Merge branch 'testing' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert...
authorDavid S. Miller <davem@davemloft.net>
Wed, 23 Jan 2013 19:00:16 +0000 (14:00 -0500)
committerDavid S. Miller <davem@davemloft.net>
Wed, 23 Jan 2013 19:00:16 +0000 (14:00 -0500)
Steffen Klassert says:

====================
1) Add a statistic counter for invalid output states and
   remove a superfluous state valid check, from Li RongQing.

2) Probe for asynchronous block ciphers instead of synchronous block
   ciphers to make the asynchronous variants available even if no
   synchronous block ciphers are found, from Jussi Kivilinna.

3) Make rfc3686 asynchronous block cipher and make use of
   the new asynchronous variant, from Jussi Kivilinna.

4) Replace some rwlocks by rcu, from Cong Wang.

5) Remove some unused defines.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
2182 files changed:
Documentation/DocBook/media/v4l/driver.xml
Documentation/PCI/pci-iov-howto.txt
Documentation/PCI/pci.txt
Documentation/acpi/enumeration.txt
Documentation/devicetree/bindings/clock/imx23-clock.txt
Documentation/devicetree/bindings/clock/imx25-clock.txt
Documentation/devicetree/bindings/clock/imx28-clock.txt
Documentation/devicetree/bindings/clock/imx6q-clock.txt
Documentation/devicetree/bindings/gpio/gpio-poweroff.txt
Documentation/devicetree/bindings/pinctrl/pinctrl-sirf.txt [new file with mode: 0644]
Documentation/devicetree/bindings/watchdog/twl4030-wdt.txt [new file with mode: 0644]
Documentation/i2c/instantiating-devices
Documentation/networking/00-INDEX
Documentation/networking/DLINK.txt [deleted file]
Documentation/networking/cs89x0.txt
Documentation/networking/depca.txt [deleted file]
Documentation/networking/ewrk3.txt [deleted file]
Documentation/networking/filter.txt
Documentation/networking/ip-sysctl.txt
Documentation/networking/multicast.txt [deleted file]
Documentation/networking/netconsole.txt
Documentation/networking/phy.txt
Documentation/power/runtime_pm.txt
Documentation/rpmsg.txt
Documentation/spi/spi-summary
Documentation/sysctl/kernel.txt
Documentation/video4linux/v4l2-framework.txt
Documentation/zh_CN/video4linux/v4l2-framework.txt
MAINTAINERS
Makefile
arch/alpha/include/asm/parport.h
arch/alpha/include/uapi/asm/socket.h
arch/alpha/kernel/pci.c
arch/alpha/kernel/smp.c
arch/alpha/kernel/sys_titan.c
arch/arm/Kconfig
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/armada-370-xp.dtsi
arch/arm/boot/dts/armada-xp-mv78230.dtsi
arch/arm/boot/dts/armada-xp-mv78260.dtsi
arch/arm/boot/dts/armada-xp-mv78460.dtsi
arch/arm/boot/dts/armada-xp.dtsi
arch/arm/boot/dts/dbx5x0.dtsi
arch/arm/boot/dts/dove.dtsi
arch/arm/boot/dts/ecx-2000.dts
arch/arm/boot/dts/exynos4210-smdkv310.dts
arch/arm/boot/dts/exynos5250.dtsi
arch/arm/boot/dts/exynos5440-ssdk5440.dts
arch/arm/boot/dts/highbank.dts
arch/arm/boot/dts/imx23-olinuxino.dts
arch/arm/boot/dts/imx31-bug.dts
arch/arm/boot/dts/imx53.dtsi
arch/arm/boot/dts/kirkwood-6282.dtsi
arch/arm/boot/dts/kirkwood-topkick.dts
arch/arm/boot/dts/kirkwood.dtsi
arch/arm/boot/dts/twl4030.dtsi
arch/arm/common/sa1111.c
arch/arm/common/scoop.c
arch/arm/common/vic.c
arch/arm/configs/multi_v7_defconfig
arch/arm/configs/mvebu_defconfig
arch/arm/configs/omap2plus_defconfig
arch/arm/kernel/bios32.c
arch/arm/kernel/etm.c
arch/arm/kernel/perf_event_cpu.c
arch/arm/kernel/perf_event_v6.c
arch/arm/kernel/perf_event_v7.c
arch/arm/kernel/perf_event_xscale.c
arch/arm/mach-davinci/board-dm646x-evm.c
arch/arm/mach-davinci/cdce949.c
arch/arm/mach-dove/pcie.c
arch/arm/mach-exynos/Kconfig
arch/arm/mach-exynos/common.c
arch/arm/mach-highbank/highbank.c
arch/arm/mach-highbank/hotplug.c
arch/arm/mach-highbank/platsmp.c
arch/arm/mach-highbank/pm.c
arch/arm/mach-highbank/sysregs.h
arch/arm/mach-highbank/system.c
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/cpufreq.c
arch/arm/mach-imx/mmdc.c
arch/arm/mach-iop13xx/pci.c
arch/arm/mach-kirkwood/board-dt.c
arch/arm/mach-kirkwood/board-usi_topkick.c
arch/arm/mach-kirkwood/pcie.c
arch/arm/mach-ks8695/board-acs5k.c
arch/arm/mach-mmp/sram.c
arch/arm/mach-msm/proc_comm.c
arch/arm/mach-msm/smd.c
arch/arm/mach-mv78xx0/pcie.c
arch/arm/mach-nomadik/board-nhk8815.c
arch/arm/mach-nomadik/include/mach/irqs.h
arch/arm/mach-omap1/Makefile
arch/arm/mach-omap1/board-ams-delta.c
arch/arm/mach-omap1/fb.c [new file with mode: 0644]
arch/arm/mach-omap1/mailbox.c
arch/arm/mach-omap1/usb.c
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/cclock3xxx_data.c
arch/arm/mach-omap2/control.h
arch/arm/mach-omap2/dpll3xxx.c
arch/arm/mach-omap2/drm.c
arch/arm/mach-omap2/dss-common.c
arch/arm/mach-omap2/fb.c [new file with mode: 0644]
arch/arm/mach-omap2/gpmc.c
arch/arm/mach-omap2/mailbox.c
arch/arm/mach-omap2/omap_hwmod_33xx_data.c
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
arch/arm/mach-omap2/omap_twl.c
arch/arm/mach-omap2/pmu.c
arch/arm/mach-omap2/prm2xxx.c
arch/arm/mach-omap2/prm2xxx_3xxx.c
arch/arm/mach-omap2/prm3xxx.c
arch/arm/mach-omap2/prm44xx.c
arch/arm/mach-omap2/prm44xx.h
arch/arm/mach-orion5x/pci.c
arch/arm/mach-prima2/pm.c
arch/arm/mach-prima2/rtciobrg.c
arch/arm/mach-pxa/corgi_pm.c
arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
arch/arm/mach-pxa/pxa27x.c
arch/arm/mach-pxa/sharpsl_pm.c
arch/arm/mach-pxa/spitz_pm.c
arch/arm/mach-pxa/tosa-bt.c
arch/arm/mach-s3c24xx/h1940-bluetooth.c
arch/arm/mach-s3c24xx/mach-osiris-dvs.c
arch/arm/mach-s3c64xx/mach-crag6410-module.c
arch/arm/mach-s3c64xx/mach-crag6410.c
arch/arm/mach-sa1100/jornada720_ssp.c
arch/arm/mach-sa1100/neponset.c
arch/arm/mach-sunxi/sunxi.c
arch/arm/mach-tegra/pcie.c
arch/arm/mach-tegra/tegra2_emc.c
arch/arm/mach-u300/dummyspichip.c
arch/arm/mach-ux500/cpu-db8500.c
arch/arm/mach-versatile/include/mach/irqs.h
arch/arm/mach-vexpress/Kconfig
arch/arm/mm/cache-l2x0.c
arch/arm/mm/proc-v7.S
arch/arm/plat-omap/Makefile
arch/arm/plat-omap/counter_32k.c
arch/arm/plat-omap/dma.c
arch/arm/plat-omap/dmtimer.c
arch/arm/plat-omap/fb.c [deleted file]
arch/arm/plat-omap/include/plat/cpu.h
arch/arm/plat-omap/sram.c
arch/arm/plat-pxa/ssp.c
arch/arm/plat-samsung/adc.c
arch/arm/plat-samsung/include/plat/cpu.h
arch/arm64/Kconfig
arch/arm64/boot/dts/Makefile
arch/arm64/include/asm/compat.h
arch/arm64/kernel/perf_event.c
arch/avr32/include/uapi/asm/socket.h
arch/avr32/lib/delay.c
arch/blackfin/mach-common/dpmc.c
arch/cris/arch-v32/drivers/pci/bios.c
arch/cris/arch-v32/kernel/smp.c
arch/cris/include/uapi/asm/socket.h
arch/frv/include/uapi/asm/socket.h
arch/frv/kernel/setup.c
arch/frv/mb93090-mb00/pci-vdk.c
arch/h8300/include/uapi/asm/socket.h
arch/ia64/include/asm/acpi.h
arch/ia64/include/asm/iosapic.h
arch/ia64/include/asm/parport.h
arch/ia64/include/asm/smp.h
arch/ia64/include/asm/unistd.h
arch/ia64/include/uapi/asm/socket.h
arch/ia64/include/uapi/asm/unistd.h
arch/ia64/kernel/acpi.c
arch/ia64/kernel/entry.S
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/time.c
arch/ia64/mm/init.c
arch/ia64/mm/tlb.c
arch/ia64/pci/fixup.c
arch/ia64/pci/pci.c
arch/ia64/sn/kernel/io_common.c
arch/ia64/sn/kernel/sn2/sn_hwperf.c
arch/ia64/xen/irq_xen.c
arch/m32r/include/uapi/asm/socket.h
arch/m32r/kernel/smpboot.c
arch/m68k/emu/nfeth.c
arch/m68k/include/asm/parport.h
arch/m68k/kernel/pcibios.c
arch/microblaze/configs/mmu_defconfig
arch/microblaze/configs/nommu_defconfig
arch/microblaze/include/asm/highmem.h
arch/microblaze/include/asm/uaccess.h
arch/microblaze/include/asm/unistd.h
arch/microblaze/include/uapi/asm/unistd.h
arch/microblaze/kernel/syscall_table.S
arch/microblaze/pci/pci-common.c
arch/mips/Kconfig
arch/mips/alchemy/common/time.c
arch/mips/cavium-octeon/serial.c
arch/mips/include/asm/page.h
arch/mips/include/asm/pci.h
arch/mips/include/asm/thread_info.h
arch/mips/include/uapi/asm/socket.h
arch/mips/include/uapi/asm/unistd.h
arch/mips/kernel/asm-offsets.c
arch/mips/kernel/genex.S
arch/mips/kernel/head.S
arch/mips/kernel/octeon_switch.S
arch/mips/kernel/perf_event_mipsxx.c
arch/mips/kernel/r2300_switch.S
arch/mips/kernel/r4k_switch.S
arch/mips/kernel/relocate_kernel.S
arch/mips/kernel/scall32-o32.S
arch/mips/kernel/scall64-64.S
arch/mips/kernel/scall64-n32.S
arch/mips/kernel/scall64-o32.S
arch/mips/kernel/smp.c
arch/mips/kernel/vmlinux.lds.S
arch/mips/lantiq/xway/dma.c
arch/mips/lantiq/xway/gptu.c
arch/mips/lantiq/xway/xrx200_phy_fw.c
arch/mips/mm/ioremap.c
arch/mips/mm/tlbex-fault.S
arch/mips/mm/tlbex.c
arch/mips/mti-sead3/sead3-i2c-drv.c
arch/mips/mti-sead3/sead3-pic32-i2c-drv.c
arch/mips/pci/fixup-cobalt.c
arch/mips/pci/fixup-emma2rh.c
arch/mips/pci/fixup-fuloong2e.c
arch/mips/pci/fixup-lemote2f.c
arch/mips/pci/fixup-malta.c
arch/mips/pci/fixup-rc32434.c
arch/mips/pci/fixup-sb1250.c
arch/mips/pci/ops-bcm63xx.c
arch/mips/pci/ops-tx4927.c
arch/mips/pci/pci-alchemy.c
arch/mips/pci/pci-ip27.c
arch/mips/pci/pci-lantiq.c
arch/mips/pci/pci.c
arch/mips/power/hibernate.S
arch/mips/sni/setup.c
arch/mips/txx9/generic/pci.c
arch/mn10300/Kconfig
arch/mn10300/include/uapi/asm/socket.h
arch/mn10300/kernel/smp.c
arch/mn10300/unit-asb2305/pci.c
arch/openrisc/lib/delay.c
arch/parisc/include/asm/parport.h
arch/parisc/include/uapi/asm/socket.h
arch/parisc/kernel/hardware.c
arch/powerpc/include/asm/eeh.h
arch/powerpc/include/asm/io-workarounds.h
arch/powerpc/include/asm/parport.h
arch/powerpc/include/asm/smp.h
arch/powerpc/include/asm/vio.h
arch/powerpc/include/uapi/asm/kvm_para.h
arch/powerpc/include/uapi/asm/socket.h
arch/powerpc/kernel/io-workarounds.c
arch/powerpc/kernel/isa-bridge.c
arch/powerpc/kernel/of_platform.c
arch/powerpc/kernel/pci-common.c
arch/powerpc/kernel/pci_32.c
arch/powerpc/kernel/pci_64.c
arch/powerpc/kernel/pci_dn.c
arch/powerpc/kernel/pci_of_scan.c
arch/powerpc/kernel/rtas_pci.c
arch/powerpc/kernel/smp-tbsync.c
arch/powerpc/kernel/smp.c
arch/powerpc/kernel/time.c
arch/powerpc/kernel/vio.c
arch/powerpc/kvm/book3s_hv_ras.c
arch/powerpc/mm/tlb_hash64.c
arch/powerpc/platforms/40x/ppc40x_simple.c
arch/powerpc/platforms/44x/currituck.c
arch/powerpc/platforms/44x/virtex_ml510.c
arch/powerpc/platforms/52xx/mpc52xx_gpt.c
arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
arch/powerpc/platforms/82xx/ep8248e.c
arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c
arch/powerpc/platforms/85xx/corenet_ds.c
arch/powerpc/platforms/85xx/mpc85xx_cds.c
arch/powerpc/platforms/85xx/tqm85xx.c
arch/powerpc/platforms/86xx/gef_ppc9a.c
arch/powerpc/platforms/86xx/gef_sbc310.c
arch/powerpc/platforms/86xx/gef_sbc610.c
arch/powerpc/platforms/cell/setup.c
arch/powerpc/platforms/cell/smp.c
arch/powerpc/platforms/chrp/pci.c
arch/powerpc/platforms/chrp/smp.c
arch/powerpc/platforms/fsl_uli1575.c
arch/powerpc/platforms/maple/pci.c
arch/powerpc/platforms/pasemi/gpio_mdio.c
arch/powerpc/platforms/pasemi/pasemi.h
arch/powerpc/platforms/pasemi/setup.c
arch/powerpc/platforms/powermac/pci.c
arch/powerpc/platforms/powermac/smp.c
arch/powerpc/platforms/powernv/pci-ioda.c
arch/powerpc/platforms/powernv/pci-p5ioc2.c
arch/powerpc/platforms/powernv/pci.c
arch/powerpc/platforms/powernv/smp.c
arch/powerpc/platforms/ps3/repository.c
arch/powerpc/platforms/pseries/eeh_dev.c
arch/powerpc/platforms/pseries/eeh_pe.c
arch/powerpc/platforms/pseries/pci_dlpar.c
arch/powerpc/platforms/pseries/smp.c
arch/powerpc/platforms/wsp/scom_smp.c
arch/powerpc/platforms/wsp/smp.c
arch/powerpc/platforms/wsp/wsp.h
arch/powerpc/platforms/wsp/wsp_pci.c
arch/powerpc/sysdev/bestcomm/bestcomm.c
arch/powerpc/sysdev/fsl_85xx_l2ctlr.c
arch/powerpc/sysdev/fsl_ifc.c
arch/powerpc/sysdev/fsl_lbc.c
arch/powerpc/sysdev/fsl_msi.c
arch/powerpc/sysdev/fsl_pci.c
arch/powerpc/sysdev/fsl_rio.c
arch/powerpc/sysdev/mpic.c
arch/powerpc/sysdev/mpic_msgr.c
arch/powerpc/sysdev/mv64x60_pci.c
arch/powerpc/sysdev/ppc4xx_msi.c
arch/s390/include/asm/dma.h
arch/s390/include/asm/io.h
arch/s390/include/asm/irq.h
arch/s390/include/uapi/asm/socket.h
arch/s390/include/uapi/asm/unistd.h
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/debug.c
arch/s390/kernel/irq.c
arch/s390/kernel/nmi.c
arch/s390/kernel/perf_cpum_cf.c
arch/s390/kernel/runtime_instr.c
arch/s390/kernel/setup.c
arch/s390/kernel/smp.c
arch/s390/kernel/syscalls.S
arch/s390/kernel/time.c
arch/s390/kernel/topology.c
arch/s390/mm/fault.c
arch/s390/oprofile/hwsampler.c
arch/s390/pci/pci.c
arch/s390/pci/pci_dma.c
arch/score/mm/cache.c
arch/sh/drivers/pci/fixups-dreamcast.c
arch/sh/drivers/pci/pci.c
arch/sh/drivers/pci/pcie-sh7786.c
arch/sparc/include/asm/parport.h
arch/sparc/include/asm/timer_64.h
arch/sparc/include/uapi/asm/socket.h
arch/sparc/include/uapi/asm/unistd.h
arch/sparc/kernel/apc.c
arch/sparc/kernel/auxio_64.c
arch/sparc/kernel/central.c
arch/sparc/kernel/chmc.c
arch/sparc/kernel/ds.c
arch/sparc/kernel/ldc.c
arch/sparc/kernel/leon_pci.c
arch/sparc/kernel/leon_pci_grpci2.c
arch/sparc/kernel/pci.c
arch/sparc/kernel/pci_fire.c
arch/sparc/kernel/pci_psycho.c
arch/sparc/kernel/pci_sabre.c
arch/sparc/kernel/pci_schizo.c
arch/sparc/kernel/pci_sun4v.c
arch/sparc/kernel/pcic.c
arch/sparc/kernel/pmc.c
arch/sparc/kernel/power.c
arch/sparc/kernel/smp_64.c
arch/sparc/kernel/systbls_32.S
arch/sparc/kernel/systbls_64.S
arch/sparc/kernel/time_32.c
arch/sparc/kernel/time_64.c
arch/sparc/mm/init_64.c
arch/tile/include/asm/pci.h
arch/tile/kernel/pci.c
arch/tile/kernel/pci_gx.c
arch/unicore32/kernel/pci.c
arch/x86/include/asm/parport.h
arch/x86/include/asm/pci_x86.h
arch/x86/kernel/cpu/perf_event_intel_uncore.c
arch/x86/kernel/kvm.c
arch/x86/kernel/pci-dma.c
arch/x86/kernel/quirks.c
arch/x86/kvm/x86.c
arch/x86/lib/delay.c
arch/x86/pci/acpi.c
arch/x86/pci/bus_numa.c
arch/x86/pci/common.c
arch/x86/pci/fixup.c
arch/x86/pci/legacy.c
arch/x86/pci/mmconfig-shared.c
arch/x86/pci/mmconfig_32.c
arch/x86/pci/mmconfig_64.c
arch/x86/pci/mrst.c
arch/x86/pci/numaq_32.c
arch/x86/pci/pcbios.c
arch/x86/platform/mrst/mrst.c
arch/x86/platform/olpc/olpc-xo1-pm.c
arch/x86/platform/olpc/olpc-xo1-sci.c
arch/x86/platform/scx200/scx200_32.c
arch/xtensa/include/uapi/asm/socket.h
drivers/acpi/acpi_memhotplug.c
drivers/acpi/acpica/Makefile
drivers/acpi/acpica/utclib.c [deleted file]
drivers/acpi/apei/erst-dbg.c
drivers/acpi/device_pm.c
drivers/acpi/glue.c
drivers/acpi/power.c
drivers/acpi/scan.c
drivers/amba/bus.c
drivers/amba/tegra-ahb.c
drivers/ata/ahci_platform.c
drivers/ata/ata_piix.c
drivers/ata/pata_arasan_cf.c
drivers/ata/pata_at91.c
drivers/ata/pata_bf54x.c
drivers/ata/pata_cs5520.c
drivers/ata/pata_ep93xx.c
drivers/ata/pata_icside.c
drivers/ata/pata_imx.c
drivers/ata/pata_ixp4xx_cf.c
drivers/ata/pata_macio.c
drivers/ata/pata_mpc52xx.c
drivers/ata/pata_octeon_cf.c
drivers/ata/pata_of_platform.c
drivers/ata/pata_palmld.c
drivers/ata/pata_pdc2027x.c
drivers/ata/pata_platform.c
drivers/ata/pata_pxa.c
drivers/ata/pata_rb532_cf.c
drivers/ata/pata_rdc.c
drivers/ata/pata_sch.c
drivers/ata/pata_sil680.c
drivers/ata/sata_highbank.c
drivers/ata/sata_mv.c
drivers/ata/sata_vsc.c
drivers/atm/ambassador.c
drivers/atm/eni.c
drivers/atm/firestream.c
drivers/atm/fore200e.c
drivers/atm/he.c
drivers/atm/horizon.c
drivers/atm/idt77252.c
drivers/atm/iphase.c
drivers/atm/lanai.c
drivers/atm/nicstar.c
drivers/atm/solos-pci.c
drivers/atm/zatm.c
drivers/auxdisplay/cfag12864bfb.c
drivers/base/power/main.c
drivers/base/power/qos.c
drivers/bcma/Kconfig
drivers/bcma/bcma_private.h
drivers/bcma/driver_chipcommon_pmu.c
drivers/bcma/driver_chipcommon_sflash.c
drivers/bcma/driver_gmac_cmn.c
drivers/bcma/driver_pci.c
drivers/bcma/driver_pci_host.c
drivers/bcma/host_pci.c
drivers/bcma/main.c
drivers/block/cciss.c
drivers/block/cpqarray.c
drivers/block/nvme.c
drivers/block/ps3disk.c
drivers/block/ps3vram.c
drivers/block/sunvdc.c
drivers/block/swim.c
drivers/block/swim3.c
drivers/block/umem.c
drivers/block/virtio_blk.c
drivers/block/xsysace.c
drivers/bus/omap-ocp2scp.c
drivers/bus/omap_l3_noc.c
drivers/cdrom/gdrom.c
drivers/char/agp/ali-agp.c
drivers/char/agp/amd-k7-agp.c
drivers/char/agp/amd64-agp.c
drivers/char/agp/ati-agp.c
drivers/char/agp/efficeon-agp.c
drivers/char/agp/i460-agp.c
drivers/char/agp/intel-agp.c
drivers/char/agp/nvidia-agp.c
drivers/char/agp/sgi-agp.c
drivers/char/agp/sis-agp.c
drivers/char/agp/sworks-agp.c
drivers/char/agp/uninorth-agp.c
drivers/char/agp/via-agp.c
drivers/char/hw_random/atmel-rng.c
drivers/char/hw_random/bcm63xx-rng.c
drivers/char/hw_random/exynos-rng.c
drivers/char/hw_random/n2-drv.c
drivers/char/hw_random/octeon-rng.c
drivers/char/hw_random/omap-rng.c
drivers/char/hw_random/pasemi-rng.c
drivers/char/hw_random/picoxcell-rng.c
drivers/char/hw_random/ppc4xx-rng.c
drivers/char/hw_random/timeriomem-rng.c
drivers/char/hw_random/virtio-rng.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/virtio_console.c
drivers/clk/clk-twl6040.c
drivers/clk/mvebu/clk-gating-ctrl.c
drivers/clk/ux500/abx500-clk.c
drivers/clocksource/acpi_pm.c
drivers/clocksource/em_sti.c
drivers/clocksource/sh_cmt.c
drivers/clocksource/sh_mtu2.c
drivers/clocksource/sh_tmu.c
drivers/connector/connector.c
drivers/cpufreq/Kconfig
drivers/cpufreq/Makefile
drivers/cpufreq/cpufreq_stats.c
drivers/cpufreq/longhaul.c
drivers/cpuidle/coupled.c
drivers/cpuidle/cpuidle.c
drivers/cpuidle/driver.c
drivers/cpuidle/governors/menu.c
drivers/crypto/atmel-aes.c
drivers/crypto/atmel-sha.c
drivers/crypto/atmel-tdes.c
drivers/crypto/bfin_crc.c
drivers/crypto/caam/ctrl.c
drivers/crypto/geode-aes.c
drivers/crypto/hifn_795x.c
drivers/crypto/mv_cesa.c
drivers/crypto/n2_core.c
drivers/crypto/nx/nx.c
drivers/crypto/omap-sham.c
drivers/crypto/picoxcell_crypto.c
drivers/crypto/tegra-aes.c
drivers/devfreq/exynos4_bus.c
drivers/dma/dw_dmac.c
drivers/dma/edma.c
drivers/dma/intel_mid_dma.c
drivers/dma/ioat/dca.c
drivers/dma/ioat/dma.c
drivers/dma/ioat/dma.h
drivers/dma/ioat/dma_v2.c
drivers/dma/ioat/dma_v2.h
drivers/dma/ioat/dma_v3.c
drivers/dma/ioat/pci.c
drivers/dma/iop-adma.c
drivers/dma/mmp_pdma.c
drivers/dma/mmp_tdma.c
drivers/dma/mpc512x_dma.c
drivers/dma/mv_xor.c
drivers/dma/pch_dma.c
drivers/dma/pl330.c
drivers/dma/ppc4xx/adma.c
drivers/dma/sa11x0-dma.c
drivers/dma/sh/shdma.c
drivers/dma/sirf-dma.c
drivers/dma/tegra20-apb-dma.c
drivers/dma/timb_dma.c
drivers/edac/Kconfig
drivers/edac/amd64_edac.c
drivers/edac/amd76x_edac.c
drivers/edac/cell_edac.c
drivers/edac/cpc925_edac.c
drivers/edac/e752x_edac.c
drivers/edac/e7xxx_edac.c
drivers/edac/edac_mc_sysfs.c
drivers/edac/highbank_l2_edac.c
drivers/edac/highbank_mc_edac.c
drivers/edac/i3000_edac.c
drivers/edac/i3200_edac.c
drivers/edac/i5000_edac.c
drivers/edac/i5100_edac.c
drivers/edac/i5400_edac.c
drivers/edac/i7300_edac.c
drivers/edac/i7core_edac.c
drivers/edac/i82443bxgx_edac.c
drivers/edac/i82860_edac.c
drivers/edac/i82875p_edac.c
drivers/edac/i82975x_edac.c
drivers/edac/mpc85xx_edac.c
drivers/edac/mv64x60_edac.c
drivers/edac/octeon_edac-l2c.c
drivers/edac/octeon_edac-lmc.c
drivers/edac/octeon_edac-pc.c
drivers/edac/octeon_edac-pci.c
drivers/edac/pasemi_edac.c
drivers/edac/ppc4xx_edac.c
drivers/edac/r82600_edac.c
drivers/edac/sb_edac.c
drivers/edac/tile_edac.c
drivers/edac/x38_edac.c
drivers/firewire/net.c
drivers/firmware/dcdbas.c
drivers/gpio/gpio-da9055.c
drivers/gpio/gpio-ts5500.c
drivers/gpio/gpio-viperboard.c
drivers/gpu/drm/ast/ast_drv.c
drivers/gpu/drm/cirrus/cirrus_drv.c
drivers/gpu/drm/drm_mm.c
drivers/gpu/drm/exynos/exynos_ddc.c
drivers/gpu/drm/exynos/exynos_drm_buf.c
drivers/gpu/drm/exynos/exynos_drm_buf.h
drivers/gpu/drm/exynos/exynos_drm_connector.c
drivers/gpu/drm/exynos/exynos_drm_connector.h
drivers/gpu/drm/exynos/exynos_drm_core.c
drivers/gpu/drm/exynos/exynos_drm_crtc.c
drivers/gpu/drm/exynos/exynos_drm_crtc.h
drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
drivers/gpu/drm/exynos/exynos_drm_dmabuf.h
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/exynos/exynos_drm_encoder.c
drivers/gpu/drm/exynos/exynos_drm_encoder.h
drivers/gpu/drm/exynos/exynos_drm_fb.c
drivers/gpu/drm/exynos/exynos_drm_fb.h
drivers/gpu/drm/exynos/exynos_drm_fbdev.c
drivers/gpu/drm/exynos/exynos_drm_fbdev.h
drivers/gpu/drm/exynos/exynos_drm_fimc.c
drivers/gpu/drm/exynos/exynos_drm_fimc.h
drivers/gpu/drm/exynos/exynos_drm_fimd.c
drivers/gpu/drm/exynos/exynos_drm_g2d.c
drivers/gpu/drm/exynos/exynos_drm_gem.c
drivers/gpu/drm/exynos/exynos_drm_gem.h
drivers/gpu/drm/exynos/exynos_drm_gsc.c
drivers/gpu/drm/exynos/exynos_drm_gsc.h
drivers/gpu/drm/exynos/exynos_drm_hdmi.c
drivers/gpu/drm/exynos/exynos_drm_hdmi.h
drivers/gpu/drm/exynos/exynos_drm_iommu.c
drivers/gpu/drm/exynos/exynos_drm_iommu.h
drivers/gpu/drm/exynos/exynos_drm_ipp.c
drivers/gpu/drm/exynos/exynos_drm_ipp.h
drivers/gpu/drm/exynos/exynos_drm_rotator.c
drivers/gpu/drm/exynos/exynos_drm_rotator.h
drivers/gpu/drm/exynos/exynos_drm_vidi.c
drivers/gpu/drm/exynos/exynos_drm_vidi.h
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/exynos_hdmi.h
drivers/gpu/drm/exynos/exynos_hdmiphy.c
drivers/gpu/drm/exynos/exynos_mixer.c
drivers/gpu/drm/gma500/tc35876x-dsi-lvds.c
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_dmabuf.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_ringbuffer.h
drivers/gpu/drm/i915/intel_sprite.c
drivers/gpu/drm/mgag200/mgag200_drv.c
drivers/gpu/drm/nouveau/core/core/client.c
drivers/gpu/drm/nouveau/core/core/handle.c
drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
drivers/gpu/drm/nouveau/core/engine/graph/fuc/gpcnve0.fuc
drivers/gpu/drm/nouveau/core/engine/graph/fuc/gpcnve0.fuc.h
drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnvc0.fuc
drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnvc0.fuc.h
drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnve0.fuc
drivers/gpu/drm/nouveau/core/engine/graph/fuc/hubnve0.fuc.h
drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c
drivers/gpu/drm/nouveau/core/engine/graph/nvc0.h
drivers/gpu/drm/nouveau/core/engine/graph/nve0.c
drivers/gpu/drm/nouveau/core/include/core/client.h
drivers/gpu/drm/nouveau/core/include/subdev/bios.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/gpio.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/init.h
drivers/gpu/drm/nouveau/core/include/subdev/bios/pll.h
drivers/gpu/drm/nouveau/core/include/subdev/gpio.h
drivers/gpu/drm/nouveau/core/subdev/bios/base.c
drivers/gpu/drm/nouveau/core/subdev/bios/gpio.c
drivers/gpu/drm/nouveau/core/subdev/bios/init.c
drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c
drivers/gpu/drm/nouveau/core/subdev/device/nve0.c
drivers/gpu/drm/nouveau/core/subdev/fb/nvc0.c
drivers/gpu/drm/nouveau/core/subdev/gpio/base.c
drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c
drivers/gpu/drm/nouveau/core/subdev/gpio/nvd0.c
drivers/gpu/drm/nouveau/core/subdev/instmem/base.c
drivers/gpu/drm/nouveau/core/subdev/mxm/base.c
drivers/gpu/drm/nouveau/core/subdev/vm/base.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_connector.c
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_fence.h
drivers/gpu/drm/nouveau/nouveau_pm.c
drivers/gpu/drm/nouveau/nouveau_prime.c
drivers/gpu/drm/nouveau/nv04_dfp.c
drivers/gpu/drm/nouveau/nv10_fence.c
drivers/gpu/drm/nouveau/nv50_fence.c
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/evergreen_cs.c
drivers/gpu/drm/radeon/evergreend.h
drivers/gpu/drm/radeon/ni.c
drivers/gpu/drm/radeon/nid.h
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/r600_cs.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_asic.c
drivers/gpu/drm/radeon/radeon_asic.h
drivers/gpu/drm/radeon/radeon_combios.c
drivers/gpu/drm/radeon/radeon_connectors.c
drivers/gpu/drm/radeon/radeon_cs.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_display.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_fence.c
drivers/gpu/drm/radeon/radeon_i2c.c
drivers/gpu/drm/radeon/radeon_legacy_encoders.c
drivers/gpu/drm/radeon/radeon_mode.h
drivers/gpu/drm/radeon/radeon_pm.c
drivers/gpu/drm/radeon/radeon_prime.c
drivers/gpu/drm/radeon/radeon_ring.c
drivers/gpu/drm/radeon/rv770.c
drivers/gpu/drm/radeon/si.c
drivers/gpu/drm/radeon/sid.h
drivers/gpu/drm/shmobile/shmob_drm_drv.c
drivers/gpu/drm/tegra/dc.c
drivers/gpu/drm/tegra/drm.h
drivers/gpu/drm/tegra/hdmi.c
drivers/gpu/drm/tegra/host1x.c
drivers/gpu/drm/ttm/ttm_bo_util.c
drivers/gpu/drm/udl/udl_connector.c
drivers/hid/i2c-hid/i2c-hid.c
drivers/hsi/clients/hsi_char.c
drivers/hwmon/vexpress.c
drivers/ide/aec62xx.c
drivers/ide/alim15x3.c
drivers/ide/amd74xx.c
drivers/ide/atiixp.c
drivers/ide/cmd64x.c
drivers/ide/cs5520.c
drivers/ide/cs5530.c
drivers/ide/cs5535.c
drivers/ide/cy82c693.c
drivers/ide/delkin_cb.c
drivers/ide/hpt366.c
drivers/ide/icside.c
drivers/ide/ide-pci-generic.c
drivers/ide/ide_platform.c
drivers/ide/it8172.c
drivers/ide/it8213.c
drivers/ide/it821x.c
drivers/ide/jmicron.c
drivers/ide/ns87415.c
drivers/ide/opti621.c
drivers/ide/palm_bk3710.c
drivers/ide/pdc202xx_new.c
drivers/ide/pdc202xx_old.c
drivers/ide/piix.c
drivers/ide/pmac.c
drivers/ide/rapide.c
drivers/ide/rz1000.c
drivers/ide/sc1200.c
drivers/ide/scc_pata.c
drivers/ide/serverworks.c
drivers/ide/sgiioc4.c
drivers/ide/siimage.c
drivers/ide/sis5513.c
drivers/ide/sl82c105.c
drivers/ide/slc90e66.c
drivers/ide/tc86c001.c
drivers/ide/triflex.c
drivers/ide/trm290.c
drivers/ide/via82cxxx.c
drivers/idle/intel_idle.c
drivers/iio/accel/Kconfig
drivers/iio/accel/hid-sensor-accel-3d.c
drivers/iio/adc/ad7266.c
drivers/iio/adc/ad7298.c
drivers/iio/adc/ad7476.c
drivers/iio/adc/ad7791.c
drivers/iio/adc/ad7887.c
drivers/iio/adc/at91_adc.c
drivers/iio/adc/lp8788_adc.c
drivers/iio/adc/max1363.c
drivers/iio/adc/ti_am335x_adc.c
drivers/iio/adc/viperboard_adc.c
drivers/iio/amplifiers/ad8366.c
drivers/iio/common/hid-sensors/Kconfig
drivers/iio/common/hid-sensors/Makefile
drivers/iio/dac/ad5064.c
drivers/iio/dac/ad5360.c
drivers/iio/dac/ad5380.c
drivers/iio/dac/ad5421.c
drivers/iio/dac/ad5446.c
drivers/iio/dac/ad5449.c
drivers/iio/dac/ad5504.c
drivers/iio/dac/ad5624r_spi.c
drivers/iio/dac/ad5686.c
drivers/iio/dac/ad5755.c
drivers/iio/dac/ad5764.c
drivers/iio/dac/ad5791.c
drivers/iio/dac/max517.c
drivers/iio/dac/mcp4725.c
drivers/iio/frequency/ad9523.c
drivers/iio/frequency/adf4350.c
drivers/iio/gyro/Kconfig
drivers/iio/gyro/hid-sensor-gyro-3d.c
drivers/iio/light/Kconfig
drivers/iio/light/adjd_s311.c
drivers/iio/light/hid-sensor-als.c
drivers/iio/light/lm3533-als.c
drivers/iio/light/vcnl4000.c
drivers/iio/magnetometer/Kconfig
drivers/iio/magnetometer/hid-sensor-magn-3d.c
drivers/infiniband/hw/amso1100/c2.c
drivers/infiniband/hw/amso1100/c2.h
drivers/infiniband/hw/amso1100/c2_pd.c
drivers/infiniband/hw/amso1100/c2_qp.c
drivers/infiniband/hw/amso1100/c2_rnic.c
drivers/infiniband/hw/ehca/ehca_main.c
drivers/infiniband/hw/ipath/ipath_driver.c
drivers/infiniband/hw/mthca/mthca_main.c
drivers/infiniband/hw/nes/nes.c
drivers/infiniband/hw/nes/nes_nic.c
drivers/infiniband/hw/qib/qib_init.c
drivers/input/keyboard/gpio_keys.c
drivers/input/keyboard/gpio_keys_polled.c
drivers/input/keyboard/tca8418_keypad.c
drivers/input/mouse/sentelic.c
drivers/iommu/intel-iommu.c
drivers/iommu/omap-iommu.c
drivers/iommu/tegra-gart.c
drivers/iommu/tegra-smmu.c
drivers/isdn/divert/divert_init.c
drivers/isdn/divert/isdn_divert.c
drivers/isdn/divert/isdn_divert.h
drivers/isdn/gigaset/common.c
drivers/isdn/gigaset/ev-layer.c
drivers/isdn/gigaset/gigaset.h
drivers/isdn/gigaset/interface.c
drivers/isdn/hardware/avm/b1pci.c
drivers/isdn/hardware/avm/c4.c
drivers/isdn/hardware/avm/t1pci.c
drivers/isdn/hardware/eicon/divasmain.c
drivers/isdn/hardware/mISDN/avmfritz.c
drivers/isdn/hardware/mISDN/hfcmulti.c
drivers/isdn/hardware/mISDN/hfcpci.c
drivers/isdn/hardware/mISDN/mISDNinfineon.c
drivers/isdn/hardware/mISDN/netjet.c
drivers/isdn/hardware/mISDN/speedfax.c
drivers/isdn/hardware/mISDN/w6692.c
drivers/isdn/hisax/amd7930_fn.c
drivers/isdn/hisax/asuscom.c
drivers/isdn/hisax/avm_a1.c
drivers/isdn/hisax/avm_a1p.c
drivers/isdn/hisax/avm_pci.c
drivers/isdn/hisax/avma1_cs.c
drivers/isdn/hisax/bkm_a4t.c
drivers/isdn/hisax/bkm_a8.c
drivers/isdn/hisax/config.c
drivers/isdn/hisax/diva.c
drivers/isdn/hisax/elsa.c
drivers/isdn/hisax/elsa_cs.c
drivers/isdn/hisax/enternow_pci.c
drivers/isdn/hisax/gazel.c
drivers/isdn/hisax/hfc4s8s_l1.c
drivers/isdn/hisax/hfc_pci.c
drivers/isdn/hisax/hfc_sx.c
drivers/isdn/hisax/hfcscard.c
drivers/isdn/hisax/hisax_fcpcipnp.c
drivers/isdn/hisax/icc.c
drivers/isdn/hisax/isac.c
drivers/isdn/hisax/isurf.c
drivers/isdn/hisax/ix1_micro.c
drivers/isdn/hisax/mic.c
drivers/isdn/hisax/niccy.c
drivers/isdn/hisax/nj_s.c
drivers/isdn/hisax/nj_u.c
drivers/isdn/hisax/s0box.c
drivers/isdn/hisax/saphir.c
drivers/isdn/hisax/sedlbauer.c
drivers/isdn/hisax/sedlbauer_cs.c
drivers/isdn/hisax/sportster.c
drivers/isdn/hisax/teleint.c
drivers/isdn/hisax/teles0.c
drivers/isdn/hisax/teles3.c
drivers/isdn/hisax/teles_cs.c
drivers/isdn/hisax/telespci.c
drivers/isdn/hisax/w6692.c
drivers/isdn/hysdn/hysdn_init.c
drivers/isdn/mISDN/core.c
drivers/leds/leds-gpio.c
drivers/macintosh/macio_asic.c
drivers/macintosh/mediabay.c
drivers/macintosh/rack-meter.c
drivers/macintosh/windfarm_ad7417_sensor.c
drivers/macintosh/windfarm_fcu_controls.c
drivers/macintosh/windfarm_pm112.c
drivers/macintosh/windfarm_pm121.c
drivers/macintosh/windfarm_pm72.c
drivers/macintosh/windfarm_pm81.c
drivers/macintosh/windfarm_pm91.c
drivers/macintosh/windfarm_rm31.c
drivers/media/i2c/adv7180.c
drivers/media/i2c/adv7183.c
drivers/media/i2c/as3645a.c
drivers/media/i2c/m5mols/m5mols_core.c
drivers/media/i2c/vs6624.c
drivers/media/mmc/siano/smssdio.c
drivers/media/pci/bt8xx/bt878.c
drivers/media/pci/bt8xx/bttv-cards.c
drivers/media/pci/bt8xx/bttv-driver.c
drivers/media/pci/bt8xx/bttv-i2c.c
drivers/media/pci/bt8xx/bttv-input.c
drivers/media/pci/bt8xx/dvb-bt8xx.c
drivers/media/pci/cx18/cx18-driver.c
drivers/media/pci/cx23885/cx23885-core.c
drivers/media/pci/cx25821/cx25821-core.c
drivers/media/pci/cx88/cx88-alsa.c
drivers/media/pci/cx88/cx88-mpeg.c
drivers/media/pci/cx88/cx88-video.c
drivers/media/pci/ddbridge/ddbridge-core.c
drivers/media/pci/dm1105/dm1105.c
drivers/media/pci/ivtv/ivtv-driver.c
drivers/media/pci/mantis/hopper_cards.c
drivers/media/pci/mantis/mantis_cards.c
drivers/media/pci/mantis/mantis_dvb.c
drivers/media/pci/mantis/mantis_i2c.c
drivers/media/pci/mantis/mantis_pci.c
drivers/media/pci/meye/meye.c
drivers/media/pci/ngene/ngene-cards.c
drivers/media/pci/ngene/ngene-core.c
drivers/media/pci/ngene/ngene.h
drivers/media/pci/pluto2/pluto2.c
drivers/media/pci/pt1/pt1.c
drivers/media/pci/saa7134/saa7134-core.c
drivers/media/pci/saa7134/saa7134.h
drivers/media/pci/saa7164/saa7164-core.c
drivers/media/pci/sta2x11/sta2x11_vip.c
drivers/media/pci/ttpci/av7110.c
drivers/media/pci/ttpci/av7110_ir.c
drivers/media/pci/zoran/zoran_card.c
drivers/media/pci/zoran/zoran_driver.c
drivers/media/platform/blackfin/bfin_capture.c
drivers/media/platform/coda.c
drivers/media/platform/davinci/dm355_ccdc.c
drivers/media/platform/davinci/dm644x_ccdc.c
drivers/media/platform/davinci/isif.c
drivers/media/platform/davinci/vpbe.c
drivers/media/platform/davinci/vpbe_display.c
drivers/media/platform/davinci/vpfe_capture.c
drivers/media/platform/davinci/vpif.c
drivers/media/platform/davinci/vpss.c
drivers/media/platform/exynos-gsc/gsc-core.c
drivers/media/platform/fsl-viu.c
drivers/media/platform/omap24xxcam.c
drivers/media/platform/omap3isp/isp.c
drivers/media/platform/s3c-camif/camif-core.c
drivers/media/platform/s5p-fimc/fimc-core.c
drivers/media/platform/s5p-fimc/fimc-lite.c
drivers/media/platform/s5p-fimc/fimc-mdevice.c
drivers/media/platform/s5p-fimc/mipi-csis.c
drivers/media/platform/s5p-mfc/s5p_mfc.c
drivers/media/platform/s5p-tv/hdmi_drv.c
drivers/media/platform/s5p-tv/hdmiphy_drv.c
drivers/media/platform/s5p-tv/mixer.h
drivers/media/platform/s5p-tv/mixer_drv.c
drivers/media/platform/s5p-tv/mixer_video.c
drivers/media/platform/s5p-tv/sdo_drv.c
drivers/media/platform/s5p-tv/sii9234_drv.c
drivers/media/platform/sh_vou.c
drivers/media/platform/soc_camera/atmel-isi.c
drivers/media/platform/soc_camera/mx2_camera.c
drivers/media/platform/soc_camera/mx3_camera.c
drivers/media/platform/soc_camera/pxa_camera.c
drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c
drivers/media/platform/soc_camera/sh_mobile_csi2.c
drivers/media/platform/soc_camera/soc_camera.c
drivers/media/platform/timblogiw.c
drivers/media/platform/via-camera.c
drivers/media/radio/radio-maxiradio.c
drivers/media/radio/radio-sf16fmi.c
drivers/media/radio/radio-sf16fmr2.c
drivers/media/radio/radio-tea5764.c
drivers/media/radio/radio-timb.c
drivers/media/radio/radio-wl1273.c
drivers/media/radio/saa7706h.c
drivers/media/radio/si470x/radio-si470x-i2c.c
drivers/media/radio/tef6862.c
drivers/media/rc/ene_ir.c
drivers/media/rc/fintek-cir.c
drivers/media/rc/gpio-ir-recv.c
drivers/media/rc/iguanair.c
drivers/media/rc/imon.c
drivers/media/rc/ir-rx51.c
drivers/media/rc/ite-cir.c
drivers/media/rc/mceusb.c
drivers/media/rc/nuvoton-cir.c
drivers/media/rc/redrat3.c
drivers/media/rc/streamzap.c
drivers/media/rc/ttusbir.c
drivers/media/rc/winbond-cir.c
drivers/media/usb/gspca/spca506.c
drivers/media/usb/siano/smsusb.c
drivers/media/usb/usbvision/usbvision-video.c
drivers/memory/tegra20-mc.c
drivers/memory/tegra30-mc.c
drivers/message/fusion/mptfc.c
drivers/message/fusion/mptsas.c
drivers/message/fusion/mptspi.c
drivers/message/i2o/pci.c
drivers/mfd/max8997.c
drivers/mfd/retu-mfd.c
drivers/mfd/rtsx_pcr.c
drivers/mfd/sta2x11-mfd.c
drivers/mfd/stmpe.c
drivers/mfd/ti_am335x_tscadc.c
drivers/mfd/tps80031.c
drivers/mfd/twl6040.c
drivers/mfd/vexpress-sysreg.c
drivers/misc/mei/amthif.c
drivers/mmc/host/dw_mmc-pci.c
drivers/mmc/host/dw_mmc-pltfm.c
drivers/mmc/host/sdhci-acpi.c
drivers/mmc/host/wmt-sdmmc.c
drivers/mtd/devices/mtd_dataflash.c
drivers/mtd/devices/spear_smi.c
drivers/mtd/maps/esb2rom.c
drivers/mtd/maps/intel_vr_nor.c
drivers/mtd/maps/pci.c
drivers/mtd/maps/physmap_of.c
drivers/mtd/maps/pismo.c
drivers/mtd/maps/scb2_flash.c
drivers/mtd/nand/atmel_nand.c
drivers/mtd/nand/bcm47xxnflash/main.c
drivers/mtd/nand/fsl_upm.c
drivers/mtd/nand/fsmc_nand.c
drivers/mtd/nand/gpmi-nand/gpmi-nand.c
drivers/mtd/nand/jz4740_nand.c
drivers/net/Space.c
drivers/net/dsa/mv88e6060.c
drivers/net/dsa/mv88e6123_61_65.c
drivers/net/dsa/mv88e6131.c
drivers/net/dsa/mv88e6xxx.c
drivers/net/dsa/mv88e6xxx.h
drivers/net/ethernet/3com/3c501.c [deleted file]
drivers/net/ethernet/3com/3c501.h [deleted file]
drivers/net/ethernet/3com/3c59x.c
drivers/net/ethernet/3com/Kconfig
drivers/net/ethernet/3com/Makefile
drivers/net/ethernet/8390/3c503.c [deleted file]
drivers/net/ethernet/8390/3c503.h [deleted file]
drivers/net/ethernet/8390/Kconfig
drivers/net/ethernet/8390/Makefile
drivers/net/ethernet/8390/ac3200.c [deleted file]
drivers/net/ethernet/8390/ax88796.c
drivers/net/ethernet/8390/e2100.c [deleted file]
drivers/net/ethernet/8390/es3210.c [deleted file]
drivers/net/ethernet/8390/hp-plus.c [deleted file]
drivers/net/ethernet/8390/hp.c [deleted file]
drivers/net/ethernet/8390/lne390.c [deleted file]
drivers/net/ethernet/8390/ne2k-pci.c
drivers/net/ethernet/8390/ne3210.c [deleted file]
drivers/net/ethernet/8390/smc-ultra32.c [deleted file]
drivers/net/ethernet/Kconfig
drivers/net/ethernet/Makefile
drivers/net/ethernet/adi/Kconfig
drivers/net/ethernet/adi/bfin_mac.c
drivers/net/ethernet/aeroflex/greth.c
drivers/net/ethernet/amd/Kconfig
drivers/net/ethernet/amd/Makefile
drivers/net/ethernet/amd/au1000_eth.c
drivers/net/ethernet/amd/depca.c [deleted file]
drivers/net/ethernet/amd/depca.h [deleted file]
drivers/net/ethernet/amd/pcnet32.c
drivers/net/ethernet/atheros/atl1c/atl1c_main.c
drivers/net/ethernet/atheros/atl1e/atl1e_main.c
drivers/net/ethernet/atheros/atlx/atl2.c
drivers/net/ethernet/broadcom/Kconfig
drivers/net/ethernet/broadcom/Makefile
drivers/net/ethernet/broadcom/b44.c
drivers/net/ethernet/broadcom/bcm63xx_enet.c
drivers/net/ethernet/broadcom/bgmac.c [new file with mode: 0644]
drivers/net/ethernet/broadcom/bgmac.h [new file with mode: 0644]
drivers/net/ethernet/broadcom/bnx2.c
drivers/net/ethernet/broadcom/bnx2x/Makefile
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dump.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_file_hdr.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_init.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_mfw_req.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.h
drivers/net/ethernet/broadcom/cnic.c
drivers/net/ethernet/broadcom/cnic_if.h
drivers/net/ethernet/broadcom/sb1250-mac.c
drivers/net/ethernet/broadcom/tg3.c
drivers/net/ethernet/cadence/macb.c
drivers/net/ethernet/chelsio/cxgb/cxgb2.c
drivers/net/ethernet/chelsio/cxgb/sge.c
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
drivers/net/ethernet/chelsio/cxgb3/sge.c
drivers/net/ethernet/chelsio/cxgb3/t3_hw.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
drivers/net/ethernet/chelsio/cxgb4vf/adapter.h
drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
drivers/net/ethernet/cisco/enic/enic_main.c
drivers/net/ethernet/dec/Kconfig
drivers/net/ethernet/dec/Makefile
drivers/net/ethernet/dec/ewrk3.c [deleted file]
drivers/net/ethernet/dec/ewrk3.h [deleted file]
drivers/net/ethernet/dlink/Kconfig
drivers/net/ethernet/dlink/Makefile
drivers/net/ethernet/dlink/de600.c [deleted file]
drivers/net/ethernet/dlink/de600.h [deleted file]
drivers/net/ethernet/dlink/de620.c [deleted file]
drivers/net/ethernet/dlink/de620.h [deleted file]
drivers/net/ethernet/dlink/sundance.c
drivers/net/ethernet/dnet.c
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/ethoc.c
drivers/net/ethernet/faraday/ftgmac100.c
drivers/net/ethernet/freescale/fec.c
drivers/net/ethernet/freescale/fec.h
drivers/net/ethernet/freescale/gianfar.c
drivers/net/ethernet/freescale/gianfar.h
drivers/net/ethernet/fujitsu/Kconfig
drivers/net/ethernet/fujitsu/Makefile
drivers/net/ethernet/fujitsu/at1700.c [deleted file]
drivers/net/ethernet/fujitsu/eth16i.c [deleted file]
drivers/net/ethernet/i825xx/3c505.c [deleted file]
drivers/net/ethernet/i825xx/3c505.h [deleted file]
drivers/net/ethernet/i825xx/3c507.c [deleted file]
drivers/net/ethernet/i825xx/82596.c
drivers/net/ethernet/i825xx/Kconfig
drivers/net/ethernet/i825xx/Makefile
drivers/net/ethernet/i825xx/eepro.c [deleted file]
drivers/net/ethernet/i825xx/eexpress.c [deleted file]
drivers/net/ethernet/i825xx/eexpress.h [deleted file]
drivers/net/ethernet/i825xx/lp486e.c [deleted file]
drivers/net/ethernet/i825xx/ni52.c [deleted file]
drivers/net/ethernet/i825xx/ni52.h [deleted file]
drivers/net/ethernet/i825xx/znet.c [deleted file]
drivers/net/ethernet/intel/Kconfig
drivers/net/ethernet/intel/e100.c
drivers/net/ethernet/intel/e1000/e1000_main.c
drivers/net/ethernet/intel/e1000e/82571.c
drivers/net/ethernet/intel/e1000e/defines.h
drivers/net/ethernet/intel/e1000e/e1000.h
drivers/net/ethernet/intel/e1000e/ethtool.c
drivers/net/ethernet/intel/e1000e/hw.h
drivers/net/ethernet/intel/e1000e/ich8lan.c
drivers/net/ethernet/intel/e1000e/mac.c
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/intel/e1000e/nvm.c
drivers/net/ethernet/intel/e1000e/param.c
drivers/net/ethernet/intel/igb/Makefile
drivers/net/ethernet/intel/igb/e1000_82575.c
drivers/net/ethernet/intel/igb/e1000_82575.h
drivers/net/ethernet/intel/igb/e1000_defines.h
drivers/net/ethernet/intel/igb/e1000_hw.h
drivers/net/ethernet/intel/igb/e1000_i210.c
drivers/net/ethernet/intel/igb/e1000_i210.h
drivers/net/ethernet/intel/igb/e1000_mac.c
drivers/net/ethernet/intel/igb/e1000_mac.h
drivers/net/ethernet/intel/igb/e1000_mbx.c
drivers/net/ethernet/intel/igb/e1000_mbx.h
drivers/net/ethernet/intel/igb/e1000_nvm.c
drivers/net/ethernet/intel/igb/e1000_nvm.h
drivers/net/ethernet/intel/igb/e1000_phy.c
drivers/net/ethernet/intel/igb/e1000_phy.h
drivers/net/ethernet/intel/igb/e1000_regs.h
drivers/net/ethernet/intel/igb/igb.h
drivers/net/ethernet/intel/igb/igb_ethtool.c
drivers/net/ethernet/intel/igb/igb_hwmon.c [new file with mode: 0644]
drivers/net/ethernet/intel/igb/igb_main.c
drivers/net/ethernet/intel/igb/igb_ptp.c
drivers/net/ethernet/intel/igbvf/netdev.c
drivers/net/ethernet/intel/ixgb/ixgb_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c
drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
drivers/net/ethernet/lantiq_etop.c
drivers/net/ethernet/marvell/mv643xx_eth.c
drivers/net/ethernet/marvell/pxa168_eth.c
drivers/net/ethernet/marvell/skge.c
drivers/net/ethernet/marvell/sky2.c
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
drivers/net/ethernet/mellanox/mlx4/en_tx.c
drivers/net/ethernet/natsemi/ibmlana.c [deleted file]
drivers/net/ethernet/natsemi/ibmlana.h [deleted file]
drivers/net/ethernet/natsemi/natsemi.c
drivers/net/ethernet/neterion/s2io.c
drivers/net/ethernet/neterion/vxge/vxge-main.c
drivers/net/ethernet/nvidia/forcedeth.c
drivers/net/ethernet/nxp/lpc_eth.c
drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
drivers/net/ethernet/qlogic/qla3xxx.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
drivers/net/ethernet/qlogic/qlge/qlge_main.c
drivers/net/ethernet/racal/Kconfig [deleted file]
drivers/net/ethernet/racal/Makefile [deleted file]
drivers/net/ethernet/racal/ni5010.c [deleted file]
drivers/net/ethernet/racal/ni5010.h [deleted file]
drivers/net/ethernet/rdc/r6040.c
drivers/net/ethernet/realtek/8139cp.c
drivers/net/ethernet/realtek/8139too.c
drivers/net/ethernet/realtek/r8169.c
drivers/net/ethernet/renesas/sh_eth.c
drivers/net/ethernet/s6gmac.c
drivers/net/ethernet/seeq/Kconfig
drivers/net/ethernet/seeq/Makefile
drivers/net/ethernet/seeq/seeq8005.c [deleted file]
drivers/net/ethernet/seeq/seeq8005.h [deleted file]
drivers/net/ethernet/sfc/ptp.c
drivers/net/ethernet/silan/sc92031.c
drivers/net/ethernet/sis/sis900.c
drivers/net/ethernet/smsc/smc911x.c
drivers/net/ethernet/smsc/smsc911x.c
drivers/net/ethernet/smsc/smsc9420.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/sun/niu.c
drivers/net/ethernet/sun/sunvnet.c
drivers/net/ethernet/ti/cpmac.c
drivers/net/ethernet/ti/cpsw.c
drivers/net/ethernet/ti/davinci_cpdma.c
drivers/net/ethernet/ti/davinci_cpdma.h
drivers/net/ethernet/ti/davinci_emac.c
drivers/net/ethernet/toshiba/tc35815.c
drivers/net/ethernet/via/via-rhine.c
drivers/net/ethernet/xilinx/Kconfig
drivers/net/ethernet/xilinx/xilinx_axienet_main.c
drivers/net/ethernet/xscale/ixp4xx_eth.c
drivers/net/ieee802154/fakehard.c
drivers/net/ifb.c
drivers/net/netconsole.c
drivers/net/phy/phy_device.c
drivers/net/tun.c
drivers/net/usb/asix.h
drivers/net/usb/asix_common.c
drivers/net/usb/asix_devices.c
drivers/net/usb/ax88172a.c
drivers/net/usb/dm9601.c
drivers/net/usb/kalmia.c
drivers/net/usb/pegasus.c
drivers/net/usb/qmi_wwan.c
drivers/net/usb/rndis_host.c
drivers/net/veth.c
drivers/net/virtio_net.c
drivers/net/vmxnet3/vmxnet3_drv.c
drivers/net/vmxnet3/vmxnet3_ethtool.c
drivers/net/vmxnet3/vmxnet3_int.h
drivers/net/vxlan.c
drivers/net/wimax/i2400m/fw.c
drivers/net/wireless/ath/Kconfig
drivers/net/wireless/ath/Makefile
drivers/net/wireless/ath/ath9k/Kconfig
drivers/net/wireless/ath/ath9k/ar9003_hw.c
drivers/net/wireless/ath/carl9170/fw.c
drivers/net/wireless/ath/wil6210/Kconfig [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/Makefile [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/cfg80211.c [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/dbg_hexdump.h [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/debugfs.c [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/interrupt.c [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/main.c [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/netdev.c [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/pcie_bus.c [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/txrx.c [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/txrx.h [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/wil6210.h [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/wmi.c [new file with mode: 0644]
drivers/net/wireless/ath/wil6210/wmi.h [new file with mode: 0644]
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43/main.h
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
drivers/net/wireless/brcm80211/brcmsmac/debug.h
drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
drivers/net/wireless/ipw2x00/ipw2200.c
drivers/net/wireless/iwlegacy/3945-mac.c
drivers/net/wireless/iwlwifi/dvm/tx.c
drivers/net/wireless/iwlwifi/pcie/rx.c
drivers/net/wireless/mwifiex/cfg80211.c
drivers/net/wireless/mwifiex/sta_ioctl.c
drivers/net/wireless/mwl8k.c
drivers/net/wireless/orinoco/main.c
drivers/net/wireless/p54/p54usb.c
drivers/net/wireless/rtlwifi/pci.c
drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
drivers/net/wireless/rtlwifi/rtl8192de/trx.c
drivers/net/wireless/rtlwifi/rtl8192se/trx.c
drivers/net/wireless/rtlwifi/rtl8723ae/phy.c
drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
drivers/net/wireless/rtlwifi/usb.c
drivers/net/xen-netback/interface.c
drivers/net/xen-netfront.c
drivers/nfc/pn544/i2c.c
drivers/of/of_mdio.c
drivers/parisc/dino.c
drivers/parisc/lba_pci.c
drivers/parport/parport_gsc.c
drivers/parport/parport_pc.c
drivers/parport/parport_serial.c
drivers/parport/parport_sunbpp.c
drivers/pci/iov.c
drivers/pci/pci-sysfs.c
drivers/pci/pcie/portdrv_pci.c
drivers/pci/quirks.c
drivers/pinctrl/core.c
drivers/pinctrl/mvebu/pinctrl-armada-370.c
drivers/pinctrl/mvebu/pinctrl-armada-xp.c
drivers/pinctrl/mvebu/pinctrl-dove.c
drivers/pinctrl/mvebu/pinctrl-kirkwood.c
drivers/pinctrl/mvebu/pinctrl-mvebu.c
drivers/pinctrl/pinctrl-at91.c
drivers/pinctrl/pinctrl-bcm2835.c
drivers/pinctrl/pinctrl-exynos5440.c
drivers/pinctrl/pinctrl-imx.c
drivers/pinctrl/pinctrl-imx23.c
drivers/pinctrl/pinctrl-imx28.c
drivers/pinctrl/pinctrl-imx35.c
drivers/pinctrl/pinctrl-imx51.c
drivers/pinctrl/pinctrl-imx53.c
drivers/pinctrl/pinctrl-imx6q.c
drivers/pinctrl/pinctrl-mmp2.c
drivers/pinctrl/pinctrl-mxs.c
drivers/pinctrl/pinctrl-nomadik-db8500.c
drivers/pinctrl/pinctrl-nomadik-db8540.c
drivers/pinctrl/pinctrl-nomadik-stn8815.c
drivers/pinctrl/pinctrl-nomadik.c
drivers/pinctrl/pinctrl-pxa168.c
drivers/pinctrl/pinctrl-pxa910.c
drivers/pinctrl/pinctrl-samsung.c
drivers/pinctrl/pinctrl-single.c
drivers/pinctrl/pinctrl-sirf.c
drivers/pinctrl/pinctrl-tegra.c
drivers/pinctrl/pinctrl-tegra20.c
drivers/pinctrl/pinctrl-tegra30.c
drivers/pinctrl/pinctrl-u300.c
drivers/pinctrl/pinctrl-xway.c
drivers/pinctrl/spear/pinctrl-plgpio.c
drivers/pinctrl/spear/pinctrl-spear.c
drivers/pinctrl/spear/pinctrl-spear.h
drivers/pinctrl/spear/pinctrl-spear1310.c
drivers/pinctrl/spear/pinctrl-spear1340.c
drivers/pinctrl/spear/pinctrl-spear300.c
drivers/pinctrl/spear/pinctrl-spear310.c
drivers/pinctrl/spear/pinctrl-spear320.c
drivers/platform/x86/acer-wmi.c
drivers/platform/x86/acerhdf.c
drivers/platform/x86/amilo-rfkill.c
drivers/platform/x86/apple-gmux.c
drivers/platform/x86/asus-laptop.c
drivers/platform/x86/compal-laptop.c
drivers/platform/x86/dell-laptop.c
drivers/platform/x86/eeepc-laptop.c
drivers/platform/x86/fujitsu-tablet.c
drivers/platform/x86/hp-wmi.c
drivers/platform/x86/ideapad-laptop.c
drivers/platform/x86/intel_mid_powerbtn.c
drivers/platform/x86/intel_mid_thermal.c
drivers/platform/x86/intel_oaktrail.c
drivers/platform/x86/intel_pmic_gpio.c
drivers/platform/x86/samsung-laptop.c
drivers/platform/x86/samsung-q10.c
drivers/platform/x86/sony-laptop.c
drivers/platform/x86/tc1100-wmi.c
drivers/platform/x86/thinkpad_acpi.c
drivers/platform/x86/toshiba_acpi.c
drivers/platform/x86/xo1-rfkill.c
drivers/pnp/interface.c
drivers/pnp/manager.c
drivers/power/ab8500_bmdata.c
drivers/power/avs/smartreflex.c
drivers/power/olpc_battery.c
drivers/power/reset/gpio-poweroff.c
drivers/power/rx51_battery.c
drivers/pps/clients/pps-gpio.c
drivers/ps3/ps3-lpm.c
drivers/ps3/ps3-sys-manager.c
drivers/ps3/ps3av.c
drivers/regulator/anatop-regulator.c
drivers/regulator/da9055-regulator.c
drivers/regulator/fixed.c
drivers/regulator/gpio-regulator.c
drivers/regulator/max8973-regulator.c
drivers/regulator/palmas-regulator.c
drivers/regulator/twl-regulator.c
drivers/remoteproc/omap_remoteproc.c
drivers/rpmsg/virtio_rpmsg_bus.c
drivers/rtc/Kconfig
drivers/rtc/Makefile
drivers/rtc/rtc-88pm80x.c
drivers/rtc/rtc-88pm860x.c
drivers/rtc/rtc-ab8500.c
drivers/rtc/rtc-at91sam9.c
drivers/rtc/rtc-au1xxx.c
drivers/rtc/rtc-bfin.c
drivers/rtc/rtc-bq32k.c
drivers/rtc/rtc-bq4802.c
drivers/rtc/rtc-cmos.c
drivers/rtc/rtc-da9052.c
drivers/rtc/rtc-da9055.c
drivers/rtc/rtc-davinci.c
drivers/rtc/rtc-dm355evm.c
drivers/rtc/rtc-ds1286.c
drivers/rtc/rtc-ds1302.c
drivers/rtc/rtc-ds1305.c
drivers/rtc/rtc-ds1307.c
drivers/rtc/rtc-ds1374.c
drivers/rtc/rtc-ds1390.c
drivers/rtc/rtc-ds1511.c
drivers/rtc/rtc-ds1553.c
drivers/rtc/rtc-ds1742.c
drivers/rtc/rtc-ds3232.c
drivers/rtc/rtc-ds3234.c
drivers/rtc/rtc-ep93xx.c
drivers/rtc/rtc-fm3130.c
drivers/rtc/rtc-imxdi.c
drivers/rtc/rtc-jz4740.c
drivers/rtc/rtc-lpc32xx.c
drivers/rtc/rtc-ls1x.c
drivers/rtc/rtc-m41t93.c
drivers/rtc/rtc-m41t94.c
drivers/rtc/rtc-m48t35.c
drivers/rtc/rtc-m48t59.c
drivers/rtc/rtc-m48t86.c
drivers/rtc/rtc-max6902.c
drivers/rtc/rtc-max8907.c
drivers/rtc/rtc-max8925.c
drivers/rtc/rtc-max8998.c
drivers/rtc/rtc-mpc5121.c
drivers/rtc/rtc-mrst.c
drivers/rtc/rtc-mv.c
drivers/rtc/rtc-mxc.c
drivers/rtc/rtc-nuc900.c
drivers/rtc/rtc-pcap.c
drivers/rtc/rtc-pcf2123.c
drivers/rtc/rtc-pcf50633.c
drivers/rtc/rtc-pcf8563.c
drivers/rtc/rtc-pcf8583.c
drivers/rtc/rtc-pm8xxx.c
drivers/rtc/rtc-puv3.c
drivers/rtc/rtc-r9701.c
drivers/rtc/rtc-rc5t583.c
drivers/rtc/rtc-rs5c313.c
drivers/rtc/rtc-rs5c348.c
drivers/rtc/rtc-rv3029c2.c
drivers/rtc/rtc-rx8025.c
drivers/rtc/rtc-rx8581.c
drivers/rtc/rtc-s3c.c
drivers/rtc/rtc-snvs.c
drivers/rtc/rtc-spear.c
drivers/rtc/rtc-stk17ta8.c
drivers/rtc/rtc-tegra.c
drivers/rtc/rtc-test.c
drivers/rtc/rtc-tile.c
drivers/rtc/rtc-tps6586x.c [new file with mode: 0644]
drivers/rtc/rtc-tps65910.c
drivers/rtc/rtc-twl.c
drivers/rtc/rtc-vr41xx.c
drivers/rtc/rtc-vt8500.c
drivers/rtc/rtc-wm831x.c
drivers/rtc/rtc-wm8350.c
drivers/s390/block/dasd_diag.c
drivers/s390/block/dasd_eckd.c
drivers/s390/block/dasd_fba.c
drivers/s390/char/con3215.c
drivers/s390/char/raw3270.c
drivers/s390/char/sclp.c
drivers/s390/char/tape_34xx.c
drivers/s390/char/tape_3590.c
drivers/s390/char/vmur.c
drivers/s390/cio/chsc_sch.c
drivers/s390/cio/cio.c
drivers/s390/cio/device.c
drivers/s390/cio/device.h
drivers/s390/cio/eadm_sch.c
drivers/s390/cio/qdio_thinint.c
drivers/s390/crypto/ap_bus.c
drivers/s390/kvm/kvm_virtio.c
drivers/s390/net/Kconfig
drivers/s390/net/claw.c
drivers/s390/net/ctcm_main.c
drivers/s390/net/lcs.c
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_core_mpc.c
drivers/s390/net/qeth_core_mpc.h
drivers/s390/net/qeth_core_sys.c
drivers/s390/net/qeth_l2_main.c
drivers/s390/net/qeth_l3_main.c
drivers/sbus/char/bbc_i2c.c
drivers/sbus/char/display7seg.c
drivers/sbus/char/envctrl.c
drivers/sbus/char/flash.c
drivers/sbus/char/uctrl.c
drivers/scsi/3w-9xxx.c
drivers/scsi/3w-sas.c
drivers/scsi/3w-xxxx.c
drivers/scsi/BusLogic.c
drivers/scsi/NCR5380.c
drivers/scsi/NCR_D700.c
drivers/scsi/NCR_Q720.c
drivers/scsi/a100u2w.c
drivers/scsi/a2091.c
drivers/scsi/aacraid/linit.c
drivers/scsi/advansys.c
drivers/scsi/aha152x.c
drivers/scsi/aha1740.c
drivers/scsi/aic94xx/aic94xx_init.c
drivers/scsi/arm/acornscsi.c
drivers/scsi/arm/arxescsi.c
drivers/scsi/arm/cumana_1.c
drivers/scsi/arm/cumana_2.c
drivers/scsi/arm/eesox.c
drivers/scsi/arm/oak.c
drivers/scsi/arm/powertec.c
drivers/scsi/atp870u.c
drivers/scsi/be2iscsi/be_main.c
drivers/scsi/bfa/bfad.c
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
drivers/scsi/bnx2i/bnx2i_init.c
drivers/scsi/bvme6000_scsi.c
drivers/scsi/csiostor/csio_init.c
drivers/scsi/dc395x.c
drivers/scsi/dmx3191d.c
drivers/scsi/fdomain.c
drivers/scsi/fnic/fnic_main.c
drivers/scsi/g_NCR5380.c
drivers/scsi/gdth.c
drivers/scsi/gvp11.c
drivers/scsi/hpsa.c
drivers/scsi/hptiop.c
drivers/scsi/ibmvscsi/ibmvfc.c
drivers/scsi/ibmvscsi/ibmvscsi.c
drivers/scsi/ibmvscsi/ibmvstgt.c
drivers/scsi/initio.c
drivers/scsi/ipr.c
drivers/scsi/ips.c
drivers/scsi/isci/init.c
drivers/scsi/jazz_esp.c
drivers/scsi/lasi700.c
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/mac_esp.c
drivers/scsi/megaraid.c
drivers/scsi/megaraid/megaraid_mbox.c
drivers/scsi/megaraid/megaraid_sas_base.c
drivers/scsi/mpt2sas/mpt2sas_scsih.c
drivers/scsi/mpt3sas/mpt3sas_scsih.c
drivers/scsi/mvme16x_scsi.c
drivers/scsi/mvsas/mv_64xx.c
drivers/scsi/mvsas/mv_94xx.c
drivers/scsi/mvsas/mv_chips.h
drivers/scsi/mvsas/mv_init.c
drivers/scsi/mvsas/mv_sas.c
drivers/scsi/mvsas/mv_sas.h
drivers/scsi/mvumi.c
drivers/scsi/nsp32.c
drivers/scsi/pm8001/pm8001_hwi.c
drivers/scsi/pm8001/pm8001_init.c
drivers/scsi/pmcraid.c
drivers/scsi/ps3rom.c
drivers/scsi/qla1280.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/qla4xxx/ql4_os.c
drivers/scsi/qlogicfas.c
drivers/scsi/qlogicpti.c
drivers/scsi/sgiwd93.c
drivers/scsi/sim710.c
drivers/scsi/sni_53c710.c
drivers/scsi/stex.c
drivers/scsi/sun3x_esp.c
drivers/scsi/sun_esp.c
drivers/scsi/sym53c416.c
drivers/scsi/sym53c8xx_2/sym_glue.c
drivers/scsi/tmscsim.c
drivers/scsi/ufs/ufshcd.c
drivers/scsi/virtio_scsi.c
drivers/scsi/vmw_pvscsi.c
drivers/scsi/zalon.c
drivers/scsi/zorro7xx.c
drivers/sh/pfc/gpio.c
drivers/sh/pfc/pinctrl.c
drivers/sn/ioc3.c
drivers/ssb/Kconfig
drivers/ssb/driver_gige.c
drivers/ssb/driver_pcicore.c
drivers/ssb/main.c
drivers/ssb/pcihost_wrapper.c
drivers/staging/comedi/Kconfig
drivers/staging/comedi/comedi_fops.c
drivers/staging/comedi/drivers/comedi_test.c
drivers/staging/comedi/drivers/ni_pcimio.c
drivers/staging/et131x/et131x.c
drivers/staging/fwserial/Kconfig
drivers/staging/fwserial/TODO
drivers/staging/fwserial/fwserial.c
drivers/staging/fwserial/fwserial.h
drivers/staging/iio/gyro/Kconfig
drivers/staging/imx-drm/imx-drm-core.c
drivers/staging/imx-drm/ipu-v3/ipu-common.c
drivers/staging/imx-drm/ipuv3-crtc.c
drivers/staging/omapdrm/Makefile
drivers/staging/omapdrm/TODO
drivers/staging/omapdrm/omap_connector.c
drivers/staging/omapdrm/omap_crtc.c
drivers/staging/omapdrm/omap_drv.c
drivers/staging/omapdrm/omap_drv.h
drivers/staging/omapdrm/omap_encoder.c
drivers/staging/omapdrm/omap_gem_dmabuf.c
drivers/staging/omapdrm/omap_irq.c [new file with mode: 0644]
drivers/staging/omapdrm/omap_plane.c
drivers/staging/rtl8187se/r8180_core.c
drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c
drivers/staging/rtl8192e/rtl8192e/rtl_core.c
drivers/staging/rtl8712/usb_intf.c
drivers/staging/sb105x/Kconfig
drivers/staging/sb105x/sb_pci_mp.c
drivers/staging/speakup/synth.c
drivers/staging/tidspbridge/core/_tiomap.h
drivers/staging/tidspbridge/core/dsp-clock.c
drivers/staging/tidspbridge/core/wdt.c
drivers/staging/vme/devices/vme_pio2_core.c
drivers/staging/wlan-ng/cfg80211.c
drivers/staging/zram/zram_drv.c
drivers/thermal/exynos_thermal.c
drivers/usb/Kconfig
drivers/usb/chipidea/host.c
drivers/usb/class/cdc-acm.c
drivers/usb/core/hub.c
drivers/usb/core/quirks.c
drivers/usb/dwc3/debugfs.c
drivers/usb/gadget/amd5536udc.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/mv_udc_core.c
drivers/usb/gadget/s3c-hsotg.c
drivers/usb/gadget/tcm_usb_gadget.c
drivers/usb/gadget/u_serial.c
drivers/usb/host/ehci-fsl.c
drivers/usb/host/ehci-mv.c
drivers/usb/host/ehci-orion.c
drivers/usb/host/ehci-pci.c
drivers/usb/host/fsl-mph-dr-of.c
drivers/usb/host/imx21-hcd.c
drivers/usb/host/ohci-tmio.c
drivers/usb/host/xhci-hub.c
drivers/usb/host/xhci-mem.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
drivers/usb/misc/usbtest.c
drivers/usb/musb/musb_core.c
drivers/usb/musb/musb_dsps.c
drivers/usb/otg/Kconfig
drivers/usb/otg/mv_otg.c
drivers/usb/renesas_usbhs/mod_gadget.c
drivers/usb/renesas_usbhs/mod_host.c
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio_ids.h
drivers/usb/serial/option.c
drivers/video/acornfb.c
drivers/video/arcfb.c
drivers/video/arkfb.c
drivers/video/asiliantfb.c
drivers/video/aty/aty128fb.c
drivers/video/aty/atyfb_base.c
drivers/video/aty/mach64_ct.c
drivers/video/aty/mach64_cursor.c
drivers/video/aty/radeon_base.c
drivers/video/aty/radeon_monitor.c
drivers/video/au1100fb.c
drivers/video/au1200fb.c
drivers/video/auo_k1900fb.c
drivers/video/auo_k1901fb.c
drivers/video/auo_k190x.c
drivers/video/bf537-lq035.c
drivers/video/bf54x-lq043fb.c
drivers/video/bfin-lq035q1-fb.c
drivers/video/bfin-t350mcqb-fb.c
drivers/video/bfin_adv7393fb.c
drivers/video/broadsheetfb.c
drivers/video/bw2.c
drivers/video/carminefb.c
drivers/video/cg14.c
drivers/video/cg3.c
drivers/video/cg6.c
drivers/video/chipsfb.c
drivers/video/cirrusfb.c
drivers/video/clps711xfb.c
drivers/video/cobalt_lcdfb.c
drivers/video/console/sticore.c
drivers/video/cyber2000fb.c
drivers/video/da8xx-fb.c
drivers/video/dnfb.c
drivers/video/efifb.c
drivers/video/ep93xx-fb.c
drivers/video/exynos/exynos_dp_core.c
drivers/video/exynos/exynos_mipi_dsi.c
drivers/video/ffb.c
drivers/video/fm2fb.c
drivers/video/fsl-diu-fb.c
drivers/video/gbefb.c
drivers/video/geode/gx1fb_core.c
drivers/video/geode/gxfb_core.c
drivers/video/geode/lxfb_core.c
drivers/video/grvga.c
drivers/video/gxt4500.c
drivers/video/hecubafb.c
drivers/video/hgafb.c
drivers/video/hitfb.c
drivers/video/hpfb.c
drivers/video/i740fb.c
drivers/video/i810/i810_main.c
drivers/video/i810/i810_main.h
drivers/video/igafb.c
drivers/video/imsttfb.c
drivers/video/imxfb.c
drivers/video/intelfb/intelfbdrv.c
drivers/video/jz4740_fb.c
drivers/video/kyro/fbdev.c
drivers/video/leo.c
drivers/video/mb862xx/mb862xxfbdrv.c
drivers/video/mbx/mbxdebugfs.c
drivers/video/mbx/mbxfb.c
drivers/video/metronomefb.c
drivers/video/msm/mddi.c
drivers/video/mxsfb.c
drivers/video/neofb.c
drivers/video/nuc900fb.c
drivers/video/nvidia/nvidia.c
drivers/video/omap/lcd_mipid.c
drivers/video/omap2/displays/panel-acx565akm.c
drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
drivers/video/omap2/displays/panel-n8x0.c
drivers/video/omap2/displays/panel-nec-nl8048hl11-01b.c
drivers/video/omap2/displays/panel-tpo-td043mtea1.c
drivers/video/p9100.c
drivers/video/platinumfb.c
drivers/video/pm2fb.c
drivers/video/pm3fb.c
drivers/video/pmag-ba-fb.c
drivers/video/pmagb-b-fb.c
drivers/video/ps3fb.c
drivers/video/pvr2fb.c
drivers/video/pxa168fb.c
drivers/video/pxa3xx-gcu.c
drivers/video/pxafb.c
drivers/video/q40fb.c
drivers/video/riva/fbdev.c
drivers/video/riva/rivafb-i2c.c
drivers/video/s1d13xxxfb.c
drivers/video/s3c-fb.c
drivers/video/s3c2410fb.c
drivers/video/s3fb.c
drivers/video/sa1100fb.c
drivers/video/savage/savagefb_driver.c
drivers/video/sgivwfb.c
drivers/video/sh7760fb.c
drivers/video/sh_mipi_dsi.c
drivers/video/sh_mobile_lcdcfb.c
drivers/video/sh_mobile_meram.c
drivers/video/sis/sis_main.c
drivers/video/sis/sis_main.h
drivers/video/skeletonfb.c
drivers/video/sm501fb.c
drivers/video/ssd1307fb.c
drivers/video/sstfb.c
drivers/video/sunxvr1000.c
drivers/video/sunxvr2500.c
drivers/video/sunxvr500.c
drivers/video/tcx.c
drivers/video/tdfxfb.c
drivers/video/tgafb.c
drivers/video/tmiofb.c
drivers/video/tridentfb.c
drivers/video/uvesafb.c
drivers/video/vermilion/vermilion.c
drivers/video/vfb.c
drivers/video/vga16fb.c
drivers/video/via/dvi.c
drivers/video/via/dvi.h
drivers/video/via/hw.c
drivers/video/via/hw.h
drivers/video/via/lcd.c
drivers/video/via/lcd.h
drivers/video/via/via-core.c
drivers/video/via/via-gpio.c
drivers/video/via/viafbdev.c
drivers/video/vt8500lcdfb.c
drivers/video/vt8623fb.c
drivers/video/w100fb.c
drivers/video/wm8505fb.c
drivers/video/wmt_ge_rops.c
drivers/video/xen-fbfront.c
drivers/video/xilinxfb.c
drivers/virtio/virtio_balloon.c
drivers/virtio/virtio_mmio.c
drivers/virtio/virtio_pci.c
drivers/vlynq/vlynq.c
drivers/w1/masters/mxc_w1.c
drivers/watchdog/da9055_wdt.c
drivers/watchdog/omap_wdt.c
drivers/watchdog/twl4030_wdt.c
drivers/xen/grant-table.c
drivers/xen/platform-pci.c
drivers/xen/xen-pciback/pci_stub.c
drivers/zorro/zorro-driver.c
fs/buffer.c
fs/cifs/cifsfs.c
fs/cifs/cifsglob.h
fs/cifs/file.c
fs/cifs/smb1ops.c
fs/cifs/smb2ops.c
fs/cifs/transport.c
fs/debugfs/inode.c
fs/ecryptfs/crypto.c
fs/ecryptfs/kthread.c
fs/ecryptfs/mmap.c
fs/eventpoll.c
fs/exec.c
fs/ext4/Kconfig
fs/ext4/extents.c
fs/ext4/file.c
fs/ext4/fsync.c
fs/ext4/inode.c
fs/ext4/namei.c
fs/ext4/super.c
fs/f2fs/data.c
fs/f2fs/dir.c
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/gc.c
fs/f2fs/hash.c
fs/f2fs/inode.c
fs/f2fs/namei.c
fs/f2fs/node.c
fs/f2fs/recovery.c
fs/f2fs/segment.c
fs/f2fs/segment.h
fs/f2fs/super.c
fs/f2fs/xattr.c
fs/file.c
fs/gfs2/lock_dlm.c
fs/gfs2/rgrp.c
fs/jbd2/transaction.c
fs/nfs/callback_proc.c
fs/nfs/dir.c
fs/nfs/nfs4proc.c
fs/nfs/pnfs.c
fs/nfs/read.c
fs/nfs/super.c
fs/nfs/write.c
fs/proc/task_mmu.c
fs/pstore/ram.c
fs/pstore/ram_core.c
fs/seq_file.c
fs/splice.c
include/Kbuild
include/asm-generic/parport.h
include/asm-generic/tlb.h
include/drm/drm_mm.h
include/drm/exynos_drm.h
include/linux/Kbuild [deleted file]
include/linux/ata_platform.h
include/linux/audit.h
include/linux/bcma/bcma_driver_chipcommon.h
include/linux/bcma/bcma_driver_gmac_cmn.h
include/linux/bcma/bcma_driver_pci.h
include/linux/compaction.h
include/linux/cpu_rmap.h
include/linux/cred.h
include/linux/etherdevice.h
include/linux/hdlc/Kbuild [deleted file]
include/linux/hsi/Kbuild [deleted file]
include/linux/in6.h
include/linux/init.h
include/linux/interrupt.h
include/linux/ipc_namespace.h
include/linux/ipv6.h
include/linux/jbd2.h
include/linux/lockdep.h
include/linux/mempolicy.h
include/linux/mm.h
include/linux/mmzone.h
include/linux/mroute.h
include/linux/mroute6.h
include/linux/msg.h
include/linux/namei.h
include/linux/netdevice.h
include/linux/netpoll.h
include/linux/pci_ids.h
include/linux/phy.h
include/linux/pstore_ram.h
include/linux/raid/Kbuild [deleted file]
include/linux/random.h
include/linux/rbtree_augmented.h
include/linux/rwsem.h
include/linux/security.h
include/linux/skbuff.h
include/linux/usb/Kbuild [deleted file]
include/net/act_api.h
include/net/addrconf.h
include/net/dsfield.h
include/net/inet6_hashtables.h
include/net/inet_hashtables.h
include/net/ip6_checksum.h
include/net/ip6_fib.h
include/net/ip6_route.h
include/net/ipv6.h
include/net/ndisc.h
include/net/netevent.h
include/net/netfilter/nf_conntrack_core.h
include/net/netfilter/nf_tproxy_core.h
include/net/netns/conntrack.h
include/net/netns/x_tables.h
include/net/pkt_cls.h
include/net/sch_generic.h
include/net/sock.h
include/rdma/Kbuild [deleted file]
include/sound/Kbuild [deleted file]
include/sound/cs4271.h
include/sound/soc.h
include/trace/events/ext4.h
include/uapi/asm-generic/socket.h
include/uapi/drm/exynos_drm.h
include/uapi/drm/i915_drm.h
include/uapi/linux/audit.h
include/uapi/linux/in6.h
include/uapi/linux/ipv6.h
include/uapi/linux/mroute.h
include/uapi/linux/mroute6.h
include/uapi/linux/msg.h
include/uapi/linux/pci_regs.h
include/uapi/linux/virtio_net.h
ipc/compat.c
ipc/ipc_sysctl.c
ipc/msg.c
ipc/msgutil.c
ipc/util.c
ipc/util.h
kernel/audit.c
kernel/audit_tree.c
kernel/audit_watch.c
kernel/auditfilter.c
kernel/auditsc.c
kernel/printk.c
kernel/rwsem.c
kernel/signal.c
kernel/softirq.c
kernel/trace/trace.c
lib/Kconfig.debug
lib/cpu_rmap.c
lib/rbtree.c
mm/bootmem.c
mm/compaction.c
mm/huge_memory.c
mm/internal.h
mm/memblock.c
mm/memory.c
mm/mempolicy.c
mm/migrate.c
mm/mmap.c
mm/page_alloc.c
mm/page_isolation.c
mm/shmem.c
mm/vmscan.c
net/Kconfig
net/batman-adv/bat_algo.h
net/batman-adv/bat_iv_ogm.c
net/batman-adv/bitarray.c
net/batman-adv/bitarray.h
net/batman-adv/bridge_loop_avoidance.c
net/batman-adv/bridge_loop_avoidance.h
net/batman-adv/debugfs.c
net/batman-adv/debugfs.h
net/batman-adv/distributed-arp-table.c
net/batman-adv/distributed-arp-table.h
net/batman-adv/gateway_client.c
net/batman-adv/gateway_client.h
net/batman-adv/gateway_common.c
net/batman-adv/gateway_common.h
net/batman-adv/hard-interface.c
net/batman-adv/hard-interface.h
net/batman-adv/hash.c
net/batman-adv/hash.h
net/batman-adv/icmp_socket.c
net/batman-adv/icmp_socket.h
net/batman-adv/main.c
net/batman-adv/main.h
net/batman-adv/originator.c
net/batman-adv/originator.h
net/batman-adv/packet.h
net/batman-adv/ring_buffer.c
net/batman-adv/ring_buffer.h
net/batman-adv/routing.c
net/batman-adv/routing.h
net/batman-adv/send.c
net/batman-adv/send.h
net/batman-adv/soft-interface.c
net/batman-adv/soft-interface.h
net/batman-adv/sysfs.c
net/batman-adv/sysfs.h
net/batman-adv/translation-table.c
net/batman-adv/translation-table.h
net/batman-adv/types.h
net/batman-adv/unicast.c
net/batman-adv/unicast.h
net/batman-adv/vis.c
net/batman-adv/vis.h
net/bridge/br_multicast.c
net/bridge/br_netlink.c
net/bridge/br_private.h
net/ceph/messenger.c
net/ceph/osd_client.c
net/core/dev.c
net/core/ethtool.c
net/core/filter.c
net/core/flow.c
net/core/flow_dissector.c
net/core/neighbour.c
net/core/net-sysfs.c
net/core/netpoll.c
net/core/request_sock.c
net/core/skbuff.c
net/core/sock.c
net/dsa/dsa.c
net/dsa/slave.c
net/ethernet/eth.c
net/ieee802154/6lowpan.c
net/ipv4/af_inet.c
net/ipv4/devinet.c
net/ipv4/fib_frontend.c
net/ipv4/inet_connection_sock.c
net/ipv4/inet_hashtables.c
net/ipv4/ip_fragment.c
net/ipv4/ip_sockglue.c
net/ipv4/ipconfig.c
net/ipv4/ipmr.c
net/ipv4/netfilter/arp_tables.c
net/ipv4/netfilter/ip_tables.c
net/ipv4/netfilter/ipt_REJECT.c
net/ipv4/netfilter/iptable_nat.c
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/udp.c
net/ipv6/Makefile
net/ipv6/addrconf.c
net/ipv6/af_inet6.c
net/ipv6/datagram.c
net/ipv6/exthdrs.c
net/ipv6/inet6_connection_sock.c
net/ipv6/inet6_hashtables.c
net/ipv6/ip6_checksum.c [new file with mode: 0644]
net/ipv6/ip6_gre.c
net/ipv6/ip6_input.c
net/ipv6/ip6_output.c
net/ipv6/ip6_tunnel.c
net/ipv6/ip6mr.c
net/ipv6/mcast.c
net/ipv6/ndisc.c
net/ipv6/netfilter/ip6_tables.c
net/ipv6/netfilter/ip6t_NPT.c
net/ipv6/netfilter/ip6t_REJECT.c
net/ipv6/netfilter/ip6table_nat.c
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
net/ipv6/netfilter/nf_conntrack_reasm.c
net/ipv6/route.c
net/ipv6/sit.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/ipv6/xfrm6_policy.c
net/ipv6/xfrm6_tunnel.c
net/iucv/iucv.c
net/mac80211/cfg.c
net/mac80211/chan.c
net/mac80211/ibss.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/mesh.c
net/mac80211/mesh.h
net/mac80211/mlme.c
net/mac80211/scan.c
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/mac802154/wpan.c
net/netfilter/Kconfig
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nf_conntrack_standalone.c
net/netfilter/nfnetlink_log.c
net/netfilter/x_tables.c
net/netfilter/xt_CT.c
net/netfilter/xt_hashlimit.c
net/netfilter/xt_recent.c
net/netlink/af_netlink.c
net/openvswitch/datapath.c
net/rxrpc/af_rxrpc.c
net/sched/act_api.c
net/sched/act_csum.c
net/sched/act_gact.c
net/sched/act_ipt.c
net/sched/act_mirred.c
net/sched/act_nat.c
net/sched/act_pedit.c
net/sched/act_police.c
net/sched/act_simple.c
net/sched/act_skbedit.c
net/sched/cls_api.c
net/sched/cls_basic.c
net/sched/cls_cgroup.c
net/sched/cls_flow.c
net/sched/cls_fw.c
net/sched/cls_route.c
net/sched/cls_rsvp.h
net/sched/cls_tcindex.c
net/sched/cls_u32.c
net/sctp/Kconfig
net/sunrpc/clnt.c
net/sunrpc/sched.c
net/sunrpc/xprt.c
net/unix/af_unix.c
net/wireless/core.c
samples/rpmsg/rpmsg_client_sample.c
scripts/headers_install.pl
scripts/kernel-doc
security/capability.c
security/integrity/ima/ima.h
security/integrity/ima/ima_main.c
security/integrity/ima/ima_policy.c
security/security.c
security/selinux/hooks.c
security/selinux/include/classmap.h
security/selinux/include/objsec.h
sound/arm/pxa2xx-ac97-lib.c
sound/oss/pas2_card.c
sound/pci/au88x0/au88x0_synth.c
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_intel.c
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_realtek.c
sound/pci/rme9652/hdspm.c
sound/soc/codecs/arizona.c
sound/soc/codecs/arizona.h
sound/soc/codecs/cs4271.c
sound/soc/codecs/cs42l52.c
sound/soc/codecs/lm49453.c
sound/soc/codecs/sgtl5000.c
sound/soc/codecs/sta529.c
sound/soc/codecs/wm2000.c
sound/soc/codecs/wm2200.c
sound/soc/codecs/wm5100.c
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm_adsp.c
sound/soc/soc-core.c
sound/soc/soc-pcm.c
sound/usb/midi.c
sound/usb/mixer_quirks.c
sound/usb/pcm.c
sound/usb/quirks-table.h
sound/usb/quirks.c
sound/usb/usbaudio.h
tools/testing/selftests/ipc/Makefile [new file with mode: 0644]
tools/testing/selftests/ipc/msgque.c [new file with mode: 0644]

index eacafe312cd26e4cad3bcdbcc9bb398d50546f66..7c6638bacedb9290a0fba78e10335b401a5706d7 100644 (file)
@@ -116,7 +116,7 @@ my_suspend              (struct pci_dev *               pci_dev,
        return 0; /* a negative value on error, 0 on success. */
 }
 
-static void __devexit
+static void
 my_remove               (struct pci_dev *               pci_dev)
 {
        my_device *my = pci_get_drvdata (pci_dev);
@@ -124,7 +124,7 @@ my_remove               (struct pci_dev *               pci_dev)
        /* Describe me. */
 }
 
-static int __devinit
+static int
 my_probe                (struct pci_dev *               pci_dev,
                         const struct pci_device_id *   pci_id)
 {
@@ -157,7 +157,7 @@ my_pci_driver = {
        .id_table = my_pci_device_ids,
 
        .probe    = my_probe,
-       .remove   = __devexit_p (my_remove),
+       .remove   = my_remove,
 
        /* Power management functions. */
        .suspend  = my_suspend,
index cfaca7e6989346246e3205c52a353ea960b50ce5..86551cc72e034fc48e63c54c6e662954ca857372 100644 (file)
@@ -76,7 +76,7 @@ To notify SR-IOV core of Virtual Function Migration:
 
 Following piece of code illustrates the usage of the SR-IOV API.
 
-static int __devinit dev_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int dev_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        pci_enable_sriov(dev, NR_VIRTFN);
 
@@ -85,7 +85,7 @@ static int __devinit dev_probe(struct pci_dev *dev, const struct pci_device_id *
        return 0;
 }
 
-static void __devexit dev_remove(struct pci_dev *dev)
+static void dev_remove(struct pci_dev *dev)
 {
        pci_disable_sriov(dev);
 
@@ -131,7 +131,7 @@ static struct pci_driver dev_driver = {
        .name =         "SR-IOV Physical Function driver",
        .id_table =     dev_id_table,
        .probe =        dev_probe,
-       .remove =       __devexit_p(dev_remove),
+       .remove =       dev_remove,
        .suspend =      dev_suspend,
        .resume =       dev_resume,
        .shutdown =     dev_shutdown,
index aa09e5476bba2c1a6ff53223312bc8d11ed23aea..bccf602a87f5c2054b146c826725ac183863a8ad 100644 (file)
@@ -183,12 +183,6 @@ Please mark the initialization and cleanup functions where appropriate
                        initializes.
        __exit          Exit code. Ignored for non-modular drivers.
 
-
-       __devinit       Device initialization code.
-                       Identical to __init if the kernel is not compiled
-                       with CONFIG_HOTPLUG, normal function otherwise.
-       __devexit       The same for __exit.
-
 Tips on when/where to use the above attributes:
        o The module_init()/module_exit() functions (and all
          initialization functions called _only_ from these)
@@ -196,20 +190,6 @@ Tips on when/where to use the above attributes:
 
        o Do not mark the struct pci_driver.
 
-       o The ID table array should be marked __devinitconst; this is done
-         automatically if the table is declared with DEFINE_PCI_DEVICE_TABLE().
-
-       o The probe() and remove() functions should be marked __devinit
-         and __devexit respectively.  All initialization functions
-         exclusively called by the probe() routine, can be marked __devinit.
-         Ditto for remove() and __devexit.
-
-       o If mydriver_remove() is marked with __devexit(), then all address
-         references to mydriver_remove must use __devexit_p(mydriver_remove)
-         (in the struct pci_driver declaration for example).
-         __devexit_p() will generate the function name _or_ NULL if the
-         function will be discarded.  For an example, see drivers/net/tg3.c.
-
        o Do NOT mark a function if you are not sure which mark to use.
          Better to not mark the function than mark the function wrong.
 
index 4f27785ca0c87f8cf0ab4c28c9566595b032ed64..54469bc81b1cbac644e482bd09ebb6c28b77db43 100644 (file)
@@ -185,7 +185,7 @@ input driver:
                        .acpi_match_table  ACPI_PTR(mpu3050_acpi_match),
                },
                .probe          = mpu3050_probe,
-               .remove         = __devexit_p(mpu3050_remove),
+               .remove         = mpu3050_remove,
                .id_table       = mpu3050_ids,
        };
 
index baadbb11fe98c226a269bd374edf43ae6f9de828..5083c0b834b25094fe7d5159cc51238cc37ef921 100644 (file)
@@ -60,11 +60,6 @@ clks: clkctrl@80040000 {
        compatible = "fsl,imx23-clkctrl";
        reg = <0x80040000 0x2000>;
        #clock-cells = <1>;
-       clock-output-names =
-               ...
-               "uart",         /* 32 */
-               ...
-               "end_of_list";
 };
 
 auart0: serial@8006c000 {
index c2a3525ecb4e59e0b781b95e42d173a1a1e29c2d..db4f2f05c4d0f15b32f354a7629e7a0c5a0556b4 100644 (file)
@@ -146,10 +146,6 @@ clks: ccm@53f80000 {
        compatible = "fsl,imx25-ccm";
        reg = <0x53f80000 0x4000>;
        interrupts = <31>;
-       clock-output-names = ...
-                       "uart_ipg",
-                       "uart_serial",
-                       ...;
 };
 
 uart1: serial@43f90000 {
index 52a49a4a50b33e0add4586516b880685da728cb3..e6587af62ff0fe6e740ee8bdeb3f4b32d851c5de 100644 (file)
@@ -83,11 +83,6 @@ clks: clkctrl@80040000 {
        compatible = "fsl,imx28-clkctrl";
        reg = <0x80040000 0x2000>;
        #clock-cells = <1>;
-       clock-output-names =
-               ...
-               "uart",         /* 45 */
-               ...
-               "end_of_list";
 };
 
 auart0: serial@8006a000 {
index d77b4e68dc42b306f22a472c5216623be0ed9a3d..f73fdf595568e30d9e79f0c0ee60d2799b8a5c0d 100644 (file)
@@ -211,10 +211,6 @@ clks: ccm@020c4000 {
        reg = <0x020c4000 0x4000>;
        interrupts = <0 87 0x04 0 88 0x04>;
        #clock-cells = <1>;
-       clock-output-names = ...
-                            "uart_ipg",
-                            "uart_serial",
-                            ...;
 };
 
 uart1: serial@02020000 {
index 558cdf3c9abc8e10539c894a4387fc72c1b32ff3..d4eab9227ea4451bb0eefbd511c22288d5fe336b 100644 (file)
@@ -1,4 +1,19 @@
-GPIO line that should be set high/low to power off a device
+Driver a GPIO line that can be used to turn the power off.
+
+The driver supports both level triggered and edge triggered power off.
+At driver load time, the driver will request the given gpio line and
+install a pm_power_off handler. If the optional properties 'input' is
+not found, the GPIO line will be driven in the inactive
+state. Otherwise its configured as an input.
+
+When the pm_power_off is called, the gpio is configured as an output,
+and drive active, so triggering a level triggered power off
+condition. This will also cause an inactive->active edge condition, so
+triggering positive edge triggered power off. After a delay of 100ms,
+the GPIO is set to inactive, thus causing an active->inactive edge,
+triggering negative edge triggered power off. After another 100ms
+delay the GPIO is driver active again. If the power is still on and
+the CPU still running after a 3000ms delay, a WARN_ON(1) is emitted.
 
 Required properties:
 - compatible : should be "gpio-poweroff".
@@ -13,10 +28,9 @@ Optional properties:
   property is not specified, the GPIO is initialized as an output in its
   inactive state.
 
-
 Examples:
 
 gpio-poweroff {
        compatible = "gpio-poweroff";
-       gpios = <&gpio 4 0>; /* GPIO 4 Active Low */
+       gpios = <&gpio 4 0>;
 };
diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-sirf.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-sirf.txt
new file mode 100644 (file)
index 0000000..c596a6a
--- /dev/null
@@ -0,0 +1,47 @@
+CSR SiRFprimaII pinmux controller
+
+Required properties:
+- compatible   : "sirf,prima2-pinctrl"
+- reg          : Address range of the pinctrl registers
+- interrupts    : Interrupts used by every GPIO group
+- gpio-controller : Indicates this device is a GPIO controller
+- interrupt-controller  : Marks the device node as an interrupt controller
+Optional properties:
+- sirf,pullups : if n-th bit of m-th bank is set, set a pullup on GPIO-n of bank m
+- sirf,pulldowns : if n-th bit of m-th bank is set, set a pulldown on GPIO-n of bank m
+
+Please refer to pinctrl-bindings.txt in this directory for details of the common
+pinctrl bindings used by client devices.
+
+SiRFprimaII's pinmux nodes act as a container for an abitrary number of subnodes.
+Each of these subnodes represents some desired configuration for a group of pins.
+
+Required subnode-properties:
+- sirf,pins : An array of strings. Each string contains the name of a group.
+- sirf,function: A string containing the name of the function to mux to the
+  group.
+
+  Valid values for group and function names can be found from looking at the
+  group and function arrays in driver files:
+  drivers/pinctrl/pinctrl-sirf.c
+
+For example, pinctrl might have subnodes like the following:
+ uart2_pins_a: uart2@0 {
+         uart {
+                 sirf,pins = "uart2grp";
+                 sirf,function = "uart2";
+         };
+ };
+ uart2_noflow_pins_a: uart2@1 {
+         uart {
+                 sirf,pins = "uart2_nostreamctrlgrp";
+                 sirf,function = "uart2_nostreamctrl";
+         };
+ };
+
+For a specific board, if it wants to use uart2 without hardware flow control,
+it can add the following to its board-specific .dts file.
+uart2: uart@0xb0070000 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart2_noflow_pins_a>;
+}
diff --git a/Documentation/devicetree/bindings/watchdog/twl4030-wdt.txt b/Documentation/devicetree/bindings/watchdog/twl4030-wdt.txt
new file mode 100644 (file)
index 0000000..80a3719
--- /dev/null
@@ -0,0 +1,10 @@
+Device tree bindings for twl4030-wdt driver (TWL4030 watchdog)
+
+Required properties:
+       compatible = "ti,twl4030-wdt";
+
+Example:
+
+watchdog {
+       compatible = "ti,twl4030-wdt";
+};
index abf63615ee055393132b738a8a05b600e9aed750..22182660dda762816ad4663588f9e50cb7076622 100644 (file)
@@ -91,7 +91,7 @@ Example (from the nxp OHCI driver):
 
 static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };
 
-static int __devinit usb_hcd_nxp_probe(struct platform_device *pdev)
+static int usb_hcd_nxp_probe(struct platform_device *pdev)
 {
        (...)
        struct i2c_adapter *i2c_adap;
index 2cc3c7733a2f163d9a4b871212a6c782bc5ccb95..258d9b92c36f78780fdb7f04e767158192361258 100644 (file)
@@ -52,8 +52,6 @@ de4x5.txt
        - the Digital EtherWORKS DE4?? and DE5?? PCI Ethernet driver
 decnet.txt
        - info on using the DECnet networking layer in Linux.
-depca.txt
-       - the Digital DEPCA/EtherWORKS DE1?? and DE2?? LANCE Ethernet driver
 dl2k.txt
        - README for D-Link DL2000-based Gigabit Ethernet Adapters (dl2k.ko).
 dm9000.txt
@@ -72,8 +70,6 @@ e1000e.txt
        - README for the Intel Gigabit Ethernet Driver (e1000e).
 eql.txt
        - serial IP load balancing
-ewrk3.txt
-       - the Digital EtherWORKS 3 DE203/4/5 Ethernet driver
 fib_trie.txt
        - Level Compressed Trie (LC-trie) notes: a structure for routing.
 filter.txt
@@ -126,8 +122,6 @@ ltpc.txt
        - the Apple or Farallon LocalTalk PC card driver
 mac80211-injection.txt
        - HOWTO use packet injection with mac80211
-multicast.txt
-       - Behaviour of cards under Multicast
 multiqueue.txt
        - HOWTO for multiqueue network device support.
 netconsole.txt
diff --git a/Documentation/networking/DLINK.txt b/Documentation/networking/DLINK.txt
deleted file mode 100644 (file)
index 55d2443..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-Released 1994-06-13
-
-
-       CONTENTS:
-
-       1. Introduction.
-       2. License.
-       3. Files in this release.
-       4. Installation.
-       5. Problems and tuning.
-       6. Using the drivers with earlier releases.
-       7. Acknowledgments.
-
-
-       1. INTRODUCTION.
-
-       This is a set of Ethernet drivers for the D-Link DE-600/DE-620
-       pocket adapters, for the parallel port on a Linux based machine.
-       Some adapter "clones" will also work.  Xircom is _not_ a clone...
-       These drivers _can_ be used as loadable modules,
-       and were developed for use on Linux 1.1.13 and above.
-       For use on Linux 1.0.X, or earlier releases, see below.
-
-       I have used these drivers for NFS, ftp, telnet and X-clients on
-       remote machines. Transmissions with ftp seems to work as
-       good as can be expected (i.e. > 80k bytes/sec) from a
-       parallel port...:-)  Receive speeds will be about 60-80% of this.
-       Depending on your machine, somewhat higher speeds can be achieved.
-
-       All comments/fixes to Bjorn Ekwall (bj0rn@blox.se).
-
-
-       2. LICENSE.
-
-       This program is free software; you can redistribute it
-       and/or modify it under the terms of the GNU General Public
-       License as published by the Free Software Foundation; either
-       version 2, or (at your option) any later version.
-
-       This program is distributed in the hope that it will be
-       useful, but WITHOUT ANY WARRANTY; without even the implied
-       warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-       PURPOSE. See the GNU General Public License for more
-       details.
-
-       You should have received a copy of the GNU General Public
-       License along with this program; if not, write to the Free
-       Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
-       02139, USA.
-
-
-       3. FILES IN THIS RELEASE.
-
-       README.DLINK  This file.
-       de600.c       The Source (may it be with You :-) for the DE-600
-       de620.c       ditto for the DE-620
-       de620.h       Macros for de620.c
-
-       If you are upgrading from the d-link tar release, there will
-       also be a "dlink-patches" file that will patch Linux 1.1.18:
-               linux/drivers/net/Makefile
-               linux/drivers/net/CONFIG
-               linux/drivers/net/MODULES
-               linux/drivers/net/Space.c
-               linux/config.in
-       Apply the patch by:
-       "cd /usr/src; patch -p0 < linux/drivers/net/dlink-patches"
-       The old source, "linux/drivers/net/d_link.c", can be removed.
-
-
-       4. INSTALLATION.
-
-       o Get the latest net binaries, according to current net.wisdom.
-
-       o Read the NET-2 and Ethernet HOWTOs and modify your setup.
-
-       o If your parallel port has a strange address or irq,
-         modify "linux/drivers/net/CONFIG" accordingly, or adjust
-         the parameters in the "tuning" section in the sources.
-
-       If you are going to use the drivers as loadable modules, do _not_
-       enable them while doing "make config", but instead make sure that
-       the drivers are included in "linux/drivers/net/MODULES".
-
-       If you are _not_ going to use the driver(s) as loadable modules,
-       but instead have them included in the kernel, remember to enable
-       the drivers while doing "make config".
-
-       o To include networking and DE600/DE620 support in your kernel:
-         # cd /linux
-         (as modules:)
-         #  make config (answer yes on CONFIG_NET and CONFIG_INET)
-         (else included in the kernel:)
-         #  make config (answer yes on CONFIG _NET, _INET and _DE600 or _DE620)
-         # make clean
-         # make zImage (or whatever magic you usually do)
-
-       o I use lilo to boot multiple kernels, so that I at least
-         can have one working kernel :-). If you do too, append
-         these lines to /etc/lilo/config:
-
-               image = /linux/zImage
-               label = newlinux
-               root = /dev/hda2 (or whatever YOU have...)
-
-         # /etc/lilo/install
-
-       o Do "sync" and reboot the new kernel with a D-Link
-         DE-600/DE-620 pocket adapter connected.
-
-       o The adapter can be configured with ifconfig eth?
-         where the actual number is decided by the kernel
-         when the drivers are initialized.
-
-
-       5. "PROBLEMS" AND TUNING,
-
-       o If you see error messages from the driver, and if the traffic
-         stops on the adapter, try to do "ifconfig" and "route" once
-         more, just as in "rc.inet1".  This should take care of most
-         problems, including effects from power loss, or adapters that
-         aren't connected to the printer port in some way or another.
-         You can somewhat change the behaviour by enabling/disabling
-         the macro  SHUTDOWN_WHEN_LOST  in the "tuning" section.
-         For the DE-600 there is another macro, CHECK_LOST_DE600,
-         that you might want to read about in the "tuning" section.
-
-       o Some machines have trouble handling the parallel port and
-         the adapter at high speed. If you experience problems:
-
-         DE-600:
-         - The adapter is not recognized at boot, i.e. an Ethernet
-           address of 00:80:c8:... is not shown, try to add another
-             "; SLOW_DOWN_IO"
-           at DE600_SLOW_DOWN in the "tuning" section. As a last resort,
-           uncomment: "#define REALLY_SLOW_IO" (see <asm/io.h> for hints).
-
-         - You experience "timeout" messages: first try to add another
-             "; SLOW_DOWN_IO"
-           at DE600_SLOW_DOWN in the "tuning" section, _then_ try to
-           increase the value (original value: 5) at
-           "if (tickssofar < 5)" near line 422.
-
-         DE-620:
-         - Your parallel port might be "sluggish".  To cater for
-           this, there are the macros LOWSPEED and READ_DELAY/WRITE_DELAY
-           in the "tuning" section. Your first step should be to enable
-           LOWSPEED, and after that you can "tune" the XXX_DELAY values.
-
-       o If the adapter _is_ recognized at boot but you get messages
-         about "Network Unreachable", then the problem is probably
-         _not_ with the driver.  Check your net configuration instead
-         (ifconfig and route) in "rc.inet1".
-
-       o There is some rudimentary support for debugging, look at
-         the source. Use "-DDE600_DEBUG=3" or "-DDE620_DEBUG=3"
-         when compiling, or include it in "linux/drivers/net/CONFIG".
-         IF YOU HAVE PROBLEMS YOU CAN'T SOLVE: PLEASE COMPILE THE DRIVER
-         WITH DEBUGGING ENABLED, AND SEND ME THE RESULTING OUTPUT!
-
-
-       6. USING THE DRIVERS WITH EARLIER RELEASES.
-
-       The later 1.1.X releases of the Linux kernel include some
-       changes in the networking layer (a.k.a. NET3). This affects
-       these drivers in a few places.  The hints that follow are
-       _not_ tested by me, since I don't have the disk space to keep
-       all releases on-line.
-       Known needed changes to date:
-       - release patchfile: some patches will fail, but they should
-         be easy to apply "by hand", since they are trivial.
-         (Space.c: d_link_init() is now called de600_probe())
-       - de600.c: change  "mark_bh(NET_BH)" to  "mark_bh(INET_BH)".
-       - de620.c: (maybe) change the code around "netif_rx(skb);" to be
-                  similar to the code around "dev_rint(...)" in de600.c
-
-
-       7. ACKNOWLEDGMENTS.
-
-       These drivers wouldn't have been done without the base
-       (and support) from Ross Biro, and D-Link Systems Inc.
-       The driver relies upon GPL-ed source from D-Link Systems Inc.
-       and from Russel Nelson at Crynwr Software <nelson@crynwr.com>.
-
-       Additional input also from:
-       Donald Becker <becker@super.org>, Alan Cox <A.Cox@swansea.ac.uk>
-       and Fred N. van Kempen <waltje@uWalt.NL.Mugnet.ORG>
-
-       DE-600 alpha release primary victim^H^H^H^H^H^Htester:
-       - Erik Proper <erikp@cs.kun.nl>.
-       Good input also from several users, most notably
-       - Mark Burton <markb@ordern.demon.co.uk>.
-
-       DE-620 alpha release victims^H^H^H^H^H^H^Htesters:
-       - J. Joshua Kopper <kopper@rtsg.mot.com>
-       - Olav Kvittem <Olav.Kvittem@uninett.no>
-       - Germano Caronni <caronni@nessie.cs.id.ethz.ch>
-       - Jeremy Fitzhardinge <jeremy@suite.sw.oz.au>
-
-
-       Happy hacking!
-
-       Bjorn Ekwall == bj0rn@blox.se
index c725d33b316fbadebb0d93d1fb70c193318ac1a2..0e190180eec88ae1ca3fee9174512e0baa07b032 100644 (file)
@@ -36,7 +36,6 @@ TABLE OF CONTENTS
     4.1 Compiling the Driver as a Loadable Module
     4.2 Compiling the driver to support memory mode
     4.3 Compiling the driver to support Rx DMA 
-    4.4 Compiling the Driver into the Kernel
 
 5.0 TESTING AND TROUBLESHOOTING
     5.1 Known Defects and Limitations
@@ -364,84 +363,6 @@ The compile-time optionality for DMA was removed in the 2.3 kernel
 series.  DMA support is now unconditionally part of the driver.  It is
 enabled by the 'use_dma=1' module option.
 
-4.4 COMPILING THE DRIVER INTO THE KERNEL
-
-If your Linux distribution already has support for the cs89x0 driver
-then simply copy the source file to the /usr/src/linux/drivers/net
-directory to replace the original ones and run the make utility to
-rebuild the kernel.  See Step 3 for rebuilding the kernel.
-
-If your Linux does not include the cs89x0 driver, you need to edit three 
-configuration files, copy the source file to the /usr/src/linux/drivers/net
-directory, and then run the make utility to rebuild the kernel.
-
-1. Edit the following configuration files by adding the statements as
-indicated.  (When possible, try to locate the added text to the section of the
-file containing similar statements).
-
-
-a.) In /usr/src/linux/drivers/net/Config.in, add:
-
-tristate 'CS89x0 support' CONFIG_CS89x0
-
-Example:
-
-     if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-       tristate 'ICL EtherTeam 16i/32 support' CONFIG_ETH16I
-     fi
-
-     tristate 'CS89x0 support' CONFIG_CS89x0
-
-     tristate 'NE2000/NE1000 support' CONFIG_NE2000
-     if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-       tristate 'NI5210 support' CONFIG_NI52
-
-
-b.) In /usr/src/linux/drivers/net/Makefile, add the following lines: 
-
-ifeq ($(CONFIG_CS89x0),y)
-L_OBJS += cs89x0.o
-else
-  ifeq ($(CONFIG_CS89x0),m)
-  M_OBJS += cs89x0.o
-  endif
-endif
-
-
-c.) In /linux/drivers/net/Space.c file, add the line:
-
-extern int cs89x0_probe(struct device *dev);
-
-
-Example:
-
- extern int ultra_probe(struct device *dev);
- extern int wd_probe(struct device *dev);
- extern int el2_probe(struct device *dev);
-
- extern int cs89x0_probe(struct device *dev);
-
- extern int ne_probe(struct device *dev);
- extern int hp_probe(struct device *dev);
- extern int hp_plus_probe(struct device *dev);
-
-
-Also add:
-
- #ifdef CONFIG_CS89x0
-       { cs89x0_probe,0 },
- #endif
-
-
-2.) Copy the driver source files (cs89x0.c and cs89x0.h) 
-into the /usr/src/linux/drivers/net directory.
-
-
-3.) Go to /usr/src/linux directory and run 'make config' followed by 'make' 
-(or make bzImage) to rebuild the kernel. 
-
-4.) Use the DOS 'setup' utility to disable plug and play on the NIC.
-
 
 5.0 TESTING AND TROUBLESHOOTING
 ===============================================================================
diff --git a/Documentation/networking/depca.txt b/Documentation/networking/depca.txt
deleted file mode 100644 (file)
index 24c6b26..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-
-DE10x
-=====
-
-Memory Addresses:
-
-       SW1     SW2     SW3     SW4
-64K    on      on      on      on      d0000   dbfff
-       off     on      on      on      c0000   cbfff
-       off     off     on      on      e0000   ebfff
-
-32K    on      on      off     on      d8000   dbfff
-       off     on      off     on      c8000   cbfff
-       off     off     off     on      e8000   ebfff
-
-DBR ROM        on      on                      dc000   dffff
-       off     on                      cc000   cffff
-       off     off                     ec000   effff
-
-Note  that the 2K  mode   is set  by   SW3/SW4  on/off or  off/off.  Address
-assignment is through the RBSA register.
-
-I/O Address:
-       SW5
-0x300  on
-0x200  off
-
-Remote Boot:
-       SW6
-Disable        on
-Enable off
-
-Remote Boot Timeout:
-       SW7
-2.5min on
-30s    off
-
-IRQ:
-       SW8     SW9     SW10    SW11    SW12
-2      on      off     off     off     off
-3      off     on      off     off     off
-4      off     off     on      off     off
-5      off     off     off     on      off
-7      off     off     off     off     on
-
-DE20x
-=====
-
-Memory Size:
-
-       SW3     SW4
-64K    on      on
-32K    off     on
-2K     on      off
-2K     off     off
-
-Start Addresses:
-
-       SW1     SW2     SW3     SW4
-64K    on      on      on      on      c0000   cffff
-       on      off     on      on      d0000   dffff
-       off     on      on      on      e0000   effff
-
-32K    on      on      off     off     c8000   cffff
-       on      off     off     off     d8000   dffff
-       off     on      off     off     e8000   effff
-
-Illegal        off     off      -       -        -       -
-
-I/O Address:
-       SW5
-0x300  on
-0x200  off
-
-Remote Boot:
-       SW6
-Disable        on
-Enable off
-
-Remote Boot Timeout:
-       SW7
-2.5min on
-30s    off
-
-IRQ:
-       SW8     SW9     SW10    SW11    SW12
-5      on      off     off     off     off
-9      off     on      off     off     off
-10     off     off     on      off     off
-11     off     off     off     on      off
-15     off     off     off     off     on
-
diff --git a/Documentation/networking/ewrk3.txt b/Documentation/networking/ewrk3.txt
deleted file mode 100644 (file)
index 90e9e5f..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-The EtherWORKS 3  driver in this distribution is  designed to  work with all
-kernels   >  1.1.33   (approx)  and  includes  tools   in  the  'ewrk3tools'
-subdirectory   to  allow  set   up of   the   card,  similar  to  the  MSDOS
-'NICSETUP.EXE' tools provided on  the DOS drivers  disk (type 'make' in that
-subdirectory to make the tools).
-
-The supported  cards are DE203,  DE204 and DE205.  All   other cards are NOT
-supported - refer to 'depca.c' for running the LANCE based network cards and
-'de4x5.c'  for the  DIGITAL   Semiconductor PCI  chip  based  adapters  from
-Digital.
-
-The ability to load  this driver as a  loadable module has been included and
-used extensively  during the driver  development (to save those  long reboot
-sequences). To utilise this ability, you have to do 8 things:
-
-    0) have a copy of the loadable modules code installed on your system.
-    1) copy ewrk3.c from the  /linux/drivers/net directory to your favourite
-    temporary directory.
-    2) edit the  source code near  line 1898 to reflect  the I/O address and
-    IRQ you're using.
-    3) compile  ewrk3.c, but include -DMODULE in  the command line to ensure
-    that the correct bits are compiled (see end of source code).
-    4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
-    kernel with the ewrk3 configuration turned off and reboot.
-    5) insmod ewrk3.o
-          [Alan Cox: Changed this so you can insmod ewrk3.o irq=x io=y]
-          [Adam Kropelin: Multiple cards now supported by irq=x1,x2 io=y1,y2]
-    6) run the net startup bits for your new eth?? interface manually 
-    (usually /etc/rc.inet[12] at boot time). 
-    7) enjoy!
-
-    Note that autoprobing is not allowed in loadable modules - the system is
-    already up and running and you're messing with interrupts.
-
-    To unload a module, turn off the associated interface 
-    'ifconfig eth?? down' then 'rmmod ewrk3'.
-
-The performance we've  achieved so far  has been measured through the 'ttcp'
-tool   at 975kB/s.  This  measures  the  total  TCP  stack performance which
-includes the   card,  so don't  expect   to get   much nearer  the  1.25MB/s
-theoretical Ethernet rate.
-
-
-Enjoy!
-
-Dave
index bbf2005270b5d1c1d3e0ffeb44a1082b8c0b8d75..cdb3e40b9d14ee28095fb02a088154a8989996c4 100644 (file)
@@ -17,12 +17,12 @@ creating filters.
 
 LSF is much simpler than BPF. One does not have to worry about
 devices or anything like that. You simply create your filter
-code, send it to the kernel via the SO_ATTACH_FILTER ioctl and
+code, send it to the kernel via the SO_ATTACH_FILTER option and
 if your filter code passes the kernel check on it, you then
 immediately begin filtering data on that socket.
 
 You can also detach filters from your socket via the
-SO_DETACH_FILTER ioctl. This will probably not be used much
+SO_DETACH_FILTER option. This will probably not be used much
 since when you close a socket that has a filter on it the
 filter is automagically removed. The other less common case
 may be adding a different filter on the same socket where you had another
@@ -31,12 +31,19 @@ the old one and placing your new one in its place, assuming your
 filter has passed the checks, otherwise if it fails the old filter
 will remain on that socket.
 
+SO_LOCK_FILTER option allows to lock the filter attached to a
+socket. Once set, a filter cannot be removed or changed. This allows
+one process to setup a socket, attach a filter, lock it then drop
+privileges and be assured that the filter will be kept until the
+socket is closed.
+
 Examples
 ========
 
 Ioctls-
 setsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(Filter));
 setsockopt(sockfd, SOL_SOCKET, SO_DETACH_FILTER, &value, sizeof(value));
+setsockopt(sockfd, SOL_SOCKET, SO_LOCK_FILTER, &value, sizeof(value));
 
 See the BSD bpf.4 manpage and the BSD Packet Filter paper written by
 Steven McCanne and Van Jacobson of Lawrence Berkeley Laboratory.
index dd52d516cb8902da098bbb21a5006cea81b66a74..19ac1802bfd4d04a456b6934322d75b89cd1ea17 100644 (file)
@@ -26,6 +26,11 @@ route/max_size - INTEGER
        Maximum number of routes allowed in the kernel.  Increase
        this when using large numbers of interfaces and/or routes.
 
+neigh/default/gc_thresh1 - INTEGER
+       Minimum number of entries to keep.  Garbage collector will not
+       purge entries if there are fewer than this number.
+       Default: 256
+
 neigh/default/gc_thresh3 - INTEGER
        Maximum number of neighbor entries allowed.  Increase this
        when using large numbers of interfaces and when communicating
@@ -36,7 +41,7 @@ neigh/default/unres_qlen_bytes - INTEGER
        The maximum number of bytes which may be used by packets
        queued for each unresolved address by other network layers.
        (added in linux 3.3)
-       Seting negative value is meaningless and will retrun error.
+       Setting negative value is meaningless and will return error.
        Default: 65536 Bytes(64KB)
 
 neigh/default/unres_qlen - INTEGER
@@ -214,8 +219,9 @@ tcp_ecn - INTEGER
        congestion before having to drop packets.
        Possible values are:
                0 Disable ECN.  Neither initiate nor accept ECN.
-               1 Always request ECN on outgoing connection attempts.
-               2 Enable ECN when requested by incomming connections
+               1 Enable ECN when requested by incoming connections and
+                 also request ECN on outgoing connection attempts.
+               2 Enable ECN when requested by incoming connections
                  but do not request ECN on outgoing connections.
        Default: 2
 
@@ -503,7 +509,7 @@ tcp_fastopen - INTEGER
 tcp_syn_retries - INTEGER
        Number of times initial SYNs for an active TCP connection attempt
        will be retransmitted. Should not be higher than 255. Default value
-       is 6, which corresponds to 63seconds till the last restransmission
+       is 6, which corresponds to 63seconds till the last retransmission
        with the current initial RTO of 1second. With this the final timeout
        for an active TCP connection attempt will happen after 127seconds.
 
@@ -1331,6 +1337,12 @@ force_tllao - BOOLEAN
        race condition where the sender deletes the cached link-layer address
        prior to receiving a response to a previous solicitation."
 
+ndisc_notify - BOOLEAN
+       Define mode for notification of address and device changes.
+       0 - (default): do nothing
+       1 - Generate unsolicited neighbour advertisements when device is brought
+           up or hardware address changes.
+
 icmp/*:
 ratelimit - INTEGER
        Limit the maximal rates for sending ICMPv6 packets.
@@ -1530,7 +1542,7 @@ cookie_hmac_alg - STRING
        * sha1
        * none
        Ability to assign md5 or sha1 as the selected alg is predicated on the
-       configuarion of those algorithms at build time (CONFIG_CRYPTO_MD5 and
+       configuration of those algorithms at build time (CONFIG_CRYPTO_MD5 and
        CONFIG_CRYPTO_SHA1).
 
        Default: Dependent on configuration.  MD5 if available, else SHA1 if
@@ -1548,7 +1560,7 @@ rcvbuf_policy - INTEGER
        blocking.
 
        1: rcvbuf space is per association
-       0: recbuf space is per socket
+       0: rcvbuf space is per socket
 
        Default: 0
 
diff --git a/Documentation/networking/multicast.txt b/Documentation/networking/multicast.txt
deleted file mode 100644 (file)
index b06c8c6..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-Behaviour of Cards Under Multicast
-==================================
-
-This is how they currently behave, not what the hardware can do--for example,
-the Lance driver doesn't use its filter, even though the code for loading
-it is in the DEC Lance-based driver.
-
-The following are requirements for multicasting 
------------------------------------------------
-AppleTalk      Multicast       hardware filtering not important but
-                                avoid cards only doing promisc
-IP-Multicast   Multicast       hardware filters really help
-IP-MRoute      AllMulti        hardware filters are of no help
-
-
-Board          Multicast       AllMulti        Promisc         Filter
-------------------------------------------------------------------------
-3c501          YES             YES             YES             Software
-3c503          YES             YES             YES             Hardware
-3c505          YES             NO              YES             Hardware
-3c507          NO              NO              NO              N/A
-3c509          YES             YES             YES             Software
-3c59x          YES             YES             YES             Software
-ac3200         YES             YES             YES             Hardware
-apricot                YES             PROMISC         YES             Hardware
-arcnet         NO              NO              NO              N/A
-at1700         PROMISC         PROMISC         YES             Software
-atp            PROMISC         PROMISC         YES             Software
-cs89x0         YES             YES             YES             Software
-de4x5          YES             YES             YES             Hardware
-de600          NO              NO              NO              N/A
-de620          PROMISC         PROMISC         YES             Software
-depca          YES             PROMISC         YES             Hardware
-dmfe           YES             YES             YES             Software(*)
-e2100          YES             YES             YES             Hardware
-eepro          YES             PROMISC         YES             Hardware
-eexpress       NO              NO              NO              N/A
-ewrk3          YES             PROMISC         YES             Hardware
-hp-plus                YES             YES             YES             Hardware
-hp             YES             YES             YES             Hardware
-hp100          YES             YES             YES             Hardware
-ibmtr          NO              NO              NO              N/A
-ioc3-eth       YES             YES             YES             Hardware
-lance          YES             YES             YES             Software(#)
-ne             YES             YES             YES             Hardware
-ni52           <------------------ Buggy ------------------>
-ni65           YES             YES             YES             Software(#)
-seeq           NO              NO              NO              N/A
-sgiseek                <------------------ Buggy ------------------>
-smc-ultra      YES             YES             YES             Hardware
-sunlance       YES             YES             YES             Hardware
-tulip          YES             YES             YES             Hardware
-wavelan                YES             PROMISC         YES             Hardware
-wd             YES             YES             YES             Hardware
-xirc2ps_cs     YES             YES             YES             Hardware
-znet           YES             YES             YES             Software
-
-
-PROMISC = This multicast mode is in fact promiscuous mode. Avoid using
-cards who go PROMISC on any multicast in a multicast kernel.
-
-(#) = Hardware multicast support is not used yet.
-(*) = Hardware support for Davicom 9132 chipset only.
index 2e9e0ae2cd453dc3ac0a605c1a40baf1096cf42f..a5d574a9ae0987031b408671a5808356f6955cb4 100644 (file)
@@ -1,9 +1,10 @@
 
 started by Ingo Molnar <mingo@redhat.com>, 2001.09.17
 2.6 port and netpoll api by Matt Mackall <mpm@selenic.com>, Sep 9 2003
+IPv6 support by Cong Wang <xiyou.wangcong@gmail.com>, Jan 1 2013
 
 Please send bug reports to Matt Mackall <mpm@selenic.com>
-and Satyam Sharma <satyam.sharma@gmail.com>
+Satyam Sharma <satyam.sharma@gmail.com>, and Cong Wang <xiyou.wangcong@gmail.com>
 
 Introduction:
 =============
@@ -41,6 +42,10 @@ Examples:
 
  insmod netconsole netconsole=@/,@10.0.0.2/
 
+  or using IPv6
+
+ insmod netconsole netconsole=@/,@fd00:1:2:3::1/
+
 It also supports logging to multiple remote agents by specifying
 parameters for the multiple agents separated by semicolons and the
 complete string enclosed in "quotes", thusly:
index 95e5f5985a2aecaffb81081fc4594d9b5ef6c074..d5b1a393524533557a4286a3e1c92cbb50eddd50 100644 (file)
@@ -103,7 +103,7 @@ Letting the PHY Abstraction Layer do Everything
  
  Now, to connect, just call this function:
  
-   phydev = phy_connect(dev, phy_name, &adjust_link, flags, interface);
+   phydev = phy_connect(dev, phy_name, &adjust_link, interface);
 
  phydev is a pointer to the phy_device structure which represents the PHY.  If
  phy_connect is successful, it will return the pointer.  dev, here, is the
@@ -113,7 +113,9 @@ Letting the PHY Abstraction Layer do Everything
  current state, though the PHY will not yet be truly operational at this
  point.
 
- flags is a u32 which can optionally contain phy-specific flags.
+ PHY-specific flags should be set in phydev->dev_flags prior to the call
+ to phy_connect() such that the underlying PHY driver can check for flags
+ and perform specific operations based on them.
  This is useful if the system has put hardware restrictions on
  the PHY/controller, of which the PHY needs to be aware.
 
@@ -185,11 +187,10 @@ Doing it all yourself
    start, or disables then frees them for stop.
 
  struct phy_device * phy_attach(struct net_device *dev, const char *phy_id,
-                u32 flags, phy_interface_t interface);
+                phy_interface_t interface);
 
    Attaches a network device to a particular PHY, binding the PHY to a generic
-   driver if none was found during bus initialization.  Passes in
-   any phy-specific flags as needed.
+   driver if none was found during bus initialization.
 
  int phy_start_aneg(struct phy_device *phydev);
    
index 4abe83e1045a4b38e85b05ebfeb3e8e62841a7f6..03591a750f99eea57fa63a5b610cf70793c716c6 100644 (file)
@@ -642,12 +642,13 @@ out the following operations:
   * During system suspend it calls pm_runtime_get_noresume() and
     pm_runtime_barrier() for every device right before executing the
     subsystem-level .suspend() callback for it.  In addition to that it calls
-    pm_runtime_disable() for every device right after executing the
-    subsystem-level .suspend() callback for it.
+    __pm_runtime_disable() with 'false' as the second argument for every device
+    right before executing the subsystem-level .suspend_late() callback for it.
 
   * During system resume it calls pm_runtime_enable() and pm_runtime_put_sync()
-    for every device right before and right after executing the subsystem-level
-    .resume() callback for it, respectively.
+    for every device right after executing the subsystem-level .resume_early()
+    callback and right after executing the subsystem-level .resume() callback
+    for it, respectively.
 
 7. Generic subsystem callbacks
 
index 409d9f964c5b547b9e3f09d76c662aebf1216536..f7edc3aa1e92d4e2eac9ed143212f9757577f041 100644 (file)
@@ -236,7 +236,7 @@ static int rpmsg_sample_probe(struct rpmsg_channel *rpdev)
        return 0;
 }
 
-static void __devexit rpmsg_sample_remove(struct rpmsg_channel *rpdev)
+static void rpmsg_sample_remove(struct rpmsg_channel *rpdev)
 {
        dev_info(&rpdev->dev, "rpmsg sample client driver is removed\n");
 }
@@ -253,7 +253,7 @@ static struct rpmsg_driver rpmsg_sample_client = {
        .id_table       = rpmsg_driver_sample_id_table,
        .probe          = rpmsg_sample_probe,
        .callback       = rpmsg_sample_cb,
-       .remove         = __devexit_p(rpmsg_sample_remove),
+       .remove         = rpmsg_sample_remove,
 };
 
 static int __init init(void)
index 7312ec14dd89802c7b3093a5bdfa65b63ece8f1b..2331eb2141466f9c5038cfa8c6f4157c570ff96a 100644 (file)
@@ -345,7 +345,7 @@ SPI protocol drivers somewhat resemble platform device drivers:
                },
 
                .probe          = CHIP_probe,
-               .remove         = __devexit_p(CHIP_remove),
+               .remove         = CHIP_remove,
                .suspend        = CHIP_suspend,
                .resume         = CHIP_resume,
        };
@@ -355,7 +355,7 @@ device whose board_info gave a modalias of "CHIP".  Your probe() code
 might look like this unless you're creating a device which is managing
 a bus (appearing under /sys/class/spi_master).
 
-       static int __devinit CHIP_probe(struct spi_device *spi)
+       static int CHIP_probe(struct spi_device *spi)
        {
                struct CHIP                     *chip;
                struct CHIP_platform_data       *pdata;
index 2907ba6c3607dfd557e3e4533413b0bea8518a60..ccd42589e124c0d7233bbba41bcf154e7ae7d87f 100644 (file)
@@ -38,6 +38,7 @@ show up in /proc/sys/kernel:
 - l2cr                        [ PPC only ]
 - modprobe                    ==> Documentation/debugging-modules.txt
 - modules_disabled
+- msg_next_id                [ sysv ipc ]
 - msgmax
 - msgmnb
 - msgmni
@@ -62,7 +63,9 @@ show up in /proc/sys/kernel:
 - rtsig-max
 - rtsig-nr
 - sem
+- sem_next_id                [ sysv ipc ]
 - sg-big-buff                 [ generic SCSI device (sg) ]
+- shm_next_id                [ sysv ipc ]
 - shm_rmid_forced
 - shmall
 - shmmax                      [ sysv ipc ]
@@ -320,6 +323,22 @@ to false.
 
 ==============================================================
 
+msg_next_id, sem_next_id, and shm_next_id:
+
+These three toggles allows to specify desired id for next allocated IPC
+object: message, semaphore or shared memory respectively.
+
+By default they are equal to -1, which means generic allocation logic.
+Possible values to set are in range {0..INT_MAX}.
+
+Notes:
+1) kernel doesn't guarantee, that new object will have desired id. So,
+it's up to userspace, how to handle an object with "wrong" id.
+2) Toggle with non-default value will be set back to -1 by kernel after
+successful IPC object allocation.
+
+==============================================================
+
 nmi_watchdog:
 
 Enables/Disables the NMI watchdog on x86 systems. When the value is
@@ -542,6 +561,19 @@ are doing anyway :)
 
 ==============================================================
 
+shmall:
+
+This parameter sets the total amount of shared memory pages that
+can be used system wide. Hence, SHMALL should always be at least
+ceil(shmmax/PAGE_SIZE).
+
+If you are not sure what the default PAGE_SIZE is on your Linux
+system, you can run the following command:
+
+# getconf PAGE_SIZE
+
+==============================================================
+
 shmmax:
 
 This value can be used to query and set the run time limit
index 32bfe926e8d77717e67a9e485ca89b398f5c26a8..b89567ad04b7f587d527da4ebb44c365240c8082 100644 (file)
@@ -174,8 +174,7 @@ The recommended approach is as follows:
 
 static atomic_t drv_instance = ATOMIC_INIT(0);
 
-static int __devinit drv_probe(struct pci_dev *pdev,
-                               const struct pci_device_id *pci_id)
+static int drv_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
 {
        ...
        state->instance = atomic_inc_return(&drv_instance) - 1;
index 3e74f13af4266d8d7aab3b3910b93a73bc1b5b71..44c1d934c4e3d1e0aceb48b22d9328d1bd6f8410 100644 (file)
@@ -182,8 +182,7 @@ int iterate(void *p)
 
 static atomic_t drv_instance = ATOMIC_INIT(0);
 
-static int __devinit drv_probe(struct pci_dev *pdev,
-                               const struct pci_device_id *pci_id)
+static int drv_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
 {
        ...
        state->instance = atomic_inc_return(&drv_instance) - 1;
index 4e2a1f67a1fcf00b553e8190947368d240d74b44..a7aadea909df3d4a994c5b78dc50a35765b2c3d9 100644 (file)
@@ -228,7 +228,7 @@ S:  Maintained
 F:     drivers/platform/x86/acerhdf.c
 
 ACER WMI LAPTOP EXTRAS
-M:     Joey Lee <jlee@novell.com>
+M:     "Lee, Chun-Yi" <jlee@suse.com>
 L:     platform-driver-x86@vger.kernel.org
 S:     Maintained
 F:     drivers/platform/x86/acer-wmi.c
@@ -449,6 +449,7 @@ T:  git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git
 S:     Maintained
 F:     drivers/char/agp/
 F:     include/linux/agp*
+F:     include/uapi/linux/agp*
 
 AHA152X SCSI DRIVER
 M:     "Juergen E. Fischer" <fischer@norbit.de>
@@ -589,6 +590,7 @@ M:  Jiri Kosina <jkosina@suse.cz>
 S:     Odd fixes
 F:     arch/x86/kernel/apm_32.c
 F:     include/linux/apm_bios.h
+F:     include/uapi/linux/apm_bios.h
 F:     drivers/char/apm-emulation.c
 
 APPLE BCM5974 MULTITOUCH DRIVER
@@ -646,7 +648,7 @@ F:  arch/arm/
 
 ARM SUB-ARCHITECTURES
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
-S:     MAINTAINED
+S:     Maintained
 F:     arch/arm/mach-*/
 F:     arch/arm/plat-*/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc.git
@@ -1005,7 +1007,6 @@ F:        drivers/mmc/host/msm_sdcc.c
 F:     drivers/mmc/host/msm_sdcc.h
 F:     drivers/tty/serial/msm_serial.h
 F:     drivers/tty/serial/msm_serial.c
-F:     drivers/platform/msm/
 F:     drivers/*/pm8???-*
 F:     include/linux/mfd/pm8xxx/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm.git
@@ -1069,7 +1070,6 @@ M:        Russell King <linux@arm.linux.org.uk>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 W:     http://www.arm.linux.org.uk/
 S:     Maintained
-F:     arch/arm/common/time-acorn.c
 F:     arch/arm/include/asm/hardware/entry-macro-iomd.S
 F:     arch/arm/include/asm/hardware/ioc.h
 F:     arch/arm/include/asm/hardware/iomd.h
@@ -1094,7 +1094,6 @@ W:        http://www.fluff.org/ben/linux/
 S:     Maintained
 F:     arch/arm/plat-samsung/
 F:     arch/arm/plat-s3c24xx/
-F:     arch/arm/plat-s5p/
 F:     arch/arm/mach-s3c24*/
 F:     arch/arm/mach-s3c64xx/
 F:     drivers/*/*s3c2410*
@@ -1125,7 +1124,6 @@ M:        Sylwester Nawrocki <s.nawrocki@samsung.com>
 L:     linux-arm-kernel@lists.infradead.org
 L:     linux-media@vger.kernel.org
 S:     Maintained
-F:     arch/arm/plat-s5p/dev-fimc*
 F:     arch/arm/plat-samsung/include/plat/*fimc*
 F:     drivers/media/platform/s5p-fimc/
 
@@ -1136,7 +1134,7 @@ M:        Jeongtae Park <jtp.park@samsung.com>
 L:     linux-arm-kernel@lists.infradead.org
 L:     linux-media@vger.kernel.org
 S:     Maintained
-F:     arch/arm/plat-s5p/dev-mfc.c
+F:     arch/arm/plat-samsung/s5p-dev-mfc.c
 F:     drivers/media/platform/s5p-mfc/
 
 ARM/SAMSUNG S5P SERIES TV SUBSYSTEM SUPPORT
@@ -1254,7 +1252,7 @@ F:        drivers/video/vt8500lcdfb.*
 F:     drivers/video/wm8505fb*
 F:     drivers/video/wmt_ge_rops.*
 F:     drivers/tty/serial/vt8500_serial.c
-F:     drivers/rtc/rtc-vt8500-c
+F:     drivers/rtc/rtc-vt8500.c
 F:     drivers/mmc/host/wmt-sdmmc.c
 
 ARM/ZIPIT Z2 SUPPORT
@@ -1353,6 +1351,14 @@ W:       http://wireless.kernel.org/en/users/Drivers/ath9k
 S:     Supported
 F:     drivers/net/wireless/ath/ath9k/
 
+WILOCITY WIL6210 WIRELESS DRIVER
+M:     Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
+L:     linux-wireless@vger.kernel.org
+L:     wil6210@qca.qualcomm.com
+S:     Supported
+W:     http://wireless.kernel.org/en/users/Drivers/wil6210
+F:     drivers/net/wireless/ath/wil6210/
+
 CARL9170 LINUX COMMUNITY WIRELESS DRIVER
 M:     Christian Lamparter <chunkeey@googlemail.com>
 L:     linux-wireless@vger.kernel.org
@@ -1388,6 +1394,7 @@ W:        http://linux-atm.sourceforge.net
 S:     Maintained
 F:     drivers/atm/
 F:     include/linux/atm*
+F:     include/uapi/linux/atm*
 
 ATMEL AT91 / AT32 MCI DRIVER
 M:     Ludovic Desroches <ludovic.desroches@atmel.com>
@@ -1406,13 +1413,13 @@ L:      linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Supported
 F:     drivers/dma/at_hdmac.c
 F:     drivers/dma/at_hdmac_regs.h
-F:     arch/arm/mach-at91/include/mach/at_hdmac.h
+F:     include/linux/platform_data/dma-atmel.h
 
 ATMEL ISI DRIVER
 M:     Josh Wu <josh.wu@atmel.com>
 L:     linux-media@vger.kernel.org
 S:     Supported
-F:     drivers/media/platform/atmel-isi.c
+F:     drivers/media/platform/soc_camera/atmel-isi.c
 F:     include/media/atmel-isi.h
 
 ATMEL LCDFB DRIVER
@@ -1467,6 +1474,7 @@ W:        http://people.redhat.com/sgrubb/audit/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git
 S:     Maintained
 F:     include/linux/audit.h
+F:     include/uapi/linux/audit.h
 F:     kernel/audit*
 
 AUXILIARY DISPLAY DRIVERS
@@ -1497,7 +1505,7 @@ M:        Ralf Baechle <ralf@linux-mips.org>
 L:     linux-hams@vger.kernel.org
 W:     http://www.linux-ax25.org/
 S:     Maintained
-F:     include/linux/ax25.h
+F:     include/uapi/linux/ax25.h
 F:     include/net/ax25.h
 F:     net/ax25/
 
@@ -1558,7 +1566,7 @@ M:        "Tigran A. Aivazian" <tigran@aivazian.fsnet.co.uk>
 S:     Maintained
 F:     Documentation/filesystems/bfs.txt
 F:     fs/bfs/
-F:     include/linux/bfs_fs.h
+F:     include/uapi/linux/bfs_fs.h
 
 BLACKFIN ARCHITECTURE
 M:     Mike Frysinger <vapier@gentoo.org>
@@ -1655,7 +1663,7 @@ L:        netdev@vger.kernel.org
 W:     http://sourceforge.net/projects/bonding/
 S:     Supported
 F:     drivers/net/bonding/
-F:     include/linux/if_bonding.h
+F:     include/uapi/linux/if_bonding.h
 
 BROADCOM B44 10/100 ETHERNET DRIVER
 M:     Gary Zambrano <zambrano@broadcom.com>
@@ -1734,6 +1742,7 @@ L:        linux-scsi@vger.kernel.org
 S:     Supported
 F:     block/bsg.c
 F:     include/linux/bsg.h
+F:     include/uapi/linux/bsg.h
 
 BT87X AUDIO DRIVER
 M:     Clemens Ladisch <clemens@ladisch.de>
@@ -1804,7 +1813,7 @@ L:        netdev@vger.kernel.org
 S:     Supported
 F:     Documentation/networking/caif/
 F:     drivers/net/caif/
-F:     include/linux/caif/
+F:     include/uapi/linux/caif/
 F:     include/net/caif/
 F:     net/caif/
 
@@ -1825,11 +1834,11 @@ W:      http://gitorious.org/linux-can
 T:     git git://gitorious.org/linux-can/linux-can-next.git
 S:     Maintained
 F:     net/can/
-F:     include/linux/can.h
 F:     include/linux/can/core.h
-F:     include/linux/can/bcm.h
-F:     include/linux/can/raw.h
-F:     include/linux/can/gw.h
+F:     include/uapi/linux/can.h
+F:     include/uapi/linux/can/bcm.h
+F:     include/uapi/linux/can/raw.h
+F:     include/uapi/linux/can/gw.h
 
 CAN NETWORK DRIVERS
 M:     Wolfgang Grandegger <wg@grandegger.com>
@@ -1840,15 +1849,16 @@ T:      git git://gitorious.org/linux-can/linux-can-next.git
 S:     Maintained
 F:     drivers/net/can/
 F:     include/linux/can/dev.h
-F:     include/linux/can/error.h
-F:     include/linux/can/netlink.h
 F:     include/linux/can/platform/
+F:     include/uapi/linux/can/error.h
+F:     include/uapi/linux/can/netlink.h
 
 CAPABILITIES
 M:     Serge Hallyn <serge.hallyn@canonical.com>
 L:     linux-security-module@vger.kernel.org
 S:     Supported
 F:     include/linux/capability.h
+F:     include/uapi/linux/capability.h
 F:     security/capability.c
 F:     security/commoncap.c
 F:     kernel/capability.c
@@ -1861,6 +1871,7 @@ W:        http://www.ibm.com/developerworks/power/cell/
 S:     Supported
 F:     arch/powerpc/include/asm/cell*.h
 F:     arch/powerpc/include/asm/spu*.h
+F:     arch/powerpc/include/uapi/asm/spu*.h
 F:     arch/powerpc/oprofile/*cell*
 F:     arch/powerpc/platforms/cell/
 
@@ -1909,7 +1920,7 @@ W:        http://wireless.kernel.org/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
 S:     Maintained
-F:     include/linux/nl80211.h
+F:     include/uapi/linux/nl80211.h
 F:     include/net/cfg80211.h
 F:     net/wireless/*
 X:     net/wireless/wext*
@@ -2012,6 +2023,7 @@ S:        Maintained
 F:     Documentation/filesystems/coda.txt
 F:     fs/coda/
 F:     include/linux/coda*.h
+F:     include/uapi/linux/coda*.h
 
 COMMON CLK FRAMEWORK
 M:     Mike Turquette <mturquette@linaro.org>
@@ -2266,6 +2278,7 @@ W:        http://www.cyclades.com/
 S:     Orphan
 F:     drivers/tty/cyclades.c
 F:     include/linux/cyclades.h
+F:     include/uapi/linux/cyclades.h
 
 CYCLADES PC300 DRIVER
 W:     http://www.cyclades.com/
@@ -2323,6 +2336,7 @@ L:        dccp@vger.kernel.org
 W:     http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp
 S:     Maintained
 F:     include/linux/dccp.h
+F:     include/uapi/linux/dccp.h
 F:     include/linux/tfrc.h
 F:     net/dccp/
 
@@ -2349,7 +2363,7 @@ M:        Massimo Dal Zotto <dz@debian.org>
 W:     http://www.debian.org/~dz/i8k/
 S:     Maintained
 F:     drivers/char/i8k.c
-F:     include/linux/i8k.h
+F:     include/uapi/linux/i8k.h
 
 DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas)
 M:     Doug Warzecha <Douglas_Warzecha@dell.com>
@@ -2422,6 +2436,7 @@ S:        Maintained
 F:     Documentation/filesystems/quota.txt
 F:     fs/quota/
 F:     include/linux/quota*.h
+F:     include/uapi/linux/quota*.h
 
 DISPLAYLINK USB 2.0 FRAMEBUFFER DRIVER (UDLFB)
 M:     Bernie Thompson <bernie@plugable.com>
@@ -2528,6 +2543,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git
 S:     Maintained
 F:     drivers/gpu/drm/
 F:     include/drm/
+F:     include/uapi/drm/
 
 INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
 M:     Daniel Vetter <daniel.vetter@ffwll.ch>
@@ -2537,6 +2553,7 @@ T:        git git://people.freedesktop.org/~danvet/drm-intel
 S:     Supported
 F:     drivers/gpu/drm/i915
 F:     include/drm/i915*
+F:     include/uapi/drm/i915*
 
 DRM DRIVERS FOR EXYNOS
 M:     Inki Dae <inki.dae@samsung.com>
@@ -2548,6 +2565,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git
 S:     Supported
 F:     drivers/gpu/drm/exynos
 F:     include/drm/exynos*
+F:     include/uapi/drm/exynos*
 
 DRM DRIVERS FOR NVIDIA TEGRA
 M:     Thierry Reding <thierry.reding@avionic-design.de>
@@ -2622,7 +2640,7 @@ W:        http://github.com/mkrufky
 Q:     http://patchwork.linuxtv.org/project/linux-media/list/
 T:     git git://linuxtv.org/media_tree.git
 S:     Maintained
-F:     drivers/media/usb/dvb-usb-v2/cxusb*
+F:     drivers/media/usb/dvb-usb/cxusb*
 
 DVB_USB_CYPRESS_FIRMWARE MEDIA DRIVER
 M:     Antti Palosaari <crope@iki.fi>
@@ -2722,6 +2740,7 @@ L:        netfilter-devel@vger.kernel.org
 W:     http://ebtables.sourceforge.net/
 S:     Maintained
 F:     include/linux/netfilter_bridge/ebt_*.h
+F:     include/uapi/linux/netfilter_bridge/ebt_*.h
 F:     net/bridge/netfilter/ebt*.c
 
 EC100 MEDIA DRIVER
@@ -2933,12 +2952,6 @@ M:       Maxim Levitsky <maximlevitsky@gmail.com>
 S:     Maintained
 F:     drivers/media/rc/ene_ir.*
 
-EPSON 1355 FRAMEBUFFER DRIVER
-M:     Christopher Hoover <ch@murgatroid.com>
-M:     Christopher Hoover <ch@hpl.hp.com>
-S:     Maintained
-F:     drivers/video/epson1355fb.c
-
 EPSON S1D13XXX FRAMEBUFFER DRIVER
 M:     Kristoffer Ericson <kristoffer.ericson@gmail.com>
 S:     Maintained
@@ -2961,11 +2974,6 @@ S:       Maintained
 F:     include/linux/netfilter_bridge/
 F:     net/bridge/
 
-ETHERTEAM 16I DRIVER
-M:     Mika Kuoppala <miku@iki.fi>
-S:     Maintained
-F:     drivers/net/ethernet/fujitsu/eth16i.c
-
 EXT2 FILE SYSTEM
 M:     Jan Kara <jack@suse.cz>
 L:     linux-ext4@vger.kernel.org
@@ -3051,6 +3059,7 @@ M:        Eric Paris <eparis@redhat.com>
 S:     Maintained
 F:     fs/notify/fanotify/
 F:     include/linux/fanotify.h
+F:     include/uapi/linux/fanotify.h
 
 FARSYNC SYNCHRONOUS DRIVER
 M:     Kevin Curtis <kevin.curtis@farsite.co.uk>
@@ -3074,6 +3083,7 @@ F:        drivers/scsi/fcoe/
 F:     include/scsi/fc/
 F:     include/scsi/libfc.h
 F:     include/scsi/libfcoe.h
+F:     include/uapi/scsi/fc/
 
 FILE LOCKING (flock() and fcntl()/lockf())
 M:     Matthew Wilcox <matthew@wil.cx>
@@ -3081,6 +3091,8 @@ L:        linux-fsdevel@vger.kernel.org
 S:     Maintained
 F:     include/linux/fcntl.h
 F:     include/linux/fs.h
+F:     include/uapi/linux/fcntl.h
+F:     include/uapi/linux/fs.h
 F:     fs/fcntl.c
 F:     fs/locks.c
 
@@ -3170,6 +3182,8 @@ F:        Documentation/devicetree/bindings/fb/
 F:     drivers/video/
 F:     include/video/
 F:     include/linux/fb.h
+F:     include/uapi/video/
+F:     include/uapi/linux/fb.h
 
 FREESCALE DIU FRAMEBUFFER DRIVER
 M:     Timur Tabi <timur@freescale.com>
@@ -3196,7 +3210,7 @@ M:        Sascha Hauer <kernel@pengutronix.de>
 L:     linux-fbdev@vger.kernel.org
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
-F:     arch/arm/plat-mxc/include/mach/imxfb.h
+F:     include/linux/platform_data/video-imxfb.h
 F:     drivers/video/imxfb.c
 
 FREESCALE SOC FS_ENET DRIVER
@@ -3273,6 +3287,16 @@ F:       Documentation/filesystems/caching/
 F:     fs/fscache/
 F:     include/linux/fscache*.h
 
+F2FS FILE SYSTEM
+M:     Jaegeuk Kim <jaegeuk.kim@samsung.com>
+L:     linux-f2fs-devel@lists.sourceforge.net
+W:     http://en.wikipedia.org/wiki/F2FS
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git
+S:     Maintained
+F:     Documentation/filesystems/f2fs.txt
+F:     fs/f2fs/
+F:     include/linux/f2fs_fs.h
+
 FUJITSU FR-V (FRV) PORT
 M:     David Howells <dhowells@redhat.com>
 S:     Maintained
@@ -3304,7 +3328,7 @@ L:        fuse-devel@lists.sourceforge.net
 W:     http://fuse.sourceforge.net/
 S:     Maintained
 F:     fs/fuse/
-F:     include/linux/fuse.h
+F:     include/uapi/linux/fuse.h
 
 FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit)
 M:     Rik Faith <faith@cs.unc.edu>
@@ -3351,6 +3375,7 @@ L:        linux-arch@vger.kernel.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git
 S:     Maintained
 F:     include/asm-generic
+F:     include/uapi/asm-generic
 
 GENERIC UIO DRIVER FOR PCI DEVICES
 M:     "Michael S. Tsirkin" <mst@redhat.com>
@@ -3367,7 +3392,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw.git
 S:     Supported
 F:     Documentation/filesystems/gfs2*.txt
 F:     fs/gfs2/
-F:     include/linux/gfs2_ondisk.h
+F:     include/uapi/linux/gfs2_ondisk.h
 
 GIGASET ISDN DRIVERS
 M:     Hansjoerg Lipp <hjlipp@web.de>
@@ -3377,7 +3402,7 @@ W:        http://gigaset307x.sourceforge.net/
 S:     Maintained
 F:     Documentation/isdn/README.gigaset
 F:     drivers/isdn/gigaset/
-F:     include/linux/gigaset_dev.h
+F:     include/uapi/linux/gigaset_dev.h
 
 GPIO SUBSYSTEM
 M:     Grant Likely <grant.likely@secretlab.ca>
@@ -3534,6 +3559,7 @@ S:        Supported
 F:     Documentation/scsi/hpsa.txt
 F:     drivers/scsi/hpsa*.[ch]
 F:     include/linux/cciss*.h
+F:     include/uapi/linux/cciss*.h
 
 HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss)
 M:     Mike Miller <mike.miller@hp.com>
@@ -3542,6 +3568,7 @@ S:        Supported
 F:     Documentation/blockdev/cciss.txt
 F:     drivers/block/cciss*
 F:     include/linux/cciss_ioctl.h
+F:     include/uapi/linux/cciss_ioctl.h
 
 HFS FILESYSTEM
 L:     linux-fsdevel@vger.kernel.org
@@ -3576,6 +3603,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
 S:     Maintained
 F:     drivers/hid/
 F:     include/linux/hid*
+F:     include/uapi/linux/hid*
 
 HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
 M:     Thomas Gleixner <tglx@linutronix.de>
@@ -3607,7 +3635,7 @@ M:        Jes Sorensen <jes@trained-monkey.org>
 L:     linux-hippi@sunsite.dk
 S:     Maintained
 F:     include/linux/hippidevice.h
-F:     include/linux/if_hippi.h
+F:     include/uapi/linux/if_hippi.h
 F:     net/802/hippi.c
 F:     drivers/net/hippi/
 
@@ -3635,6 +3663,7 @@ S:        Maintained
 F:     Documentation/timers/hpet.txt
 F:     drivers/char/hpet.c
 F:     include/linux/hpet.h
+F:     include/uapi/linux/hpet.h
 
 HPET:  x86
 M:     "Venkatesh Pallipadi (Venki)" <venki@google.com>
@@ -3735,6 +3764,8 @@ F:        Documentation/i2c/
 F:     drivers/i2c/
 F:     include/linux/i2c.h
 F:     include/linux/i2c-*.h
+F:     include/uapi/linux/i2c.h
+F:     include/uapi/linux/i2c-*.h
 
 I2C-TAOS-EVM DRIVER
 M:     Jean Delvare <khali@linux-fr.org>
@@ -3850,7 +3881,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
 S:     Maintained
 F:     net/ieee802154/
 F:     net/mac802154/
-F:     drivers/ieee802154/
+F:     drivers/net/ieee802154/
 
 IGUANAWORKS USB IR TRANSCEIVER
 M:     Sean Young <sean@mess.org>
@@ -3901,7 +3932,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git
 S:     Supported
 F:     Documentation/infiniband/
 F:     drivers/infiniband/
-F:     include/linux/if_infiniband.h
+F:     include/uapi/linux/if_infiniband.h
 
 INOTIFY
 M:     John McCutchan <john@johnmccutchan.com>
@@ -3911,6 +3942,7 @@ S:        Maintained
 F:     Documentation/filesystems/inotify.txt
 F:     fs/notify/inotify/
 F:     include/linux/inotify.h
+F:     include/uapi/linux/inotify.h
 
 INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS
 M:     Dmitry Torokhov <dmitry.torokhov@gmail.com>
@@ -3921,6 +3953,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
 S:     Maintained
 F:     drivers/input/
 F:     include/linux/input.h
+F:     include/uapi/linux/input.h
 F:     include/linux/input/
 
 INPUT MULTITOUCH (MT) PROTOCOL
@@ -3941,7 +3974,6 @@ L:        linux-scsi@vger.kernel.org
 T:     git git://git.code.sf.net/p/intel-sas/isci
 S:     Supported
 F:     drivers/scsi/isci/
-F:     firmware/isci/
 
 INTEL IDLE DRIVER
 M:     Len Brown <lenb@kernel.org>
@@ -4036,12 +4068,6 @@ F:       Documentation/networking/ixgbe.txt
 F:     Documentation/networking/ixgbevf.txt
 F:     drivers/net/ethernet/intel/
 
-INTEL MRST PMU DRIVER
-M:     Len Brown <len.brown@intel.com>
-L:     linux-pm@vger.kernel.org
-S:     Supported
-F:     arch/x86/platform/mrst/pmu.*
-
 INTEL PRO/WIRELESS 2100, 2200BG, 2915ABG NETWORK CONNECTION SUPPORT
 M:     Stanislav Yakovlev <stas.yakovlev@gmail.com>
 L:     linux-wireless@vger.kernel.org
@@ -4070,7 +4096,7 @@ S:        Supported
 W:     http://linuxwimax.org
 F:     Documentation/wimax/README.i2400m
 F:     drivers/net/wimax/i2400m/
-F:     include/linux/wimax/i2400m.h
+F:     include/uapi/linux/wimax/i2400m.h
 
 INTEL WIRELESS 3945ABG/BG, 4965AGN (iwlegacy)
 M:     Stanislaw Gruszka <sgruszka@redhat.com>
@@ -4092,9 +4118,9 @@ INTEL MANAGEMENT ENGINE (mei)
 M:     Tomas Winkler <tomas.winkler@intel.com>
 L:     linux-kernel@vger.kernel.org
 S:     Supported
-F:     include/linux/mei.h
+F:     include/uapi/linux/mei.h
 F:     drivers/misc/mei/*
-F:     Documentation/mei/*
+F:     Documentation/misc-devices/mei/*
 
 IOC3 ETHERNET DRIVER
 M:     Ralf Baechle <ralf@linux-mips.org>
@@ -4134,6 +4160,7 @@ S:        Supported
 F:     Documentation/IPMI.txt
 F:     drivers/char/ipmi/
 F:     include/linux/ipmi*
+F:     include/uapi/linux/ipmi*
 
 IPS SCSI RAID DRIVER
 M:     Adaptec OEM Raid Solutions <aacraid@adaptec.com>
@@ -4151,7 +4178,7 @@ L:        lvs-devel@vger.kernel.org
 S:     Maintained
 F:     Documentation/networking/ipvs-sysctl.txt
 F:     include/net/ip_vs.h
-F:     include/linux/ip_vs.h
+F:     include/uapi/linux/ip_vs.h
 F:     net/netfilter/ipvs/
 
 IPWIRELESS DRIVER
@@ -4164,8 +4191,8 @@ IPX NETWORK LAYER
 M:     Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 L:     netdev@vger.kernel.org
 S:     Maintained
-F:     include/linux/ipx.h
 F:     include/net/ipx.h
+F:     include/uapi/linux/ipx.h
 F:     net/ipx/
 
 IRDA SUBSYSTEM
@@ -4228,6 +4255,8 @@ F:        Documentation/isdn/
 F:     drivers/isdn/
 F:     include/linux/isdn.h
 F:     include/linux/isdn/
+F:     include/uapi/linux/isdn.h
+F:     include/uapi/linux/isdn/
 
 ISDN SUBSYSTEM (Eicon active card driver)
 M:     Armin Schindler <mac@melware.de>
@@ -4268,7 +4297,7 @@ W:        http://www.ivtvdriver.org
 S:     Maintained
 F:     Documentation/video4linux/*.ivtv
 F:     drivers/media/pci/ivtv/
-F:     include/linux/ivtv*
+F:     include/uapi/linux/ivtv*
 
 IX2505V MEDIA DRIVER
 M:     Malcolm Priestley <tvboxspy@gmail.com>
@@ -4306,7 +4335,7 @@ L:        linux-mtd@lists.infradead.org
 W:     http://www.linux-mtd.infradead.org/doc/jffs2.html
 S:     Maintained
 F:     fs/jffs2/
-F:     include/linux/jffs2.h
+F:     include/uapi/linux/jffs2.h
 
 JOURNALLING LAYER FOR BLOCK DEVICES (JBD)
 M:     Andrew Morton <akpm@linux-foundation.org>
@@ -4389,11 +4418,13 @@ W:      http://nfs.sourceforge.net/
 S:     Supported
 F:     fs/nfsd/
 F:     include/linux/nfsd/
+F:     include/uapi/linux/nfsd/
 F:     fs/lockd/
 F:     fs/nfs_common/
 F:     net/sunrpc/
 F:     include/linux/lockd/
 F:     include/linux/sunrpc/
+F:     include/uapi/linux/sunrpc/
 
 KERNEL VIRTUAL MACHINE (KVM)
 M:     Marcelo Tosatti <mtosatti@redhat.com>
@@ -4405,6 +4436,7 @@ F:        Documentation/*/kvm.txt
 F:     arch/*/kvm/
 F:     arch/*/include/asm/kvm*
 F:     include/linux/kvm*
+F:     include/uapi/linux/kvm*
 F:     virt/kvm/
 
 KERNEL VIRTUAL MACHINE (KVM) FOR AMD-V
@@ -4451,6 +4483,7 @@ W:        http://kernel.org/pub/linux/utils/kernel/kexec/
 L:     kexec@lists.infradead.org
 S:     Maintained
 F:     include/linux/kexec.h
+F:     include/uapi/linux/kexec.h
 F:     kernel/kexec.c
 
 KEYS/KEYRINGS:
@@ -4692,6 +4725,7 @@ LLC (802.2)
 M:     Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 S:     Maintained
 F:     include/linux/llc.h
+F:     include/uapi/linux/llc.h
 F:     include/net/llc*
 F:     net/llc/
 
@@ -4912,7 +4946,7 @@ MATROX FRAMEBUFFER DRIVER
 L:     linux-fbdev@vger.kernel.org
 S:     Orphan
 F:     drivers/video/matrox/matroxfb_*
-F:     include/linux/matroxfb.h
+F:     include/uapi/linux/matroxfb.h
 
 MAX16065 HARDWARE MONITOR DRIVER
 M:     Guenter Roeck <linux@roeck-us.net>
@@ -4994,7 +5028,7 @@ T:        git git://git.infradead.org/mtd-2.6.git
 S:     Maintained
 F:     drivers/mtd/
 F:     include/linux/mtd/
-F:     include/mtd/
+F:     include/uapi/mtd/
 
 MICROBLAZE ARCHITECTURE
 M:     Michal Simek <monstr@monstr.eu>
@@ -5032,12 +5066,6 @@ F:       Documentation/video4linux/meye.txt
 F:     drivers/media/pci/meye/
 F:     include/uapi/linux/meye.h
 
-MOTOROLA IMX MMC/SD HOST CONTROLLER INTERFACE DRIVER
-M:     Pavel Pisa <ppisa@pikron.com>
-L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
-S:     Maintained
-F:     drivers/mmc/host/imxmmc.*
-
 MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
 M:     Jiri Slaby <jirislaby@gmail.com>
 S:     Maintained
@@ -5052,7 +5080,7 @@ S:        Maintained
 F:     drivers/media/radio/radio-mr800.c
 
 MSI LAPTOP SUPPORT
-M:     "Lee, Chun-Yi" <jlee@novell.com>
+M:     "Lee, Chun-Yi" <jlee@suse.com>
 L:     platform-driver-x86@vger.kernel.org
 S:     Maintained
 F:     drivers/platform/x86/msi-laptop.c
@@ -5076,6 +5104,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git
 S:     Maintained
 F:     drivers/mmc/
 F:     include/linux/mmc/
+F:     include/uapi/linux/mmc/
 
 MULTIMEDIA CARD (MMC) ETC. OVER SPI
 S:     Orphan
@@ -5176,6 +5205,8 @@ S:        Supported
 F:     include/linux/netfilter*
 F:     include/linux/netfilter/
 F:     include/net/netfilter/
+F:     include/uapi/linux/netfilter*
+F:     include/uapi/linux/netfilter/
 F:     net/*/netfilter.c
 F:     net/*/netfilter/
 F:     net/netfilter/
@@ -5194,8 +5225,8 @@ M:        Ralf Baechle <ralf@linux-mips.org>
 L:     linux-hams@vger.kernel.org
 W:     http://www.linux-ax25.org/
 S:     Maintained
-F:     include/linux/netrom.h
 F:     include/net/netrom.h
+F:     include/uapi/linux/netrom.h
 F:     net/netrom/
 
 NETWORK BLOCK DEVICE (NBD)
@@ -5204,6 +5235,7 @@ S:        Maintained
 F:     Documentation/blockdev/nbd.txt
 F:     drivers/block/nbd.c
 F:     include/linux/nbd.h
+F:     include/uapi/linux/nbd.h
 
 NETWORK DROP MONITOR
 M:     Neil Horman <nhorman@tuxdriver.com>
@@ -5225,6 +5257,9 @@ F:        include/net/
 F:     include/linux/in.h
 F:     include/linux/net.h
 F:     include/linux/netdevice.h
+F:     include/uapi/linux/in.h
+F:     include/uapi/linux/net.h
+F:     include/uapi/linux/netdevice.h
 
 NETWORKING [IPv4/IPv6]
 M:     "David S. Miller" <davem@davemloft.net>
@@ -5270,6 +5305,7 @@ F:        net/rfkill/
 F:     net/wireless/
 F:     include/net/ieee80211*
 F:     include/linux/wireless.h
+F:     include/uapi/linux/wireless.h
 F:     include/net/iw_handler.h
 F:     drivers/net/wireless/
 
@@ -5289,6 +5325,8 @@ F:        include/linux/fcdevice.h
 F:     include/linux/fddidevice.h
 F:     include/linux/hippidevice.h
 F:     include/linux/inetdevice.h
+F:     include/uapi/linux/if_*
+F:     include/uapi/linux/netdevice.h
 
 NETXEN (1/10) GbE SUPPORT
 M:     Sony Chacko <sony.chacko@qlogic.com>
@@ -5306,8 +5344,8 @@ L:        linux-wireless@vger.kernel.org
 L:     linux-nfc@lists.01.org (moderated for non-subscribers)
 S:     Maintained
 F:     net/nfc/
-F:     include/linux/nfc.h
 F:     include/net/nfc/
+F:     include/uapi/linux/nfc.h
 F:     drivers/nfc/
 F:     include/linux/platform_data/pn544.h
 
@@ -5324,13 +5362,8 @@ F:       net/sunrpc/
 F:     include/linux/lockd/
 F:     include/linux/nfs*
 F:     include/linux/sunrpc/
-
-NI5010 NETWORK DRIVER
-M:     Jan-Pascal van Best <janpascal@vanbest.org>
-M:     Andreas Mohr <andi@lisas.de>
-L:     netdev@vger.kernel.org
-S:     Maintained
-F:     drivers/net/ethernet/racal/ni5010.*
+F:     include/uapi/linux/nfs*
+F:     include/uapi/linux/sunrpc/
 
 NILFS2 FILESYSTEM
 M:     KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
@@ -5385,6 +5418,15 @@ F:       arch/arm/*omap*/
 F:     drivers/i2c/busses/i2c-omap.c
 F:     include/linux/i2c-omap.h
 
+OMAP DEVICE TREE SUPPORT
+M:     Benoît Cousson <b-cousson@ti.com>
+M:     Tony Lindgren <tony@atomide.com>
+L:     linux-omap@vger.kernel.org
+L:     devicetree-discuss@lists.ozlabs.org (moderated for non-subscribers)
+S:     Maintained
+F:     arch/arm/boot/dts/*omap*
+F:     arch/arm/boot/dts/*am3*
+
 OMAP CLOCK FRAMEWORK SUPPORT
 M:     Paul Walmsley <paul@pwsan.com>
 L:     linux-omap@vger.kernel.org
@@ -5461,8 +5503,7 @@ M:        Benoît Cousson <b-cousson@ti.com>
 M:     Paul Walmsley <paul@pwsan.com>
 L:     linux-omap@vger.kernel.org
 S:     Maintained
-F:     arch/arm/mach-omap2/omap_hwmod.c
-F:     arch/arm/plat-omap/include/plat/omap_hwmod.h
+F:     arch/arm/mach-omap2/omap_hwmod.*
 
 OMAP HWMOD DATA FOR OMAP4-BASED DEVICES
 M:     Benoît Cousson <b-cousson@ti.com>
@@ -5504,6 +5545,7 @@ M:        Harald Welte <laforge@gnumonks.org>
 S:     Maintained
 F:     drivers/char/pcmcia/cm4000_cs.c
 F:     include/linux/cm4000_cs.h
+F:     include/uapi/linux/cm4000_cs.h
 
 OMNIKEY CARDMAN 4040 DRIVER
 M:     Harald Welte <laforge@gnumonks.org>
@@ -5662,7 +5704,7 @@ S:        Orphan
 F:     drivers/parport/
 F:     include/linux/parport*.h
 F:     drivers/char/ppdev.c
-F:     include/linux/ppdev.h
+F:     include/uapi/linux/ppdev.h
 
 PARAVIRT_OPS INTERFACE
 M:     Jeremy Fitzhardinge <jeremy@goop.org>
@@ -5803,11 +5845,11 @@ T:      git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
 S:     Supported
 F:     kernel/events/*
 F:     include/linux/perf_event.h
+F:     include/uapi/linux/perf_event.h
 F:     arch/*/kernel/perf_event*.c
 F:     arch/*/kernel/*/perf_event*.c
 F:     arch/*/kernel/*/*/perf_event*.c
 F:     arch/*/include/asm/perf_event.h
-F:     arch/*/lib/perf_event*.c
 F:     arch/*/kernel/perf_callchain.c
 F:     tools/perf/
 
@@ -5816,6 +5858,7 @@ M:        Christoph Hellwig <hch@infradead.org>
 L:     linux-abi-devel@lists.sourceforge.net
 S:     Maintained
 F:     include/linux/personality.h
+F:     include/uapi/linux/personality.h
 
 PHONET PROTOCOL
 M:     Remi Denis-Courmont <courmisch@gmail.com>
@@ -5823,6 +5866,7 @@ S:        Supported
 F:     Documentation/networking/phonet.txt
 F:     include/linux/phonet.h
 F:     include/net/phonet/
+F:     include/uapi/linux/phonet.h
 F:     net/phonet/
 
 PHRAM MTD DRIVER
@@ -5871,6 +5915,7 @@ M:        Jiri Kosina <jkosina@suse.cz>
 S:     Maintained
 F:     drivers/block/pktcdvd.c
 F:     include/linux/pktcdvd.h
+F:     include/uapi/linux/pktcdvd.h
 
 PKUNITY SOC DRIVERS
 M:     Guan Xuetao <gxt@mprc.pku.edu.cn>
@@ -5945,7 +5990,7 @@ PPP OVER ATM (RFC 2364)
 M:     Mitchell Blank Jr <mitch@sfgoth.com>
 S:     Maintained
 F:     net/atm/pppoatm.c
-F:     include/linux/atmppp.h
+F:     include/uapi/linux/atmppp.h
 
 PPP OVER ETHERNET
 M:     Michal Ostrowski <mostrows@earthlink.net>
@@ -5958,6 +6003,7 @@ M:        James Chapman <jchapman@katalix.com>
 S:     Maintained
 F:     net/l2tp/l2tp_ppp.c
 F:     include/linux/if_pppol2tp.h
+F:     include/uapi/linux/if_pppol2tp.h
 
 PPS SUPPORT
 M:     Rodolfo Giometti <giometti@enneenne.com>
@@ -6055,6 +6101,7 @@ F:        include/asm-generic/syscall.h
 F:     include/linux/ptrace.h
 F:     include/linux/regset.h
 F:     include/linux/tracehook.h
+F:     include/uapi/linux/ptrace.h
 F:     kernel/ptrace.c
 
 PVRUSB2 VIDEO4LINUX DRIVER
@@ -6083,7 +6130,6 @@ T:        git git://gitorious.org/linux-pwm/linux-pwm.git
 F:     Documentation/pwm.txt
 F:     Documentation/devicetree/bindings/pwm/
 F:     include/linux/pwm.h
-F:     include/linux/of_pwm.h
 F:     drivers/pwm/
 F:     drivers/video/backlight/pwm_bl.c
 F:     include/linux/pwm_backlight.h
@@ -6179,8 +6225,8 @@ M:        Anders Larsen <al@alarsen.net>
 W:     http://www.alarsen.net/linux/qnx4fs/
 S:     Maintained
 F:     fs/qnx4/
-F:     include/linux/qnx4_fs.h
-F:     include/linux/qnxtypes.h
+F:     include/uapi/linux/qnx4_fs.h
+F:     include/uapi/linux/qnxtypes.h
 
 QT1010 MEDIA DRIVER
 M:     Antti Palosaari <crope@iki.fi>
@@ -6214,7 +6260,7 @@ M:        Benjamin Herrenschmidt <benh@kernel.crashing.org>
 L:     linux-fbdev@vger.kernel.org
 S:     Maintained
 F:     drivers/video/aty/radeon*
-F:     include/linux/radeonfb.h
+F:     include/uapi/linux/radeonfb.h
 
 RADIOSHARK RADIO DRIVER
 M:     Hans de Goede <hdegoede@redhat.com>
@@ -6315,6 +6361,7 @@ S:        Maintained
 F:     Documentation/rtc.txt
 F:     drivers/rtc/
 F:     include/linux/rtc.h
+F:     include/uapi/linux/rtc.h
 
 REISERFS FILE SYSTEM
 L:     reiserfs-devel@vger.kernel.org
@@ -6369,8 +6416,8 @@ M:        Ralf Baechle <ralf@linux-mips.org>
 L:     linux-hams@vger.kernel.org
 W:     http://www.linux-ax25.org/
 S:     Maintained
-F:     include/linux/rose.h
 F:     include/net/rose.h
+F:     include/uapi/linux/rose.h
 F:     net/rose/
 
 RTL2830 MEDIA DRIVER
@@ -6547,6 +6594,8 @@ S:        Supported
 F:     include/linux/clocksource.h
 F:     include/linux/time.h
 F:     include/linux/timex.h
+F:     include/uapi/linux/time.h
+F:     include/uapi/linux/timex.h
 F:     kernel/time/clocksource.c
 F:     kernel/time/time*.c
 F:     kernel/time/ntp.c
@@ -6571,6 +6620,7 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
 S:     Maintained
 F:     kernel/sched/
 F:     include/linux/sched.h
+F:     include/uapi/linux/sched.h
 
 SCORE ARCHITECTURE
 M:     Chen Liqin <liqin.chen@sunplusct.com>
@@ -6724,7 +6774,7 @@ SENSABLE PHANTOM
 M:     Jiri Slaby <jirislaby@gmail.com>
 S:     Maintained
 F:     drivers/misc/phantom.c
-F:     include/linux/phantom.h
+F:     include/uapi/linux/phantom.h
 
 SERIAL ATA (SATA) SUBSYSTEM
 M:     Jeff Garzik <jgarzik@pobox.com>
@@ -6982,6 +7032,7 @@ L:        linux-raid@vger.kernel.org
 S:     Supported
 F:     drivers/md/
 F:     include/linux/raid/
+F:     include/uapi/linux/raid/
 
 SONIC NETWORK DRIVER
 M:     Thomas Bogendoerfer <tsbogend@alpha.franken.de>
@@ -7022,6 +7073,7 @@ T:        git git://git.alsa-project.org/alsa-kernel.git
 S:     Maintained
 F:     Documentation/sound/
 F:     include/sound/
+F:     include/uapi/sound/
 F:     sound/
 
 SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
@@ -7122,6 +7174,7 @@ S:        Maintained
 F:     Documentation/spi/
 F:     drivers/spi/
 F:     include/linux/spi/
+F:     include/uapi/linux/spi/
 
 SPIDERNET NETWORK DRIVER for CELL
 M:     Ishizaki Kou <kou.ishizaki@toshiba.co.jp>
@@ -7258,7 +7311,7 @@ F:        drivers/staging/rtl8712/
 STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER
 M:     Teddy Wang <teddy.wang@siliconmotion.com.cn>
 S:     Odd Fixes
-F:     drivers/staging/sm7xx/
+F:     drivers/staging/sm7xxfb/
 
 STAGING - SOFTLOGIC 6x10 MPEG CODEC
 M:     Ben Collins <bcollins@bluecherry.net>
@@ -7276,7 +7329,7 @@ S:        Odd Fixes
 F:     drivers/staging/speakup/
 
 STAGING - TI DSP BRIDGE DRIVERS
-M:     Omar Ramirez Luna <omar.ramirez@ti.com>
+M:     Omar Ramirez Luna <omar.ramirez@copitl.com>
 S:     Odd Fixes
 F:     drivers/staging/tidspbridge/
 
@@ -7384,8 +7437,8 @@ TC CLASSIFIER
 M:     Jamal Hadi Salim <jhs@mojatatu.com>
 L:     netdev@vger.kernel.org
 S:     Maintained
-F:     include/linux/pkt_cls.h
 F:     include/net/pkt_cls.h
+F:     include/uapi/linux/pkt_cls.h
 F:     net/sched/
 
 TCP LOW PRIORITY MODULE
@@ -7477,6 +7530,7 @@ L:        netdev@vger.kernel.org
 S:     Supported
 F:     drivers/net/team/
 F:     include/linux/if_team.h
+F:     include/uapi/linux/if_team.h
 
 TECHNOTREND USB IR RECEIVER
 M:     Sean Young <sean@mess.org>
@@ -7575,7 +7629,7 @@ L:        netdev@vger.kernel.org (core kernel code)
 L:     tipc-discussion@lists.sourceforge.net (user apps, general discussion)
 W:     http://tipc.sourceforge.net/
 S:     Maintained
-F:     include/linux/tipc*.h
+F:     include/uapi/linux/tipc*.h
 F:     net/tipc/
 
 TILE ARCHITECTURE
@@ -7625,6 +7679,7 @@ W:        http://www.buzzard.org.uk/toshiba/
 S:     Maintained
 F:     drivers/char/toshiba.c
 F:     include/linux/toshiba.h
+F:     include/uapi/linux/toshiba.h
 
 TMIO MMC DRIVER
 M:     Guennadi Liakhovetski <g.liakhovetski@gmx.de>
@@ -7692,6 +7747,9 @@ F:        drivers/tty/serial/serial_core.c
 F:     include/linux/serial_core.h
 F:     include/linux/serial.h
 F:     include/linux/tty.h
+F:     include/uapi/linux/serial_core.h
+F:     include/uapi/linux/serial.h
+F:     include/uapi/linux/tty.h
 
 TUA9001 MEDIA DRIVER
 M:     Antti Palosaari <crope@iki.fi>
@@ -7771,7 +7829,7 @@ M:        David Herrmann <dh.herrmann@googlemail.com>
 L:     linux-input@vger.kernel.org
 S:     Maintained
 F:     drivers/hid/uhid.c
-F:     include/linux/uhid.h
+F:     include/uapi/linux/uhid.h
 
 ULTRA-WIDEBAND (UWB) SUBSYSTEM:
 L:     linux-usb@vger.kernel.org
@@ -7800,6 +7858,7 @@ S:        Maintained
 F:     Documentation/cdrom/
 F:     drivers/cdrom/cdrom.c
 F:     include/linux/cdrom.h
+F:     include/uapi/linux/cdrom.h
 
 UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER
 M:     Vinayak Holikatti <vinholikatti@gmail.com>
@@ -7817,7 +7876,7 @@ T:        git git://git.infradead.org/ubi-2.6.git
 S:     Maintained
 F:     drivers/mtd/ubi/
 F:     include/linux/mtd/ubi.h
-F:     include/mtd/ubi-user.h
+F:     include/uapi/mtd/ubi-user.h
 
 UNSORTED BLOCK IMAGES (UBI) Fastmap
 M:     Richard Weinberger <richard@nod.at>
@@ -7851,7 +7910,7 @@ M:        Oliver Neukum <oliver@neukum.org>
 L:     linux-usb@vger.kernel.org
 S:     Maintained
 F:     drivers/net/usb/cdc_*.c
-F:     include/linux/usb/cdc.h
+F:     include/uapi/linux/usb/cdc.h
 
 USB CYPRESS C67X00 DRIVER
 M:     Peter Korsgaard <jacmet@sunsite.dk>
@@ -8172,6 +8231,7 @@ S:        Maintained
 F:     Documentation/vfio.txt
 F:     drivers/vfio/
 F:     include/linux/vfio.h
+F:     include/uapi/linux/vfio.h
 
 VIDEOBUF2 FRAMEWORK
 M:     Pawel Osciak <pawel@osciak.com>
@@ -8188,6 +8248,7 @@ L:        virtualization@lists.linux-foundation.org
 S:     Maintained
 F:     drivers/char/virtio_console.c
 F:     include/linux/virtio_console.h
+F:     include/uapi/linux/virtio_console.h
 
 VIRTIO CORE, NET AND BLOCK DRIVERS
 M:     Rusty Russell <rusty@rustcorp.com.au>
@@ -8206,7 +8267,7 @@ L:        virtualization@lists.linux-foundation.org
 L:     netdev@vger.kernel.org
 S:     Maintained
 F:     drivers/vhost/
-F:     include/linux/vhost.h
+F:     include/uapi/linux/vhost.h
 
 VIA RHINE NETWORK DRIVER
 M:     Roger Luethi <rl@hellgate.ch>
@@ -8346,6 +8407,7 @@ S:        Maintained
 F:     Documentation/watchdog/
 F:     drivers/watchdog/
 F:     include/linux/watchdog.h
+F:     include/uapi/linux/watchdog.h
 
 WD7000 SCSI DRIVER
 M:     Miroslav Zagorac <zaga@fly.cc.fer.hr>
@@ -8371,9 +8433,9 @@ L:        wimax@linuxwimax.org
 S:     Supported
 W:     http://linuxwimax.org
 F:     Documentation/wimax/README.wimax
-F:     include/linux/wimax.h
 F:     include/linux/wimax/debug.h
 F:     include/net/wimax.h
+F:     include/uapi/linux/wimax.h
 F:     net/wimax/
 
 WISTRON LAPTOP BUTTON DRIVER
@@ -8459,7 +8521,7 @@ F:        Documentation/x86/
 F:     arch/x86/
 
 X86 PLATFORM DRIVERS
-M:     Matthew Garrett <mjg@redhat.com>
+M:     Matthew Garrett <matthew.garrett@nebula.com>
 L:     platform-driver-x86@vger.kernel.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.git
 S:     Maintained
@@ -8491,6 +8553,7 @@ F:        drivers/*/xen-*front.c
 F:     drivers/xen/
 F:     arch/x86/include/asm/xen/
 F:     include/xen/
+F:     include/uapi/xen/
 
 XEN HYPERVISOR ARM
 M:     Stefano Stabellini <stefano.stabellini@eu.citrix.com>
index 275b9567382c775d881b03fffcdc8138fdd5d75c..a1667c4bcce580a25e141672daf44b550f4ee5e9 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 3
 PATCHLEVEL = 8
 SUBLEVEL = 0
-EXTRAVERSION = -rc1
+EXTRAVERSION = -rc3
 NAME = Terrified Chipmunk
 
 # *DOCUMENTATION*
index c5ee7cbb2fcdf8cbdf928ae43beaaaf0be7e7102..6abd0af11f13513bf1a31c9fc7d66b31e58cafbb 100644 (file)
@@ -9,8 +9,8 @@
 #ifndef _ASM_AXP_PARPORT_H
 #define _ASM_AXP_PARPORT_H 1
 
-static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma);
-static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
+static int parport_pc_find_isa_ports (int autoirq, int autodma);
+static int parport_pc_find_nonpci_ports (int autoirq, int autodma)
 {
        return parport_pc_find_isa_ports (autoirq, autodma);
 }
index 097c1577735af85844b58ad1b4f6c71767f94d6c..c5195524d1ef8904af746889e9955271b2ff55c1 100644 (file)
@@ -19,7 +19,7 @@
 #define SO_BROADCAST   0x0020
 #define SO_LINGER      0x0080
 #define SO_OOBINLINE   0x0100
-/* To add :#define SO_REUSEPORT 0x0200 */
+#define SO_REUSEPORT   0x0200
 
 #define SO_TYPE                0x1008
 #define SO_ERROR       0x1007
@@ -77,5 +77,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
 
 #endif /* _UAPI_ASM_SOCKET_H */
index ef757147cbf9ae2e63c74c44a7c01d9528db9e10..edb4e0097b75eff056ea89d37146ec2fe77eadc7 100644 (file)
@@ -59,13 +59,13 @@ struct pci_controller *pci_isa_hose;
  * Quirks.
  */
 
-static void __devinit quirk_isa_bridge(struct pci_dev *dev)
+static void quirk_isa_bridge(struct pci_dev *dev)
 {
        dev->class = PCI_CLASS_BRIDGE_ISA << 8;
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82378, quirk_isa_bridge);
 
-static void __devinit quirk_cypress(struct pci_dev *dev)
+static void quirk_cypress(struct pci_dev *dev)
 {
        /* The Notorious Cy82C693 chip.  */
 
@@ -104,7 +104,7 @@ static void __devinit quirk_cypress(struct pci_dev *dev)
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, quirk_cypress);
 
 /* Called for each device after PCI setup is done. */
-static void __devinit pcibios_fixup_final(struct pci_dev *dev)
+static void pcibios_fixup_final(struct pci_dev *dev)
 {
        unsigned int class = dev->class >> 8;
 
@@ -198,8 +198,7 @@ subsys_initcall(pcibios_init);
 #ifdef ALPHA_RESTORE_SRM_SETUP
 static struct pdev_srm_saved_conf *srm_saved_configs;
 
-void __devinit
-pdev_save_srm_config(struct pci_dev *dev)
+void pdev_save_srm_config(struct pci_dev *dev)
 {
        struct pdev_srm_saved_conf *tmp;
        static int printed = 0;
@@ -241,8 +240,7 @@ pci_restore_srm_config(void)
 }
 #endif
 
-void __devinit
-pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        struct pci_dev *dev = bus->self;
 
index a41ad90a97a692b039a2e8dbee2f57aa4b1a3300..9603bc234b479ce8ffbbbc961f8c0df9da97fff4 100644 (file)
@@ -68,7 +68,7 @@ enum ipi_message_type {
 };
 
 /* Set to a secondary's cpuid when it comes online.  */
-static int smp_secondary_alive __devinitdata = 0;
+static int smp_secondary_alive = 0;
 
 int smp_num_probed;            /* Internal processor count */
 int smp_num_cpus = 1;          /* Number that came online.  */
@@ -172,7 +172,7 @@ smp_callin(void)
 }
 
 /* Wait until hwrpb->txrdy is clear for cpu.  Return -1 on timeout.  */
-static int __devinit
+static int
 wait_for_txrdy (unsigned long cpumask)
 {
        unsigned long timeout;
@@ -468,7 +468,7 @@ smp_prepare_cpus(unsigned int max_cpus)
        smp_num_cpus = smp_num_probed;
 }
 
-void __devinit
+void
 smp_prepare_boot_cpu(void)
 {
 }
index 2533db280d9ba1f7ea642d4c947b5d532484a526..5cf4a481b8c57ea01e0709764f2e4c11ad26b863 100644 (file)
@@ -303,7 +303,7 @@ titan_late_init(void)
 
 }
 
-static int __devinit
+static int
 titan_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 {
        u8 intline;
index f95ba14ae3d067c7ddfbd139e4207c0ee24bd82c..67874b82a4edf318ae3718ae6137393140405586 100644 (file)
@@ -371,7 +371,6 @@ config ARCH_CNS3XXX
 config ARCH_CLPS711X
        bool "Cirrus Logic CLPS711x/EP721x/EP731x-based"
        select ARCH_REQUIRE_GPIOLIB
-       select ARCH_USES_GETTIMEOFFSET
        select AUTO_ZRELADDR
        select CLKDEV_LOOKUP
        select COMMON_CLK
@@ -1230,6 +1229,7 @@ config ARM_ERRATA_430973
 config ARM_ERRATA_458693
        bool "ARM errata: Processor deadlock when a false hazard is created"
        depends on CPU_V7
+       depends on !ARCH_MULTIPLATFORM
        help
          This option enables the workaround for the 458693 Cortex-A8 (r2p0)
          erratum. For very specific sequences of memory operations, it is
@@ -1243,6 +1243,7 @@ config ARM_ERRATA_458693
 config ARM_ERRATA_460075
        bool "ARM errata: Data written to the L2 cache can be overwritten with stale data"
        depends on CPU_V7
+       depends on !ARCH_MULTIPLATFORM
        help
          This option enables the workaround for the 460075 Cortex-A8 (r2p0)
          erratum. Any asynchronous access to the L2 cache may encounter a
@@ -1255,6 +1256,7 @@ config ARM_ERRATA_460075
 config ARM_ERRATA_742230
        bool "ARM errata: DMB operation may be faulty"
        depends on CPU_V7 && SMP
+       depends on !ARCH_MULTIPLATFORM
        help
          This option enables the workaround for the 742230 Cortex-A9
          (r1p0..r2p2) erratum. Under rare circumstances, a DMB instruction
@@ -1267,6 +1269,7 @@ config ARM_ERRATA_742230
 config ARM_ERRATA_742231
        bool "ARM errata: Incorrect hazard handling in the SCU may lead to data corruption"
        depends on CPU_V7 && SMP
+       depends on !ARCH_MULTIPLATFORM
        help
          This option enables the workaround for the 742231 Cortex-A9
          (r2p0..r2p2) erratum. Under certain conditions, specific to the
@@ -1317,6 +1320,7 @@ config PL310_ERRATA_727915
 config ARM_ERRATA_743622
        bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption"
        depends on CPU_V7
+       depends on !ARCH_MULTIPLATFORM
        help
          This option enables the workaround for the 743622 Cortex-A9
          (r2p*) erratum. Under very rare conditions, a faulty
@@ -1330,6 +1334,7 @@ config ARM_ERRATA_743622
 config ARM_ERRATA_751472
        bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation"
        depends on CPU_V7
+       depends on !ARCH_MULTIPLATFORM
        help
          This option enables the workaround for the 751472 Cortex-A9 (prior
          to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the
index e44da40d984f7faa18bb8a32f51f5f1fe233f20a..5ebb44fe826a9b0b36d051272910a26775e5a16f 100644 (file)
@@ -155,6 +155,7 @@ dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \
 dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb
 
 targets += dtbs
+targets += $(dtb-y)
 endif
 
 # *.dtb used to be generated in the directory above. Clean out the
index cf6c48a09eacf36e84b4caf4b83be0c35d0b22e8..4c0abe85405fe533ba0cedd41c95d4b9de4b4dc7 100644 (file)
                ranges;
 
                serial@d0012000 {
-                               compatible = "ns16550";
+                               compatible = "snps,dw-apb-uart";
                                reg = <0xd0012000 0x100>;
                                reg-shift = <2>;
                                interrupts = <41>;
+                               reg-io-width = <4>;
                                status = "disabled";
                };
                serial@d0012100 {
-                               compatible = "ns16550";
+                               compatible = "snps,dw-apb-uart";
                                reg = <0xd0012100 0x100>;
                                reg-shift = <2>;
                                interrupts = <42>;
+                               reg-io-width = <4>;
                                status = "disabled";
                };
 
index c45c7b4dc35230c52957fb1d32054a261e66e2ad..271855a6e224758800f1146f02dd992786dab801 100644 (file)
                reg = <0>;
                clocks = <&cpuclk 0>;
            };
-       }
+
+           cpu@1 {
+               device_type = "cpu";
+               compatible = "marvell,sheeva-v7";
+               reg = <1>;
+               clocks = <&cpuclk 1>;
+           };
+       };
 
        soc {
                pinctrl {
index a2aee5707377c3886a51217d40c102ed5e68c1e1..1c1937dbce73c1d320f9689fd62fe9a05c851fd2 100644 (file)
                        #interrupts-cells = <2>;
                        interrupts = <24>;
                };
+
+               ethernet@d0034000 {
+                               compatible = "marvell,armada-370-neta";
+                               reg = <0xd0034000 0x2500>;
+                               interrupts = <14>;
+                               clocks = <&gateclk 1>;
+                               status = "disabled";
+               };
        };
 };
index da03a129243a548853e5afa611b84f1b5fd73ebe..4905cf3a5ef85edc82dee68e0fafe978bd919f5c 100644 (file)
                        #interrupts-cells = <2>;
                        interrupts = <24>;
                };
+
+               ethernet@d0034000 {
+                               compatible = "marvell,armada-370-neta";
+                               reg = <0xd0034000 0x2500>;
+                               interrupts = <14>;
+                               clocks = <&gateclk 1>;
+                               status = "disabled";
+               };
        };
  };
index 367aa3f94912ac9d78a35d22321c64667af406cf..2e37ef101c9035d65efefa83854ba79c742a8d94 100644 (file)
 
        soc {
                serial@d0012200 {
-                               compatible = "ns16550";
+                               compatible = "snps,dw-apb-uart";
                                reg = <0xd0012200 0x100>;
                                reg-shift = <2>;
                                interrupts = <43>;
+                               reg-io-width = <4>;
                                status = "disabled";
                };
                serial@d0012300 {
-                               compatible = "ns16550";
+                               compatible = "snps,dw-apb-uart";
                                reg = <0xd0012300 0x100>;
                                reg-shift = <2>;
                                interrupts = <44>;
+                               reg-io-width = <4>;
                                status = "disabled";
                };
 
                                status = "disabled";
                };
 
-               ethernet@d0034000 {
-                               compatible = "marvell,armada-370-neta";
-                               reg = <0xd0034000 0x2500>;
-                               interrupts = <14>;
-                               clocks = <&gateclk 1>;
-                               status = "disabled";
-               };
-
                xor@d0060900 {
                        compatible = "marvell,orion-xor";
                        reg = <0xd0060900 0x100
index 2efd9c891bc91f85522a6158854fd14e89b7f65f..63f2fbcfe8196823a93ac5f74f2eadebd3ae52f7 100644 (file)
                        gpio-bank = <8>;
                };
 
-               pinctrl {
+               pinctrl@80157000 {
+                       // This is actually the PRCMU base address
+                       reg = <0x80157000 0x2000>;
                        compatible = "stericsson,nmk_pinctrl";
                };
 
index f3f7e9d8adca4862c92cd22d00eb6d15267a8a8c..42eac1ff3cc82a02c5f52fddba478e76d83548d8 100644 (file)
                pinctrl: pinctrl@d0200 {
                        compatible = "marvell,dove-pinctrl";
                        reg = <0xd0200 0x10>;
+                       clocks = <&gate_clk 22>;
                };
 
                spi0: spi@10600 {
index 46477ac1de99fd4e148c6b8593c1c6f2502eff98..139b40cc3a23e63087fc6154ca6e7f79ed828fae 100644 (file)
@@ -32,6 +32,7 @@
 
                cpu@0 {
                        compatible = "arm,cortex-a15";
+                       device_type = "cpu";
                        reg = <0>;
                        clocks = <&a9pll>;
                        clock-names = "cpu";
@@ -39,6 +40,7 @@
 
                cpu@1 {
                        compatible = "arm,cortex-a15";
+                       device_type = "cpu";
                        reg = <1>;
                        clocks = <&a9pll>;
                        clock-names = "cpu";
@@ -46,6 +48,7 @@
 
                cpu@2 {
                        compatible = "arm,cortex-a15";
+                       device_type = "cpu";
                        reg = <2>;
                        clocks = <&a9pll>;
                        clock-names = "cpu";
@@ -53,6 +56,7 @@
 
                cpu@3 {
                        compatible = "arm,cortex-a15";
+                       device_type = "cpu";
                        reg = <3>;
                        clocks = <&a9pll>;
                        clock-names = "cpu";
index 9b23a8255e39a148eecdd18e04391f4a2f6529f0..f63490707f3a56646c8cc09edd471009d6644b14 100644 (file)
@@ -26,7 +26,7 @@
        };
 
        chosen {
-               bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC2,115200 init=/linuxrc";
+               bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc";
        };
 
        sdhci@12530000 {
index 2e3b6efaf1a2632062fd93a8ca7d0eec792a9c0c..3acf594ea60bda97bc5e53187011455bf86b0c5b 100644 (file)
 
        hdmi {
                compatible = "samsung,exynos5-hdmi";
-               reg = <0x14530000 0x100000>;
+               reg = <0x14530000 0x70000>;
                interrupts = <0 95 0>;
        };
 
index 921c83cf694f57fe7138fb8a703e022133f5f480..81e2c964a900f8a74d5efbac4aca73491bcc719a 100644 (file)
@@ -21,7 +21,7 @@
        };
 
        chosen {
-               bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x81000000,8M console=ttySAC2,115200 init=/linuxrc";
+               bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x81000000,8M console=ttySAC0,115200 init=/linuxrc";
        };
 
        spi {
index a9ae5d32e80dfa057f01bb49dacb728035480e19..5927a8df562536550b101669f45978f33907e0ac 100644 (file)
                #address-cells = <1>;
                #size-cells = <0>;
 
-               cpu@0 {
+               cpu@900 {
                        compatible = "arm,cortex-a9";
-                       reg = <0>;
+                       device_type = "cpu";
+                       reg = <0x900>;
                        next-level-cache = <&L2>;
                        clocks = <&a9pll>;
                        clock-names = "cpu";
                };
 
-               cpu@1 {
+               cpu@901 {
                        compatible = "arm,cortex-a9";
-                       reg = <1>;
+                       device_type = "cpu";
+                       reg = <0x901>;
                        next-level-cache = <&L2>;
                        clocks = <&a9pll>;
                        clock-names = "cpu";
                };
 
-               cpu@2 {
+               cpu@902 {
                        compatible = "arm,cortex-a9";
-                       reg = <2>;
+                       device_type = "cpu";
+                       reg = <0x902>;
                        next-level-cache = <&L2>;
                        clocks = <&a9pll>;
                        clock-names = "cpu";
                };
 
-               cpu@3 {
+               cpu@903 {
                        compatible = "arm,cortex-a9";
-                       reg = <3>;
+                       device_type = "cpu";
+                       reg = <0x903>;
                        next-level-cache = <&L2>;
                        clocks = <&a9pll>;
                        clock-names = "cpu";
index 7c43b8e70b9fcb1c29da27a059f658440ddec246..e7484e4ea659ca261149476a6e7fc6c07dd85690 100644 (file)
                                hog_pins_a: hog@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
-                                               0x2013 /* MX23_PAD_SSP1_DETECT__GPIO_2_1 */
+                                               0x0113 /* MX23_PAD_GPMI_ALE__GPIO_0_17 */
                                        >;
                                        fsl,drive-strength = <0>;
                                        fsl,voltage = <1>;
                                        fsl,pull-up = <0>;
                                };
 
-                               led_pin_gpio0_17: led_gpio0_17@0 {
+                               led_pin_gpio2_1: led_gpio2_1@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
-                                               0x0113 /* MX23_PAD_GPMI_ALE__GPIO_0_17 */
+                                               0x2013 /* MX23_PAD_SSP1_DETECT__GPIO_2_1 */
                                        >;
                                        fsl,drive-strength = <0>;
                                        fsl,voltage = <1>;
        leds {
                compatible = "gpio-leds";
                pinctrl-names = "default";
-               pinctrl-0 = <&led_pin_gpio0_17>;
+               pinctrl-0 = <&led_pin_gpio2_1>;
 
                user {
                        label = "green";
index 24731cb78e8ecd72616d272aaeff0e224807e0cc..7f67402328d377aa213a579860ff934db4e2483f 100644 (file)
@@ -14,7 +14,7 @@
 
 / {
        model = "Buglabs i.MX31 Bug 1.x";
-       compatible = "fsl,imx31-bug", "fsl,imx31";
+       compatible = "buglabs,imx31-bug", "fsl,imx31";
 
        memory {
                reg = <0x80000000 0x8000000>; /* 128M */
index 552aed4ff9823e63bdfdca1df059cff82b7f2baa..edc3f1eb6699238b776a1affc9f647103dfdc4ca 100644 (file)
                                compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";
                                reg = <0x53fcc000 0x4000>;
                                interrupts = <83>;
-                               clocks = <&clks 158>, <&clks 157>;
+                               clocks = <&clks 87>, <&clks 86>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
index 9ae2004d567531422ad64c4321e97849da0714e6..4ccea2130a6cd2b42029522ac2c8c527fba2728f 100644 (file)
@@ -39,6 +39,7 @@
                        #size-cells = <0>;
                        interrupts = <32>;
                        clock-frequency = <100000>;
+                       clocks = <&gate_clk 7>;
                        status = "disabled";
                };
        };
index c0de5a7f660d976269087e7f8e888b141adf8468..cd15452a52a62024f9518a5abdb677ab8292fd9c 100644 (file)
                        gpios = <&gpio1 16 1>;
                };
        };
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               sata0_power: regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "SATA0 Power";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       gpio = <&gpio1 4 0>;
+               };
+       };
 };
index 7735cee4a9c6fb8a34ffb001eed617137a0fef6c..110d6cbb795b384aa330c422d6409057839bb3ee 100644 (file)
                        compatible = "marvell,orion-ehci";
                        reg = <0x50000 0x1000>;
                        interrupts = <19>;
+                       clocks = <&gate_clk 3>;
                        status = "okay";
                };
 
index 63411b036932011e6fe1b8764c7fa9ecdd0ee48f..ed0bc9546837d8f40f3bf873e20055717c5d1451 100644 (file)
                interrupts = <11>;
        };
 
+       watchdog {
+               compatible = "ti,twl4030-wdt";
+       };
+
        vdac: regulator-vdac {
                compatible = "ti,twl4030-vdac";
                regulator-min-microvolt = <1800000>;
index 9173d112ea0156a31b2f2769731a3b80be7de680..e57d7e5bf96a1a16681ed1ba73bf31c291ba3da5 100644 (file)
@@ -686,8 +686,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
  *     %-EINVAL        no platform data passed
  *     %0              successful.
  */
-static int __devinit
-__sa1111_probe(struct device *me, struct resource *mem, int irq)
+static int __sa1111_probe(struct device *me, struct resource *mem, int irq)
 {
        struct sa1111_platform_data *pd = me->platform_data;
        struct sa1111 *sachip;
@@ -1011,7 +1010,7 @@ static int sa1111_resume(struct platform_device *dev)
 #define sa1111_resume  NULL
 #endif
 
-static int __devinit sa1111_probe(struct platform_device *pdev)
+static int sa1111_probe(struct platform_device *pdev)
 {
        struct resource *mem;
        int irq;
index 0c616d5fcb0f7bf3a6811ea08f7fd2dcc63c819b..a5c3dc38aa1818d29285d16789df7788bd83aa4c 100644 (file)
@@ -176,7 +176,7 @@ static int scoop_resume(struct platform_device *dev)
 #define scoop_resume   NULL
 #endif
 
-static int __devinit scoop_probe(struct platform_device *pdev)
+static int scoop_probe(struct platform_device *pdev)
 {
        struct scoop_dev *devptr;
        struct scoop_config *inf;
@@ -243,7 +243,7 @@ err_ioremap:
        return ret;
 }
 
-static int __devexit scoop_remove(struct platform_device *pdev)
+static int scoop_remove(struct platform_device *pdev)
 {
        struct scoop_dev *sdev = platform_get_drvdata(pdev);
        int ret;
@@ -268,7 +268,7 @@ static int __devexit scoop_remove(struct platform_device *pdev)
 
 static struct platform_driver scoop_driver = {
        .probe          = scoop_probe,
-       .remove         = __devexit_p(scoop_remove),
+       .remove         = scoop_remove,
        .suspend        = scoop_suspend,
        .resume         = scoop_resume,
        .driver         = {
index e4df17ca90c7114efaca806977d153a87b7ad5ba..8f324b99416e46548ce2bdb9a02edac2340835bd 100644 (file)
@@ -206,6 +206,7 @@ static void __init vic_register(void __iomem *base, unsigned int irq,
                                struct device_node *node)
 {
        struct vic_device *v;
+       int i;
 
        if (vic_id >= ARRAY_SIZE(vic_devices)) {
                printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__);
@@ -220,6 +221,10 @@ static void __init vic_register(void __iomem *base, unsigned int irq,
        vic_id++;
        v->domain = irq_domain_add_simple(node, fls(valid_sources), irq,
                                          &vic_irqdomain_ops, v);
+       /* create an IRQ mapping for each valid IRQ */
+       for (i = 0; i < fls(valid_sources); i++)
+               if (valid_sources & (1 << i))
+                       irq_create_mapping(v->domain, i);
 }
 
 static void vic_ack_irq(struct irq_data *d)
@@ -416,9 +421,9 @@ int __init vic_of_init(struct device_node *node, struct device_node *parent)
                return -EIO;
 
        /*
-        * Passing -1 as first IRQ makes the simple domain allocate descriptors
+        * Passing 0 as first IRQ makes the simple domain allocate descriptors
         */
-       __vic_init(regs, -1, ~0, ~0, node);
+       __vic_init(regs, 0, ~0, ~0, node);
 
        return 0;
 }
index dbea6f4efe9f7775879032ddf4ff3444a7a80a63..2eeff1e64b6e15d77f76aa75eb7c6152d3cf800f 100644 (file)
@@ -6,6 +6,7 @@ CONFIG_MACH_ARMADA_370=y
 CONFIG_MACH_ARMADA_XP=y
 CONFIG_ARCH_HIGHBANK=y
 CONFIG_ARCH_SOCFPGA=y
+CONFIG_ARCH_SUNXI=y
 # CONFIG_ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA is not set
 CONFIG_ARM_ERRATA_754322=y
 CONFIG_SMP=y
index a702fb345c01e5693d82f22d0eeb5fc2d7c88b2a..b5bc96cb65a79d87c2f65814e9cc4fecd69e4df1 100644 (file)
@@ -33,9 +33,7 @@ CONFIG_MVNETA=y
 CONFIG_MARVELL_PHY=y
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_OF_PLATFORM=y
-CONFIG_I2C=y
-CONFIG_I2C_MV64XXX=y
+CONFIG_SERIAL_8250_DW=y
 CONFIG_GPIOLIB=y
 CONFIG_GPIO_SYSFS=y
 # CONFIG_USB_SUPPORT is not set
index a1dc5c071e71250879e27ae3c92632a3409375cb..82ce8d738fa1c8a6f4ba730828867de22aa392c3 100644 (file)
@@ -65,6 +65,8 @@ CONFIG_MAC80211_RC_PID=y
 CONFIG_MAC80211_RC_DEFAULT_PID=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_CONNECTOR=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_CHAR=y
@@ -132,9 +134,11 @@ CONFIG_POWER_SUPPLY=y
 CONFIG_WATCHDOG=y
 CONFIG_OMAP_WATCHDOG=y
 CONFIG_TWL4030_WATCHDOG=y
+CONFIG_MFD_TPS65217=y
 CONFIG_REGULATOR_TWL4030=y
 CONFIG_REGULATOR_TPS65023=y
 CONFIG_REGULATOR_TPS6507X=y
+CONFIG_REGULATOR_TPS65217=y
 CONFIG_FB=y
 CONFIG_FIRMWARE_EDID=y
 CONFIG_FB_MODE_HELPERS=y
@@ -170,6 +174,7 @@ CONFIG_SND_DEBUG=y
 CONFIG_SND_USB_AUDIO=m
 CONFIG_SND_SOC=m
 CONFIG_SND_OMAP_SOC=m
+CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m
 CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
 CONFIG_USB=y
 CONFIG_USB_DEBUG=y
index 9b722612553ddbe3c03257b0e3d3fc8b6d939939..379cf32923908365853c7f9eafc6a5fdba54c76c 100644 (file)
@@ -78,7 +78,7 @@ void pcibios_report_status(u_int status_mask, int warn)
  * Bug 3 is responsible for the sound DMA grinding to a halt.  We now
  * live with bug 2.
  */
-static void __devinit pci_fixup_83c553(struct pci_dev *dev)
+static void pci_fixup_83c553(struct pci_dev *dev)
 {
        /*
         * Set memory region to start at address 0, and enable IO
@@ -130,7 +130,7 @@ static void __devinit pci_fixup_83c553(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_83C553, pci_fixup_83c553);
 
-static void __devinit pci_fixup_unassign(struct pci_dev *dev)
+static void pci_fixup_unassign(struct pci_dev *dev)
 {
        dev->resource[0].end -= dev->resource[0].start;
        dev->resource[0].start = 0;
@@ -142,7 +142,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940F,
  * if it is the host bridge by marking it as such.  These resources are of
  * no consequence to the PCI layer (they are handled elsewhere).
  */
-static void __devinit pci_fixup_dec21285(struct pci_dev *dev)
+static void pci_fixup_dec21285(struct pci_dev *dev)
 {
        int i;
 
@@ -161,7 +161,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, pci_fixup_d
 /*
  * PCI IDE controllers use non-standard I/O port decoding, respect it.
  */
-static void __devinit pci_fixup_ide_bases(struct pci_dev *dev)
+static void pci_fixup_ide_bases(struct pci_dev *dev)
 {
        struct resource *r;
        int i;
@@ -182,7 +182,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases);
 /*
  * Put the DEC21142 to sleep
  */
-static void __devinit pci_fixup_dec21142(struct pci_dev *dev)
+static void pci_fixup_dec21142(struct pci_dev *dev)
 {
        pci_write_config_dword(dev, 0x40, 0x80000000);
 }
@@ -204,7 +204,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142, pci_fixup_d
  * functional.  However, The CY82C693U _does not work_ in bus
  * master mode without locking the PCI bus solid.
  */
-static void __devinit pci_fixup_cy82c693(struct pci_dev *dev)
+static void pci_fixup_cy82c693(struct pci_dev *dev)
 {
        if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
                u32 base0, base1;
@@ -254,7 +254,7 @@ static void __devinit pci_fixup_cy82c693(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, pci_fixup_cy82c693);
 
-static void __devinit pci_fixup_it8152(struct pci_dev *dev)
+static void pci_fixup_it8152(struct pci_dev *dev)
 {
        int i;
        /* fixup for ITE 8152 devices */
@@ -361,9 +361,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
        printk(KERN_INFO "PCI: bus%d: Fast back to back transfers %sabled\n",
                bus->number, (features & PCI_COMMAND_FAST_BACK) ? "en" : "dis");
 }
-#ifdef CONFIG_HOTPLUG
 EXPORT_SYMBOL(pcibios_fixup_bus);
-#endif
 
 /*
  * Swizzle the device pin each time we cross a bridge.  If a platform does
@@ -380,7 +378,7 @@ EXPORT_SYMBOL(pcibios_fixup_bus);
  * PCI standard swizzle is implemented on plug-in cards and Cardbus based
  * PCI extenders, so it can not be ignored.
  */
-static u8 __devinit pcibios_swizzle(struct pci_dev *dev, u8 *pin)
+static u8 pcibios_swizzle(struct pci_dev *dev, u8 *pin)
 {
        struct pci_sys_data *sys = dev->sysdata;
        int slot, oldpin = *pin;
index 36d20bd501200880dad2a662a8a3d29f15506e5c..9b6de8c988f30e67af04325c081c8d0809e9f663 100644 (file)
@@ -339,7 +339,7 @@ static struct miscdevice etb_miscdev = {
        .fops = &etb_fops,
 };
 
-static int __devinit etb_probe(struct amba_device *dev, const struct amba_id *id)
+static int etb_probe(struct amba_device *dev, const struct amba_id *id)
 {
        struct tracectx *t = &tracer;
        int ret = 0;
@@ -531,7 +531,7 @@ static ssize_t trace_mode_store(struct kobject *kobj,
 static struct kobj_attribute trace_mode_attr =
        __ATTR(trace_mode, 0644, trace_mode_show, trace_mode_store);
 
-static int __devinit etm_probe(struct amba_device *dev, const struct amba_id *id)
+static int etm_probe(struct amba_device *dev, const struct amba_id *id)
 {
        struct tracectx *t = &tracer;
        int ret = 0;
index 9a4f6307a01620996f08c29ebec7c03d05ff05fd..5f6620684e255cb7e8e5b34d36e31771682e8e40 100644 (file)
@@ -132,7 +132,7 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler)
        return 0;
 }
 
-static void __devinit cpu_pmu_init(struct arm_pmu *cpu_pmu)
+static void cpu_pmu_init(struct arm_pmu *cpu_pmu)
 {
        int cpu;
        for_each_possible_cpu(cpu) {
@@ -178,7 +178,7 @@ static struct notifier_block __cpuinitdata cpu_pmu_hotplug_notifier = {
 /*
  * PMU platform driver and devicetree bindings.
  */
-static struct of_device_id __devinitdata cpu_pmu_of_device_ids[] = {
+static struct of_device_id cpu_pmu_of_device_ids[] = {
        {.compatible = "arm,cortex-a15-pmu",    .data = armv7_a15_pmu_init},
        {.compatible = "arm,cortex-a9-pmu",     .data = armv7_a9_pmu_init},
        {.compatible = "arm,cortex-a8-pmu",     .data = armv7_a8_pmu_init},
@@ -190,7 +190,7 @@ static struct of_device_id __devinitdata cpu_pmu_of_device_ids[] = {
        {},
 };
 
-static struct platform_device_id __devinitdata cpu_pmu_plat_device_ids[] = {
+static struct platform_device_id cpu_pmu_plat_device_ids[] = {
        {.name = "arm-pmu"},
        {},
 };
@@ -198,7 +198,7 @@ static struct platform_device_id __devinitdata cpu_pmu_plat_device_ids[] = {
 /*
  * CPU PMU identification and probing.
  */
-static int __devinit probe_current_pmu(struct arm_pmu *pmu)
+static int probe_current_pmu(struct arm_pmu *pmu)
 {
        int cpu = get_cpu();
        unsigned long cpuid = read_cpuid_id();
@@ -252,7 +252,7 @@ static int __devinit probe_current_pmu(struct arm_pmu *pmu)
        return ret;
 }
 
-static int __devinit cpu_pmu_device_probe(struct platform_device *pdev)
+static int cpu_pmu_device_probe(struct platform_device *pdev)
 {
        const struct of_device_id *of_id;
        int (*init_fn)(struct arm_pmu *);
index f3e22ff8b6a2c2bc5f620e9b8a389cb17b56a136..041d0526a2885fb424bd58716af0c10e29e95419 100644 (file)
@@ -653,7 +653,7 @@ static int armv6_map_event(struct perf_event *event)
                                &armv6_perf_cache_map, 0xFF);
 }
 
-static int __devinit armv6pmu_init(struct arm_pmu *cpu_pmu)
+static int armv6pmu_init(struct arm_pmu *cpu_pmu)
 {
        cpu_pmu->name           = "v6";
        cpu_pmu->handle_irq     = armv6pmu_handle_irq;
@@ -685,7 +685,7 @@ static int armv6mpcore_map_event(struct perf_event *event)
                                &armv6mpcore_perf_cache_map, 0xFF);
 }
 
-static int __devinit armv6mpcore_pmu_init(struct arm_pmu *cpu_pmu)
+static int armv6mpcore_pmu_init(struct arm_pmu *cpu_pmu)
 {
        cpu_pmu->name           = "v6mpcore";
        cpu_pmu->handle_irq     = armv6pmu_handle_irq;
index 7d0cce85d17e56ea1049403b38b4d4532dc7d6b1..4fbc757d9cffd6daebd6dd070047d2cfe1ff5e06 100644 (file)
@@ -1226,7 +1226,7 @@ static void armv7pmu_init(struct arm_pmu *cpu_pmu)
        cpu_pmu->max_period     = (1LLU << 32) - 1;
 };
 
-static u32 __devinit armv7_read_num_pmnc_events(void)
+static u32 armv7_read_num_pmnc_events(void)
 {
        u32 nb_cnt;
 
@@ -1237,7 +1237,7 @@ static u32 __devinit armv7_read_num_pmnc_events(void)
        return nb_cnt + 1;
 }
 
-static int __devinit armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)
+static int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)
 {
        armv7pmu_init(cpu_pmu);
        cpu_pmu->name           = "ARMv7 Cortex-A8";
@@ -1246,7 +1246,7 @@ static int __devinit armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)
        return 0;
 }
 
-static int __devinit armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)
+static int armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)
 {
        armv7pmu_init(cpu_pmu);
        cpu_pmu->name           = "ARMv7 Cortex-A9";
@@ -1255,7 +1255,7 @@ static int __devinit armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)
        return 0;
 }
 
-static int __devinit armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)
+static int armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)
 {
        armv7pmu_init(cpu_pmu);
        cpu_pmu->name           = "ARMv7 Cortex-A5";
@@ -1264,7 +1264,7 @@ static int __devinit armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)
        return 0;
 }
 
-static int __devinit armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)
+static int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)
 {
        armv7pmu_init(cpu_pmu);
        cpu_pmu->name           = "ARMv7 Cortex-A15";
@@ -1274,7 +1274,7 @@ static int __devinit armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)
        return 0;
 }
 
-static int __devinit armv7_a7_pmu_init(struct arm_pmu *cpu_pmu)
+static int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu)
 {
        armv7pmu_init(cpu_pmu);
        cpu_pmu->name           = "ARMv7 Cortex-A7";
index 0c8265e53d5f7b079a49e80b70912e2edc1d7372..2b0fe30ec12e11715b834b13ee8998c043e2463d 100644 (file)
@@ -440,7 +440,7 @@ static int xscale_map_event(struct perf_event *event)
                                &xscale_perf_cache_map, 0xFF);
 }
 
-static int __devinit xscale1pmu_init(struct arm_pmu *cpu_pmu)
+static int xscale1pmu_init(struct arm_pmu *cpu_pmu)
 {
        cpu_pmu->name           = "xscale1";
        cpu_pmu->handle_irq     = xscale1pmu_handle_irq;
@@ -810,7 +810,7 @@ static inline void xscale2pmu_write_counter(struct perf_event *event, u32 val)
        }
 }
 
-static int __devinit xscale2pmu_init(struct arm_pmu *cpu_pmu)
+static int xscale2pmu_init(struct arm_pmu *cpu_pmu)
 {
        cpu_pmu->name           = "xscale2";
        cpu_pmu->handle_irq     = xscale2pmu_handle_irq;
index 9211e8800c79a60397afa92c1e463c4cc569e974..6e2f1631df5b0e1321c9d80d11beea76c8c29607 100644 (file)
@@ -358,7 +358,7 @@ static int cpld_video_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit cpld_video_remove(struct i2c_client *client)
+static int cpld_video_remove(struct i2c_client *client)
 {
        cpld_client = NULL;
        return 0;
index f2232ca6d0707b7f8b5c64b976778000430f4bdf..abafb92031c0966a9728a5dd5309872a71e86886 100644 (file)
@@ -256,7 +256,7 @@ static int cdce_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit cdce_remove(struct i2c_client *client)
+static int cdce_remove(struct i2c_client *client)
 {
        cdce_i2c_client = NULL;
        return 0;
@@ -274,7 +274,7 @@ static struct i2c_driver cdce_driver = {
                .name   = "cdce949",
        },
        .probe          = cdce_probe,
-       .remove         = __devexit_p(cdce_remove),
+       .remove         = cdce_remove,
        .id_table       = cdce_id,
 };
 
index 0ef4435b16570dccde5af41737bf25987051270d..8a275f2975220f94063442c569510dbe5ea72dc9 100644 (file)
@@ -135,7 +135,7 @@ static struct pci_ops pcie_ops = {
        .write = pcie_wr_conf,
 };
 
-static void __devinit rc_pci_fixup(struct pci_dev *dev)
+static void rc_pci_fixup(struct pci_dev *dev)
 {
        /*
         * Prevent enumeration of root complex.
index 91d5b6f1d5afa80c6c0fbb5d35a88af1a2750838..e103c290bc9e37ca5871d8e8182493e9fa0447c5 100644 (file)
@@ -74,6 +74,8 @@ config SOC_EXYNOS5440
        depends on ARCH_EXYNOS5
        select ARM_ARCH_TIMER
        select AUTO_ZRELADDR
+       select PINCTRL
+       select PINCTRL_EXYNOS5440
        help
          Enable EXYNOS5440 SoC support
 
index d6d0dc651089a4a253d473783c156d453eda55be..1a89824a5f781bfef84f7afc9167c41874198798 100644 (file)
@@ -424,11 +424,18 @@ static void __init exynos5_init_clocks(int xtal)
 {
        printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
 
+       /* EXYNOS5440 can support only common clock framework */
+
+       if (soc_is_exynos5440())
+               return;
+
+#ifdef CONFIG_SOC_EXYNOS5250
        s3c24xx_register_baseclocks(xtal);
        s5p_register_clocks(xtal);
 
        exynos5_register_clocks();
        exynos5_setup_clocks();
+#endif
 }
 
 #define COMBINER_ENABLE_SET    0x0
index dc248167d206c7072864cda37c01df675fcef50f..981dc1e1da518b1ddf5f6340085837ad07d7e444 100644 (file)
@@ -135,7 +135,7 @@ static struct sys_timer highbank_timer = {
 
 static void highbank_power_off(void)
 {
-       hignbank_set_pwr_shutdown();
+       highbank_set_pwr_shutdown();
 
        while (1)
                cpu_do_idle();
index 7b60faccd5518da90c6bc404e32636cb3631be49..f30c528433967e43b1f1afa1050c13feefbbe914 100644 (file)
@@ -30,7 +30,7 @@ void __ref highbank_cpu_die(unsigned int cpu)
 {
        flush_cache_all();
 
-       highbank_set_cpu_jump(cpu, secondary_startup);
+       highbank_set_cpu_jump(cpu, phys_to_virt(0));
        highbank_set_core_pwr();
 
        cpu_do_idle();
index 1129957f6c1df90cdc10a90a4b6b0f4c6e5a2c37..4ecc864ac8b95dbe63283c4c0637c9436558d8a7 100644 (file)
@@ -32,6 +32,7 @@ static void __cpuinit highbank_secondary_init(unsigned int cpu)
 
 static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
+       highbank_set_cpu_jump(cpu, secondary_startup);
        gic_raise_softirq(cpumask_of(cpu), 0);
        return 0;
 }
@@ -61,19 +62,8 @@ static void __init highbank_smp_init_cpus(void)
 
 static void __init highbank_smp_prepare_cpus(unsigned int max_cpus)
 {
-       int i;
-
        if (scu_base_addr)
                scu_enable(scu_base_addr);
-
-       /*
-        * Write the address of secondary startup into the jump table
-        * The cores are in wfi and wait until they receive a soft interrupt
-        * and a non-zero value to jump to. Then the secondary CPU branches
-        * to this address.
-        */
-       for (i = 1; i < max_cpus; i++)
-               highbank_set_cpu_jump(i, secondary_startup);
 }
 
 struct smp_operations highbank_smp_ops __initdata = {
index 74aa135966f00c87716ca537df45e65c825d3273..04eddb4f438095da0fff7caee5f4561b7fe2c1f3 100644 (file)
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <linux/cpu_pm.h>
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/suspend.h>
 
+#include <asm/cacheflush.h>
 #include <asm/proc-fns.h>
 #include <asm/suspend.h>
 
 
 static int highbank_suspend_finish(unsigned long val)
 {
+       outer_flush_all();
+       outer_disable();
+
+       highbank_set_pwr_suspend();
+
        cpu_do_idle();
+
+       highbank_clear_pwr_request();
        return 0;
 }
 
 static int highbank_pm_enter(suspend_state_t state)
 {
-       hignbank_set_pwr_suspend();
+       cpu_pm_enter();
+       cpu_cluster_pm_enter();
+
        highbank_set_cpu_jump(0, cpu_resume);
        cpu_suspend(0, highbank_suspend_finish);
 
+       cpu_cluster_pm_exit();
+       cpu_pm_exit();
+
+       highbank_smc1(0x102, 0x1);
+       if (scu_base_addr)
+               scu_enable(scu_base_addr);
        return 0;
 }
 
index e13e8ea7c6cb30fdf5863c668765d39904984754..70af9d13fcefefb1fad252c1a8c8a2bffa71ef3b 100644 (file)
@@ -44,28 +44,43 @@ static inline void highbank_set_core_pwr(void)
                writel_relaxed(1, sregs_base + SREG_CPU_PWR_CTRL(cpu));
 }
 
-static inline void hignbank_set_pwr_suspend(void)
+static inline void highbank_clear_core_pwr(void)
+{
+       int cpu = cpu_logical_map(smp_processor_id());
+       if (scu_base_addr)
+               scu_power_mode(scu_base_addr, SCU_PM_NORMAL);
+       else
+               writel_relaxed(0, sregs_base + SREG_CPU_PWR_CTRL(cpu));
+}
+
+static inline void highbank_set_pwr_suspend(void)
 {
        writel(HB_PWR_SUSPEND, sregs_base + HB_SREG_A9_PWR_REQ);
        highbank_set_core_pwr();
 }
 
-static inline void hignbank_set_pwr_shutdown(void)
+static inline void highbank_set_pwr_shutdown(void)
 {
        writel(HB_PWR_SHUTDOWN, sregs_base + HB_SREG_A9_PWR_REQ);
        highbank_set_core_pwr();
 }
 
-static inline void hignbank_set_pwr_soft_reset(void)
+static inline void highbank_set_pwr_soft_reset(void)
 {
        writel(HB_PWR_SOFT_RESET, sregs_base + HB_SREG_A9_PWR_REQ);
        highbank_set_core_pwr();
 }
 
-static inline void hignbank_set_pwr_hard_reset(void)
+static inline void highbank_set_pwr_hard_reset(void)
 {
        writel(HB_PWR_HARD_RESET, sregs_base + HB_SREG_A9_PWR_REQ);
        highbank_set_core_pwr();
 }
 
+static inline void highbank_clear_pwr_request(void)
+{
+       writel(~0UL, sregs_base + HB_SREG_A9_PWR_REQ);
+       highbank_clear_core_pwr();
+}
+
 #endif
index aed96ad9bd4a7ddf8a7f2f544ca03e6d3f14a5bb..37d8384dcf1923bbae0d21a812784bc8037df8b8 100644 (file)
@@ -22,9 +22,9 @@
 void highbank_restart(char mode, const char *cmd)
 {
        if (mode == 'h')
-               hignbank_set_pwr_hard_reset();
+               highbank_set_pwr_hard_reset();
        else
-               hignbank_set_pwr_soft_reset();
+               highbank_set_pwr_soft_reset();
 
        while (1)
                cpu_do_idle();
index 1ad0d76de8c7b57029faccb9c88dda430a93bab7..3e628fd7a674d3b5f6b4782b32ef03f7548c43a2 100644 (file)
@@ -841,8 +841,6 @@ config SOC_IMX6Q
        select ARCH_HAS_CPUFREQ
        select ARCH_HAS_OPP
        select ARM_CPU_SUSPEND if PM
-       select ARM_ERRATA_743622
-       select ARM_ERRATA_751472
        select ARM_ERRATA_754322
        select ARM_ERRATA_764369 if SMP
        select ARM_ERRATA_775420
index 36e8b399447037a73eb5261381a39cd88d9ea2bf..d8c75c3c925d7173dbfe05ecece495d5d3d9d7a7 100644 (file)
@@ -188,7 +188,7 @@ static struct cpufreq_driver mxc_driver = {
        .name = "imx",
 };
 
-static int __devinit mxc_cpufreq_driver_init(void)
+static int mxc_cpufreq_driver_init(void)
 {
        return cpufreq_register_driver(&mxc_driver);
 }
index c461e98496c308924f96a3daa65c37d60d0f3f8e..7a9686ad994ce99fed6431692040d162f3c0f5ce 100644 (file)
@@ -21,7 +21,7 @@
 #define BP_MMDC_MAPSR_PSD      0
 #define BP_MMDC_MAPSR_PSS      4
 
-static int __devinit imx_mmdc_probe(struct platform_device *pdev)
+static int imx_mmdc_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        void __iomem *mmdc_base, *reg;
index 2f28018c44478d97a5d108c861faaa1d1ae0483e..9082b84aeebb54cd7831256937f85299dd07a039 100644 (file)
@@ -504,7 +504,7 @@ iop13xx_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 
 /* Scan an IOP13XX PCI bus.  nr selects which ATU we use.
  */
-struct pci_bus * __devinit iop13xx_scan_bus(int nr, struct pci_sys_data *sys)
+struct pci_bus *iop13xx_scan_bus(int nr, struct pci_sys_data *sys)
 {
        int which_atu;
        struct pci_bus *bus = NULL;
index ff4150a2ad05259383d147626fbae49648e1a256..de4fd2bb1e27960a36d4301792a072bee90409f3 100644 (file)
@@ -67,6 +67,10 @@ static void __init kirkwood_legacy_clk_init(void)
        orion_clkdev_add(NULL, "mv643xx_eth_port.1",
                         of_clk_get_from_provider(&clkspec));
 
+       clkspec.args[0] = CGC_BIT_SDIO;
+       orion_clkdev_add(NULL, "mvsdio",
+                        of_clk_get_from_provider(&clkspec));
+
 }
 
 static void __init kirkwood_of_clk_init(void)
index 15e69fcde9f4d262f80d749938ce8c477130e0d9..23d2dd1b1b1ed4079d61d20fd60ec898d9901de9 100644 (file)
@@ -64,8 +64,6 @@ static unsigned int topkick_mpp_config[] __initdata = {
        0
 };
 
-#define TOPKICK_SATA0_PWR_ENABLE 36
-
 void __init usi_topkick_init(void)
 {
        /*
@@ -73,8 +71,6 @@ void __init usi_topkick_init(void)
         */
        kirkwood_mpp_conf(topkick_mpp_config);
 
-       /* SATA0 power enable */
-       gpio_set_value(TOPKICK_SATA0_PWR_ENABLE, 1);
 
        kirkwood_ge00_init(&topkick_ge00_data);
        kirkwood_sdio_init(&topkick_mvsdio_data);
index ef102646ba9abbd4e650b79e8ded6e5137ff6bd6..a1c3ab6fc809da0061f01f15746d225a25b5645f 100644 (file)
@@ -214,7 +214,7 @@ static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys)
  * PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on
  * the device. Decoding setup is handled by the orion code.
  */
-static void __devinit rc_pci_fixup(struct pci_dev *dev)
+static void rc_pci_fixup(struct pci_dev *dev)
 {
        if (dev->bus->parent == NULL && dev->devfn == 0) {
                int i;
index 255502ddd87924b444a27ba9f669d463f73ba251..b0c306ccbc6e38369167a7aef437914bd85affd7 100644 (file)
@@ -92,7 +92,7 @@ static struct i2c_board_info acs5k_i2c_devs[] __initdata = {
        },
 };
 
-static void __devinit acs5k_i2c_init(void)
+static void acs5k_i2c_init(void)
 {
        /* The gpio interface */
        platform_device_register(&acs5k_i2c_device);
index a6c08ede4491dfb2672806de2021b8c95c63848a..bf5e64906e65604375a0781e51c95bbea7242924 100644 (file)
@@ -61,7 +61,7 @@ struct gen_pool *sram_get_gpool(char *pool_name)
 }
 EXPORT_SYMBOL(sram_get_gpool);
 
-static int __devinit sram_probe(struct platform_device *pdev)
+static int sram_probe(struct platform_device *pdev)
 {
        struct sram_platdata *pdata = pdev->dev.platform_data;
        struct sram_bank_info *info;
@@ -125,7 +125,7 @@ out:
        return ret;
 }
 
-static int __devexit sram_remove(struct platform_device *pdev)
+static int sram_remove(struct platform_device *pdev)
 {
        struct sram_bank_info *info;
 
index 8f1eecd881863ffe304bb760bba99bc5b7cdac6a..507f5ca806977343ae688a058ecb96131b8e0797 100644 (file)
@@ -120,7 +120,7 @@ int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned *data2)
  * and unknown state. This function should be called early to
  * wait on the ARM9.
  */
-void __devinit proc_comm_boot_wait(void)
+void proc_comm_boot_wait(void)
 {
        void __iomem *base = MSM_SHARED_RAM_BASE;
  
index c5a2eddc6cdc1517d5e36fd11a5b0f5d97ead7a3..b1588a1ea2f8c1627f5c288486779f12744969e5 100644 (file)
@@ -988,7 +988,7 @@ int smd_core_init(void)
        return 0;
 }
 
-static int __devinit msm_smd_probe(struct platform_device *pdev)
+static int msm_smd_probe(struct platform_device *pdev)
 {
        /*
         * If we haven't waited for the ARM9 to boot up till now,
index a9a154a646dde94fb75b81f86cd6aa094250edfe..ee8c0b51df2c7013126f52ef8f441d4b9ccb6a8a 100644 (file)
@@ -173,7 +173,7 @@ static struct pci_ops pcie_ops = {
        .write = pcie_wr_conf,
 };
 
-static void __devinit rc_pci_fixup(struct pci_dev *dev)
+static void rc_pci_fixup(struct pci_dev *dev)
 {
        /*
         * Prevent enumeration of root complex.
index 98167a4319f72d3735adf6ab4e277d68da8790b8..9f19069248da2341e643f1c6161fc8576c5803c3 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/pinctrl/machine.h>
 #include <linux/platform_data/pinctrl-nomadik.h>
 #include <linux/platform_data/clocksource-nomadik-mtu.h>
-#include <linux/platform_data/mtd-nomadik-nand.h>
 #include <asm/hardware/vic.h>
 #include <asm/sizes.h>
 #include <asm/mach-types.h>
index b549d0571548ed8d3682e6946e2bce6f0e2fb4ed..215f8cdb400430b7e21f98c6271cdea71313f3f5 100644 (file)
 
 #include <mach/hardware.h>
 
-#define IRQ_VIC_START                /* first VIC interrupt is 1 */
+#define IRQ_VIC_START          32      /* first VIC interrupt is 1 */
 
 /*
  * Interrupt numbers generic for all Nomadik Chip cuts
  */
-#define IRQ_WATCHDOG                   1
-#define IRQ_SOFTINT                    2
-#define IRQ_CRYPTO                     3
-#define IRQ_OWM                                4
-#define IRQ_MTU0                       5
-#define IRQ_MTU1                       6
-#define IRQ_GPIO0                      7
-#define IRQ_GPIO1                      8
-#define IRQ_GPIO2                      9
-#define IRQ_GPIO3                      10
-#define IRQ_RTC_RTT                    11
-#define IRQ_SSP                                12
-#define IRQ_UART0                      13
-#define IRQ_DMA1                       14
-#define IRQ_CLCD_MDIF                  15
-#define IRQ_DMA0                       16
-#define IRQ_PWRFAIL                    17
-#define IRQ_UART1                      18
-#define IRQ_FIRDA                      19
-#define IRQ_MSP0                       20
-#define IRQ_I2C0                       21
-#define IRQ_I2C1                       22
-#define IRQ_SDMMC                      23
-#define IRQ_USBOTG                     24
-#define IRQ_SVA_IT0                    25
-#define IRQ_SVA_IT1                    26
-#define IRQ_SAA_IT0                    27
-#define IRQ_SAA_IT1                    28
-#define IRQ_UART2                      29
-#define IRQ_MSP2                       30
-#define IRQ_L2CC                       49
-#define IRQ_HPI                                50
-#define IRQ_SKE                                51
-#define IRQ_KP                         52
-#define IRQ_MEMST                      55
-#define IRQ_SGA_IT                     59
-#define IRQ_USBM                       61
-#define IRQ_MSP1                       63
+#define IRQ_WATCHDOG                   (IRQ_VIC_START+0)
+#define IRQ_SOFTINT                    (IRQ_VIC_START+1)
+#define IRQ_CRYPTO                     (IRQ_VIC_START+2)
+#define IRQ_OWM                                (IRQ_VIC_START+3)
+#define IRQ_MTU0                       (IRQ_VIC_START+4)
+#define IRQ_MTU1                       (IRQ_VIC_START+5)
+#define IRQ_GPIO0                      (IRQ_VIC_START+6)
+#define IRQ_GPIO1                      (IRQ_VIC_START+7)
+#define IRQ_GPIO2                      (IRQ_VIC_START+8)
+#define IRQ_GPIO3                      (IRQ_VIC_START+9)
+#define IRQ_RTC_RTT                    (IRQ_VIC_START+10)
+#define IRQ_SSP                                (IRQ_VIC_START+11)
+#define IRQ_UART0                      (IRQ_VIC_START+12)
+#define IRQ_DMA1                       (IRQ_VIC_START+13)
+#define IRQ_CLCD_MDIF                  (IRQ_VIC_START+14)
+#define IRQ_DMA0                       (IRQ_VIC_START+15)
+#define IRQ_PWRFAIL                    (IRQ_VIC_START+16)
+#define IRQ_UART1                      (IRQ_VIC_START+17)
+#define IRQ_FIRDA                      (IRQ_VIC_START+18)
+#define IRQ_MSP0                       (IRQ_VIC_START+19)
+#define IRQ_I2C0                       (IRQ_VIC_START+20)
+#define IRQ_I2C1                       (IRQ_VIC_START+21)
+#define IRQ_SDMMC                      (IRQ_VIC_START+22)
+#define IRQ_USBOTG                     (IRQ_VIC_START+23)
+#define IRQ_SVA_IT0                    (IRQ_VIC_START+24)
+#define IRQ_SVA_IT1                    (IRQ_VIC_START+25)
+#define IRQ_SAA_IT0                    (IRQ_VIC_START+26)
+#define IRQ_SAA_IT1                    (IRQ_VIC_START+27)
+#define IRQ_UART2                      (IRQ_VIC_START+28)
+#define IRQ_MSP2                       (IRQ_VIC_START+29)
+#define IRQ_L2CC                       (IRQ_VIC_START+30)
+#define IRQ_HPI                                (IRQ_VIC_START+31)
+#define IRQ_SKE                                (IRQ_VIC_START+32)
+#define IRQ_KP                         (IRQ_VIC_START+33)
+#define IRQ_MEMST                      (IRQ_VIC_START+34)
+#define IRQ_SGA_IT                     (IRQ_VIC_START+35)
+#define IRQ_USBM                       (IRQ_VIC_START+36)
+#define IRQ_MSP1                       (IRQ_VIC_START+37)
 
 #define NOMADIK_GPIO_OFFSET            (IRQ_VIC_START+64)
 
index f0e69cbc5baaefa8a0372a485408687d2395be07..222d58c0ae76951efa9651e064182cf138ed0dbd 100644 (file)
@@ -4,7 +4,7 @@
 
 # Common support
 obj-y := io.o id.o sram-init.o sram.o time.o irq.o mux.o flash.o \
-        serial.o devices.o dma.o
+        serial.o devices.o dma.o fb.o
 obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o timer.o
 
 ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),)
index a8fce3ccc707fcea16c27f9edd8a47ef8961d2a0..2e98a3ac7c5e1f5fdc56046507bda4b61aa1b3ae 100644 (file)
@@ -160,7 +160,7 @@ static struct omap_lcd_config ams_delta_lcd_config __initdata = {
        .ctrl_name      = "internal",
 };
 
-static struct omap_usb_config ams_delta_usb_config = {
+static struct omap_usb_config ams_delta_usb_config __initdata = {
        .register_host  = 1,
        .hmc_mode       = 16,
        .pins[0]        = 2,
diff --git a/arch/arm/mach-omap1/fb.c b/arch/arm/mach-omap1/fb.c
new file mode 100644 (file)
index 0000000..c770d45
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * File: arch/arm/plat-omap/fb.c
+ *
+ * Framebuffer device registration for TI OMAP platforms
+ *
+ * Copyright (C) 2006 Nokia Corporation
+ * Author: Imre Deak <imre.deak@nokia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/memblock.h>
+#include <linux/io.h>
+#include <linux/omapfb.h>
+#include <linux/dma-mapping.h>
+
+#include <asm/mach/map.h>
+
+#if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE)
+
+static bool omapfb_lcd_configured;
+static struct omapfb_platform_data omapfb_config;
+
+static u64 omap_fb_dma_mask = ~(u32)0;
+
+static struct platform_device omap_fb_device = {
+       .name           = "omapfb",
+       .id             = -1,
+       .dev = {
+               .dma_mask               = &omap_fb_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &omapfb_config,
+       },
+       .num_resources = 0,
+};
+
+void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
+{
+       omapfb_config.lcd = *config;
+       omapfb_lcd_configured = true;
+}
+
+static int __init omap_init_fb(void)
+{
+       /*
+        * If the board file has not set the lcd config with
+        * omapfb_set_lcd_config(), don't bother registering the omapfb device
+        */
+       if (!omapfb_lcd_configured)
+               return 0;
+
+       return platform_device_register(&omap_fb_device);
+}
+
+arch_initcall(omap_init_fb);
+
+#else
+
+void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
+{
+}
+
+#endif
index e962926b67bc48dcd146fab36901971910164556..efc8f207f6fcd7845065b569f835764ff47e9ba5 100644 (file)
@@ -142,7 +142,7 @@ static struct omap_mbox mbox_dsp_info = {
 
 static struct omap_mbox *omap1_mboxes[] = { &mbox_dsp_info, NULL };
 
-static int __devinit omap1_mbox_probe(struct platform_device *pdev)
+static int omap1_mbox_probe(struct platform_device *pdev)
 {
        struct resource *mem;
        int ret;
@@ -165,7 +165,7 @@ static int __devinit omap1_mbox_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit omap1_mbox_remove(struct platform_device *pdev)
+static int omap1_mbox_remove(struct platform_device *pdev)
 {
        omap_mbox_unregister();
        iounmap(mbox_base);
@@ -174,7 +174,7 @@ static int __devexit omap1_mbox_remove(struct platform_device *pdev)
 
 static struct platform_driver omap1_mbox_driver = {
        .probe  = omap1_mbox_probe,
-       .remove = __devexit_p(omap1_mbox_remove),
+       .remove = omap1_mbox_remove,
        .driver = {
                .name   = "omap-mailbox",
        },
index 104fed366b8f4877f79d05b325f7e3b835f1b5c6..1a1db5971cd9e6e412b7c8151040f6c907c2868f 100644 (file)
@@ -629,8 +629,14 @@ static void __init omap_1510_usb_init(struct omap_usb_config *config)
 static inline void omap_1510_usb_init(struct omap_usb_config *config) {}
 #endif
 
-void __init omap1_usb_init(struct omap_usb_config *pdata)
+void __init omap1_usb_init(struct omap_usb_config *_pdata)
 {
+       struct omap_usb_config *pdata;
+
+       pdata = kmemdup(_pdata, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata)
+               return;
+
        pdata->usb0_init = omap1_usb0_init;
        pdata->usb1_init = omap1_usb1_init;
        pdata->usb2_init = omap1_usb2_init;
index a8004f33b7e2ac6357bc8454e95d9a69dddcfbe4..947cafe65aefda11f9e00a43c8758807d1229f96 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 # Common support
-obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \
+obj-y := id.o io.o control.o mux.o devices.o fb.o serial.o gpmc.o timer.o pm.o \
         common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o \
         omap_device.o sram.o
 
index bdf39481fbd6022d96af89e54a44e5bf402fb62f..6ef87580c33f6772a1fed5445b1bb2344fb96a6d 100644 (file)
@@ -1167,6 +1167,8 @@ static const struct clk_ops emu_src_ck_ops = {
        .recalc_rate    = &omap2_clksel_recalc,
        .get_parent     = &omap2_clksel_find_parent_index,
        .set_parent     = &omap2_clksel_set_parent,
+       .enable         = &omap2_clkops_enable_clkdm,
+       .disable        = &omap2_clkops_disable_clkdm,
 };
 
 static struct clk emu_src_ck;
index 3d944d3263d2ae36966ed9f0a01e0c5849288948..e6c328128a0a3fbf0fc7745c5d3895b9c61c9759 100644 (file)
 #define OMAP343X_PADCONF_ETK_D14       OMAP343X_PADCONF_ETK(16)
 #define OMAP343X_PADCONF_ETK_D15       OMAP343X_PADCONF_ETK(17)
 
-/* 34xx GENERAL_WKUP regist offsets */
+/* 34xx GENERAL_WKUP register offsets */
 #define OMAP343X_CONTROL_WKUP_DEBOBSMUX(i) (OMAP343X_CONTROL_GENERAL_WKUP + \
                                                0x008 + (i))
 #define OMAP343X_CONTROL_WKUP_DEBOBS0 (OMAP343X_CONTROL_GENERAL_WKUP + 0x008)
index 2bb18838cba9994dbd25be0b0c209bb261ee43e4..0a02aab5df677db9bc5577093f5f6091d4c86ff8 100644 (file)
@@ -504,8 +504,7 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
                if (!cpu_is_omap44xx() && !cpu_is_omap3630()) {
                        freqsel = _omap3_dpll_compute_freqsel(clk,
                                                dd->last_rounded_n);
-                       if (!freqsel)
-                               WARN_ON(1);
+                       WARN_ON(!freqsel);
                }
 
                pr_debug("%s: %s: set rate: locking rate to %lu.\n",
index fce5aa3fff49b8cfea304426da3d316e71055273..4c7566c7e24a3f5ca90c5d320cc43a76fcbbd82a 100644 (file)
@@ -27,7 +27,6 @@
 
 #include "omap_device.h"
 #include "omap_hwmod.h"
-#include <plat/cpu.h>
 
 #if defined(CONFIG_DRM_OMAP) || (CONFIG_DRM_OMAP_MODULE)
 
index 679a0478644fe4a5a008a233105d23a00dc9c96b..4be5cfc81ab8cd8c0ab1b6333b13c33fe6d0d733 100644 (file)
@@ -31,8 +31,7 @@
 #include <video/omap-panel-nokia-dsi.h>
 #include <video/omap-panel-picodlp.h>
 
-#include <plat/cpu.h>
-
+#include "soc.h"
 #include "dss-common.h"
 #include "mux.h"
 
diff --git a/arch/arm/mach-omap2/fb.c b/arch/arm/mach-omap2/fb.c
new file mode 100644 (file)
index 0000000..d9bd965
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Framebuffer device registration for TI OMAP platforms
+ *
+ * Copyright (C) 2006 Nokia Corporation
+ * Author: Imre Deak <imre.deak@nokia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/memblock.h>
+#include <linux/io.h>
+#include <linux/omapfb.h>
+#include <linux/dma-mapping.h>
+
+#include <asm/mach/map.h>
+
+#include "soc.h"
+
+#ifdef CONFIG_OMAP2_VRFB
+
+/*
+ * The first memory resource is the register region for VRFB,
+ * the rest are VRFB virtual memory areas for each VRFB context.
+ */
+
+static const struct resource omap2_vrfb_resources[] = {
+       DEFINE_RES_MEM_NAMED(0x68008000u, 0x40, "vrfb-regs"),
+       DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
+       DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
+       DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
+       DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
+};
+
+static const struct resource omap3_vrfb_resources[] = {
+       DEFINE_RES_MEM_NAMED(0x6C000180u, 0xc0, "vrfb-regs"),
+       DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
+       DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
+       DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
+       DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
+       DEFINE_RES_MEM_NAMED(0xe0000000u, 0x4000000, "vrfb-area-4"),
+       DEFINE_RES_MEM_NAMED(0xe4000000u, 0x4000000, "vrfb-area-5"),
+       DEFINE_RES_MEM_NAMED(0xe8000000u, 0x4000000, "vrfb-area-6"),
+       DEFINE_RES_MEM_NAMED(0xec000000u, 0x4000000, "vrfb-area-7"),
+       DEFINE_RES_MEM_NAMED(0xf0000000u, 0x4000000, "vrfb-area-8"),
+       DEFINE_RES_MEM_NAMED(0xf4000000u, 0x4000000, "vrfb-area-9"),
+       DEFINE_RES_MEM_NAMED(0xf8000000u, 0x4000000, "vrfb-area-10"),
+       DEFINE_RES_MEM_NAMED(0xfc000000u, 0x4000000, "vrfb-area-11"),
+};
+
+static int __init omap_init_vrfb(void)
+{
+       struct platform_device *pdev;
+       const struct resource *res;
+       unsigned int num_res;
+
+       if (cpu_is_omap24xx()) {
+               res = omap2_vrfb_resources;
+               num_res = ARRAY_SIZE(omap2_vrfb_resources);
+       } else if (cpu_is_omap34xx()) {
+               res = omap3_vrfb_resources;
+               num_res = ARRAY_SIZE(omap3_vrfb_resources);
+       } else {
+               return 0;
+       }
+
+       pdev = platform_device_register_resndata(NULL, "omapvrfb", -1,
+                       res, num_res, NULL, 0);
+
+       if (IS_ERR(pdev))
+               return PTR_ERR(pdev);
+       else
+               return 0;
+}
+
+arch_initcall(omap_init_vrfb);
+#endif
+
+#if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
+
+static u64 omap_fb_dma_mask = ~(u32)0;
+static struct omapfb_platform_data omapfb_config;
+
+static struct platform_device omap_fb_device = {
+       .name           = "omapfb",
+       .id             = -1,
+       .dev = {
+               .dma_mask               = &omap_fb_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &omapfb_config,
+       },
+       .num_resources = 0,
+};
+
+static int __init omap_init_fb(void)
+{
+       return platform_device_register(&omap_fb_device);
+}
+
+arch_initcall(omap_init_fb);
+
+#endif
index 65468f6d7f0e62382ee6df3c16fcb2cad5eb054e..8033cb747c86ecc60ca18397ec9a9a2bfd9855ca 100644 (file)
@@ -744,7 +744,7 @@ static int gpmc_setup_irq(void)
        return request_irq(gpmc_irq, gpmc_handle_irq, 0, "gpmc", NULL);
 }
 
-static __devexit int gpmc_free_irq(void)
+static int gpmc_free_irq(void)
 {
        int i;
 
@@ -762,7 +762,7 @@ static __devexit int gpmc_free_irq(void)
        return 0;
 }
 
-static void __devexit gpmc_mem_exit(void)
+static void gpmc_mem_exit(void)
 {
        int cs;
 
@@ -774,7 +774,7 @@ static void __devexit gpmc_mem_exit(void)
 
 }
 
-static int __devinit gpmc_mem_init(void)
+static int gpmc_mem_init(void)
 {
        int cs, rc;
        unsigned long boot_rom_space = 0;
@@ -1121,7 +1121,7 @@ int gpmc_calc_timings(struct gpmc_timings *gpmc_t,
        return 0;
 }
 
-static __devinit int gpmc_probe(struct platform_device *pdev)
+static int gpmc_probe(struct platform_device *pdev)
 {
        int rc;
        u32 l;
@@ -1177,7 +1177,7 @@ static __devinit int gpmc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static __devexit int gpmc_remove(struct platform_device *pdev)
+static int gpmc_remove(struct platform_device *pdev)
 {
        gpmc_free_irq();
        gpmc_mem_exit();
@@ -1187,7 +1187,7 @@ static __devexit int gpmc_remove(struct platform_device *pdev)
 
 static struct platform_driver gpmc_driver = {
        .probe          = gpmc_probe,
-       .remove         = __devexit_p(gpmc_remove),
+       .remove         = gpmc_remove,
        .driver         = {
                .name   = DEVICE_NAME,
                .owner  = THIS_MODULE,
index 0d974565f8ca7ec6fae5d6f1fe081c398e2b243b..0b080267b7f6355dac3b9adcd8b732b7cc44f936 100644 (file)
@@ -342,7 +342,7 @@ struct omap_mbox mbox_2_info = {
 struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL };
 #endif
 
-static int __devinit omap2_mbox_probe(struct platform_device *pdev)
+static int omap2_mbox_probe(struct platform_device *pdev)
 {
        struct resource *mem;
        int ret;
@@ -395,7 +395,7 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit omap2_mbox_remove(struct platform_device *pdev)
+static int omap2_mbox_remove(struct platform_device *pdev)
 {
        omap_mbox_unregister();
        iounmap(mbox_base);
@@ -404,7 +404,7 @@ static int __devexit omap2_mbox_remove(struct platform_device *pdev)
 
 static struct platform_driver omap2_mbox_driver = {
        .probe = omap2_mbox_probe,
-       .remove = __devexit_p(omap2_mbox_remove),
+       .remove = omap2_mbox_remove,
        .driver = {
                .name = "omap-mailbox",
        },
index 081c71edddf4562797c632fc8f19bb86a8bac07d..646c14d9fdb9dfbe656437b45c6757c8db4d1b15 100644 (file)
@@ -2070,7 +2070,7 @@ static struct omap_hwmod_irq_info am33xx_usbss_mpu_irqs[] = {
        { .name = "usbss-irq", .irq = 17 + OMAP_INTC_START, },
        { .name = "musb0-irq", .irq = 18 + OMAP_INTC_START, },
        { .name = "musb1-irq", .irq = 19 + OMAP_INTC_START, },
-       { .irq = -1 + OMAP_INTC_START, },
+       { .irq = -1, },
 };
 
 static struct omap_hwmod am33xx_usbss_hwmod = {
@@ -2515,7 +2515,7 @@ static struct omap_hwmod_ocp_if am33xx_l4_hs__cpgmac0 = {
        .user           = OCP_USER_MPU,
 };
 
-struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = {
+static struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = {
        {
                .pa_start       = 0x4A101000,
                .pa_end         = 0x4A101000 + SZ_256 - 1,
@@ -2523,7 +2523,7 @@ struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = {
        { }
 };
 
-struct omap_hwmod_ocp_if am33xx_cpgmac0__mdio = {
+static struct omap_hwmod_ocp_if am33xx_cpgmac0__mdio = {
        .master         = &am33xx_cpgmac0_hwmod,
        .slave          = &am33xx_mdio_hwmod,
        .addr           = am33xx_mdio_addr_space,
index f9fab942d5ba003f853d1259cf83e57f64a96ac0..129d5081ed1572146a027eae3984b84457cf01be 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <linux/omap-dma.h>
 
-#include <linux/platform_data/omap_ocp2scp.h>
 #include <linux/platform_data/spi-omap2-mcspi.h>
 #include <linux/platform_data/asoc-ti-mcbsp.h>
 #include <linux/platform_data/iommu-omap.h>
index fefd40166624d97196c8f000c63061f01c18761f..615e5b1fb025dddebadf72e21a7845c0a4306c14 100644 (file)
@@ -292,8 +292,8 @@ int __init omap3_twl_set_sr_bit(bool enable)
        if (twl_sr_enable_autoinit)
                pr_warning("%s: unexpected multiple calls\n", __func__);
 
-       ret = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &temp,
-                                       TWL4030_DCDC_GLOBAL_CFG);
+       ret = twl_i2c_read_u8(TWL_MODULE_PM_RECEIVER, &temp,
+                             TWL4030_DCDC_GLOBAL_CFG);
        if (ret)
                goto err;
 
@@ -302,8 +302,8 @@ int __init omap3_twl_set_sr_bit(bool enable)
        else
                temp &= ~SMARTREFLEX_ENABLE;
 
-       ret = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, temp,
-                               TWL4030_DCDC_GLOBAL_CFG);
+       ret = twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, temp,
+                              TWL4030_DCDC_GLOBAL_CFG);
        if (!ret) {
                twl_sr_enable_autoinit = true;
                return 0;
index 250d909e38bdf1204dd42c786b8e89f670b60f43..eb78ae7a3464e4f00a3e4d36655a53a556e82528 100644 (file)
@@ -11,8 +11,6 @@
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  */
-#include <linux/pm_runtime.h>
-
 #include <asm/pmu.h>
 
 #include "soc.h"
index faeab18696dfff6dc8e092c90c25fdd40be6f9a6..418de9c3b3195e0ccc283fc90a70a486beafa3b3 100644 (file)
@@ -18,9 +18,8 @@
 #include <linux/io.h>
 #include <linux/irq.h>
 
+#include "soc.h"
 #include "common.h"
-#include <plat/cpu.h>
-
 #include "vp.h"
 #include "powerdomain.h"
 #include "clockdomain.h"
 #include "cm2xxx_3xxx.h"
 #include "prm-regbits-24xx.h"
 
+/*
+ * OMAP24xx PM_PWSTCTRL_*.POWERSTATE and PM_PWSTST_*.LASTSTATEENTERED bits -
+ * these are reversed from the bits used on OMAP3+
+ */
+#define OMAP24XX_PWRDM_POWER_ON                        0x0
+#define OMAP24XX_PWRDM_POWER_RET               0x1
+#define OMAP24XX_PWRDM_POWER_OFF               0x3
+
 /*
  * omap2xxx_prm_reset_src_map - map from bits in the PRM_RSTST_WKUP
  *   hardware register (which are specific to the OMAP2xxx SoCs) to
@@ -68,6 +75,34 @@ static u32 omap2xxx_prm_read_reset_sources(void)
        return r;
 }
 
+/**
+ * omap2xxx_pwrst_to_common_pwrst - convert OMAP2xxx pwrst to common pwrst
+ * @omap2xxx_pwrst: OMAP2xxx hardware power state to convert
+ *
+ * Return the common power state bits corresponding to the OMAP2xxx
+ * hardware power state bits @omap2xxx_pwrst, or -EINVAL upon error.
+ */
+static int omap2xxx_pwrst_to_common_pwrst(u8 omap2xxx_pwrst)
+{
+       u8 pwrst;
+
+       switch (omap2xxx_pwrst) {
+       case OMAP24XX_PWRDM_POWER_OFF:
+               pwrst = PWRDM_POWER_OFF;
+               break;
+       case OMAP24XX_PWRDM_POWER_RET:
+               pwrst = PWRDM_POWER_RET;
+               break;
+       case OMAP24XX_PWRDM_POWER_ON:
+               pwrst = PWRDM_POWER_ON;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return pwrst;
+}
+
 /**
  * omap2xxx_prm_dpll_reset - use DPLL reset to reboot the OMAP SoC
  *
@@ -98,10 +133,56 @@ int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm)
        return 0;
 }
 
+static int omap2xxx_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
+{
+       u8 omap24xx_pwrst;
+
+       switch (pwrst) {
+       case PWRDM_POWER_OFF:
+               omap24xx_pwrst = OMAP24XX_PWRDM_POWER_OFF;
+               break;
+       case PWRDM_POWER_RET:
+               omap24xx_pwrst = OMAP24XX_PWRDM_POWER_RET;
+               break;
+       case PWRDM_POWER_ON:
+               omap24xx_pwrst = OMAP24XX_PWRDM_POWER_ON;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
+                                  (omap24xx_pwrst << OMAP_POWERSTATE_SHIFT),
+                                  pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
+       return 0;
+}
+
+static int omap2xxx_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
+{
+       u8 omap2xxx_pwrst;
+
+       omap2xxx_pwrst = omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
+                                                      OMAP2_PM_PWSTCTRL,
+                                                      OMAP_POWERSTATE_MASK);
+
+       return omap2xxx_pwrst_to_common_pwrst(omap2xxx_pwrst);
+}
+
+static int omap2xxx_pwrdm_read_pwrst(struct powerdomain *pwrdm)
+{
+       u8 omap2xxx_pwrst;
+
+       omap2xxx_pwrst = omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
+                                                      OMAP2_PM_PWSTST,
+                                                      OMAP_POWERSTATEST_MASK);
+
+       return omap2xxx_pwrst_to_common_pwrst(omap2xxx_pwrst);
+}
+
 struct pwrdm_ops omap2_pwrdm_operations = {
-       .pwrdm_set_next_pwrst   = omap2_pwrdm_set_next_pwrst,
-       .pwrdm_read_next_pwrst  = omap2_pwrdm_read_next_pwrst,
-       .pwrdm_read_pwrst       = omap2_pwrdm_read_pwrst,
+       .pwrdm_set_next_pwrst   = omap2xxx_pwrdm_set_next_pwrst,
+       .pwrdm_read_next_pwrst  = omap2xxx_pwrdm_read_next_pwrst,
+       .pwrdm_read_pwrst       = omap2xxx_pwrdm_read_pwrst,
        .pwrdm_set_logic_retst  = omap2_pwrdm_set_logic_retst,
        .pwrdm_set_mem_onst     = omap2_pwrdm_set_mem_onst,
        .pwrdm_set_mem_retst    = omap2_pwrdm_set_mem_retst,
index 30517f5af70708e360c140ef22374adc7560ec89..a3e121f94a864e63108ba1c54522aeb904395918 100644 (file)
@@ -103,28 +103,6 @@ int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift)
 /* Powerdomain low-level functions */
 
 /* Common functions across OMAP2 and OMAP3 */
-int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
-{
-       omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
-                                  (pwrst << OMAP_POWERSTATE_SHIFT),
-                                  pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
-       return 0;
-}
-
-int omap2_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
-{
-       return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
-                                            OMAP2_PM_PWSTCTRL,
-                                            OMAP_POWERSTATE_MASK);
-}
-
-int omap2_pwrdm_read_pwrst(struct powerdomain *pwrdm)
-{
-       return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
-                                            OMAP2_PM_PWSTST,
-                                            OMAP_POWERSTATEST_MASK);
-}
-
 int omap2_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,
                                                                u8 pwrst)
 {
index db198d058584d06203860216abeb5cc43b1ab074..e648bd55b0729a6b1023e1cc7b04b8f0c786e0fe 100644 (file)
@@ -18,9 +18,8 @@
 #include <linux/io.h>
 #include <linux/irq.h>
 
+#include "soc.h"
 #include "common.h"
-#include <plat/cpu.h>
-
 #include "vp.h"
 #include "powerdomain.h"
 #include "prm3xxx.h"
@@ -278,6 +277,28 @@ static u32 omap3xxx_prm_read_reset_sources(void)
 
 /* Powerdomain low-level functions */
 
+static int omap3_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
+{
+       omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
+                                  (pwrst << OMAP_POWERSTATE_SHIFT),
+                                  pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL);
+       return 0;
+}
+
+static int omap3_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
+{
+       return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
+                                            OMAP2_PM_PWSTCTRL,
+                                            OMAP_POWERSTATE_MASK);
+}
+
+static int omap3_pwrdm_read_pwrst(struct powerdomain *pwrdm)
+{
+       return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
+                                            OMAP2_PM_PWSTST,
+                                            OMAP_POWERSTATEST_MASK);
+}
+
 /* Applicable only for OMAP3. Not supported on OMAP2 */
 static int omap3_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
 {
@@ -356,9 +377,9 @@ static int omap3_pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
 }
 
 struct pwrdm_ops omap3_pwrdm_operations = {
-       .pwrdm_set_next_pwrst   = omap2_pwrdm_set_next_pwrst,
-       .pwrdm_read_next_pwrst  = omap2_pwrdm_read_next_pwrst,
-       .pwrdm_read_pwrst       = omap2_pwrdm_read_pwrst,
+       .pwrdm_set_next_pwrst   = omap3_pwrdm_set_next_pwrst,
+       .pwrdm_read_next_pwrst  = omap3_pwrdm_read_next_pwrst,
+       .pwrdm_read_pwrst       = omap3_pwrdm_read_pwrst,
        .pwrdm_read_prev_pwrst  = omap3_pwrdm_read_prev_pwrst,
        .pwrdm_set_logic_retst  = omap2_pwrdm_set_logic_retst,
        .pwrdm_read_logic_pwrst = omap3_pwrdm_read_logic_pwrst,
index 7498bc77fe8b8e69e5dbfe106dd24861c3a2c203..c05a343d465dcc1374a7c3a19142ca2e75d77517 100644 (file)
@@ -56,9 +56,9 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = {
  *   enumeration)
  */
 static struct prm_reset_src_map omap44xx_prm_reset_src_map[] = {
-       { OMAP4430_RST_GLOBAL_WARM_SW_SHIFT,
+       { OMAP4430_GLOBAL_WARM_SW_RST_SHIFT,
          OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT },
-       { OMAP4430_RST_GLOBAL_COLD_SW_SHIFT,
+       { OMAP4430_GLOBAL_COLD_RST_SHIFT,
          OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT },
        { OMAP4430_MPU_SECURITY_VIOL_RST_SHIFT,
          OMAP_SECU_VIOL_RST_SRC_ID_SHIFT },
@@ -333,7 +333,7 @@ static u32 omap44xx_prm_read_reset_sources(void)
        u32 r = 0;
        u32 v;
 
-       v = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST,
+       v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
                                    OMAP4_RM_RSTST);
 
        p = omap44xx_prm_reset_src_map;
index 22b0979206ca08b7cd929eee361607f802561af2..8ee1fbdec5615c47c9345c88eb689249e8ea90ae 100644 (file)
@@ -62,8 +62,8 @@
 
 /* OMAP4 specific register offsets */
 #define OMAP4_RM_RSTCTRL                               0x0000
-#define OMAP4_RM_RSTTIME                               0x0004
-#define OMAP4_RM_RSTST                                 0x0008
+#define OMAP4_RM_RSTST                                 0x0004
+#define OMAP4_RM_RSTTIME                               0x0008
 #define OMAP4_PM_PWSTCTRL                              0x0000
 #define OMAP4_PM_PWSTST                                        0x0004
 
index cd50e328db2a46e4470e57bb8bbe5af0d30f595c..d9c7c3bf0d9cca840a618590c16145ef621c399d 100644 (file)
@@ -506,7 +506,7 @@ static int __init pci_setup(struct pci_sys_data *sys)
 /*****************************************************************************
  * General PCIe + PCI
  ****************************************************************************/
-static void __devinit rc_pci_fixup(struct pci_dev *dev)
+static void rc_pci_fixup(struct pci_dev *dev)
 {
        /*
         * Prevent enumeration of root complex.
index fb5a7910af35b7a86534116f53b821aa2d36755c..9936c180bf016bbf769e60a16309c603c69c1a6f 100644 (file)
@@ -123,7 +123,7 @@ static const struct of_device_id memc_ids[] = {
        {}
 };
 
-static int __devinit sirfsoc_memc_probe(struct platform_device *op)
+static int sirfsoc_memc_probe(struct platform_device *op)
 {
        struct device_node *np = op->dev.of_node;
 
index 9d80f1e20a98fc0364c113ff37df6c8bf5818fac..5573536021302b91f0d52048f14a94b3abfe3513 100644 (file)
@@ -107,7 +107,7 @@ static const struct of_device_id rtciobrg_ids[] = {
        {}
 };
 
-static int __devinit sirfsoc_rtciobrg_probe(struct platform_device *op)
+static int sirfsoc_rtciobrg_probe(struct platform_device *op)
 {
        struct device_node *np = op->dev.of_node;
 
index 048c4299473c586ab2a814b7bf625130c0b063ed..7a39efc50865b27d678b561431ba29d4e5dce560 100644 (file)
@@ -198,7 +198,7 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
 
 static struct platform_device *corgipm_device;
 
-static int __devinit corgipm_init(void)
+static int corgipm_init(void)
 {
        int ret;
 
index a611ad3153c7b2e7e9a7e78803df0f9876bc677e..b6132aa95dc08b1ef2cc6ae0c4a5565b5213a0ab 100644 (file)
        GPIO76_LCD_PCLK,        \
        GPIO77_LCD_BIAS
 
+/* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */
+#define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT)
+#define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT)
 
 extern int keypad_set_wake(unsigned int on);
 #endif /* __ASM_ARCH_MFP_PXA27X_H */
index 8047ee0effc582b421a28085624a2b58250e88e4..616cb87b61792544f470110cd6322b2d3ea9d914 100644 (file)
@@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void)
 EXPORT_SYMBOL(pxa27x_clear_otgph);
 
 static unsigned long ac97_reset_config[] = {
-       GPIO113_GPIO,
+       GPIO113_AC97_nRESET_GPIO_HIGH,
        GPIO113_AC97_nRESET,
-       GPIO95_GPIO,
+       GPIO95_AC97_nRESET_GPIO_HIGH,
        GPIO95_AC97_nRESET,
 };
 
index ec55c575ed192f7969d64b19dc0dbb8837ae89eb..0a36d3585f26822191e7355c9d2e4208c77fcaff 100644 (file)
@@ -829,7 +829,7 @@ static const struct platform_suspend_ops sharpsl_pm_ops = {
 };
 #endif
 
-static int __devinit sharpsl_pm_probe(struct platform_device *pdev)
+static int sharpsl_pm_probe(struct platform_device *pdev)
 {
        int ret, irq;
 
@@ -941,7 +941,7 @@ static struct platform_driver sharpsl_pm_driver = {
        },
 };
 
-static int __devinit sharpsl_pm_init(void)
+static int sharpsl_pm_init(void)
 {
        return platform_driver_register(&sharpsl_pm_driver);
 }
index 842596d4d31e19e59cd898084125944a03db7b90..e191f9996b26b967dbfbe8a176af92b73123dc1e 100644 (file)
@@ -232,7 +232,7 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = {
 
 static struct platform_device *spitzpm_device;
 
-static int __devinit spitzpm_init(void)
+static int spitzpm_init(void)
 {
        int ret;
 
index b9b1e5c2b29048247910612448a5498cb4513b7f..fc3646c2c694a74fe6ac3f572704e70444637312 100644 (file)
@@ -102,7 +102,7 @@ err_reset:
        return rc;
 }
 
-static int __devexit tosa_bt_remove(struct platform_device *dev)
+static int tosa_bt_remove(struct platform_device *dev)
 {
        struct tosa_bt_data *data = dev->dev.platform_data;
        struct rfkill *rfk = platform_get_drvdata(dev);
@@ -125,7 +125,7 @@ static int __devexit tosa_bt_remove(struct platform_device *dev)
 
 static struct platform_driver tosa_bt_driver = {
        .probe = tosa_bt_probe,
-       .remove = __devexit_p(tosa_bt_remove),
+       .remove = tosa_bt_remove,
 
        .driver = {
                .name = "tosa-bt",
index 57aee916bdb10cb50d220cd1b6ee152b05561778..3f40c61b6e0295f7b9911ed62cff3dae6484d79a 100644 (file)
@@ -62,7 +62,7 @@ static const struct rfkill_ops h1940bt_rfkill_ops = {
        .set_block = h1940bt_set_block,
 };
 
-static int __devinit h1940bt_probe(struct platform_device *pdev)
+static int h1940bt_probe(struct platform_device *pdev)
 {
        struct rfkill *rfk;
        int ret = 0;
index 5876c6ba7500d9f348533a59bfb520359c1e682f..45e74363aaa99a6db34a46f16cdcc10b7b169cf1 100644 (file)
@@ -93,7 +93,7 @@ static struct notifier_block osiris_dvs_nb = {
        .notifier_call  = osiris_dvs_notify,
 };
 
-static int __devinit osiris_dvs_probe(struct platform_device *pdev)
+static int osiris_dvs_probe(struct platform_device *pdev)
 {
        int ret;
 
@@ -126,7 +126,7 @@ err_nogpio:
        return ret;
 }
 
-static int __devexit osiris_dvs_remove(struct platform_device *pdev)
+static int osiris_dvs_remove(struct platform_device *pdev)
 {
        dev_info(&pdev->dev, "exiting\n");
 
@@ -167,7 +167,7 @@ static const struct dev_pm_ops osiris_dvs_pm = {
 
 static struct platform_driver osiris_dvs_driver = {
        .probe          = osiris_dvs_probe,
-       .remove         = __devexit_p(osiris_dvs_remove),
+       .remove         = osiris_dvs_remove,
        .driver         = {
                .name   = "osiris-dvs",
                .owner  = THIS_MODULE,
index c6d8dba9062330f181e6fb03719295cb691587f1..553059f51841874c430d74bbbe7b4e108308fca6 100644 (file)
@@ -290,7 +290,7 @@ static const struct i2c_board_info wm2200_i2c[] = {
          .platform_data = &wm2200_pdata, },
 };
 
-static __devinitdata const struct {
+static const struct {
        u8 id;
        u8 rev;
        const char *name;
@@ -343,8 +343,8 @@ static __devinitdata const struct {
          .i2c_devs = wm2200_i2c, .num_i2c_devs = ARRAY_SIZE(wm2200_i2c) },
 };
 
-static __devinit int wlf_gf_module_probe(struct i2c_client *i2c,
-                                        const struct i2c_device_id *i2c_id)
+static int wlf_gf_module_probe(struct i2c_client *i2c,
+                              const struct i2c_device_id *i2c_id)
 {
        int ret, i, j, id, rev;
 
index cdde249166b5011cb1d075fed3caa212963427d5..bf6311a28f3db1c7a014d92ac75361ca20534f8c 100644 (file)
@@ -171,7 +171,7 @@ static struct fb_videomode crag6410_lcd_timing = {
 };
 
 /* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */
-static struct s3c_fb_platdata crag6410_lcd_pdata __devinitdata = {
+static struct s3c_fb_platdata crag6410_lcd_pdata = {
        .setup_gpio     = s3c64xx_fb_gpio_setup_24bpp,
        .vtiming        = &crag6410_lcd_timing,
        .win[0]         = &crag6410_fb_win0,
@@ -181,7 +181,7 @@ static struct s3c_fb_platdata crag6410_lcd_pdata __devinitdata = {
 
 /* 2x6 keypad */
 
-static uint32_t crag6410_keymap[] __devinitdata = {
+static uint32_t crag6410_keymap[] = {
        /* KEY(row, col, keycode) */
        KEY(0, 0, KEY_VOLUMEUP),
        KEY(0, 1, KEY_HOME),
@@ -197,12 +197,12 @@ static uint32_t crag6410_keymap[] __devinitdata = {
        KEY(1, 5, KEY_CAMERA),
 };
 
-static struct matrix_keymap_data crag6410_keymap_data __devinitdata = {
+static struct matrix_keymap_data crag6410_keymap_data = {
        .keymap         = crag6410_keymap,
        .keymap_size    = ARRAY_SIZE(crag6410_keymap),
 };
 
-static struct samsung_keypad_platdata crag6410_keypad_data __devinitdata = {
+static struct samsung_keypad_platdata crag6410_keypad_data = {
        .keymap_data    = &crag6410_keymap_data,
        .rows           = 2,
        .cols           = 6,
@@ -407,11 +407,11 @@ static struct wm831x_buckv_pdata vddarm_pdata = {
        .dvs_gpio = S3C64XX_GPK(0),
 };
 
-static struct regulator_consumer_supply vddarm_consumers[] __devinitdata = {
+static struct regulator_consumer_supply vddarm_consumers[] = {
        REGULATOR_SUPPLY("vddarm", NULL),
 };
 
-static struct regulator_init_data vddarm __devinitdata = {
+static struct regulator_init_data vddarm = {
        .constraints = {
                .name = "VDDARM",
                .min_uV = 1000000,
@@ -425,11 +425,11 @@ static struct regulator_init_data vddarm __devinitdata = {
        .driver_data = &vddarm_pdata,
 };
 
-static struct regulator_consumer_supply vddint_consumers[] __devinitdata = {
+static struct regulator_consumer_supply vddint_consumers[] = {
        REGULATOR_SUPPLY("vddint", NULL),
 };
 
-static struct regulator_init_data vddint __devinitdata = {
+static struct regulator_init_data vddint = {
        .constraints = {
                .name = "VDDINT",
                .min_uV = 1000000,
@@ -442,27 +442,27 @@ static struct regulator_init_data vddint __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddmem __devinitdata = {
+static struct regulator_init_data vddmem = {
        .constraints = {
                .name = "VDDMEM",
                .always_on = 1,
        },
 };
 
-static struct regulator_init_data vddsys __devinitdata = {
+static struct regulator_init_data vddsys = {
        .constraints = {
                .name = "VDDSYS,VDDEXT,VDDPCM,VDDSS",
                .always_on = 1,
        },
 };
 
-static struct regulator_consumer_supply vddmmc_consumers[] __devinitdata = {
+static struct regulator_consumer_supply vddmmc_consumers[] = {
        REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
        REGULATOR_SUPPLY("vmmc", "s3c-sdhci.1"),
        REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"),
 };
 
-static struct regulator_init_data vddmmc __devinitdata = {
+static struct regulator_init_data vddmmc = {
        .constraints = {
                .name = "VDDMMC,UH",
                .always_on = 1,
@@ -472,7 +472,7 @@ static struct regulator_init_data vddmmc __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddotgi __devinitdata = {
+static struct regulator_init_data vddotgi = {
        .constraints = {
                .name = "VDDOTGi",
                .always_on = 1,
@@ -480,7 +480,7 @@ static struct regulator_init_data vddotgi __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddotg __devinitdata = {
+static struct regulator_init_data vddotg = {
        .constraints = {
                .name = "VDDOTG",
                .always_on = 1,
@@ -488,7 +488,7 @@ static struct regulator_init_data vddotg __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddhi __devinitdata = {
+static struct regulator_init_data vddhi = {
        .constraints = {
                .name = "VDDHI",
                .always_on = 1,
@@ -496,7 +496,7 @@ static struct regulator_init_data vddhi __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddadc __devinitdata = {
+static struct regulator_init_data vddadc = {
        .constraints = {
                .name = "VDDADC,VDDDAC",
                .always_on = 1,
@@ -504,7 +504,7 @@ static struct regulator_init_data vddadc __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddmem0 __devinitdata = {
+static struct regulator_init_data vddmem0 = {
        .constraints = {
                .name = "VDDMEM0",
                .always_on = 1,
@@ -512,7 +512,7 @@ static struct regulator_init_data vddmem0 __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddpll __devinitdata = {
+static struct regulator_init_data vddpll = {
        .constraints = {
                .name = "VDDPLL",
                .always_on = 1,
@@ -520,7 +520,7 @@ static struct regulator_init_data vddpll __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddlcd __devinitdata = {
+static struct regulator_init_data vddlcd = {
        .constraints = {
                .name = "VDDLCD",
                .always_on = 1,
@@ -528,7 +528,7 @@ static struct regulator_init_data vddlcd __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct regulator_init_data vddalive __devinitdata = {
+static struct regulator_init_data vddalive = {
        .constraints = {
                .name = "VDDALIVE",
                .always_on = 1,
@@ -536,28 +536,28 @@ static struct regulator_init_data vddalive __devinitdata = {
        .supply_regulator = "WALLVDD",
 };
 
-static struct wm831x_backup_pdata banff_backup_pdata __devinitdata = {
+static struct wm831x_backup_pdata banff_backup_pdata = {
        .charger_enable = 1,
        .vlim = 2500,  /* mV */
        .ilim = 200,   /* uA */
 };
 
-static struct wm831x_status_pdata banff_red_led __devinitdata = {
+static struct wm831x_status_pdata banff_red_led = {
        .name = "banff:red:",
        .default_src = WM831X_STATUS_MANUAL,
 };
 
-static struct wm831x_status_pdata banff_green_led __devinitdata = {
+static struct wm831x_status_pdata banff_green_led = {
        .name = "banff:green:",
        .default_src = WM831X_STATUS_MANUAL,
 };
 
-static struct wm831x_touch_pdata touch_pdata __devinitdata = {
+static struct wm831x_touch_pdata touch_pdata = {
        .data_irq = S3C_EINT(26),
        .pd_irq = S3C_EINT(27),
 };
 
-static struct wm831x_pdata crag_pmic_pdata __devinitdata = {
+static struct wm831x_pdata crag_pmic_pdata = {
        .wm831x_num = 1,
        .gpio_base = BANFF_PMIC_GPIO_BASE,
        .soft_shutdown = true,
@@ -601,7 +601,7 @@ static struct wm831x_pdata crag_pmic_pdata __devinitdata = {
        .touch = &touch_pdata,
 };
 
-static struct i2c_board_info i2c_devs0[] __devinitdata = {
+static struct i2c_board_info i2c_devs0[] = {
        { I2C_BOARD_INFO("24c08", 0x50), },
        { I2C_BOARD_INFO("tca6408", 0x20),
          .platform_data = &crag6410_pca_data,
@@ -616,13 +616,13 @@ static struct s3c2410_platform_i2c i2c0_pdata = {
        .frequency = 400000,
 };
 
-static struct regulator_consumer_supply pvdd_1v2_consumers[] __devinitdata = {
+static struct regulator_consumer_supply pvdd_1v2_consumers[] = {
        REGULATOR_SUPPLY("DCVDD", "spi0.0"),
        REGULATOR_SUPPLY("AVDD", "spi0.0"),
        REGULATOR_SUPPLY("AVDD", "spi0.1"),
 };
 
-static struct regulator_init_data pvdd_1v2 __devinitdata = {
+static struct regulator_init_data pvdd_1v2 = {
        .constraints = {
                .name = "PVDD_1V2",
                .valid_ops_mask = REGULATOR_CHANGE_STATUS,
@@ -632,7 +632,7 @@ static struct regulator_init_data pvdd_1v2 __devinitdata = {
        .num_consumer_supplies = ARRAY_SIZE(pvdd_1v2_consumers),
 };
 
-static struct regulator_consumer_supply pvdd_1v8_consumers[] __devinitdata = {
+static struct regulator_consumer_supply pvdd_1v8_consumers[] = {
        REGULATOR_SUPPLY("LDOVDD", "1-001a"),
        REGULATOR_SUPPLY("PLLVDD", "1-001a"),
        REGULATOR_SUPPLY("DBVDD", "1-001a"),
@@ -664,7 +664,7 @@ static struct regulator_consumer_supply pvdd_1v8_consumers[] __devinitdata = {
        REGULATOR_SUPPLY("CPVDD", "wm5110-codec"),
 };
 
-static struct regulator_init_data pvdd_1v8 __devinitdata = {
+static struct regulator_init_data pvdd_1v8 = {
        .constraints = {
                .name = "PVDD_1V8",
                .always_on = 1,
@@ -674,12 +674,12 @@ static struct regulator_init_data pvdd_1v8 __devinitdata = {
        .num_consumer_supplies = ARRAY_SIZE(pvdd_1v8_consumers),
 };
 
-static struct regulator_consumer_supply pvdd_3v3_consumers[] __devinitdata = {
+static struct regulator_consumer_supply pvdd_3v3_consumers[] = {
        REGULATOR_SUPPLY("MICVDD", "1-001a"),
        REGULATOR_SUPPLY("AVDD1", "1-001a"),
 };
 
-static struct regulator_init_data pvdd_3v3 __devinitdata = {
+static struct regulator_init_data pvdd_3v3 = {
        .constraints = {
                .name = "PVDD_3V3",
                .always_on = 1,
@@ -689,7 +689,7 @@ static struct regulator_init_data pvdd_3v3 __devinitdata = {
        .num_consumer_supplies = ARRAY_SIZE(pvdd_3v3_consumers),
 };
 
-static struct wm831x_pdata glenfarclas_pmic_pdata __devinitdata = {
+static struct wm831x_pdata glenfarclas_pmic_pdata = {
        .wm831x_num = 2,
        .irq_base = GLENFARCLAS_PMIC_IRQ_BASE,
        .gpio_base = GLENFARCLAS_PMIC_GPIO_BASE,
@@ -721,7 +721,7 @@ static struct wm1250_ev1_pdata wm1250_ev1_pdata = {
        },
 };
 
-static struct i2c_board_info i2c_devs1[] __devinitdata = {
+static struct i2c_board_info i2c_devs1[] = {
        { I2C_BOARD_INFO("wm8311", 0x34),
          .irq = S3C_EINT(0),
          .platform_data = &glenfarclas_pmic_pdata },
index 7f07f08d896804c71ae161aad4ad6b5d1588e48f..b143c4659346d841d7249fc358b12272061e71af 100644 (file)
@@ -130,7 +130,7 @@ void jornada_ssp_end(void)
 };
 EXPORT_SYMBOL(jornada_ssp_end);
 
-static int __devinit jornada_ssp_probe(struct platform_device *dev)
+static int jornada_ssp_probe(struct platform_device *dev)
 {
        int ret;
 
index 88be0474f3d720a0ba2384536bd01516c2f451de..400f803320461320dbbe1fc65635f977355966c7 100644 (file)
@@ -154,7 +154,7 @@ static u_int neponset_get_mctrl(struct uart_port *port)
        return ret;
 }
 
-static struct sa1100_port_fns neponset_port_fns __devinitdata = {
+static struct sa1100_port_fns neponset_port_fns = {
        .set_mctrl      = neponset_set_mctrl,
        .get_mctrl      = neponset_get_mctrl,
 };
@@ -233,7 +233,7 @@ static struct sa1111_platform_data sa1111_info = {
        .disable_devs   = SA1111_DEVID_PS2_MSE,
 };
 
-static int __devinit neponset_probe(struct platform_device *dev)
+static int neponset_probe(struct platform_device *dev)
 {
        struct neponset_drvdata *d;
        struct resource *nep_res, *sa1111_res, *smc91x_res;
@@ -368,7 +368,7 @@ static int __devinit neponset_probe(struct platform_device *dev)
        return ret;
 }
 
-static int __devexit neponset_remove(struct platform_device *dev)
+static int neponset_remove(struct platform_device *dev)
 {
        struct neponset_drvdata *d = platform_get_drvdata(dev);
        int irq = platform_get_irq(dev, 0);
@@ -420,7 +420,7 @@ static const struct dev_pm_ops neponset_pm_ops = {
 
 static struct platform_driver neponset_device_driver = {
        .probe          = neponset_probe,
-       .remove         = __devexit_p(neponset_remove),
+       .remove         = neponset_remove,
        .driver         = {
                .name   = "neponset",
                .owner  = THIS_MODULE,
index 9be910f7920b9d464f49bcb0e40c08f9ddf8e5cb..1dc8a92e5a5fd4d4d5ba76b67cdeab0f58d81b23 100644 (file)
@@ -80,8 +80,8 @@ static void __init sunxi_dt_init(void)
 }
 
 static const char * const sunxi_board_dt_compat[] = {
-       "allwinner,sun4i",
-       "allwinner,sun5i",
+       "allwinner,sun4i-a10",
+       "allwinner,sun5i-a13",
        NULL,
 };
 
index 53d085871798ef62afca5f3905dfc288f8ca8f34..bffcd643d7a3eb14ef094d537444271344280a93 100644 (file)
@@ -331,7 +331,7 @@ static struct pci_ops tegra_pcie_ops = {
        .write  = tegra_pcie_write_conf,
 };
 
-static void __devinit tegra_pcie_fixup_bridge(struct pci_dev *dev)
+static void tegra_pcie_fixup_bridge(struct pci_dev *dev)
 {
        u16 reg;
 
@@ -345,7 +345,7 @@ static void __devinit tegra_pcie_fixup_bridge(struct pci_dev *dev)
 DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_fixup_bridge);
 
 /* Tegra PCIE root complex wrongly reports device class */
-static void __devinit tegra_pcie_fixup_class(struct pci_dev *dev)
+static void tegra_pcie_fixup_class(struct pci_dev *dev)
 {
        dev->class = PCI_CLASS_BRIDGE_PCI << 8;
 }
@@ -353,7 +353,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf0, tegra_pcie_fixup_class);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf1, tegra_pcie_fixup_class);
 
 /* Tegra PCIE requires relaxed ordering */
-static void __devinit tegra_pcie_relax_enable(struct pci_dev *dev)
+static void tegra_pcie_relax_enable(struct pci_dev *dev)
 {
        pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN);
 }
index 837c7b9ea63b1c6561a6fbb13397f36da2ff75a3..e18aa2f83ebf3041cd12d31a06c5bb027820df53 100644 (file)
@@ -268,7 +268,7 @@ static struct tegra_emc_pdata *tegra_emc_dt_parse_pdata(
 }
 #endif
 
-static struct tegra_emc_pdata __devinit *tegra_emc_fill_pdata(struct platform_device *pdev)
+static struct tegra_emc_pdata *tegra_emc_fill_pdata(struct platform_device *pdev)
 {
        struct clk *c = clk_get_sys(NULL, "emc");
        struct tegra_emc_pdata *pdata;
@@ -296,7 +296,7 @@ static struct tegra_emc_pdata __devinit *tegra_emc_fill_pdata(struct platform_de
        return pdata;
 }
 
-static int __devinit tegra_emc_probe(struct platform_device *pdev)
+static int tegra_emc_probe(struct platform_device *pdev)
 {
        struct tegra_emc_pdata *pdata;
        struct resource *res;
@@ -333,7 +333,7 @@ static int __devinit tegra_emc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static struct of_device_id tegra_emc_of_match[] __devinitdata = {
+static struct of_device_id tegra_emc_of_match[] = {
        { .compatible = "nvidia,tegra20-emc", },
        { },
 };
index 03f79361259400596a790949073e1ce617e99bff..2785cb67b5e81025a55b387d96b9bc0ae64f9d34 100644 (file)
@@ -222,7 +222,7 @@ static ssize_t dummy_looptest(struct device *dev,
 
 static DEVICE_ATTR(looptest, S_IRUGO, dummy_looptest, NULL);
 
-static int __devinit pl022_dummy_probe(struct spi_device *spi)
+static int pl022_dummy_probe(struct spi_device *spi)
 {
        struct dummy *p_dummy;
        int status;
@@ -251,7 +251,7 @@ out_dev_create_looptest_failed:
        return status;
 }
 
-static int __devexit pl022_dummy_remove(struct spi_device *spi)
+static int pl022_dummy_remove(struct spi_device *spi)
 {
        struct dummy *p_dummy = dev_get_drvdata(&spi->dev);
 
@@ -269,7 +269,7 @@ static struct spi_driver pl022_dummy_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = pl022_dummy_probe,
-       .remove = __devexit_p(pl022_dummy_remove),
+       .remove = pl022_dummy_remove,
 };
 
 static int __init pl022_init_dummy(void)
index db0bb75e2c7620e9a7964c40d6a428cd66f9d4a8..5b286e06474ce481ff019f302bf1a66aec635687 100644 (file)
@@ -285,7 +285,8 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
        OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL),
        OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),
        /* Requires device name bindings. */
-       OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL),
+       OF_DEV_AUXDATA("stericsson,nmk_pinctrl", U8500_PRCMU_BASE,
+               "pinctrl-db8500", NULL),
        /* Requires clock name and DMA bindings. */
        OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000,
                "ux500-msp-i2s.0", &msp0_platform_data),
index bf44c61bd1f682f203d1169528542a93b6482404..0fd771ca617b00ddf71bd676e7e3834ec87b0b6b 100644 (file)
@@ -25,7 +25,7 @@
  *  IRQ interrupts definitions are the same as the INT definitions
  *  held within platform.h
  */
-#define IRQ_VIC_START          0
+#define IRQ_VIC_START          32
 #define IRQ_WDOGINT            (IRQ_VIC_START + INT_WDOGINT)
 #define IRQ_SOFTINT            (IRQ_VIC_START + INT_SOFTINT)
 #define IRQ_COMMRx             (IRQ_VIC_START + INT_COMMRx)
 /*
  * Secondary interrupt controller
  */
-#define IRQ_SIC_START          32
+#define IRQ_SIC_START          64
 #define IRQ_SIC_MMCI0B                 (IRQ_SIC_START + SIC_INT_MMCI0B)
 #define IRQ_SIC_MMCI1B                 (IRQ_SIC_START + SIC_INT_MMCI1B)
 #define IRQ_SIC_KMI0           (IRQ_SIC_START + SIC_INT_KMI0)
 #define IRQ_SIC_PCI1           (IRQ_SIC_START + SIC_INT_PCI1)
 #define IRQ_SIC_PCI2           (IRQ_SIC_START + SIC_INT_PCI2)
 #define IRQ_SIC_PCI3           (IRQ_SIC_START + SIC_INT_PCI3)
-#define IRQ_SIC_END            63
+#define IRQ_SIC_END            95
 
 #define IRQ_GPIO0_START                (IRQ_SIC_END + 1)
 #define IRQ_GPIO0_END          (IRQ_GPIO0_START + 31)
index 99e63f5f99d179eeeafbae428bd82444adbee747..52d315b792c8e8bb1561b4ae703194a724e865e0 100644 (file)
@@ -42,7 +42,6 @@ config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA
        bool "Enable A5 and A9 only errata work-arounds"
        default y
        select ARM_ERRATA_720789
-       select ARM_ERRATA_751472
        select PL310_ERRATA_753970 if CACHE_PL310
        help
          Provides common dependencies for Versatile Express platforms
index 6911b8b2745c5345ca2a5f4498c702ddd1bc6aad..c2f37390308a20b835d653dfbb0f64f28cc8ce40 100644 (file)
@@ -352,7 +352,8 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)
                /* Unmapped register. */
                sync_reg_offset = L2X0_DUMMY_REG;
 #endif
-               outer_cache.set_debug = pl310_set_debug;
+               if ((cache_id & L2X0_CACHE_ID_RTL_MASK) <= L2X0_CACHE_ID_RTL_R3P0)
+                       outer_cache.set_debug = pl310_set_debug;
                break;
        case L2X0_CACHE_ID_PART_L210:
                ways = (aux >> 13) & 0xf;
@@ -459,8 +460,8 @@ static void aurora_pa_range(unsigned long start, unsigned long end,
        unsigned long flags;
 
        raw_spin_lock_irqsave(&l2x0_lock, flags);
-       writel(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG);
-       writel(end, l2x0_base + offset);
+       writel_relaxed(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG);
+       writel_relaxed(end, l2x0_base + offset);
        raw_spin_unlock_irqrestore(&l2x0_lock, flags);
 
        cache_sync();
@@ -505,15 +506,21 @@ static void aurora_clean_range(unsigned long start, unsigned long end)
 
 static void aurora_flush_range(unsigned long start, unsigned long end)
 {
-       if (!l2_wt_override) {
-               start &= ~(CACHE_LINE_SIZE - 1);
-               end = ALIGN(end, CACHE_LINE_SIZE);
-               while (start != end) {
-                       unsigned long range_end = calc_range_end(start, end);
+       start &= ~(CACHE_LINE_SIZE - 1);
+       end = ALIGN(end, CACHE_LINE_SIZE);
+       while (start != end) {
+               unsigned long range_end = calc_range_end(start, end);
+               /*
+                * If L2 is forced to WT, the L2 will always be clean and we
+                * just need to invalidate.
+                */
+               if (l2_wt_override)
                        aurora_pa_range(start, range_end - CACHE_LINE_SIZE,
-                                       AURORA_FLUSH_RANGE_REG);
-                       start = range_end;
-               }
+                                                       AURORA_INVAL_RANGE_REG);
+               else
+                       aurora_pa_range(start, range_end - CACHE_LINE_SIZE,
+                                                       AURORA_FLUSH_RANGE_REG);
+               start = range_end;
        }
 }
 
@@ -668,8 +675,9 @@ static void pl310_resume(void)
 static void aurora_resume(void)
 {
        if (!(readl(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) {
-               writel(l2x0_saved_regs.aux_ctrl, l2x0_base + L2X0_AUX_CTRL);
-               writel(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL);
+               writel_relaxed(l2x0_saved_regs.aux_ctrl,
+                               l2x0_base + L2X0_AUX_CTRL);
+               writel_relaxed(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL);
        }
 }
 
index 350f6a74992b9200618e52ed07a2ec9dd1bde407..3a3c015f8d5c33cb99357995b6d35790037e7f94 100644 (file)
@@ -169,6 +169,7 @@ __v7_ca15mp_setup:
        orreq   r0, r0, r10                     @ Enable CPU-specific SMP bits
        mcreq   p15, 0, r0, c1, c0, 1
 #endif
+       b       __v7_setup
 
 __v7_pj4b_setup:
 #ifdef CONFIG_CPU_PJ4B
@@ -245,7 +246,8 @@ __v7_setup:
        ldr     r10, =0x00000c08                @ Cortex-A8 primary part number
        teq     r0, r10
        bne     2f
-#ifdef CONFIG_ARM_ERRATA_430973
+#if defined(CONFIG_ARM_ERRATA_430973) && !defined(CONFIG_ARCH_MULTIPLATFORM)
+
        teq     r5, #0x00100000                 @ only present in r1p*
        mrceq   p15, 0, r10, c1, c0, 1          @ read aux control register
        orreq   r10, r10, #(1 << 6)             @ set IBE to 1
index 9d9aa2f5512942af5b493bbfd3afae041b6be615..a14a78a2f149fa76e0167af8ec420c8152fe744f 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 # Common support
-obj-y := sram.o dma.o fb.o counter_32k.o
+obj-y := sram.o dma.o counter_32k.o
 obj-m :=
 obj-n :=
 obj-  :=
index f3771cdb98385917f95526e1fa0b69f443620f13..5b0b86bb34bb8d8ab22466e9f7a54c4937fddd5e 100644 (file)
@@ -22,6 +22,8 @@
 #include <asm/mach/time.h>
 #include <asm/sched_clock.h>
 
+#include <plat/counter-32k.h>
+
 /* OMAP2_32KSYNCNT_CR_OFF: offset of 32ksync counter register */
 #define OMAP2_32KSYNCNT_REV_OFF                0x0
 #define OMAP2_32KSYNCNT_REV_SCHEME     (0x3 << 30)
index 37a488aaa2ba95dffef6c017988df5fbb4769af5..4136b20cba3cc257534900894a1a8767baab585e 100644 (file)
@@ -2000,7 +2000,7 @@ void omap_dma_global_context_restore(void)
                        omap_clear_dma(ch);
 }
 
-static int __devinit omap_system_dma_probe(struct platform_device *pdev)
+static int omap_system_dma_probe(struct platform_device *pdev)
 {
        int ch, ret = 0;
        int dma_irq;
@@ -2116,7 +2116,7 @@ exit_dma_lch_fail:
        return ret;
 }
 
-static int __devexit omap_system_dma_remove(struct platform_device *pdev)
+static int omap_system_dma_remove(struct platform_device *pdev)
 {
        int dma_irq;
 
@@ -2140,7 +2140,7 @@ static int __devexit omap_system_dma_remove(struct platform_device *pdev)
 
 static struct platform_driver omap_system_dma_driver = {
        .probe          = omap_system_dma_probe,
-       .remove         = __devexit_p(omap_system_dma_remove),
+       .remove         = omap_system_dma_remove,
        .driver         = {
                .name   = "omap_dma_system"
        },
index 89585c2935549129fe8f8c72994a203fcdc77601..7b433f3bddca180102fb729bca15cd47317da3a6 100644 (file)
@@ -777,7 +777,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timers_active);
  * Called by driver framework at the end of device registration for all
  * timer devices.
  */
-static int __devinit omap_dm_timer_probe(struct platform_device *pdev)
+static int omap_dm_timer_probe(struct platform_device *pdev)
 {
        unsigned long flags;
        struct omap_dm_timer *timer;
@@ -864,7 +864,7 @@ static int __devinit omap_dm_timer_probe(struct platform_device *pdev)
  * In addition to freeing platform resources it also deletes the timer
  * entry from the local list.
  */
-static int __devexit omap_dm_timer_remove(struct platform_device *pdev)
+static int omap_dm_timer_remove(struct platform_device *pdev)
 {
        struct omap_dm_timer *timer;
        unsigned long flags;
@@ -891,26 +891,15 @@ MODULE_DEVICE_TABLE(of, omap_timer_match);
 
 static struct platform_driver omap_dm_timer_driver = {
        .probe  = omap_dm_timer_probe,
-       .remove = __devexit_p(omap_dm_timer_remove),
+       .remove = omap_dm_timer_remove,
        .driver = {
                .name   = "omap_timer",
                .of_match_table = of_match_ptr(omap_timer_match),
        },
 };
 
-static int __init omap_dm_timer_driver_init(void)
-{
-       return platform_driver_register(&omap_dm_timer_driver);
-}
-
-static void __exit omap_dm_timer_driver_exit(void)
-{
-       platform_driver_unregister(&omap_dm_timer_driver);
-}
-
 early_platform_init("earlytimer", &omap_dm_timer_driver);
-module_init(omap_dm_timer_driver_init);
-module_exit(omap_dm_timer_driver_exit);
+module_platform_driver(omap_dm_timer_driver);
 
 MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver");
 MODULE_LICENSE("GPL");
diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c
deleted file mode 100644 (file)
index a3367b7..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * File: arch/arm/plat-omap/fb.c
- *
- * Framebuffer device registration for TI OMAP platforms
- *
- * Copyright (C) 2006 Nokia Corporation
- * Author: Imre Deak <imre.deak@nokia.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/memblock.h>
-#include <linux/io.h>
-#include <linux/omapfb.h>
-#include <linux/dma-mapping.h>
-
-#include <asm/mach/map.h>
-
-#include <plat/cpu.h>
-
-#ifdef CONFIG_OMAP2_VRFB
-
-/*
- * The first memory resource is the register region for VRFB,
- * the rest are VRFB virtual memory areas for each VRFB context.
- */
-
-static const struct resource omap2_vrfb_resources[] = {
-       DEFINE_RES_MEM_NAMED(0x68008000u, 0x40, "vrfb-regs"),
-       DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
-       DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
-       DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
-       DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
-};
-
-static const struct resource omap3_vrfb_resources[] = {
-       DEFINE_RES_MEM_NAMED(0x6C000180u, 0xc0, "vrfb-regs"),
-       DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
-       DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
-       DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
-       DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
-       DEFINE_RES_MEM_NAMED(0xe0000000u, 0x4000000, "vrfb-area-4"),
-       DEFINE_RES_MEM_NAMED(0xe4000000u, 0x4000000, "vrfb-area-5"),
-       DEFINE_RES_MEM_NAMED(0xe8000000u, 0x4000000, "vrfb-area-6"),
-       DEFINE_RES_MEM_NAMED(0xec000000u, 0x4000000, "vrfb-area-7"),
-       DEFINE_RES_MEM_NAMED(0xf0000000u, 0x4000000, "vrfb-area-8"),
-       DEFINE_RES_MEM_NAMED(0xf4000000u, 0x4000000, "vrfb-area-9"),
-       DEFINE_RES_MEM_NAMED(0xf8000000u, 0x4000000, "vrfb-area-10"),
-       DEFINE_RES_MEM_NAMED(0xfc000000u, 0x4000000, "vrfb-area-11"),
-};
-
-static int __init omap_init_vrfb(void)
-{
-       struct platform_device *pdev;
-       const struct resource *res;
-       unsigned int num_res;
-
-       if (cpu_is_omap24xx()) {
-               res = omap2_vrfb_resources;
-               num_res = ARRAY_SIZE(omap2_vrfb_resources);
-       } else if (cpu_is_omap34xx()) {
-               res = omap3_vrfb_resources;
-               num_res = ARRAY_SIZE(omap3_vrfb_resources);
-       } else {
-               return 0;
-       }
-
-       pdev = platform_device_register_resndata(NULL, "omapvrfb", -1,
-                       res, num_res, NULL, 0);
-
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
-       else
-               return 0;
-}
-
-arch_initcall(omap_init_vrfb);
-#endif
-
-#if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE)
-
-static bool omapfb_lcd_configured;
-static struct omapfb_platform_data omapfb_config;
-
-static u64 omap_fb_dma_mask = ~(u32)0;
-
-static struct platform_device omap_fb_device = {
-       .name           = "omapfb",
-       .id             = -1,
-       .dev = {
-               .dma_mask               = &omap_fb_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-               .platform_data          = &omapfb_config,
-       },
-       .num_resources = 0,
-};
-
-void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
-{
-       omapfb_config.lcd = *config;
-       omapfb_lcd_configured = true;
-}
-
-static int __init omap_init_fb(void)
-{
-       /*
-        * If the board file has not set the lcd config with
-        * omapfb_set_lcd_config(), don't bother registering the omapfb device
-        */
-       if (!omapfb_lcd_configured)
-               return 0;
-
-       return platform_device_register(&omap_fb_device);
-}
-
-arch_initcall(omap_init_fb);
-
-#elif defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
-
-static u64 omap_fb_dma_mask = ~(u32)0;
-static struct omapfb_platform_data omapfb_config;
-
-static struct platform_device omap_fb_device = {
-       .name           = "omapfb",
-       .id             = -1,
-       .dev = {
-               .dma_mask               = &omap_fb_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-               .platform_data          = &omapfb_config,
-       },
-       .num_resources = 0,
-};
-
-static int __init omap_init_fb(void)
-{
-       return platform_device_register(&omap_fb_device);
-}
-
-arch_initcall(omap_init_fb);
-
-#else
-
-void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
-{
-}
-
-#endif
index b4516aba67ed5fd32687de5d9f94660bf21003c6..c9a66bf36c9a4506f190186666dee325c1dbf3c3 100644 (file)
@@ -32,8 +32,4 @@
 #include <mach/soc.h>
 #endif
 
-#ifdef CONFIG_ARCH_OMAP2PLUS
-#include "../../mach-omap2/soc.h"
-#endif
-
 #endif
index 743fc2836f7aaa8877349cd47fe98669351e11d2..a5bc92d7e4765b81315379c41618fff7f84cbec2 100644 (file)
@@ -26,6 +26,8 @@
 
 #include <asm/mach/map.h>
 
+#include <plat/sram.h>
+
 #define ROUND_DOWN(value,boundary)     ((value) & (~((boundary)-1)))
 
 static void __iomem *omap_sram_base;
index 584c9bf8ed2d0feed3894fa1b672f26ab70365a5..8e11e96eab5ef6dbb07f79c3dd747252401d5a52 100644 (file)
@@ -72,7 +72,7 @@ void pxa_ssp_free(struct ssp_device *ssp)
 }
 EXPORT_SYMBOL(pxa_ssp_free);
 
-static int __devinit pxa_ssp_probe(struct platform_device *pdev)
+static int pxa_ssp_probe(struct platform_device *pdev)
 {
        const struct platform_device_id *id = platform_get_device_id(pdev);
        struct resource *res;
@@ -164,7 +164,7 @@ err_free:
        return ret;
 }
 
-static int __devexit pxa_ssp_remove(struct platform_device *pdev)
+static int pxa_ssp_remove(struct platform_device *pdev)
 {
        struct resource *res;
        struct ssp_device *ssp;
@@ -199,7 +199,7 @@ static const struct platform_device_id ssp_id_table[] = {
 
 static struct platform_driver pxa_ssp_driver = {
        .probe          = pxa_ssp_probe,
-       .remove         = __devexit_p(pxa_ssp_remove),
+       .remove         = pxa_ssp_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "pxa2xx-ssp",
index 37542c2689a2763968bad6d040ae010c3ac61ac1..2d676ab50f7300c15dd3753fdde2edb1f5570ee6 100644 (file)
@@ -416,7 +416,7 @@ static int s3c_adc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit s3c_adc_remove(struct platform_device *pdev)
+static int s3c_adc_remove(struct platform_device *pdev)
 {
        struct adc_device *adc = platform_get_drvdata(pdev);
 
@@ -516,7 +516,7 @@ static struct platform_driver s3c_adc_driver = {
                .pm     = &adc_pm_ops,
        },
        .probe          = s3c_adc_probe,
-       .remove         = __devexit_p(s3c_adc_remove),
+       .remove         = s3c_adc_remove,
 };
 
 static int __init adc_init(void)
index e0072ce8d6e9c016d78d89c23cba639fa6732186..b69e11dc679da60d8c800c0658a30c84b47437e8 100644 (file)
@@ -43,7 +43,7 @@ extern unsigned long samsung_cpu_id;
 #define EXYNOS4_CPU_MASK       0xFFFE0000
 
 #define EXYNOS5250_SOC_ID      0x43520000
-#define EXYNOS5440_SOC_ID      0x54400000
+#define EXYNOS5440_SOC_ID      0xE5440000
 #define EXYNOS5_SOC_MASK       0xFFFFF000
 
 #define IS_SAMSUNG_CPU(name, id, mask)         \
index 9c829b0082614ec202e3269288e2e642d8303f0b..f8f362aafee948601178c275bc81b4e9c8b51ae5 100644 (file)
@@ -2,6 +2,8 @@ config ARM64
        def_bool y
        select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
        select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
+       select ARM_AMBA
+       select CLONE_BACKWARDS
        select COMMON_CLK
        select GENERIC_CLOCKEVENTS
        select GENERIC_HARDIRQS_NO_DEPRECATED
@@ -31,7 +33,6 @@ config ARM64
        select RTC_LIB
        select SPARSE_IRQ
        select SYSCTL_EXCEPTION_TRACE
-       select CLONE_BACKWARDS
        help
          ARM 64-bit (AArch64) Linux support.
 
@@ -90,6 +91,9 @@ config SWIOTLB
 config IOMMU_HELPER
        def_bool SWIOTLB
 
+config GENERIC_GPIO
+       def_bool y
+
 source "init/Kconfig"
 
 source "kernel/Kconfig.freezer"
index 801e2d7fcbc6e9bd0e4795faea842604c0c57afc..32ac0aef006879cb57b9c6bfbc25c072924b8076 100644 (file)
@@ -1,4 +1,5 @@
 targets += dtbs
+targets += $(dtb-y)
 
 dtbs: $(addprefix $(obj)/, $(dtb-y))
 
index d9ec40217a27639280fb958ee49c9f92cb188c90..618b450e5a1d5e009f30784b11e66a3fbc6468c5 100644 (file)
@@ -23,6 +23,7 @@
  */
 #include <linux/types.h>
 #include <linux/sched.h>
+#include <linux/ptrace.h>
 
 #define COMPAT_USER_HZ         100
 #define COMPAT_UTS_MACHINE     "armv8l\0\0"
index c76c7241125b66d8ee762b13bdae3f73328f8fe7..f7073c7b1ca91de056f5ca80f13aad12e3383e91 100644 (file)
@@ -1221,7 +1221,7 @@ static struct of_device_id armpmu_of_device_ids[] = {
        {},
 };
 
-static int __devinit armpmu_device_probe(struct platform_device *pdev)
+static int armpmu_device_probe(struct platform_device *pdev)
 {
        if (!cpu_pmu)
                return -ENODEV;
index 486df68abeecc955757a352cf64e70ad9b39a020..51c6401582ea677a1d9d211ce3652b833de9516c 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -70,4 +70,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* __ASM_AVR32_SOCKET_H */
index 9aa8800830f396b8ef4fb79a4186b1f9b95dc60a..c2f4a07dcda182d446ae49ed122b570f1a173efe 100644 (file)
@@ -20,7 +20,7 @@
 #include <asm/processor.h>
 #include <asm/sysreg.h>
 
-int __devinit read_current_timer(unsigned long *timer_value)
+int read_current_timer(unsigned long *timer_value)
 {
        *timer_value = sysreg_read(COUNT);
        return 0;
index 978bb400be062a350dbe1281ed8c658f0f86b476..724a8c5f5578d14a69f3dcda0933e165f379d21c 100644 (file)
@@ -129,7 +129,7 @@ static struct notifier_block vreg_cpufreq_notifier_block = {
  *     bfin_dpmc_probe -
  *
  */
-static int __devinit bfin_dpmc_probe(struct platform_device *pdev)
+static int bfin_dpmc_probe(struct platform_device *pdev)
 {
        if (pdev->dev.platform_data)
                pdata = pdev->dev.platform_data;
@@ -143,7 +143,7 @@ static int __devinit bfin_dpmc_probe(struct platform_device *pdev)
 /**
  *     bfin_dpmc_remove -
  */
-static int __devexit bfin_dpmc_remove(struct platform_device *pdev)
+static int bfin_dpmc_remove(struct platform_device *pdev)
 {
        pdata = NULL;
        return cpufreq_unregister_notifier(&vreg_cpufreq_notifier_block,
@@ -152,7 +152,7 @@ static int __devexit bfin_dpmc_remove(struct platform_device *pdev)
 
 struct platform_driver bfin_dpmc_device_driver = {
        .probe   = bfin_dpmc_probe,
-       .remove  = __devexit_p(bfin_dpmc_remove),
+       .remove  = bfin_dpmc_remove,
        .driver  = {
                .name = DRIVER_NAME,
        }
index e3dfc72d0cfd760507f42ea74355511aa134c16d..64a5fb93767d153139bacf61f007ca00c013eb7e 100644 (file)
@@ -2,7 +2,7 @@
 #include <linux/kernel.h>
 #include <arch/hwregs/intr_vect.h>
 
-void __devinit  pcibios_fixup_bus(struct pci_bus *b)
+void pcibios_fixup_bus(struct pci_bus *b)
 {
 }
 
index ebe2cb30bd11ba9f54188ba9ad39b6dfcb800c87..04a16edd540162ae3c596cd7ee2c5dc7cffe0cf5 100644 (file)
@@ -84,7 +84,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
                cpumask_set_cpu(i, &phys_cpu_present_map);
 }
 
-void __devinit smp_prepare_boot_cpu(void)
+void smp_prepare_boot_cpu(void)
 {
        /* PGD pointer has moved after per_cpu initialization so
         * update the MMU.
index b681b043f6c819fedc4b819c5ffa59a72cd7059f..50692b738c756172af61ab84f2f8693495ea6655 100644 (file)
@@ -24,7 +24,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -72,6 +72,8 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _ASM_SOCKET_H */
 
 
index 871f89b7fbdaf08a0629679f01d804337804cbc7..595391f0f98c65e2bddbcbbe70b7e4d5062082d9 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -70,5 +70,7 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _ASM_SOCKET_H */
 
index 3cb3392f799e02886e8a93b88907a2ca7a9f0215..a5136474c6fd6f95628362e8e144d82f8799c773 100644 (file)
@@ -852,7 +852,7 @@ void __init setup_arch(char **cmdline_p)
 /*
  *
  */
-static int __devinit setup_arch_serial(void)
+static int setup_arch_serial(void)
 {
        /* register those serial ports that are available */
 #ifndef CONFIG_GDBSTUB_UART0
index 71e9bcf581051a71316665b7ec0cea5d22f98b67..d186b254ce99fd87046177e8c2d15eb15529dcff 100644 (file)
@@ -268,7 +268,7 @@ static void __init pci_fixup_umc_ide(struct pci_dev *d)
                d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO;
 }
 
-static void __devinit pci_fixup_ide_bases(struct pci_dev *d)
+static void pci_fixup_ide_bases(struct pci_dev *d)
 {
        int i;
 
@@ -287,7 +287,7 @@ static void __devinit pci_fixup_ide_bases(struct pci_dev *d)
        }
 }
 
-static void __devinit pci_fixup_ide_trash(struct pci_dev *d)
+static void pci_fixup_ide_trash(struct pci_dev *d)
 {
        int i;
 
@@ -300,7 +300,7 @@ static void __devinit pci_fixup_ide_trash(struct pci_dev *d)
                d->resource[i].start = d->resource[i].end = d->resource[i].flags = 0;
 }
 
-static void __devinit  pci_fixup_latency(struct pci_dev *d)
+static void pci_fixup_latency(struct pci_dev *d)
 {
        /*
         *  SiS 5597 and 5598 chipsets require latency timer set to
index 90a2e573c7e679ac92300734e3641f7d5d5b45e0..43e32621da7d01ab20ad81f0c520d6ee83682434 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -70,4 +70,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _ASM_SOCKET_H */
index 301609c3fceca4099201c06ef2b4992f7a29fff2..359e68a03ca3e47ca1ea71df04b3fd04cba14e31 100644 (file)
@@ -153,7 +153,7 @@ extern int additional_cpus;
 #else
 #define MAX_PXM_DOMAINS (256)
 #endif
-extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS];
+extern int pxm_to_nid_map[MAX_PXM_DOMAINS];
 extern int __initdata nid_to_pxm_map[MAX_NUMNODES];
 #endif
 
index b9c102e15f22b196cd429d326c9cb674a9136009..94c89a2d97fe2f59421a101c64c587d7bde0c588 100644 (file)
@@ -87,18 +87,13 @@ static inline void iosapic_eoi(char __iomem *iosapic, u32 vector)
 }
 
 extern void __init iosapic_system_init (int pcat_compat);
-extern int __devinit iosapic_init (unsigned long address,
-                                   unsigned int gsi_base);
-#ifdef CONFIG_HOTPLUG
+extern int iosapic_init (unsigned long address, unsigned int gsi_base);
 extern int iosapic_remove (unsigned int gsi_base);
-#else
-#define iosapic_remove(gsi_base)                               (-EINVAL)
-#endif /* CONFIG_HOTPLUG */
 extern int gsi_to_irq (unsigned int gsi);
 extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,
                                  unsigned long trigger);
 extern void iosapic_unregister_intr (unsigned int irq);
-extern void __devinit iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
+extern void iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
                                      unsigned long polarity,
                                      unsigned long trigger);
 extern int __init iosapic_register_platform_intr (u32 int_type,
@@ -109,7 +104,7 @@ extern int __init iosapic_register_platform_intr (u32 int_type,
                                           unsigned long trigger);
 
 #ifdef CONFIG_NUMA
-extern void __devinit map_iosapic_to_node (unsigned int, int);
+extern void map_iosapic_to_node (unsigned int, int);
 #endif
 #else
 #define iosapic_system_init(pcat_compat)                       do { } while (0)
index 67e16adfcd25dcd26da9be94bf2e93d07add8bf7..638b4d271b994b91b0481535adcf9615e4de72cd 100644 (file)
@@ -9,10 +9,9 @@
 #ifndef _ASM_IA64_PARPORT_H
 #define _ASM_IA64_PARPORT_H 1
 
-static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma);
+static int parport_pc_find_isa_ports(int autoirq, int autodma);
 
-static int __devinit
-parport_pc_find_nonpci_ports (int autoirq, int autodma)
+static int parport_pc_find_nonpci_ports(int autoirq, int autodma)
 {
        return parport_pc_find_isa_ports(autoirq, autodma);
 }
index 0b3b3997decd1adf397901a4ec4b4ad9d3328cfe..fea21e986022e447fe54a37d1b21f29f9c05aa4b 100644 (file)
@@ -55,7 +55,7 @@ extern struct smp_boot_data {
        int cpu_phys_id[NR_CPUS];
 } smp_boot_data __initdata;
 
-extern char no_int_routing __devinitdata;
+extern char no_int_routing;
 
 extern cpumask_t cpu_core_map[NR_CPUS];
 DECLARE_PER_CPU_SHARED_ALIGNED(cpumask_t, cpu_sibling_map);
index 8b3ff2f5b86167eda40544dbda0099c568eaaf0e..c3cc42a15af157b14fc7fd55da74f75d39d21616 100644 (file)
@@ -11,7 +11,7 @@
 
 
 
-#define NR_syscalls                    311 /* length of syscall table */
+#define NR_syscalls                    312 /* length of syscall table */
 
 /*
  * The following defines stop scripts/checksyscalls.sh from complaining about
index 23d6759bb57b8dd6af9a824e78ce7335dede1d80..c567adc8bea535fb5bcc15156a51f4af55424bf3 100644 (file)
@@ -31,7 +31,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -79,4 +79,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _ASM_IA64_SOCKET_H */
index b706aa54df2058eb0cb0bbd72cf543a49880313e..34fd6fe46da1e6e1659b347481f2a93ec2b5ca11 100644 (file)
 #define __NR_process_vm_readv          1332
 #define __NR_process_vm_writev         1333
 #define __NR_accept4                   1334
+#define __NR_finit_module              1335
 
 #endif /* _UAPI_ASM_IA64_UNISTD_H */
index e9682f5be3431b58c1dfe6d080bdb87432dea838..335eb07480fe9a89545c48d3ed273e50cfee9cb8 100644 (file)
@@ -422,7 +422,7 @@ static int __init acpi_parse_madt(struct acpi_table_header *table)
 #define PXM_FLAG_LEN ((MAX_PXM_DOMAINS + 1)/32)
 
 static int __initdata srat_num_cpus;   /* number of cpus */
-static u32 __devinitdata pxm_flag[PXM_FLAG_LEN];
+static u32 pxm_flag[PXM_FLAG_LEN];
 #define pxm_bit_set(bit)       (set_bit(bit,(void *)pxm_flag))
 #define pxm_bit_test(bit)      (test_bit(bit,(void *)pxm_flag))
 static struct acpi_table_slit __initdata *slit_table;
@@ -956,8 +956,8 @@ EXPORT_SYMBOL(acpi_unmap_lsapic);
 #endif                         /* CONFIG_ACPI_HOTPLUG_CPU */
 
 #ifdef CONFIG_ACPI_NUMA
-static acpi_status __devinit
-acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret)
+static acpi_status acpi_map_iosapic(acpi_handle handle, u32 depth,
+                                   void *context, void **ret)
 {
        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
        union acpi_object *obj;
index e25b784a2b72166ef27d1e7ccb66d8063f5bf31c..6bfd8429ee0f4a6aedd72aa051030928f72085fa 100644 (file)
@@ -1785,6 +1785,7 @@ sys_call_table:
        data8 sys_process_vm_readv
        data8 sys_process_vm_writev
        data8 sys_accept4
+       data8 sys_finit_module                  // 1335
 
        .org sys_call_table + 8*NR_syscalls     // guard against failures to increase NR_syscalls
 #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
index ef4b5d877cf2ed08dc2706f5da6883323219aeb9..ee33c3aaa2fca383abd28f64021a0b6cb1c4c6ba 100644 (file)
@@ -147,7 +147,7 @@ static struct iosapic_intr_info {
        unsigned char   trigger : 1;    /* trigger mode (see iosapic.h) */
 } iosapic_intr_info[NR_IRQS];
 
-static unsigned char pcat_compat __devinitdata;        /* 8259 compatibility flag */
+static unsigned char pcat_compat;      /* 8259 compatibility flag */
 
 static inline void
 iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val)
@@ -914,10 +914,8 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
 /*
  * ACPI calls this when it finds an entry for a legacy ISA IRQ override.
  */
-void __devinit
-iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
-                         unsigned long polarity,
-                         unsigned long trigger)
+void iosapic_override_isa_irq(unsigned int isa_irq, unsigned int gsi,
+                             unsigned long polarity, unsigned long trigger)
 {
        int vector, irq;
        unsigned int dest = cpu_physical_id(smp_processor_id());
@@ -1012,8 +1010,7 @@ iosapic_check_gsi_range (unsigned int gsi_base, unsigned int ver)
        return 0;
 }
 
-int __devinit
-iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
+int iosapic_init(unsigned long phys_addr, unsigned int gsi_base)
 {
        int num_rte, err, index;
        unsigned int isa_irq, ver;
@@ -1070,9 +1067,7 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
        return 0;
 }
 
-#ifdef CONFIG_HOTPLUG
-int
-iosapic_remove (unsigned int gsi_base)
+int iosapic_remove(unsigned int gsi_base)
 {
        int index, err = 0;
        unsigned long flags;
@@ -1098,11 +1093,9 @@ iosapic_remove (unsigned int gsi_base)
        spin_unlock_irqrestore(&iosapic_lock, flags);
        return err;
 }
-#endif /* CONFIG_HOTPLUG */
 
 #ifdef CONFIG_NUMA
-void __devinit
-map_iosapic_to_node(unsigned int gsi_base, int node)
+void map_iosapic_to_node(unsigned int gsi_base, int node)
 {
        int index;
 
index 6a368cb2043ee9ae82388b3856fe6b0e3a7d304f..500f1e4d9f9d973aceff4143ede63b3c69a6b83e 100644 (file)
@@ -347,8 +347,7 @@ ia64_sync_itc (unsigned int master)
 /*
  * Ideally sets up per-cpu profiling hooks.  Doesn't do much now...
  */
-static inline void __devinit
-smp_setup_percpu_timer (void)
+static inline void smp_setup_percpu_timer(void)
 {
 }
 
@@ -563,7 +562,7 @@ smp_prepare_cpus (unsigned int max_cpus)
        }
 }
 
-void __devinit smp_prepare_boot_cpu(void)
+void smp_prepare_boot_cpu(void)
 {
        set_cpu_online(smp_processor_id(), true);
        cpu_set(smp_processor_id(), cpu_callin_map);
@@ -713,8 +712,7 @@ smp_cpus_done (unsigned int dummy)
               (int)num_online_cpus(), bogosum/(500000/HZ), (bogosum/(5000/HZ))%100);
 }
 
-static inline void __devinit
-set_cpu_sibling_map(int cpu)
+static inline void set_cpu_sibling_map(int cpu)
 {
        int i;
 
@@ -793,8 +791,7 @@ init_smp_config(void)
  * identify_siblings(cpu) gets called from identify_cpu. This populates the 
  * information related to logical execution units in per_cpu_data structure.
  */
-void __devinit
-identify_siblings(struct cpuinfo_ia64 *c)
+void identify_siblings(struct cpuinfo_ia64 *c)
 {
        long status;
        u16 pltid;
index b1995efbfd21708f0f283f7657f16ffbb5613c83..88a794536bc01b9e55ec0b41aa00b37c55653eea 100644 (file)
@@ -243,8 +243,7 @@ static int __init nojitter_setup(char *str)
 __setup("nojitter", nojitter_setup);
 
 
-void __devinit
-ia64_init_itm (void)
+void ia64_init_itm(void)
 {
        unsigned long platform_base_freq, itc_freq;
        struct pal_freq_ratio itc_ratio, proc_ratio;
index 082e383c1b6f22dc8370fdac789489acbb04ffba..b755ea92aea7f23d269f4053974dbc8cba2b380e 100644 (file)
@@ -294,11 +294,10 @@ setup_gate (void)
        ia64_patch_gate();
 }
 
-void __devinit
-ia64_mmu_init (void *my_cpu_data)
+void ia64_mmu_init(void *my_cpu_data)
 {
        unsigned long pta, impl_va_bits;
-       extern void __devinit tlb_init (void);
+       extern void tlb_init(void);
 
 #ifdef CONFIG_DISABLE_VHPT
 #      define VHPT_ENABLE_BIT  0
index 7b3cdc6c6d9147d3edd422ab31b97adf90e46f6c..ed61297686814be272dbde922bf94d8977894bf5 100644 (file)
@@ -337,8 +337,7 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start,
 }
 EXPORT_SYMBOL(flush_tlb_range);
 
-void __devinit
-ia64_tlb_init (void)
+void ia64_tlb_init(void)
 {
        ia64_ptce_info_t uninitialized_var(ptce_info); /* GCC be quiet */
        u64 tr_pgbits;
index eab28e314022e7c4456a2860d99eea70c22c8df0..5dc969dd4ac06fec04f308894bcfe27dfc324e68 100644 (file)
@@ -24,7 +24,7 @@
  * video device at this point.
  */
 
-static void __devinit pci_fixup_video(struct pci_dev *pdev)
+static void pci_fixup_video(struct pci_dev *pdev)
 {
        struct pci_dev *bridge;
        struct pci_bus *bus;
index 5faa66c5c2a8df236c098f2738fc877a0f5300c5..55b72ad573292d58af2d6eff037a46bab8d75dba 100644 (file)
@@ -116,8 +116,7 @@ struct pci_ops pci_root_ops = {
 
 /* Called by ACPI when it finds a new root bus.  */
 
-static struct pci_controller * __devinit
-alloc_pci_controller (int seg)
+static struct pci_controller *alloc_pci_controller(int seg)
 {
        struct pci_controller *controller;
 
@@ -165,8 +164,8 @@ new_space (u64 phys_base, int sparse)
        return i;
 }
 
-static u64 __devinit
-add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr)
+static u64 add_io_space(struct pci_root_info *info,
+                       struct acpi_resource_address64 *addr)
 {
        struct resource *resource;
        char *name;
@@ -226,8 +225,8 @@ out:
        return ~0;
 }
 
-static acpi_status __devinit resource_to_window(struct acpi_resource *resource,
-       struct acpi_resource_address64 *addr)
+static acpi_status resource_to_window(struct acpi_resource *resource,
+                                     struct acpi_resource_address64 *addr)
 {
        acpi_status status;
 
@@ -249,8 +248,7 @@ static acpi_status __devinit resource_to_window(struct acpi_resource *resource,
        return AE_ERROR;
 }
 
-static acpi_status __devinit
-count_window (struct acpi_resource *resource, void *data)
+static acpi_status count_window(struct acpi_resource *resource, void *data)
 {
        unsigned int *windows = (unsigned int *) data;
        struct acpi_resource_address64 addr;
@@ -263,7 +261,7 @@ count_window (struct acpi_resource *resource, void *data)
        return AE_OK;
 }
 
-static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
+static acpi_status add_window(struct acpi_resource *res, void *data)
 {
        struct pci_root_info *info = data;
        struct pci_window *window;
@@ -324,8 +322,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
        return AE_OK;
 }
 
-struct pci_bus * __devinit
-pci_acpi_scan_root(struct acpi_pci_root *root)
+struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
 {
        struct acpi_device *device = root->device;
        int domain = root->segment;
@@ -396,7 +393,7 @@ out1:
        return NULL;
 }
 
-static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
+static int is_valid_resource(struct pci_dev *dev, int idx)
 {
        unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
        struct resource *devr = &dev->resource[idx], *busr;
@@ -414,8 +411,7 @@ static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
        return 0;
 }
 
-static void __devinit
-pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
+static void pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
 {
        int i;
 
@@ -427,13 +423,13 @@ pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
        }
 }
 
-void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
+void pcibios_fixup_device_resources(struct pci_dev *dev)
 {
        pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES);
 }
 EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources);
 
-static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev)
+static void pcibios_fixup_bridge_resources(struct pci_dev *dev)
 {
        pcibios_fixup_resources(dev, PCI_BRIDGE_RESOURCES, PCI_NUM_RESOURCES);
 }
@@ -441,8 +437,7 @@ static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev)
 /*
  *  Called after each bus is probed, but before its children are examined.
  */
-void __devinit
-pcibios_fixup_bus (struct pci_bus *b)
+void pcibios_fixup_bus(struct pci_bus *b)
 {
        struct pci_dev *dev;
 
index 8630875e74b5770ce3a02e3cf32175b3cbfeb6ba..11f2275570fb552f14443d8a8ece3281f0b65874 100644 (file)
@@ -435,8 +435,7 @@ void sn_generate_path(struct pci_bus *pci_bus, char *address)
                                                geo_slot(geoid));
 }
 
-void __devinit
-sn_pci_fixup_bus(struct pci_bus *bus)
+void sn_pci_fixup_bus(struct pci_bus *bus)
 {
 
        if (SN_ACPI_BASE_SUPPORT())
index 4554f68b786524e7df3608cbf3b105fb8edf5030..b9992571c0368a123bffd493571478af6180fde8 100644 (file)
@@ -977,7 +977,7 @@ int sn_hwperf_get_nearest_node(cnodeid_t node,
        return e;
 }
 
-static int __devinit sn_hwperf_misc_register_init(void)
+static int sn_hwperf_misc_register_init(void)
 {
        int e;
 
index 01f479ee1c4333d89f0ac57b322c544edc8c4378..efb74dafec4de299df6c41929e8b864312d584cc 100644 (file)
@@ -273,9 +273,8 @@ xen_bind_early_percpu_irq(void)
  */
 
 #ifdef CONFIG_HOTPLUG_CPU
-static int __devinit
-unbind_evtchn_callback(struct notifier_block *nfb,
-                      unsigned long action, void *hcpu)
+static int unbind_evtchn_callback(struct notifier_block *nfb,
+                                 unsigned long action, void *hcpu)
 {
        unsigned int cpu = (unsigned long)hcpu;
 
index 5e7088a26726cc0133ae3a6f166f3597832646a6..519afa2755db5c8738bc7138f67aecc408d27fd2 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -70,4 +70,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _ASM_M32R_SOCKET_H */
index a2cfc0abb05ce4de59521727c147ee6b0b23965a..13168a769f8fcaee8fd3c5af3d085c0cd60e6d75 100644 (file)
@@ -127,7 +127,7 @@ static void unmap_cpu_to_physid(int, int);
 /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
 /* Boot up APs Routines : BSP                                                */
 /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
-void __devinit smp_prepare_boot_cpu(void)
+void smp_prepare_boot_cpu(void)
 {
        bsp_phys_id = hard_smp_processor_id();
        physid_set(bsp_phys_id, phys_cpu_present_map);
index a985a7e87d45a76a3f07e2c2bd849bc0a06e628c..695cd737a42e80687bcb834685c32b15bd3085ca 100644 (file)
@@ -39,7 +39,7 @@ enum {
 #define MAX_UNIT       8
 
 /* These identify the driver base version and may not be removed. */
-static const char version[] __devinitconst =
+static const char version[] =
        KERN_INFO KBUILD_MODNAME ".c:v" DRV_VERSION " " DRV_RELDATE
        " S.Opichal, M.Jurik, P.Stehlik\n"
        KERN_INFO " http://aranym.org/\n";
index 646b1872f73b412982145b4c46ed1ff27b234124..5ea75e6a7399a3a58b7837177af6cc7c2c6120f1 100644 (file)
@@ -15,8 +15,8 @@
 #define outsl(port,buf,len)  isa_outsb(port,buf,(len)<<2)
 
 /* no dma, or IRQ autoprobing */
-static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma);
-static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
+static int parport_pc_find_isa_ports (int autoirq, int autodma);
+static int parport_pc_find_nonpci_ports (int autoirq, int autodma)
 {
         if (! (MACH_IS_Q40))
          return 0; /* count=0 */
index 73fa0b56a06c7613523bdd5297be2da86df64647..931a31ff59ddb32de3300d494b00a8efdcba2afc 100644 (file)
@@ -87,7 +87,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
        return 0;
 }
 
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        struct pci_dev *dev;
 
@@ -97,7 +97,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
        }
 }
 
-char __devinit *pcibios_setup(char *str)
+char *pcibios_setup(char *str)
 {
        return str;
 }
index b3f5eecff2a7ddd16a42aaf2d8c5579019c86c3c..d2b097a652d9193f58917f2a256b4e3af09b540c 100644 (file)
@@ -1,25 +1,22 @@
 CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_FHANDLE=y
+CONFIG_AUDIT=y
+CONFIG_AUDIT_LOGINUID_IMMUTABLE=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
 CONFIG_SYSFS_DEPRECATED_V2=y
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE="rootfs.cpio"
-CONFIG_INITRAMFS_COMPRESSION_GZIP=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_EXPERT=y
 CONFIG_KALLSYMS_ALL=y
-CONFIG_KALLSYMS_EXTRA_PASS=y
-# CONFIG_HOTPLUG is not set
 # CONFIG_BASE_FULL is not set
-# CONFIG_FUTEX is not set
-# CONFIG_EPOLL is not set
-# CONFIG_SIGNALFD is not set
-# CONFIG_SHMEM is not set
+CONFIG_EMBEDDED=y
 CONFIG_SLAB=y
 CONFIG_MODULES=y
 CONFIG_MODULE_UNLOAD=y
 # CONFIG_BLK_DEV_BSG is not set
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_EFI_PARTITION is not set
 CONFIG_OPT_LIB_ASM=y
 CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1
 CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR=1
@@ -31,39 +28,62 @@ CONFIG_HZ_100=y
 CONFIG_MMU=y
 CONFIG_CMDLINE_BOOL=y
 CONFIG_CMDLINE_FORCE=y
+CONFIG_HIGHMEM=y
+CONFIG_PCI=y
+CONFIG_PCI_XILINX=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
 CONFIG_INET=y
 # CONFIG_INET_LRO is not set
 # CONFIG_IPV6 is not set
+CONFIG_MTD=y
 CONFIG_PROC_DEVICETREE=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_NETDEVICES=y
-CONFIG_NET_ETHERNET=y
 CONFIG_XILINX_EMACLITE=y
+CONFIG_XILINX_LL_TEMAC=y
 # CONFIG_INPUT is not set
 # CONFIG_SERIO is not set
 # CONFIG_VT is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
 CONFIG_SERIAL_UARTLITE=y
 CONFIG_SERIAL_UARTLITE_CONSOLE=y
 # CONFIG_HW_RANDOM is not set
+CONFIG_XILINX_HWICAP=y
+CONFIG_I2C=y
+CONFIG_I2C_XILINX=y
+CONFIG_SPI=y
+CONFIG_SPI_XILINX=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_XILINX=y
 # CONFIG_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_XILINX_WATCHDOG=y
+CONFIG_FB=y
+CONFIG_FB_XILINX=y
 # CONFIG_USB_SUPPORT is not set
+CONFIG_UIO=y
+CONFIG_UIO_PDRV=y
+CONFIG_UIO_PDRV_GENIRQ=y
+CONFIG_UIO_DMEM_GENIRQ=y
 CONFIG_EXT2_FS=y
 # CONFIG_DNOTIFY is not set
+CONFIG_CRAMFS=y
+CONFIG_ROMFS_FS=y
 CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
 CONFIG_CIFS=y
 CONFIG_CIFS_STATS=y
 CONFIG_CIFS_STATS2=y
-CONFIG_PARTITION_ADVANCED=y
-CONFIG_DEBUG_KERNEL=y
 CONFIG_DETECT_HUNG_TASK=y
 CONFIG_DEBUG_SLAB=y
 CONFIG_DEBUG_SPINLOCK=y
 CONFIG_DEBUG_INFO=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
 CONFIG_EARLY_PRINTK=y
+CONFIG_KEYS=y
+CONFIG_ENCRYPTED_KEYS=y
+CONFIG_KEYS_DEBUG_PROC_KEYS=y
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
index 0249e4b7e1d34003ebfd138755aef15f42632079..10b5172283d727e3b15a838f4a3c67a7192efa58 100644 (file)
@@ -1,41 +1,42 @@
 CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
+CONFIG_FHANDLE=y
+CONFIG_AUDIT=y
+CONFIG_AUDIT_LOGINUID_IMMUTABLE=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_BSD_PROCESS_ACCT_V3=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
 CONFIG_SYSFS_DEPRECATED_V2=y
-CONFIG_EXPERT=y
 CONFIG_KALLSYMS_ALL=y
-CONFIG_KALLSYMS_EXTRA_PASS=y
-# CONFIG_HOTPLUG is not set
 # CONFIG_BASE_FULL is not set
+CONFIG_EMBEDDED=y
 CONFIG_SLAB=y
 CONFIG_MODULES=y
 CONFIG_MODULE_UNLOAD=y
 # CONFIG_BLK_DEV_BSG is not set
-# CONFIG_OPT_LIB_FUNCTION is not set
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_EFI_PARTITION is not set
 CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1
 CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR=1
 CONFIG_XILINX_MICROBLAZE0_USE_BARREL=1
 CONFIG_XILINX_MICROBLAZE0_USE_DIV=1
 CONFIG_XILINX_MICROBLAZE0_USE_HW_MUL=2
 CONFIG_XILINX_MICROBLAZE0_USE_FPU=2
-CONFIG_HIGH_RES_TIMERS=y
 CONFIG_HZ_100=y
 CONFIG_CMDLINE_BOOL=y
-CONFIG_BINFMT_FLAT=y
+CONFIG_CMDLINE_FORCE=y
+CONFIG_PCI=y
+CONFIG_PCI_XILINX=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
 CONFIG_INET=y
 # CONFIG_INET_LRO is not set
 # CONFIG_IPV6 is not set
-# CONFIG_PREVENT_FIRMWARE_BUILD is not set
 CONFIG_MTD=y
-CONFIG_MTD_CONCAT=y
-CONFIG_MTD_PARTITIONS=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_CHAR=y
 CONFIG_MTD_BLOCK=y
@@ -45,41 +46,55 @@ CONFIG_MTD_CFI_AMDSTD=y
 CONFIG_MTD_RAM=y
 CONFIG_MTD_UCLINUX=y
 CONFIG_PROC_DEVICETREE=y
-CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_NETDEVICES=y
-CONFIG_NET_ETHERNET=y
+CONFIG_XILINX_EMACLITE=y
+CONFIG_XILINX_LL_TEMAC=y
 # CONFIG_INPUT is not set
 # CONFIG_SERIO is not set
 # CONFIG_VT is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
 CONFIG_SERIAL_UARTLITE=y
 CONFIG_SERIAL_UARTLITE_CONSOLE=y
-CONFIG_HW_RANDOM=y
+# CONFIG_HW_RANDOM is not set
+CONFIG_XILINX_HWICAP=y
+CONFIG_I2C=y
+CONFIG_I2C_XILINX=y
+CONFIG_SPI=y
+CONFIG_SPI_XILINX=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_XILINX=y
 # CONFIG_HWMON is not set
-CONFIG_VIDEO_OUTPUT_CONTROL=y
+CONFIG_WATCHDOG=y
+CONFIG_XILINX_WATCHDOG=y
+CONFIG_FB=y
+CONFIG_FB_XILINX=y
+# CONFIG_USB_SUPPORT is not set
+CONFIG_UIO=y
+CONFIG_UIO_PDRV=y
+CONFIG_UIO_PDRV_GENIRQ=y
+CONFIG_UIO_DMEM_GENIRQ=y
 CONFIG_EXT2_FS=y
 # CONFIG_DNOTIFY is not set
 CONFIG_CRAMFS=y
 CONFIG_ROMFS_FS=y
 CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
 CONFIG_NFS_V3_ACL=y
-CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_DEBUG_SHIRQ=y
+CONFIG_NLS=y
 CONFIG_DETECT_HUNG_TASK=y
-CONFIG_SCHEDSTATS=y
-CONFIG_TIMER_STATS=y
-CONFIG_DEBUG_OBJECTS=y
-CONFIG_DEBUG_OBJECTS_SELFTEST=y
-CONFIG_DEBUG_OBJECTS_FREE=y
-CONFIG_DEBUG_OBJECTS_TIMERS=y
+CONFIG_DEBUG_SLAB=y
+CONFIG_DEBUG_SPINLOCK=y
 CONFIG_DEBUG_INFO=y
-CONFIG_DEBUG_LIST=y
-CONFIG_DEBUG_SG=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-CONFIG_SYSCTL_SYSCALL_CHECK=y
 CONFIG_EARLY_PRINTK=y
+CONFIG_KEYS=y
+CONFIG_ENCRYPTED_KEYS=y
+CONFIG_KEYS_DEBUG_PROC_KEYS=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_DES=y
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
-# CONFIG_CRC32 is not set
index 2446a73140acb8c74fce242de7c4f37b44cff08e..d0463893243888f47bf1e740d7ebf0e68fb087c4 100644 (file)
@@ -71,7 +71,7 @@ static inline void kunmap(struct page *page)
        kunmap_high(page);
 }
 
-static inline void *__kmap_atomic(struct page *page)
+static inline void *kmap_atomic(struct page *page)
 {
        return kmap_atomic_prot(page, kmap_prot);
 }
index 927540d3cb7d1ee9ddb62a6b1b0915f758dc8761..a1ab5f0009efcd7bc84d4dd17aabedb915707653 100644 (file)
@@ -108,7 +108,7 @@ static inline int ___range_ok(unsigned long addr, unsigned long size)
 # define __EX_TABLE_SECTION    ".section __ex_table,\"a\"\n"
 #else
 # define __FIXUP_SECTION       ".section .discard,\"ax\"\n"
-# define __EX_TABLE_SECTION    ".section .discard,\"a\"\n"
+# define __EX_TABLE_SECTION    ".section .discard,\"ax\"\n"
 #endif
 
 extern unsigned long __copy_tofrom_user(void __user *to,
index a5f06ac97113d0aa4b8338f06ac3d6c5d5f5b411..10f8ac186855300af1fba9b374ddc581717b2356 100644 (file)
@@ -37,9 +37,7 @@
 #define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_CLONE
 #define __ARCH_WANT_SYS_VFORK
-#ifdef CONFIG_MMU
 #define __ARCH_WANT_SYS_FORK
-#endif
 
 /*
  * "Conditional" syscalls
index ccb6920f3b339fd2350d9c86effbad7050036672..5f7fe7582f3ae3a483a39ae6419b2867ab4db76e 100644 (file)
 #define __NR_process_vm_readv  377
 #define __NR_process_vm_writev 378
 #define __NR_kcmp              379
+#define __NR_finit_module      380
 
-#define __NR_syscalls          380
+#define __NR_syscalls          381
 
 #endif /* _UAPI_ASM_MICROBLAZE_UNISTD_H */
index 1cbace29b5e2495f567abb04b261e4341b316cc0..4fca56cf02f6f0c43bdac35be3eadfb55b57bc2f 100644 (file)
@@ -380,3 +380,4 @@ ENTRY(sys_call_table)
        .long sys_process_vm_readv
        .long sys_process_vm_writev
        .long sys_kcmp
+       .long sys_finit_module
index a1c5b996d66d0ba4e53b869210b9d662b1e2b35a..96416553cb361a8ba4835a85c9e6bf730d8ff2ce 100644 (file)
@@ -287,7 +287,7 @@ static struct resource *__pci_mmap_make_offset(struct pci_dev *dev,
        unsigned long io_offset = 0;
        int i, res_bit;
 
-       if (hose == 0)
+       if (!hose)
                return NULL;            /* should never happen */
 
        /* If memory, add on the PCI bridge address offset */
@@ -655,9 +655,8 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,
  *   - Some 32 bits platforms such as 4xx can have physical space larger than
  *     32 bits so we need to use 64 bits values for the parsing
  */
-void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
-                                           struct device_node *dev,
-                                           int primary)
+void pci_process_bridge_OF_ranges(struct pci_controller *hose,
+                                 struct device_node *dev, int primary)
 {
        const u32 *ranges;
        int rlen;
@@ -822,15 +821,13 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
 /* Decide whether to display the domain number in /proc */
 int pci_proc_domain(struct pci_bus *bus)
 {
-       struct pci_controller *hose = pci_bus_to_host(bus);
-
        return 0;
 }
 
 /* This header fixup will do the resource fixup for all devices as they are
  * probed, but not for bridge ranges
  */
-static void __devinit pcibios_fixup_resources(struct pci_dev *dev)
+static void pcibios_fixup_resources(struct pci_dev *dev)
 {
        struct pci_controller *hose = pci_bus_to_host(dev->bus);
        int i;
@@ -871,8 +868,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
  * things go more smoothly when it gets it right. It should covers cases such
  * as Apple "closed" bridge resources and bare-metal pSeries unassigned bridges
  */
-static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,
-                                                          struct resource *res)
+static int pcibios_uninitialized_bridge_resource(struct pci_bus *bus,
+                                                struct resource *res)
 {
        struct pci_controller *hose = pci_bus_to_host(bus);
        struct pci_dev *dev = bus->self;
@@ -933,7 +930,7 @@ static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,
 }
 
 /* Fixup resources of a PCI<->PCI bridge */
-static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)
+static void pcibios_fixup_bridge(struct pci_bus *bus)
 {
        struct resource *res;
        int i;
@@ -970,14 +967,14 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)
        }
 }
 
-void __devinit pcibios_setup_bus_self(struct pci_bus *bus)
+void pcibios_setup_bus_self(struct pci_bus *bus)
 {
        /* Fix up the bus resources for P2P bridges */
        if (bus->self != NULL)
                pcibios_fixup_bridge(bus);
 }
 
-void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
+void pcibios_setup_bus_devices(struct pci_bus *bus)
 {
        struct pci_dev *dev;
 
@@ -1002,7 +999,7 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
        }
 }
 
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        /* When called from the generic PCI probe, read PCI<->PCI bridge
         * bases. This is -not- called when generating the PCI tree from
@@ -1124,7 +1121,7 @@ static int __init reparent_resources(struct resource *parent,
  *         as well.
  */
 
-void pcibios_allocate_bus_resources(struct pci_bus *bus)
+static void pcibios_allocate_bus_resources(struct pci_bus *bus)
 {
        struct pci_bus *b;
        int i;
@@ -1179,7 +1176,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)
                }
                printk(KERN_WARNING "PCI: Cannot allocate resource region "
                       "%d of PCI bridge %d, will remap\n", i, bus->number);
-clear_resource:
+
                res->start = res->end = 0;
                res->flags = 0;
        }
@@ -1188,7 +1185,7 @@ clear_resource:
                pcibios_allocate_bus_resources(b);
 }
 
-static inline void __devinit alloc_resource(struct pci_dev *dev, int idx)
+static inline void alloc_resource(struct pci_dev *dev, int idx)
 {
        struct resource *pr, *r = &dev->resource[idx];
 
@@ -1351,7 +1348,7 @@ void __init pcibios_resource_survey(void)
  * rest of the code later, for now, keep it as-is as our main
  * resource allocation function doesn't deal with sub-trees yet.
  */
-void __devinit pcibios_claim_one_bus(struct pci_bus *bus)
+void pcibios_claim_one_bus(struct pci_bus *bus)
 {
        struct pci_dev *dev;
        struct pci_bus *child_bus;
@@ -1410,7 +1407,8 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
        return pci_enable_resources(dev, mask);
 }
 
-static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources)
+static void pcibios_setup_phb_resources(struct pci_controller *hose,
+                                       struct list_head *resources)
 {
        unsigned long io_offset;
        struct resource *res;
@@ -1433,7 +1431,8 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s
                res->end = res->start + IO_SPACE_LIMIT;
                res->flags = IORESOURCE_IO;
        }
-       pci_add_resource_offset(resources, res, hose->io_base_virt - _IO_BASE);
+       pci_add_resource_offset(resources, res,
+               (__force resource_size_t)(hose->io_base_virt - _IO_BASE));
 
        pr_debug("PCI: PHB IO resource    = %016llx-%016llx [%lx]\n",
                 (unsigned long long)res->start,
@@ -1477,7 +1476,7 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
        return of_node_get(hose->dn);
 }
 
-static void __devinit pcibios_scan_phb(struct pci_controller *hose)
+static void pcibios_scan_phb(struct pci_controller *hose)
 {
        LIST_HEAD(resources);
        struct pci_bus *bus;
index b7dc39c6c849189bcc57929cef61f0abd9c4befe..2ac626ab9d4380014a6f25a24825d79f9ee92205 100644 (file)
@@ -39,8 +39,8 @@ config MIPS
        select GENERIC_CLOCKEVENTS
        select GENERIC_CMOS_UPDATE
        select HAVE_MOD_ARCH_SPECIFIC
-       select MODULES_USE_ELF_REL
-       select MODULES_USE_ELF_RELA if 64BIT
+       select MODULES_USE_ELF_REL if MODULES
+       select MODULES_USE_ELF_RELA if MODULES && 64BIT
 
 menu "Machine selection"
 
index a7193ae13a5d2d6ab8df643a76c6b33cd9621421..b67930d1932510dbe90cfc64b2b937d135d162ce 100644 (file)
@@ -53,7 +53,7 @@ static struct clocksource au1x_counter1_clocksource = {
        .read           = au1x_counter1_read,
        .mask           = CLOCKSOURCE_MASK(32),
        .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
-       .rating         = 100,
+       .rating         = 1500,
 };
 
 static int au1x_rtcmatch2_set_next_event(unsigned long delta,
@@ -84,7 +84,7 @@ static irqreturn_t au1x_rtcmatch2_irq(int irq, void *dev_id)
 static struct clock_event_device au1x_rtcmatch2_clockdev = {
        .name           = "rtcmatch2",
        .features       = CLOCK_EVT_FEAT_ONESHOT,
-       .rating         = 100,
+       .rating         = 1500,
        .set_next_event = au1x_rtcmatch2_set_next_event,
        .set_mode       = au1x_rtcmatch2_set_mode,
        .cpumask        = cpu_all_mask,
@@ -158,20 +158,6 @@ cntr_err:
        return -1;
 }
 
-static void __init alchemy_setup_c0timer(void)
-{
-       /*
-        * MIPS kernel assigns 'au1k_wait' to 'cpu_wait' before this
-        * function is called.  Because the Alchemy counters are unusable
-        * the C0 timekeeping code is installed and use of the 'wait'
-        * instruction must be prohibited, which is done most easily by
-        * assigning NULL to cpu_wait.
-        */
-       cpu_wait = NULL;
-       r4k_clockevent_init();
-       init_r4k_clocksource();
-}
-
 static int alchemy_m2inttab[] __initdata = {
        AU1000_RTC_MATCH2_INT,
        AU1500_RTC_MATCH2_INT,
@@ -186,8 +172,7 @@ void __init plat_time_init(void)
        int t;
 
        t = alchemy_get_cputype();
-       if (t == ALCHEMY_CPU_UNKNOWN)
-               alchemy_setup_c0timer();
-       else if (alchemy_time_init(alchemy_m2inttab[t]))
-               alchemy_setup_c0timer();
+       if (t == ALCHEMY_CPU_UNKNOWN ||
+           alchemy_time_init(alchemy_m2inttab[t]))
+               cpu_wait = NULL;        /* wait doesn't work with r4k timer */
 }
index 569f41bdcc466529501b4cbeb8ad4133e86e8205..f393f65f3923acd39343a65b1e50d3845d2806c6 100644 (file)
@@ -43,7 +43,7 @@ void octeon_serial_out(struct uart_port *up, int offset, int value)
        cvmx_write_csr((uint64_t)(up->membase + (offset << 3)), (u8)value);
 }
 
-static int __devinit octeon_serial_probe(struct platform_device *pdev)
+static int octeon_serial_probe(struct platform_device *pdev)
 {
        int irq, res;
        struct resource *res_mem;
index 31ab10f02bad555724dffa1e58556bd6508cd79b..dbaec94046dab06348eb688887b73e2513e3b666 100644 (file)
@@ -45,8 +45,6 @@
 #define HUGETLB_PAGE_ORDER     ({BUILD_BUG(); 0; })
 #endif /* CONFIG_MIPS_HUGE_TLB_SUPPORT */
 
-#ifndef __ASSEMBLY__
-
 #include <linux/pfn.h>
 #include <asm/io.h>
 
@@ -139,8 +137,6 @@ typedef struct { unsigned long pgprot; } pgprot_t;
  */
 #define ptep_buddy(x)  ((pte_t *)((unsigned long)(x) ^ sizeof(pte_t)))
 
-#endif /* !__ASSEMBLY__ */
-
 /*
  * __pa()/__va() should be used only during mem init.
  */
@@ -202,7 +198,10 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 #endif
 
 #define virt_to_page(kaddr)    pfn_to_page(PFN_DOWN(virt_to_phys(kaddr)))
-#define virt_addr_valid(kaddr) pfn_valid(PFN_DOWN(virt_to_phys(kaddr)))
+
+extern int __virt_addr_valid(const volatile void *kaddr);
+#define virt_addr_valid(kaddr)                                         \
+       __virt_addr_valid((const volatile void *) (kaddr))
 
 #define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
                                 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
index 90bf3b3fce199cda78430b3af99770fe82de3fcd..d69ea743272bfc7cac4e559b1f93b4dc6caa5ad5 100644 (file)
@@ -145,7 +145,7 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
 extern char * (*pcibios_plat_setup)(char *str);
 
 /* this function parses memory ranges from a device node */
-extern void __devinit pci_load_of_ranges(struct pci_controller *hose,
-                                        struct device_node *node);
+extern void pci_load_of_ranges(struct pci_controller *hose,
+                              struct device_node *node);
 
 #endif /* _ASM_PCI_H */
index 18806a52061c3c6869ed03c101ccabe740b64ac8..b2050b9e64b1702c6596553276626a7cd7fc09c4 100644 (file)
@@ -29,10 +29,11 @@ struct thread_info {
        __u32                   cpu;            /* current CPU */
        int                     preempt_count;  /* 0 => preemptable, <0 => BUG */
 
-       mm_segment_t            addr_limit;     /* thread address space:
-                                                  0-0xBFFFFFFF for user-thead
-                                                  0-0xFFFFFFFF for kernel-thread
-                                               */
+       mm_segment_t            addr_limit;     /*
+                                                * thread address space limit:
+                                                * 0x7fffffff for user-thead
+                                                * 0xffffffff for kernel-thread
+                                                */
        struct restart_block    restart_block;
        struct pt_regs          *regs;
 };
index 17307ab90474271e4c77f9d48bfb775f2049db74..7e2723637b356d08169ae18c5b82eb1403801a43 100644 (file)
@@ -28,8 +28,7 @@
 #define SO_LINGER      0x0080  /* Block on close of a reliable
                                   socket to transmit pending data.  */
 #define SO_OOBINLINE 0x0100    /* Receive out-of-band data in-band.  */
-#if 0
-To add: #define SO_REUSEPORT 0x0200    /* Allow local address and port reuse.  */
+#define SO_REUSEPORT 0x0200    /* Allow local address and port reuse.  */
 #endif
 
 #define SO_TYPE                0x1008  /* Compatible name for SO_STYLE.  */
@@ -90,5 +89,6 @@ To add: #define SO_REUSEPORT 0x0200   /* Allow local address and port reuse.  */
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
 
 #endif /* _UAPI_ASM_SOCKET_H */
index cc98a9dcb01b2b6afb766b61313ede7fc0b3ba31..0eebf3c3e03c26f2a2f310e36f1831bcdad9aec6 100644 (file)
 #define __NR_process_vm_readv          (__NR_Linux + 345)
 #define __NR_process_vm_writev         (__NR_Linux + 346)
 #define __NR_kcmp                      (__NR_Linux + 347)
+#define __NR_finit_module              (__NR_Linux + 348)
 
 /*
  * Offset of the last Linux o32 flavoured syscall
  */
-#define __NR_Linux_syscalls            347
+#define __NR_Linux_syscalls            348
 
 #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
 
 #define __NR_O32_Linux                 4000
-#define __NR_O32_Linux_syscalls                347
+#define __NR_O32_Linux_syscalls                348
 
 #if _MIPS_SIM == _MIPS_SIM_ABI64
 
 #define __NR_process_vm_readv          (__NR_Linux + 304)
 #define __NR_process_vm_writev         (__NR_Linux + 305)
 #define __NR_kcmp                      (__NR_Linux + 306)
+#define __NR_finit_module              (__NR_Linux + 307)
 
 /*
  * Offset of the last Linux 64-bit flavoured syscall
  */
-#define __NR_Linux_syscalls            306
+#define __NR_Linux_syscalls            307
 
 #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
 
 #define __NR_64_Linux                  5000
-#define __NR_64_Linux_syscalls         306
+#define __NR_64_Linux_syscalls         307
 
 #if _MIPS_SIM == _MIPS_SIM_NABI32
 
 #define __NR_process_vm_readv          (__NR_Linux + 309)
 #define __NR_process_vm_writev         (__NR_Linux + 310)
 #define __NR_kcmp                      (__NR_Linux + 311)
+#define __NR_finit_module              (__NR_Linux + 312)
 
 /*
  * Offset of the last N32 flavoured syscall
  */
-#define __NR_Linux_syscalls            311
+#define __NR_Linux_syscalls            312
 
 #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
 
 #define __NR_N32_Linux                 6000
-#define __NR_N32_Linux_syscalls                311
+#define __NR_N32_Linux_syscalls                312
 
 #endif /* _UAPI_ASM_UNISTD_H */
index 9690998d4ef3e9e99b5628cbb4bf297c90158a10..50285b2c7ffe30d5a54d877f7f0cac075dd59f8c 100644 (file)
@@ -200,6 +200,9 @@ void output_mm_defines(void)
        DEFINE(_PTRS_PER_PMD, PTRS_PER_PMD);
        DEFINE(_PTRS_PER_PTE, PTRS_PER_PTE);
        BLANK();
+       DEFINE(_PAGE_SHIFT, PAGE_SHIFT);
+       DEFINE(_PAGE_SIZE, PAGE_SIZE);
+       BLANK();
 }
 
 #ifdef CONFIG_32BIT
index 8882e5766f27ce5b7a8a57932b4b103b7a69eaa7..8a0096d62812c07ea328bf1c78186e36019538f8 100644 (file)
@@ -19,7 +19,6 @@
 #include <asm/mipsregs.h>
 #include <asm/stackframe.h>
 #include <asm/war.h>
-#include <asm/page.h>
 #include <asm/thread_info.h>
 
 #define PANIC_PIC(msg)                                 \
@@ -483,8 +482,8 @@ NESTED(nmi_handler, PT_SIZE, sp)
        MFC0    k1, CP0_ENTRYHI
        andi    k1, 0xff        /* ASID_MASK */
        MFC0    k0, CP0_EPC
-       PTR_SRL k0, PAGE_SHIFT + 1
-       PTR_SLL k0, PAGE_SHIFT + 1
+       PTR_SRL k0, _PAGE_SHIFT + 1
+       PTR_SLL k0, _PAGE_SHIFT + 1
        or      k1, k0
        MTC0    k1, CP0_ENTRYHI
        mtc0_tlbw_hazard
index ea695d9605e99e1bda75ca3573722a9a3819973f..fcf97312f32812fe6935d0cff13dd7091af33633 100644 (file)
@@ -21,7 +21,6 @@
 #include <asm/asmmacro.h>
 #include <asm/irqflags.h>
 #include <asm/regdef.h>
-#include <asm/page.h>
 #include <asm/pgtable-bits.h>
 #include <asm/mipsregs.h>
 #include <asm/stackframe.h>
index 0441f54b2a6acc9ab27a0d229c1465a8e0fa5975..207f1341578ba73abcffcd0ee7bbeda43f1e5643 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/fpregdef.h>
 #include <asm/mipsregs.h>
 #include <asm/asm-offsets.h>
-#include <asm/page.h>
 #include <asm/pgtable-bits.h>
 #include <asm/regdef.h>
 #include <asm/stackframe.h>
index b14c14d90fc2feedbb25eff71578824a7eff7440..d9c81c5a6c90cfc0800fb96984697aecee900088 100644 (file)
@@ -847,7 +847,6 @@ static const struct mips_perf_event xlp_event_map[PERF_COUNT_HW_MAX] = {
        [PERF_COUNT_HW_CACHE_MISSES] = { 0x07, CNTR_ALL }, /* PAPI_L1_ICM */
        [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = { 0x1b, CNTR_ALL }, /* PAPI_BR_CN */
        [PERF_COUNT_HW_BRANCH_MISSES] = { 0x1c, CNTR_ALL }, /* PAPI_BR_MSP */
-       [PERF_COUNT_HW_BUS_CYCLES] = { UNSUPPORTED_PERF_EVENT_ID },
 };
 
 /* 24K/34K/1004K cores can share the same cache event map. */
@@ -1115,24 +1114,12 @@ static const struct mips_perf_event xlp_cache_map
                [C(RESULT_ACCESS)]      = { 0x2f, CNTR_ALL }, /* PAPI_L1_DCW */
                [C(RESULT_MISS)]        = { 0x2e, CNTR_ALL }, /* PAPI_L1_STM */
        },
-       [C(OP_PREFETCH)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
-               [C(RESULT_MISS)]        = { UNSUPPORTED_PERF_EVENT_ID },
-       },
 },
 [C(L1I)] = {
        [C(OP_READ)] = {
                [C(RESULT_ACCESS)]      = { 0x04, CNTR_ALL }, /* PAPI_L1_ICA */
                [C(RESULT_MISS)]        = { 0x07, CNTR_ALL }, /* PAPI_L1_ICM */
        },
-       [C(OP_WRITE)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
-               [C(RESULT_MISS)]        = { UNSUPPORTED_PERF_EVENT_ID },
-       },
-       [C(OP_PREFETCH)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
-               [C(RESULT_MISS)]        = { UNSUPPORTED_PERF_EVENT_ID },
-       },
 },
 [C(LL)] = {
        [C(OP_READ)] = {
@@ -1143,10 +1130,6 @@ static const struct mips_perf_event xlp_cache_map
                [C(RESULT_ACCESS)]      = { 0x34, CNTR_ALL }, /* PAPI_L2_DCA */
                [C(RESULT_MISS)]        = { 0x36, CNTR_ALL }, /* PAPI_L2_DCM */
        },
-       [C(OP_PREFETCH)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
-               [C(RESULT_MISS)]        = { UNSUPPORTED_PERF_EVENT_ID },
-       },
 },
 [C(DTLB)] = {
        /*
@@ -1154,45 +1137,24 @@ static const struct mips_perf_event xlp_cache_map
         * read and write.
         */
        [C(OP_READ)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
                [C(RESULT_MISS)]        = { 0x2d, CNTR_ALL }, /* PAPI_TLB_DM */
        },
        [C(OP_WRITE)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
                [C(RESULT_MISS)]        = { 0x2d, CNTR_ALL }, /* PAPI_TLB_DM */
        },
-       [C(OP_PREFETCH)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
-               [C(RESULT_MISS)]        = { UNSUPPORTED_PERF_EVENT_ID },
-       },
 },
 [C(ITLB)] = {
        [C(OP_READ)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
                [C(RESULT_MISS)]        = { 0x08, CNTR_ALL }, /* PAPI_TLB_IM */
        },
        [C(OP_WRITE)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
                [C(RESULT_MISS)]        = { 0x08, CNTR_ALL }, /* PAPI_TLB_IM */
        },
-       [C(OP_PREFETCH)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
-               [C(RESULT_MISS)]        = { UNSUPPORTED_PERF_EVENT_ID },
-       },
 },
 [C(BPU)] = {
        [C(OP_READ)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
                [C(RESULT_MISS)]        = { 0x25, CNTR_ALL },
        },
-       [C(OP_WRITE)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
-               [C(RESULT_MISS)]        = { UNSUPPORTED_PERF_EVENT_ID },
-       },
-       [C(OP_PREFETCH)] = {
-               [C(RESULT_ACCESS)]      = { UNSUPPORTED_PERF_EVENT_ID },
-               [C(RESULT_MISS)]        = { UNSUPPORTED_PERF_EVENT_ID },
-       },
 },
 };
 
index 9c51be5a163a9249efa3bd74f12be62b64eba923..8d32d5a6b460a72b1d9e5b55538febb6e029e70e 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/fpregdef.h>
 #include <asm/mipsregs.h>
 #include <asm/asm-offsets.h>
-#include <asm/page.h>
 #include <asm/regdef.h>
 #include <asm/stackframe.h>
 #include <asm/thread_info.h>
index 42d2a3938420df28e64d1f016459529b13991b7e..8decdfacb448c18540e85b8bc516ba39ecba38d9 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/fpregdef.h>
 #include <asm/mipsregs.h>
 #include <asm/asm-offsets.h>
-#include <asm/page.h>
 #include <asm/pgtable-bits.h>
 #include <asm/regdef.h>
 #include <asm/stackframe.h>
index e4142c5f7c2b6f16434275436668f7c17f67c68a..804ebb2c34a6c9cd556acf3e0048f974641eb32f 100644 (file)
@@ -9,7 +9,6 @@
 #include <asm/asm.h>
 #include <asm/asmmacro.h>
 #include <asm/regdef.h>
-#include <asm/page.h>
 #include <asm/mipsregs.h>
 #include <asm/stackframe.h>
 #include <asm/addrspace.h>
@@ -50,7 +49,7 @@ process_entry:
        and             s3, s2, 0x8
        beq             s3, zero, process_entry
        and             s2, s2, ~0x8
-       li              s6, (1 << PAGE_SHIFT) / SZREG
+       li              s6, (1 << _PAGE_SHIFT) / SZREG
 
 copy_word:
        /* copy page word by word */
index 374f66e05f3d2ab1d59b95da33cf2465dbf1a3bb..d20a4bc9ed05c90191f82a120eb2648d75e2f846 100644 (file)
@@ -583,6 +583,7 @@ einval:     li      v0, -ENOSYS
        sys     sys_process_vm_readv    6       /* 4345 */
        sys     sys_process_vm_writev   6
        sys     sys_kcmp                5
+       sys     sys_finit_module        3
        .endm
 
        /* We pre-compute the number of _instruction_ bytes needed to
index 169de6a6d916549ae3e5e5cb079a022314718cbe..b64f642da073f7f7d48ab9a1d54a8f2e749032db 100644 (file)
@@ -422,4 +422,5 @@ sys_call_table:
        PTR     sys_process_vm_readv
        PTR     sys_process_vm_writev           /* 5305 */
        PTR     sys_kcmp
+       PTR     sys_finit_module
        .size   sys_call_table,.-sys_call_table
index ad3de9668da9974c74d6a002b95a3739207e95b3..c29ac197f44694821b3a411954a7d6861e0ba33c 100644 (file)
@@ -416,4 +416,5 @@ EXPORT(sysn32_call_table)
        PTR     compat_sys_process_vm_readv
        PTR     compat_sys_process_vm_writev    /* 6310 */
        PTR     sys_kcmp
+       PTR     sys_finit_module
        .size   sysn32_call_table,.-sysn32_call_table
index 9601be6afa3de3b9571215bf75d2fe6c55392a60..cf3e75e466506bc6b73e371818712580bb9d7918 100644 (file)
@@ -540,4 +540,5 @@ sys_call_table:
        PTR     compat_sys_process_vm_readv     /* 4345 */
        PTR     compat_sys_process_vm_writev
        PTR     sys_kcmp
+       PTR     sys_finit_module
        .size   sys_call_table,.-sys_call_table
index 2e6374a589ec622a85dde2ad1c9394b93bd05c68..66bf4e22d9b9451615cd8386caaf9b8016b96a34 100644 (file)
@@ -188,7 +188,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 }
 
 /* preload SMP state for boot cpu */
-void __devinit smp_prepare_boot_cpu(void)
+void smp_prepare_boot_cpu(void)
 {
        set_cpu_possible(0, true);
        set_cpu_online(0, true);
index 007ccbe1e26474a6788ef61ee046e226c480d877..0a4336b803e9e15f4b6031824849e0ade3062002 100644 (file)
@@ -1,7 +1,8 @@
 #include <asm/asm-offsets.h>
-#include <asm/page.h>
 #include <asm/thread_info.h>
 
+#define PAGE_SIZE _PAGE_SIZE
+
 /*
  * Put .bss..swapper_pg_dir as the first thing in .bss. This will
  * ensure that it has .bss alignment (64K).
index 6453962ac898f86222587ec98184af6244a812a1..e44a1866653f10fa258df13b3656aa20750002f0 100644 (file)
@@ -210,7 +210,7 @@ ltq_dma_init_port(int p)
 }
 EXPORT_SYMBOL_GPL(ltq_dma_init_port);
 
-static int __devinit
+static int
 ltq_dma_init(struct platform_device *pdev)
 {
        struct clk *clk;
index cbb56fc022bc6817633e1b06e5f54f343a73c7b8..e30b1ed1b93633cfc2b63201f24d85a06c212cae 100644 (file)
@@ -133,7 +133,7 @@ static inline void clkdev_add_gptu(struct device *dev, const char *con,
        clkdev_add(&clk->cl);
 }
 
-static int __devinit gptu_probe(struct platform_device *pdev)
+static int gptu_probe(struct platform_device *pdev)
 {
        struct clk *clk;
        struct resource *res;
index fe808bf5366dd18deb3adcd85adcb1c07905ae02..d4d9d31f152e403ae40a8246fbc2ba665a8521ee 100644 (file)
@@ -54,7 +54,7 @@ static dma_addr_t xway_gphy_load(struct platform_device *pdev)
        return dev_addr;
 }
 
-static int __devinit xway_phy_fw_probe(struct platform_device *pdev)
+static int xway_phy_fw_probe(struct platform_device *pdev)
 {
        dma_addr_t fw_addr;
        struct property *pp;
index cacfd31e8ec9d1121c86e81feb35fac4344a9a3b..7657fd21cd3fb35779ad6a37ff65c73547cedc88 100644 (file)
@@ -190,3 +190,9 @@ void __iounmap(const volatile void __iomem *addr)
 
 EXPORT_SYMBOL(__ioremap);
 EXPORT_SYMBOL(__iounmap);
+
+int __virt_addr_valid(const volatile void *kaddr)
+{
+       return pfn_valid(PFN_DOWN(virt_to_phys(kaddr)));
+}
+EXPORT_SYMBOL_GPL(__virt_addr_valid);
index e99eaa1fbedcc7e7cf54e3ba045382b95c708ad4..318855eb5f80309d3e596d33c8130bdbced61bf7 100644 (file)
@@ -7,7 +7,6 @@
  * Copyright (C) 1999 Silicon Graphics, Inc.
  */
 #include <asm/mipsregs.h>
-#include <asm/page.h>
 #include <asm/regdef.h>
 #include <asm/stackframe.h>
 
index 05613355627b2435faa5efe89b5c0a476dfa9d0f..1c8ac49ec72cabc7bc66583012bb3d21ac270a7c 100644 (file)
@@ -976,13 +976,6 @@ build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr)
 #endif
        uasm_i_mfc0(p, tmp, C0_BADVADDR); /* get faulting address */
        uasm_i_lw(p, ptr, uasm_rel_lo(pgdc), ptr);
-
-       if (cpu_has_mips_r2) {
-               uasm_i_ext(p, tmp, tmp, PGDIR_SHIFT, (32 - PGDIR_SHIFT));
-               uasm_i_ins(p, ptr, tmp, PGD_T_LOG2, (32 - PGDIR_SHIFT));
-               return;
-       }
-
        uasm_i_srl(p, tmp, tmp, PGDIR_SHIFT); /* get pgd only bits */
        uasm_i_sll(p, tmp, tmp, PGD_T_LOG2);
        uasm_i_addu(p, ptr, ptr, tmp); /* add in pgd offset */
@@ -1018,15 +1011,6 @@ static void __cpuinit build_adjust_context(u32 **p, unsigned int ctx)
 
 static void __cpuinit build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr)
 {
-       if (cpu_has_mips_r2) {
-               /* PTE ptr offset is obtained from BadVAddr */
-               UASM_i_MFC0(p, tmp, C0_BADVADDR);
-               UASM_i_LW(p, ptr, 0, ptr);
-               uasm_i_ext(p, tmp, tmp, PAGE_SHIFT+1, PGDIR_SHIFT-PAGE_SHIFT-1);
-               uasm_i_ins(p, ptr, tmp, PTE_T_LOG2+1, PGDIR_SHIFT-PAGE_SHIFT-1);
-               return;
-       }
-
        /*
         * Bug workaround for the Nevada. It seems as if under certain
         * circumstances the move from cp0_context might produce a
index 0375ee66bca3086fa2e35f21999bbfba1c001d99..7aa2225e75b907e0d77b7ed0d1a4f5d66120cba2 100644 (file)
@@ -297,7 +297,7 @@ static void sead3_i2c_platform_setup(struct pic32_i2c_platform_data *priv)
                priv->base + PIC32_I2CxSTATCLR);
 }
 
-static int __devinit sead3_i2c_platform_probe(struct platform_device *pdev)
+static int sead3_i2c_platform_probe(struct platform_device *pdev)
 {
        struct pic32_i2c_platform_data *priv;
        struct resource *r;
@@ -345,7 +345,7 @@ out:
        return ret;
 }
 
-static int __devexit sead3_i2c_platform_remove(struct platform_device *pdev)
+static int sead3_i2c_platform_remove(struct platform_device *pdev)
 {
        struct pic32_i2c_platform_data *priv = platform_get_drvdata(pdev);
 
@@ -383,7 +383,7 @@ static struct platform_driver sead3_i2c_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = sead3_i2c_platform_probe,
-       .remove         = __devexit_p(sead3_i2c_platform_remove),
+       .remove         = sead3_i2c_platform_remove,
        .suspend        = sead3_i2c_platform_suspend,
        .resume         = sead3_i2c_platform_resume,
 };
index 46509b0a620df0acb66eefc77e4f8118f6c0feb5..514675ed0cde2e27e216da96dffe160c61588290 100644 (file)
@@ -304,8 +304,7 @@ static void i2c_platform_disable(struct i2c_platform_data *priv)
        pr_debug("i2c_platform_disable\n");
 }
 
-static int __devinit
-i2c_platform_probe(struct platform_device *pdev)
+static int i2c_platform_probe(struct platform_device *pdev)
 {
        struct i2c_platform_data *priv;
        struct resource *r;
@@ -362,8 +361,7 @@ out:
        return ret;
 }
 
-static int __devexit
-i2c_platform_remove(struct platform_device *pdev)
+static int i2c_platform_remove(struct platform_device *pdev)
 {
        struct i2c_platform_data *priv = platform_get_drvdata(pdev);
 
@@ -408,7 +406,7 @@ static struct platform_driver i2c_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = i2c_platform_probe,
-       .remove         = __devexit_p(i2c_platform_remove),
+       .remove         = i2c_platform_remove,
        .suspend        = i2c_platform_suspend,
        .resume         = i2c_platform_resume,
 };
index 3e7ce65d776c83ff32a935d38320153c913f54b9..9553b14002dda51a757cf06ccb0bca5483b86c1a 100644 (file)
@@ -37,7 +37,7 @@
 #define VIA_COBALT_BRD_ID_REG  0x94
 #define VIA_COBALT_BRD_REG_to_ID(reg)  ((unsigned char)(reg) >> 4)
 
-static void __devinit qube_raq_galileo_early_fixup(struct pci_dev *dev)
+static void qube_raq_galileo_early_fixup(struct pci_dev *dev)
 {
        if (dev->devfn == PCI_DEVFN(0, 0) &&
                (dev->class >> 8) == PCI_CLASS_MEMORY_OTHER) {
@@ -51,7 +51,7 @@ static void __devinit qube_raq_galileo_early_fixup(struct pci_dev *dev)
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_GT64111,
         qube_raq_galileo_early_fixup);
 
-static void __devinit qube_raq_via_bmIDE_fixup(struct pci_dev *dev)
+static void qube_raq_via_bmIDE_fixup(struct pci_dev *dev)
 {
        unsigned short cfgword;
        unsigned char lt;
@@ -74,7 +74,7 @@ static void __devinit qube_raq_via_bmIDE_fixup(struct pci_dev *dev)
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1,
         qube_raq_via_bmIDE_fixup);
 
-static void __devinit qube_raq_galileo_fixup(struct pci_dev *dev)
+static void qube_raq_galileo_fixup(struct pci_dev *dev)
 {
        if (dev->devfn != PCI_DEVFN(0, 0))
                return;
@@ -129,7 +129,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_GT64111,
 
 int cobalt_board_id;
 
-static void __devinit qube_raq_via_board_id_fixup(struct pci_dev *dev)
+static void qube_raq_via_board_id_fixup(struct pci_dev *dev)
 {
        u8 id;
        int retval;
index 0d9ccf4dfc5abc5b7263361eef22444861507a86..beaec32b02e54f3b77a2a3d01dbb0fdb5526e674 100644 (file)
@@ -52,7 +52,7 @@ static unsigned char irq_map[][5] __initdata = {
               MARKEINS_PCI_IRQ_INTA, MARKEINS_PCI_IRQ_INTB,},
 };
 
-static void __devinit nec_usb_controller_fixup(struct pci_dev *dev)
+static void nec_usb_controller_fixup(struct pci_dev *dev)
 {
        if (PCI_SLOT(dev->devfn) == EMMA2RH_USB_SLOT)
                /* on board USB controller configuration */
@@ -67,7 +67,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_USB,
  * if it is the host bridge by marking it as such.  These resources are of
  * no consequence to the PCI layer (they are handled elsewhere).
  */
-static void __devinit emma2rh_pci_host_fixup(struct pci_dev *dev)
+static void emma2rh_pci_host_fixup(struct pci_dev *dev)
 {
        int i;
 
index 0857ab8c3919750feb164b3649f60df502290312..63ab4a042cd6e4a4f5dec5f0beafb548000b6e0d 100644 (file)
@@ -48,7 +48,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
        return 0;
 }
 
-static void __devinit loongson2e_nec_fixup(struct pci_dev *pdev)
+static void loongson2e_nec_fixup(struct pci_dev *pdev)
 {
        unsigned int val;
 
@@ -60,7 +60,7 @@ static void __devinit loongson2e_nec_fixup(struct pci_dev *pdev)
        pci_write_config_dword(pdev, 0xe4, 1 << 5);
 }
 
-static void __devinit loongson2e_686b_func0_fixup(struct pci_dev *pdev)
+static void loongson2e_686b_func0_fixup(struct pci_dev *pdev)
 {
        unsigned char c;
 
@@ -135,7 +135,7 @@ static void __devinit loongson2e_686b_func0_fixup(struct pci_dev *pdev)
        printk(KERN_INFO"via686b fix: ISA bridge done\n");
 }
 
-static void __devinit loongson2e_686b_func1_fixup(struct pci_dev *pdev)
+static void loongson2e_686b_func1_fixup(struct pci_dev *pdev)
 {
        printk(KERN_INFO"via686b fix: IDE\n");
 
@@ -168,19 +168,19 @@ static void __devinit loongson2e_686b_func1_fixup(struct pci_dev *pdev)
        printk(KERN_INFO"via686b fix: IDE done\n");
 }
 
-static void __devinit loongson2e_686b_func2_fixup(struct pci_dev *pdev)
+static void loongson2e_686b_func2_fixup(struct pci_dev *pdev)
 {
        /* irq routing */
        pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 10);
 }
 
-static void __devinit loongson2e_686b_func3_fixup(struct pci_dev *pdev)
+static void loongson2e_686b_func3_fixup(struct pci_dev *pdev)
 {
        /* irq routing */
        pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 11);
 }
 
-static void __devinit loongson2e_686b_func5_fixup(struct pci_dev *pdev)
+static void loongson2e_686b_func5_fixup(struct pci_dev *pdev)
 {
        unsigned int val;
        unsigned char c;
index a7b917dcf604bde1ee359b20fb203356c0e4a84e..519daaebb5da6cae81e4fedd5ea76a557f8fc464 100644 (file)
@@ -96,21 +96,21 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
 }
 
 /* CS5536 SPEC. fixup */
-static void __devinit loongson_cs5536_isa_fixup(struct pci_dev *pdev)
+static void loongson_cs5536_isa_fixup(struct pci_dev *pdev)
 {
        /* the uart1 and uart2 interrupt in PIC is enabled as default */
        pci_write_config_dword(pdev, PCI_UART1_INT_REG, 1);
        pci_write_config_dword(pdev, PCI_UART2_INT_REG, 1);
 }
 
-static void __devinit loongson_cs5536_ide_fixup(struct pci_dev *pdev)
+static void loongson_cs5536_ide_fixup(struct pci_dev *pdev)
 {
        /* setting the mutex pin as IDE function */
        pci_write_config_dword(pdev, PCI_IDE_CFG_REG,
                               CS5536_IDE_FLASH_SIGNATURE);
 }
 
-static void __devinit loongson_cs5536_acc_fixup(struct pci_dev *pdev)
+static void loongson_cs5536_acc_fixup(struct pci_dev *pdev)
 {
        /* enable the AUDIO interrupt in PIC  */
        pci_write_config_dword(pdev, PCI_ACC_INT_REG, 1);
@@ -118,14 +118,14 @@ static void __devinit loongson_cs5536_acc_fixup(struct pci_dev *pdev)
        pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xc0);
 }
 
-static void __devinit loongson_cs5536_ohci_fixup(struct pci_dev *pdev)
+static void loongson_cs5536_ohci_fixup(struct pci_dev *pdev)
 {
        /* enable the OHCI interrupt in PIC */
        /* THE OHCI, EHCI, UDC, OTG are shared with interrupt in PIC */
        pci_write_config_dword(pdev, PCI_OHCI_INT_REG, 1);
 }
 
-static void __devinit loongson_cs5536_ehci_fixup(struct pci_dev *pdev)
+static void loongson_cs5536_ehci_fixup(struct pci_dev *pdev)
 {
        u32 hi, lo;
 
@@ -137,7 +137,7 @@ static void __devinit loongson_cs5536_ehci_fixup(struct pci_dev *pdev)
        pci_write_config_dword(pdev, PCI_EHCI_FLADJ_REG, 0x2000);
 }
 
-static void __devinit loongson_nec_fixup(struct pci_dev *pdev)
+static void loongson_nec_fixup(struct pci_dev *pdev)
 {
        unsigned int val;
 
index 9a1a2244522a10972ec20aca833f32cf1dc4dba0..75d03f6be3bde7fcc59cb65e45518384560ae5cf 100644 (file)
@@ -8,7 +8,7 @@
 #define PCID           4
 
 /* This table is filled in by interrogating the PIIX4 chip */
-static char pci_irq[5] __devinitdata = {
+static char pci_irq[5] = {
 };
 
 static char irq_tab[][5] __initdata = {
@@ -50,10 +50,10 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
        return 0;
 }
 
-static void __devinit malta_piix_func0_fixup(struct pci_dev *pdev)
+static void malta_piix_func0_fixup(struct pci_dev *pdev)
 {
        unsigned char reg_val;
-       static int piixirqmap[16] __devinitdata = {  /* PIIX PIRQC[A:D] irq mappings */
+       static int piixirqmap[16] = {  /* PIIX PIRQC[A:D] irq mappings */
                0,  0,  0,  3,
                4,  5,  6,  7,
                0,  9, 10, 11,
@@ -84,7 +84,7 @@ static void __devinit malta_piix_func0_fixup(struct pci_dev *pdev)
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0,
         malta_piix_func0_fixup);
 
-static void __devinit malta_piix_func1_fixup(struct pci_dev *pdev)
+static void malta_piix_func1_fixup(struct pci_dev *pdev)
 {
        unsigned char reg_val;
 
@@ -104,7 +104,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB,
         malta_piix_func1_fixup);
 
 /* Enable PCI 2.1 compatibility in PIIX4 */
-static void __devinit quirk_dlcsetup(struct pci_dev *dev)
+static void quirk_dlcsetup(struct pci_dev *dev)
 {
        u8 odlc, ndlc;
 
index 76bb1be99d432bc935af5ee93698093dafa42d8a..d0f6ecbf35f7486c2435dc0375312b51929450b1 100644 (file)
 #include <asm/mach-rc32434/rc32434.h>
 #include <asm/mach-rc32434/irq.h>
 
-static int __devinitdata irq_map[2][12] = {
+static int irq_map[2][12] = {
        {0, 0, 2, 3, 2, 3, 0, 0, 0, 0, 0, 1},
        {0, 0, 1, 3, 0, 2, 1, 3, 0, 2, 1, 3}
 };
 
-int __devinit pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 {
        int irq = 0;
 
@@ -47,7 +47,7 @@ int __devinit pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
        return irq + GROUP4_IRQ_BASE + 4;
 }
 
-static void __devinit rc32434_pci_early_fixup(struct pci_dev *dev)
+static void rc32434_pci_early_fixup(struct pci_dev *dev)
 {
        if (PCI_SLOT(dev->devfn) == 6 && dev->bus->number == 0) {
                /* disable prefetched memory range */
index d02900a72916869dc39a03d0dd2075a5f8e85d82..1441becdcb6c1cf32cf19c728f1b58bf8859d31f 100644 (file)
@@ -15,7 +15,7 @@
  * Set the BCM1250, etc. PCI host bridge's TRDY timeout
  * to the finite max.
  */
-static void __devinit quirk_sb1250_pci(struct pci_dev *dev)
+static void quirk_sb1250_pci(struct pci_dev *dev)
 {
        pci_write_config_byte(dev, 0x40, 0xff);
 }
@@ -25,7 +25,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_PCI,
 /*
  * The BCM1250, etc. PCI/HT bridge reports as a host bridge.
  */
-static void __devinit quirk_sb1250_ht(struct pci_dev *dev)
+static void quirk_sb1250_ht(struct pci_dev *dev)
 {
        dev->class = PCI_CLASS_BRIDGE_PCI << 8;
 }
@@ -35,7 +35,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_HT,
 /*
  * Set the SP1011 HT/PCI bridge's TRDY timeout to the finite max.
  */
-static void __devinit quirk_sp1011(struct pci_dev *dev)
+static void quirk_sp1011(struct pci_dev *dev)
 {
        pci_write_config_byte(dev, 0x64, 0xff);
 }
index 65c7bd1004860d3e3eb7490d98f78c4718e5be81..4a156629e958168c2060ff6d40af2ffe72c29980 100644 (file)
@@ -411,7 +411,7 @@ struct pci_ops bcm63xx_cb_ops = {
  * only one IO window, so it  cannot be shared by PCI and cardbus, use
  * fixup to choose and detect unhandled configuration
  */
-static void __devinit bcm63xx_fixup(struct pci_dev *dev)
+static void bcm63xx_fixup(struct pci_dev *dev)
 {
        static int io_window = -1;
        int i, found, new_io_window;
index bc13e29d2bb34d6f9a257322e222b943da533c1c..0d69d6f4ea44f72ec828c972e5d49a2d6c34902a 100644 (file)
@@ -191,13 +191,13 @@ static struct {
        u8 trdyto;
        u8 retryto;
        u16 gbwc;
-} tx4927_pci_opts __devinitdata = {
+} tx4927_pci_opts = {
        .trdyto = 0,
        .retryto = 0,
        .gbwc = 0xfe0,  /* 4064 GBUSCLK for CCFG.GTOT=0b11 */
 };
 
-char *__devinit tx4927_pcibios_setup(char *str)
+char *tx4927_pcibios_setup(char *str)
 {
        unsigned long val;
 
@@ -495,7 +495,7 @@ irqreturn_t tx4927_pcierr_interrupt(int irq, void *dev_id)
 }
 
 #ifdef CONFIG_TOSHIBA_FPCIB0
-static void __devinit tx4927_quirk_slc90e66_bridge(struct pci_dev *dev)
+static void tx4927_quirk_slc90e66_bridge(struct pci_dev *dev)
 {
        struct tx4927_pcic_reg __iomem *pcicptr = pci_bus_to_pcicptr(dev->bus);
 
index ec125bed721c5f616fb45493cf827d465ca2ced1..c4ea6cc55f946c9fe144c4225160be5e74b587ca 100644 (file)
@@ -356,7 +356,7 @@ static struct syscore_ops alchemy_pci_pmops = {
        .resume         = alchemy_pci_resume,
 };
 
-static int __devinit alchemy_pci_probe(struct platform_device *pdev)
+static int alchemy_pci_probe(struct platform_device *pdev)
 {
        struct alchemy_pci_platdata *pd = pdev->dev.platform_data;
        struct alchemy_pci_context *ctx;
index fdc24440294c7028c6fdf7e2a655b896dbe60ef7..7f4f49b09b5b90ba62b1cae28685066b11063ff2 100644 (file)
@@ -143,7 +143,7 @@ int __cpuinit bridge_probe(nasid_t nasid, int widget_id, int masterwid)
  * A given PCI device, in general, should be able to intr any of the cpus
  * on any one of the hubs connected to its xbow.
  */
-int __devinit pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 {
        return 0;
 }
@@ -212,7 +212,7 @@ static inline void pci_enable_swapping(struct pci_dev *dev)
        bridge->b_widget.w_tflush;      /* Flush */
 }
 
-static void __devinit pci_fixup_ioc3(struct pci_dev *d)
+static void pci_fixup_ioc3(struct pci_dev *d)
 {
        pci_disable_swapping(d);
 }
index 075d87acd12ac4158e090b7918250e958f0d8c05..95681789b51e44978c5725701e889abf28da1b00 100644 (file)
@@ -95,7 +95,7 @@ static inline u32 ltq_calc_bar11mask(void)
        return bar11mask;
 }
 
-static int __devinit ltq_pci_startup(struct platform_device *pdev)
+static int ltq_pci_startup(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
        const __be32 *req_mask, *bus_clk;
@@ -201,7 +201,7 @@ static int __devinit ltq_pci_startup(struct platform_device *pdev)
        return 0;
 }
 
-static int __devinit ltq_pci_probe(struct platform_device *pdev)
+static int ltq_pci_probe(struct platform_device *pdev)
 {
        struct resource *res_cfg, *res_bridge;
 
index 4040416e060316e2fd2b1bb647e3048c89e37379..a1843448fad38de52d8a53316ade498a8a7bd5b8 100644 (file)
@@ -76,7 +76,7 @@ pcibios_align_resource(void *data, const struct resource *res,
        return start;
 }
 
-static void __devinit pcibios_scanbus(struct pci_controller *hose)
+static void pcibios_scanbus(struct pci_controller *hose)
 {
        static int next_busno;
        static int need_domain_info;
@@ -120,8 +120,7 @@ static void __devinit pcibios_scanbus(struct pci_controller *hose)
 }
 
 #ifdef CONFIG_OF
-void __devinit pci_load_of_ranges(struct pci_controller *hose,
-                               struct device_node *node)
+void pci_load_of_ranges(struct pci_controller *hose, struct device_node *node)
 {
        const __be32 *ranges;
        int rlen;
@@ -174,7 +173,7 @@ void __devinit pci_load_of_ranges(struct pci_controller *hose,
 
 static DEFINE_MUTEX(pci_scan_mutex);
 
-void __devinit register_pci_controller(struct pci_controller *hose)
+void register_pci_controller(struct pci_controller *hose)
 {
        if (request_resource(&iomem_resource, hose->mem_resource) < 0)
                goto out;
@@ -303,7 +302,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
        return pcibios_plat_dev_init(dev);
 }
 
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        struct pci_dev *dev = bus->self;
 
index f8a751c032823f25f088530d53acb23fdd11d5e2..61e2558a2dcb9414a35a51ad2deecc29d7554cc7 100644 (file)
@@ -8,7 +8,6 @@
  *         Wu Zhangjin <wuzhangjin@gmail.com>
  */
 #include <asm/asm-offsets.h>
-#include <asm/page.h>
 #include <asm/regdef.h>
 #include <asm/asm.h>
 
@@ -35,7 +34,7 @@ LEAF(swsusp_arch_resume)
 0:
        PTR_L t1, PBE_ADDRESS(t0)   /* source */
        PTR_L t2, PBE_ORIG_ADDRESS(t0) /* destination */
-       PTR_ADDU t3, t1, PAGE_SIZE
+       PTR_ADDU t3, t1, _PAGE_SIZE
 1:
        REG_L t8, (t1)
        REG_S t8, (t2)
index d6c7bd4b5ab0a5c7980a6a949be8c6597c0f59bb..2e9c283b8e688a4907ad8ff674d0d14870beab67 100644 (file)
@@ -236,7 +236,7 @@ void __init plat_mem_setup(void)
 #include <video/vga.h>
 #include <video/cirrus.h>
 
-static void __devinit quirk_cirrus_ram_size(struct pci_dev *dev)
+static void quirk_cirrus_ram_size(struct pci_dev *dev)
 {
        u16 cmd;
 
index b14ee53581a9674fc53cbdef9555dbaf0513897e..ce8f8b9b930cabf88df93cf8da95df820436cd51 100644 (file)
@@ -256,8 +256,7 @@ static irqreturn_t i8259_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit
-txx9_i8259_irq_setup(int irq)
+static int txx9_i8259_irq_setup(int irq)
 {
        int err;
 
@@ -269,7 +268,7 @@ txx9_i8259_irq_setup(int irq)
        return err;
 }
 
-static void __devinit quirk_slc90e66_bridge(struct pci_dev *dev)
+static void quirk_slc90e66_bridge(struct pci_dev *dev)
 {
        int irq;        /* PCI/ISA Bridge interrupt */
        u8 reg_64;
@@ -304,7 +303,7 @@ static void __devinit quirk_slc90e66_bridge(struct pci_dev *dev)
        smsc_fdc37m81x_config_end();
 }
 
-static void __devinit quirk_slc90e66_ide(struct pci_dev *dev)
+static void quirk_slc90e66_ide(struct pci_dev *dev)
 {
        unsigned char dat;
        int regs[2] = {0x41, 0x43};
@@ -339,7 +338,7 @@ static void __devinit quirk_slc90e66_ide(struct pci_dev *dev)
 }
 #endif /* CONFIG_TOSHIBA_FPCIB0 */
 
-static void __devinit tc35815_fixup(struct pci_dev *dev)
+static void tc35815_fixup(struct pci_dev *dev)
 {
        /* This device may have PM registers but not they are not supported. */
        if (dev->pm_cap) {
@@ -348,7 +347,7 @@ static void __devinit tc35815_fixup(struct pci_dev *dev)
        }
 }
 
-static void __devinit final_fixup(struct pci_dev *dev)
+static void final_fixup(struct pci_dev *dev)
 {
        unsigned char bist;
 
index aa03f2e13385fe5083a50b17ae6f8c02e3ccb269..e70001cfa05b1ee650b132f9163e72766f2fbb5c 100644 (file)
@@ -6,6 +6,7 @@ config MN10300
        select ARCH_WANT_IPC_PARSE_VERSION
        select HAVE_ARCH_TRACEHOOK
        select HAVE_ARCH_KGDB
+       select GENERIC_ATOMIC64
        select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER
        select GENERIC_CLOCKEVENTS
        select MODULES_USE_ELF_RELA
index af5366bbfe62727b09e2d47474e78a7483bb3a13..5c7c7c988544558f632a84ab5f529801a27b8963 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -70,4 +70,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _ASM_SOCKET_H */
index 95983cd21e77e45a47be44ea41c82b59479b9c25..5d7e152a23b7d2b03921aca402d4538b55672144 100644 (file)
@@ -905,7 +905,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
  * Set up the cpu_online_mask, cpu_callout_map and cpu_callin_map of the boot
  * processor (CPU 0).
  */
-void __devinit smp_prepare_boot_cpu(void)
+void smp_prepare_boot_cpu(void)
 {
        cpumask_set_cpu(0, &cpu_callout_map);
        cpumask_set_cpu(0, &cpu_callin_map);
@@ -930,7 +930,7 @@ void initialize_secondary(void)
  * __cpu_up - Set smp_commenced_mask for the nominated CPU
  * @cpu: The target CPU.
  */
-int __devinit __cpu_up(unsigned int cpu, struct task_struct *tidle)
+int __cpu_up(unsigned int cpu, struct task_struct *tidle)
 {
        int timeout;
 
index e2059486d3f84b9bbee412c809aae8acfb21056e..6911e845b8cdff49dc85f50f91d2f905c3e2f1c1 100644 (file)
@@ -282,7 +282,7 @@ static int __init pci_check_direct(void)
        return -ENODEV;
 }
 
-static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
+static int is_valid_resource(struct pci_dev *dev, int idx)
 {
        unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
        struct resource *devr = &dev->resource[idx], *busr;
@@ -302,7 +302,7 @@ static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
        return 0;
 }
 
-static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
+static void pcibios_fixup_device_resources(struct pci_dev *dev)
 {
        int limit, i;
 
@@ -325,7 +325,7 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
  *  Called after each bus is probed, but before its children
  *  are examined.
  */
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        struct pci_dev *dev;
 
index c330767c921747ac089339bcf565c5151160fe7e..c82b09f4a106ce15d2a0b243f5ec40f135cd2b7d 100644 (file)
@@ -22,7 +22,7 @@
 #include <asm/timex.h>
 #include <asm/processor.h>
 
-int __devinit read_current_timer(unsigned long *timer_value)
+int read_current_timer(unsigned long *timer_value)
 {
        *timer_value = mfspr(SPR_TTCR);
        return 0;
index 00d9cc3e7b973db94227548da49dfe48208142b2..c391d7cbc22389cf9c74591fffd64bd6c94df1a4 100644 (file)
@@ -8,7 +8,7 @@
 #define _ASM_PARPORT_H 1
 
 
-static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
+static int parport_pc_find_nonpci_ports (int autoirq, int autodma)
 {
        /* nothing ! */
        return 0;
index d9ff4731253bb6e8f6402686e2401e251126ecb2..526e4b9aece0a0480f1631bcb492c83ffac2c735 100644 (file)
@@ -13,7 +13,7 @@
 #define SO_BROADCAST   0x0020
 #define SO_LINGER      0x0080
 #define SO_OOBINLINE   0x0100
-/* To add :#define SO_REUSEPORT 0x0200 */
+#define SO_REUSEPORT   0x0200
 #define SO_SNDBUF      0x1001
 #define SO_RCVBUF      0x1002
 #define SO_SNDBUFFORCE 0x100a
@@ -69,6 +69,7 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               0x4024
 
+#define SO_LOCK_FILTER         0x4025
 
 /* O_NONBLOCK clashes with the bits used for socket types.  Therefore we
  * have to define SOCK_NONBLOCK to a different value here.
index f48a640b55fbe553fd191eace94be5a8d66aa0cf..f7752f6af29e090e559d74e0d8d1206bd50a72ef 100644 (file)
@@ -38,7 +38,7 @@
  *     so don't reference this table after starting the init process
  */
  
-static struct hp_hardware hp_hardware_list[] __devinitdata = {
+static struct hp_hardware hp_hardware_list[] = {
        {HPHW_NPROC,0x01,0x4,0x0,"Indigo (840, 930)"},
        {HPHW_NPROC,0x8,0x4,0x01,"Firefox(825,925)"},
        {HPHW_NPROC,0xA,0x4,0x01,"Top Gun (835,834,935,635)"},
@@ -1230,7 +1230,7 @@ static struct hp_cpu_type_mask {
        unsigned short model;
        unsigned short mask;
        enum cpu_type cpu;
-} hp_cpu_type_mask_list[] __devinitdata = {
+} hp_cpu_type_mask_list[] = {
 
        { 0x0000, 0x0ff0, pcx    },  /* 0x0000 - 0x000f */
        { 0x0048, 0x0ff0, pcxl   },  /* 0x0040 - 0x004f */
@@ -1327,8 +1327,7 @@ const char * const cpu_name_version[][2] = {
        [mako2] = { "PA8900 (Shortfin)",        "2.0" }
 };
 
-const char * __devinit
-parisc_hardware_description(struct parisc_device_id *id)
+const char *parisc_hardware_description(struct parisc_device_id *id)
 {
        struct hp_hardware *listptr;
        
index b0ef73882b3847763117f7b0ccb6a123a227e9a5..a8fb03e22770fe9f4f82b5fceb24db81ca7e1edc 100644 (file)
@@ -183,7 +183,7 @@ static inline void eeh_unlock(void)
 #define EEH_MAX_ALLOWED_FREEZES 5
 
 typedef void *(*eeh_traverse_func)(void *data, void *flag);
-int __devinit eeh_phb_pe_create(struct pci_controller *phb);
+int eeh_phb_pe_create(struct pci_controller *phb);
 int eeh_add_to_parent_pe(struct eeh_dev *edev);
 int eeh_rmv_from_parent_pe(struct eeh_dev *edev, int purge_pe);
 void *eeh_pe_dev_traverse(struct eeh_pe *root,
@@ -191,8 +191,8 @@ void *eeh_pe_dev_traverse(struct eeh_pe *root,
 void eeh_pe_restore_bars(struct eeh_pe *pe);
 struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe);
 
-void * __devinit eeh_dev_init(struct device_node *dn, void *data);
-void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb);
+void *eeh_dev_init(struct device_node *dn, void *data);
+void eeh_dev_phb_init_dynamic(struct pci_controller *phb);
 int __init eeh_ops_register(struct eeh_ops *ops);
 int __exit eeh_ops_unregister(const char *name);
 unsigned long eeh_check_failure(const volatile void __iomem *token,
index fbae492869264f1e6d4cf94504fe8d353e35e757..f96dd096ff4e28b74c740bd582ff73989fec784b 100644 (file)
@@ -31,8 +31,8 @@ struct iowa_bus {
        void   *private;
 };
 
-void __devinit iowa_register_bus(struct pci_controller *, struct ppc_pci_io *,
-                                int (*)(struct iowa_bus *, void *), void *);
+void iowa_register_bus(struct pci_controller *, struct ppc_pci_io *,
+                      int (*)(struct iowa_bus *, void *), void *);
 struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR);
 struct iowa_bus *iowa_pio_find_bus(unsigned long);
 
index 1ca1102b4a2f0386b5ee2993588d6fb48f832a91..6dc2577932b13cc0694fa4c6b14942695a036379 100644 (file)
@@ -12,7 +12,7 @@
 
 #include <asm/prom.h>
 
-static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
+static int parport_pc_find_nonpci_ports (int autoirq, int autodma)
 {
        struct device_node *np;
        const u32 *prop;
index 5a4e437c238d814ad421c4c0c3eff12391cf316f..195ce2ac569157f47e80814f66dc897420a52d2a 100644 (file)
@@ -54,8 +54,8 @@ struct smp_ops_t {
 
 extern void smp_send_debugger_break(void);
 extern void start_secondary_resume(void);
-extern void __devinit smp_generic_give_timebase(void);
-extern void __devinit smp_generic_take_timebase(void);
+extern void smp_generic_give_timebase(void);
+extern void smp_generic_take_timebase(void);
 
 DECLARE_PER_CPU(unsigned int, cpu_pvr);
 
index df81cb72d1e08a805a94fe267b9dcc712a199459..68d0cc998b1baa5cee49b2a735f394354819492c 100644 (file)
@@ -139,7 +139,7 @@ extern void vio_unregister_driver(struct vio_driver *drv);
 extern int vio_cmo_entitlement_update(size_t);
 extern void vio_cmo_set_dev_desired(struct vio_dev *viodev, size_t desired);
 
-extern void __devinit vio_unregister_device(struct vio_dev *dev);
+extern void vio_unregister_device(struct vio_dev *dev);
 
 extern int vio_h_cop_sync(struct vio_dev *vdev, struct vio_pfo_op *op);
 
index ed0e0254b47f2b3ae67940e15d151b58dddc7462..e3af3286a06801643a760fcbfa2afd116ad01053 100644 (file)
@@ -78,7 +78,7 @@ struct kvm_vcpu_arch_shared {
 
 #define KVM_HCALL_TOKEN(num)     _EV_HCALL_TOKEN(EV_KVM_VENDOR_ID, num)
 
-#include <uapi/asm/epapr_hcalls.h>
+#include <asm/epapr_hcalls.h>
 
 #define KVM_FEATURE_MAGIC_PAGE 1
 
index eb0b1864d400b2a01386ed3a77fedb300a560227..a26dcaece509490746ab8b2a5d254125f6d4571f 100644 (file)
@@ -29,7 +29,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_RCVLOWAT    16
 #define SO_SNDLOWAT    17
 #define SO_RCVTIMEO    18
@@ -77,4 +77,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _ASM_POWERPC_SOCKET_H */
index 12d329bcbb9825cbad17618460e22d4c2b0d5cdf..50e90b7e713993109022db1f7b4d4bf0905ded1f 100644 (file)
@@ -118,7 +118,7 @@ static void iowa_##name at                                  \
 #undef DEF_PCI_AC_RET
 #undef DEF_PCI_AC_NORET
 
-static const struct ppc_pci_io __devinitconst iowa_pci_io = {
+static const struct ppc_pci_io iowa_pci_io = {
 
 #define DEF_PCI_AC_RET(name, ret, at, al, space, aa)   .name = iowa_##name,
 #define DEF_PCI_AC_NORET(name, at, al, space, aa)      .name = iowa_##name,
@@ -146,7 +146,7 @@ static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,
 }
 
 /* Enable IO workaround */
-static void __devinit io_workaround_init(void)
+static void io_workaround_init(void)
 {
        static int io_workaround_inited;
 
@@ -158,9 +158,8 @@ static void __devinit io_workaround_init(void)
 }
 
 /* Register new bus to support workaround */
-void __devinit iowa_register_bus(struct pci_controller *phb,
-                       struct ppc_pci_io *ops,
-                       int (*initfunc)(struct iowa_bus *, void *), void *data)
+void iowa_register_bus(struct pci_controller *phb, struct ppc_pci_io *ops,
+                      int (*initfunc)(struct iowa_bus *, void *), void *data)
 {
        struct iowa_bus *bus;
        struct device_node *np = phb->dn;
index d45ec58703cec58553d02de52baab00152fcad72..0f19970979608208b385aa0606c5461747673238 100644 (file)
@@ -41,8 +41,8 @@ EXPORT_SYMBOL_GPL(isa_bridge_pcidev);
 #define ISA_SPACE_MASK 0x1
 #define ISA_SPACE_IO 0x1
 
-static void __devinit pci_process_ISA_OF_ranges(struct device_node *isa_node,
-                                               unsigned long phb_io_base_phys)
+static void pci_process_ISA_OF_ranges(struct device_node *isa_node,
+                                     unsigned long phb_io_base_phys)
 {
        /* We should get some saner parsing here and remove these structs */
        struct pci_address {
@@ -170,8 +170,8 @@ void __init isa_bridge_find_early(struct pci_controller *hose)
  * isa_bridge_find_late - Find and map the ISA IO space upon discovery of
  *                        a new ISA bridge
  */
-static void __devinit isa_bridge_find_late(struct pci_dev *pdev,
-                                          struct device_node *devnode)
+static void isa_bridge_find_late(struct pci_dev *pdev,
+                                struct device_node *devnode)
 {
        struct pci_controller *hose = pci_bus_to_host(pdev->bus);
 
@@ -215,8 +215,8 @@ static void isa_bridge_remove(void)
 /**
  * isa_bridge_notify - Get notified of PCI devices addition/removal
  */
-static int __devinit isa_bridge_notify(struct notifier_block *nb,
-                                      unsigned long action, void *data)
+static int isa_bridge_notify(struct notifier_block *nb, unsigned long action,
+                            void *data)
 {
        struct device *dev = data;
        struct pci_dev *pdev = to_pci_dev(dev);
index 9db8ec07ec94ff4d953bb7277d1698304e39190c..07c12697d7083cb0645a3f4eb90cd0d94725d108 100644 (file)
@@ -37,7 +37,7 @@
  * lacking some bits needed here.
  */
 
-static int __devinit of_pci_phb_probe(struct platform_device *dev)
+static int of_pci_phb_probe(struct platform_device *dev)
 {
        struct pci_controller *phb;
 
index abc0d08569948f43bfad024df8a5b9fc85bdf94d..7c37379ea9b1334446eda1d318fb0b46a210ac3e 100644 (file)
@@ -673,9 +673,8 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,
  *   - Some 32 bits platforms such as 4xx can have physical space larger than
  *     32 bits so we need to use 64 bits values for the parsing
  */
-void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
-                                           struct device_node *dev,
-                                           int primary)
+void pci_process_bridge_OF_ranges(struct pci_controller *hose,
+                                 struct device_node *dev, int primary)
 {
        const u32 *ranges;
        int rlen;
@@ -848,7 +847,7 @@ int pci_proc_domain(struct pci_bus *bus)
 /* This header fixup will do the resource fixup for all devices as they are
  * probed, but not for bridge ranges
  */
-static void __devinit pcibios_fixup_resources(struct pci_dev *dev)
+static void pcibios_fixup_resources(struct pci_dev *dev)
 {
        struct pci_controller *hose = pci_bus_to_host(dev->bus);
        int i;
@@ -902,8 +901,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
  * things go more smoothly when it gets it right. It should covers cases such
  * as Apple "closed" bridge resources and bare-metal pSeries unassigned bridges
  */
-static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,
-                                                          struct resource *res)
+static int pcibios_uninitialized_bridge_resource(struct pci_bus *bus,
+                                                struct resource *res)
 {
        struct pci_controller *hose = pci_bus_to_host(bus);
        struct pci_dev *dev = bus->self;
@@ -967,7 +966,7 @@ static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,
 }
 
 /* Fixup resources of a PCI<->PCI bridge */
-static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)
+static void pcibios_fixup_bridge(struct pci_bus *bus)
 {
        struct resource *res;
        int i;
@@ -1007,7 +1006,7 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)
        }
 }
 
-void __devinit pcibios_setup_bus_self(struct pci_bus *bus)
+void pcibios_setup_bus_self(struct pci_bus *bus)
 {
        /* Fix up the bus resources for P2P bridges */
        if (bus->self != NULL)
@@ -1024,7 +1023,7 @@ void __devinit pcibios_setup_bus_self(struct pci_bus *bus)
                ppc_md.pci_dma_bus_setup(bus);
 }
 
-void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
+void pcibios_setup_bus_devices(struct pci_bus *bus)
 {
        struct pci_dev *dev;
 
@@ -1063,7 +1062,7 @@ void pcibios_set_master(struct pci_dev *dev)
        /* No special bus mastering setup handling */
 }
 
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        /* When called from the generic PCI probe, read PCI<->PCI bridge
         * bases. This is -not- called when generating the PCI tree from
@@ -1080,7 +1079,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
 }
 EXPORT_SYMBOL(pcibios_fixup_bus);
 
-void __devinit pci_fixup_cardbus(struct pci_bus *bus)
+void pci_fixup_cardbus(struct pci_bus *bus)
 {
        /* Now fixup devices on that bus */
        pcibios_setup_bus_devices(bus);
@@ -1264,7 +1263,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)
                pcibios_allocate_bus_resources(b);
 }
 
-static inline void __devinit alloc_resource(struct pci_dev *dev, int idx)
+static inline void alloc_resource(struct pci_dev *dev, int idx)
 {
        struct resource *pr, *r = &dev->resource[idx];
 
@@ -1500,7 +1499,8 @@ resource_size_t pcibios_io_space_offset(struct pci_controller *hose)
        return (unsigned long) hose->io_base_virt - _IO_BASE;
 }
 
-static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources)
+static void pcibios_setup_phb_resources(struct pci_controller *hose,
+                                       struct list_head *resources)
 {
        struct resource *res;
        int i;
@@ -1639,7 +1639,7 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
  * pci_scan_phb - Given a pci_controller, setup and scan the PCI bus
  * @hose: Pointer to the PCI host controller instance structure
  */
-void __devinit pcibios_scan_phb(struct pci_controller *hose)
+void pcibios_scan_phb(struct pci_controller *hose)
 {
        LIST_HEAD(resources);
        struct pci_bus *bus;
index 64f526a321f5f82e2fc094dd10e674668844296a..e37c2152acf4d96eaed43e70cb40a1ea06c85edb 100644 (file)
@@ -213,7 +213,7 @@ pci_create_OF_bus_map(void)
        }
 }
 
-void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose)
+void pcibios_setup_phb_io_space(struct pci_controller *hose)
 {
        unsigned long io_offset;
        struct resource *res = &hose->io_resource;
index 2cbe6768fddd7c545370738a10f4a55232da7578..51a133a78a09daaf2f8147134ac7136065bb7920 100644 (file)
@@ -122,7 +122,7 @@ int pcibios_unmap_io_space(struct pci_bus *bus)
 }
 EXPORT_SYMBOL_GPL(pcibios_unmap_io_space);
 
-static int __devinit pcibios_map_phb_io_space(struct pci_controller *hose)
+static int pcibios_map_phb_io_space(struct pci_controller *hose)
 {
        struct vm_struct *area;
        unsigned long phys_page;
@@ -173,7 +173,7 @@ static int __devinit pcibios_map_phb_io_space(struct pci_controller *hose)
        return 0;
 }
 
-int __devinit pcibios_map_io_space(struct pci_bus *bus)
+int pcibios_map_io_space(struct pci_bus *bus)
 {
        WARN_ON(bus == NULL);
 
@@ -193,7 +193,7 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus)
 }
 EXPORT_SYMBOL_GPL(pcibios_map_io_space);
 
-void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose)
+void pcibios_setup_phb_io_space(struct pci_controller *hose)
 {
        pcibios_map_phb_io_space(hose);
 }
index dd9e4a04bf795b0529da827738d2fe8484f46be6..e7af165f8b9d402add808fc5ce3760b9674d7c7a 100644 (file)
@@ -36,7 +36,7 @@
  * Traverse_func that inits the PCI fields of the device node.
  * NOTE: this *must* be done before read/write config to the device.
  */
-void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
+void *update_dn_pci_info(struct device_node *dn, void *data)
 {
        struct pci_controller *phb = data;
        const int *type =
@@ -129,7 +129,7 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,
  * subsystem is set up, before kmalloc is valid) and during the 
  * dynamic lpar operation of adding a PHB to a running system.
  */
-void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
+void pci_devs_phb_init_dynamic(struct pci_controller *phb)
 {
        struct device_node *dn = phb->dn;
        struct pci_dn *pdn;
index 30378a19f65d03f43ab671c004e2027a793359ae..2a67e9baa59f80200f4a25b5a75471c04f04c776 100644 (file)
@@ -204,7 +204,7 @@ EXPORT_SYMBOL(of_create_pci_dev);
  * this routine in turn call of_scan_bus() recusively to scan for more child
  * devices.
  */
-void __devinit of_scan_pci_bridge(struct pci_dev *dev)
+void of_scan_pci_bridge(struct pci_dev *dev)
 {
        struct device_node *node = dev->dev.of_node;
        struct pci_bus *bus;
@@ -299,8 +299,8 @@ EXPORT_SYMBOL(of_scan_pci_bridge);
  * @bus: pci_bus structure for the PCI bus
  * @rescan_existing: Flag indicating bus has already been set up
  */
-static void __devinit __of_scan_bus(struct device_node *node,
-                                   struct pci_bus *bus, int rescan_existing)
+static void __of_scan_bus(struct device_node *node, struct pci_bus *bus,
+                         int rescan_existing)
 {
        struct device_node *child;
        const u32 *reg;
@@ -348,8 +348,7 @@ static void __devinit __of_scan_bus(struct device_node *node,
  * @node: device tree node for the PCI bus
  * @bus: pci_bus structure for the PCI bus
  */
-void __devinit of_scan_bus(struct device_node *node,
-                          struct pci_bus *bus)
+void of_scan_bus(struct device_node *node, struct pci_bus *bus)
 {
        __of_scan_bus(node, bus, 0);
 }
@@ -363,8 +362,7 @@ EXPORT_SYMBOL_GPL(of_scan_bus);
  * Same as of_scan_bus, but for a pci_bus structure that has already been
  * setup.
  */
-void __devinit of_rescan_bus(struct device_node *node,
-                            struct pci_bus *bus)
+void of_rescan_bus(struct device_node *node, struct pci_bus *bus)
 {
        __of_scan_bus(node, bus, 1);
 }
index 6de63e3250bb1af364e1b412ed511d1f50092f9c..71cb20d6ec61a42b58934b95b0dcdc13948ab29a 100644 (file)
@@ -209,7 +209,7 @@ void __init init_pci_config_tokens (void)
        ibm_write_pci_config = rtas_token("ibm,write-pci-config");
 }
 
-unsigned long __devinit get_phb_buid (struct device_node *phb)
+unsigned long get_phb_buid (struct device_node *phb)
 {
        struct resource r;
 
@@ -237,7 +237,7 @@ static int phb_set_bus_ranges(struct device_node *dev,
        return 0;
 }
 
-int __devinit rtas_setup_phb(struct pci_controller *phb)
+int rtas_setup_phb(struct pci_controller *phb)
 {
        struct device_node *dev = phb->dn;
 
index 640de836e466eebd697acad630ed1d04f35a2f82..e68fd1ae727a56c2edd9f79a21fcf9dd467b4f04 100644 (file)
@@ -36,13 +36,13 @@ static struct {
 
 static volatile int            running;
 
-static void __devinit enter_contest(u64 mark, long add)
+static void enter_contest(u64 mark, long add)
 {
        while (get_tb() < mark)
                tbsync->race_result = add;
 }
 
-void __devinit smp_generic_take_timebase(void)
+void smp_generic_take_timebase(void)
 {
        int cmd;
        u64 tb;
@@ -75,7 +75,7 @@ void __devinit smp_generic_take_timebase(void)
        local_irq_restore(flags);
 }
 
-static int __devinit start_contest(int cmd, long offset, int num)
+static int start_contest(int cmd, long offset, int num)
 {
        int i, score=0;
        u64 tb;
@@ -110,7 +110,7 @@ static int __devinit start_contest(int cmd, long offset, int num)
        return score;
 }
 
-void __devinit smp_generic_give_timebase(void)
+void smp_generic_give_timebase(void)
 {
        int i, score, score2, old, min=0, max=5000, offset=1000;
 
index e5b133ebd8a57820bb65ff0ad5243afb85fa8fdd..793401e65088763dd9d9e5deaead0f8888c8209b 100644 (file)
@@ -82,7 +82,7 @@ int smt_enabled_at_boot = 1;
 static void (*crash_ipi_function_ptr)(struct pt_regs *) = NULL;
 
 #ifdef CONFIG_PPC64
-int __devinit smp_generic_kick_cpu(int nr)
+int smp_generic_kick_cpu(int nr)
 {
        BUG_ON(nr < 0 || nr >= NR_CPUS);
 
@@ -311,7 +311,7 @@ void smp_send_stop(void)
 
 struct thread_info *current_set[NR_CPUS];
 
-static void __devinit smp_store_cpu_info(int id)
+static void smp_store_cpu_info(int id)
 {
        per_cpu(cpu_pvr, id) = mfspr(SPRN_PVR);
 #ifdef CONFIG_PPC_FSL_BOOK3E
@@ -355,7 +355,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
                max_cpus = 1;
 }
 
-void __devinit smp_prepare_boot_cpu(void)
+void smp_prepare_boot_cpu(void)
 {
        BUG_ON(smp_processor_id() != boot_cpuid);
 #ifdef CONFIG_PPC64
@@ -610,7 +610,7 @@ static struct device_node *cpu_to_l2cache(int cpu)
 }
 
 /* Activate a secondary processor. */
-void __devinit start_secondary(void *unused)
+void start_secondary(void *unused)
 {
        unsigned int cpu = smp_processor_id();
        struct device_node *l2_cache;
index b3b14352b05ec3e460ca554c2475134d9185b978..6f6b1cccc91662037115e69dc072ac1f7a376be5 100644 (file)
@@ -770,13 +770,8 @@ void update_vsyscall_old(struct timespec *wall_time, struct timespec *wtm,
 
 void update_vsyscall_tz(void)
 {
-       /* Make userspace gettimeofday spin until we're done. */
-       ++vdso_data->tb_update_count;
-       smp_mb();
        vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
        vdso_data->tz_dsttime = sys_tz.tz_dsttime;
-       smp_mb();
-       ++vdso_data->tb_update_count;
 }
 
 static void __init clocksource_init(void)
index 201ba59738be93fefc95786336a7ebe57c0a1ed6..536016d792baf8a8a7208c4cd2f300c1672d49f2 100644 (file)
@@ -1289,7 +1289,7 @@ void vio_unregister_driver(struct vio_driver *viodrv)
 EXPORT_SYMBOL(vio_unregister_driver);
 
 /* vio_dev refcount hit 0 */
-static void __devinit vio_dev_release(struct device *dev)
+static void vio_dev_release(struct device *dev)
 {
        struct iommu_table *tbl = get_iommu_table_base(dev);
 
@@ -1545,7 +1545,7 @@ static struct device_attribute vio_dev_attrs[] = {
        __ATTR_NULL
 };
 
-void __devinit vio_unregister_device(struct vio_dev *viodev)
+void vio_unregister_device(struct vio_dev *viodev)
 {
        device_unregister(&viodev->dev);
 }
index 35f3cf0269b3100fff55aaee62f0c2ea5fc507fa..a353c485808c6ea203eac428106b5fdf41943b36 100644 (file)
@@ -79,7 +79,9 @@ static void flush_tlb_power7(struct kvm_vcpu *vcpu)
 static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)
 {
        unsigned long srr1 = vcpu->arch.shregs.msr;
+#ifdef CONFIG_PPC_POWERNV
        struct opal_machine_check_event *opal_evt;
+#endif
        long handled = 1;
 
        if (srr1 & SRR1_MC_LDSTERR) {
@@ -117,6 +119,7 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)
                handled = 0;
        }
 
+#ifdef CONFIG_PPC_POWERNV
        /*
         * See if OPAL has already handled the condition.
         * We assume that if the condition is recovered then OPAL
@@ -131,6 +134,7 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)
 
        if (handled)
                opal_evt->in_use = 0;
+#endif
 
        return handled;
 }
index ae758b3ff72cef57d702ac74f416116b752f44ec..0d82ef50dc3faf9269042bb09001320fbdacdaad 100644 (file)
@@ -186,8 +186,6 @@ void tlb_flush(struct mmu_gather *tlb)
  * Because of that usage pattern, it's only available with CONFIG_HOTPLUG
  * and is implemented for small size rather than speed.
  */
-#ifdef CONFIG_HOTPLUG
-
 void __flush_hash_table_range(struct mm_struct *mm, unsigned long start,
                              unsigned long end)
 {
@@ -221,5 +219,3 @@ void __flush_hash_table_range(struct mm_struct *mm, unsigned long start,
        arch_leave_lazy_mmu_mode();
        local_irq_restore(flags);
 }
-
-#endif /* CONFIG_HOTPLUG */
index 969dddcf33203aab139798f4b5f3dcdf99804f67..8f3920e5a046c4df771ecd30371154a84e813d82 100644 (file)
@@ -57,7 +57,8 @@ static const char * const board[] __initconst = {
        "amcc,makalu",
        "apm,klondike",
        "est,hotfoot",
-       "plathome,obs600"
+       "plathome,obs600",
+       NULL
 };
 
 static int __init ppc40x_probe(void)
index 6bd89a0e0dead4dcf112baca8aca5a0380f84a8c..ecd3890c40d72f11147a642fdb39c3389a6a7a38 100644 (file)
@@ -46,7 +46,7 @@ static __initdata struct of_device_id ppc47x_of_bus[] = {
 
 /* The EEPROM is missing and the default values are bogus.  This forces USB in
  * to EHCI mode */
-static void __devinit quirk_ppc_currituck_usb_fixup(struct pci_dev *dev)
+static void quirk_ppc_currituck_usb_fixup(struct pci_dev *dev)
 {
        if (of_machine_is_compatible("ibm,currituck")) {
                pci_write_config_dword(dev, 0xe0, 0x0114231f);
index ba4a6e388a461fdb5a32ce6a78262680453e83c6..1fdb8748638d6322a4eed241f4157f5bb36bcf01 100644 (file)
@@ -5,7 +5,7 @@
 /**
  * ml510_ail_quirk
  */
-static void __devinit ml510_ali_quirk(struct pci_dev *dev)
+static void ml510_ali_quirk(struct pci_dev *dev)
 {
        /* Enable the IDE controller */
        pci_write_config_byte(dev, 0x58, 0x4c);
index a51cb07bd663debc0b9f9fb17211e0a57cbed1f1..692998244d2c316d54880b262653fe21c66c9e35 100644 (file)
@@ -669,7 +669,7 @@ static struct miscdevice mpc52xx_wdt_miscdev = {
        .fops           = &mpc52xx_wdt_fops,
 };
 
-static int __devinit mpc52xx_gpt_wdt_init(void)
+static int mpc52xx_gpt_wdt_init(void)
 {
        int err;
 
@@ -704,7 +704,7 @@ static int mpc52xx_gpt_wdt_setup(struct mpc52xx_gpt_priv *gpt,
 
 #else
 
-static int __devinit mpc52xx_gpt_wdt_init(void)
+static int mpc52xx_gpt_wdt_init(void)
 {
        return 0;
 }
@@ -720,7 +720,7 @@ static inline int mpc52xx_gpt_wdt_setup(struct mpc52xx_gpt_priv *gpt,
 /* ---------------------------------------------------------------------
  * of_platform bus binding code
  */
-static int __devinit mpc52xx_gpt_probe(struct platform_device *ofdev)
+static int mpc52xx_gpt_probe(struct platform_device *ofdev)
 {
        struct mpc52xx_gpt_priv *gpt;
 
index 16150fa430f931713231497b15421ab50cafd636..f9f4537f546dfc7380b73ed002b17cf924339e7c 100644 (file)
@@ -470,7 +470,7 @@ void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req)
 }
 EXPORT_SYMBOL(mpc52xx_lpbfifo_abort);
 
-static int __devinit mpc52xx_lpbfifo_probe(struct platform_device *op)
+static int mpc52xx_lpbfifo_probe(struct platform_device *op)
 {
        struct resource res;
        int rc = -ENOMEM;
@@ -540,7 +540,7 @@ static int __devinit mpc52xx_lpbfifo_probe(struct platform_device *op)
 }
 
 
-static int __devexit mpc52xx_lpbfifo_remove(struct platform_device *op)
+static int mpc52xx_lpbfifo_remove(struct platform_device *op)
 {
        if (lpbfifo.dev != &op->dev)
                return 0;
@@ -564,7 +564,7 @@ static int __devexit mpc52xx_lpbfifo_remove(struct platform_device *op)
        return 0;
 }
 
-static struct of_device_id mpc52xx_lpbfifo_match[] __devinitconst = {
+static struct of_device_id mpc52xx_lpbfifo_match[] = {
        { .compatible = "fsl,mpc5200-lpbfifo", },
        {},
 };
@@ -576,6 +576,6 @@ static struct platform_driver mpc52xx_lpbfifo_driver = {
                .of_match_table = mpc52xx_lpbfifo_match,
        },
        .probe = mpc52xx_lpbfifo_probe,
-       .remove = __devexit_p(mpc52xx_lpbfifo_remove),
+       .remove = mpc52xx_lpbfifo_remove,
 };
 module_platform_driver(mpc52xx_lpbfifo_driver);
index 10ff526cd0467a6ecee78acc30e1d1350922c2e5..79799b29ffe21912dfa437885d2affaf8e916912 100644 (file)
@@ -111,7 +111,7 @@ static struct mdiobb_ctrl ep8248e_mdio_ctrl = {
        .ops = &ep8248e_mdio_ops,
 };
 
-static int __devinit ep8248e_mdio_probe(struct platform_device *ofdev)
+static int ep8248e_mdio_probe(struct platform_device *ofdev)
 {
        struct mii_bus *bus;
        struct resource res;
index ef6537b8ed330185393aa92f54ffc2151d6c255a..624cb51d19c92c58b9821b2e511a6dc8089ff93e 100644 (file)
@@ -145,8 +145,7 @@ static int mcu_gpiochip_remove(struct mcu *mcu)
        return gpiochip_remove(&mcu->gc);
 }
 
-static int __devinit mcu_probe(struct i2c_client *client,
-                              const struct i2c_device_id *id)
+static int mcu_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
        struct mcu *mcu;
        int ret;
@@ -188,7 +187,7 @@ err:
        return ret;
 }
 
-static int __devexit mcu_remove(struct i2c_client *client)
+static int mcu_remove(struct i2c_client *client)
 {
        struct mcu *mcu = i2c_get_clientdata(client);
        int ret;
@@ -216,7 +215,7 @@ static const struct i2c_device_id mcu_ids[] = {
 };
 MODULE_DEVICE_TABLE(i2c, mcu_ids);
 
-static struct of_device_id mcu_of_match_table[] __devinitdata = {
+static struct of_device_id mcu_of_match_table[] = {
        { .compatible = "fsl,mcu-mpc8349emitx", },
        { },
 };
@@ -228,7 +227,7 @@ static struct i2c_driver mcu_driver = {
                .of_match_table = mcu_of_match_table,
        },
        .probe = mcu_probe,
-       .remove = __devexit_p(mcu_remove),
+       .remove = mcu_remove,
        .id_table = mcu_ids,
 };
 
index ed69c9250717d19721924a50e7a6b3934bf5a1a5..6f355d8c92f62ebb426cd051632c042755120d7c 100644 (file)
@@ -64,7 +64,7 @@ void __init corenet_ds_setup_arch(void)
        pr_info("%s board from Freescale Semiconductor\n", ppc_md.name);
 }
 
-static const struct of_device_id of_device_ids[] __devinitconst = {
+static const struct of_device_id of_device_ids[] = {
        {
                .compatible     = "simple-bus"
        },
index c474505ad0d06c39ec340d8373c507eba509b1ac..7a31a0e1df2987b0bf33bd33c90b971676c57f5e 100644 (file)
@@ -154,7 +154,7 @@ static void __init mpc85xx_cds_pci_irq_fixup(struct pci_dev *dev)
        }
 }
 
-static void __devinit skip_fake_bridge(struct pci_dev *dev)
+static void skip_fake_bridge(struct pci_dev *dev)
 {
        /* Make it an error to skip the fake bridge
         * in pci_setup_device() in probe.c */
index b4e58cdc09a53cc3cd9e998a2a1efe0443457eb2..ec0b7272fae25bcc5af5570fd75e5a567ff7d3b9 100644 (file)
@@ -85,7 +85,7 @@ static void tqm85xx_show_cpuinfo(struct seq_file *m)
        seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f));
 }
 
-static void __devinit tqm85xx_ti1520_fixup(struct pci_dev *pdev)
+static void tqm85xx_ti1520_fixup(struct pci_dev *pdev)
 {
        unsigned int val;
 
index bf5338754c5a301d83d8dbd9fc652fa482912b9f..c23f3443880ac96d138c1483120802559a5ee75b 100644 (file)
@@ -159,7 +159,7 @@ static void gef_ppc9a_show_cpuinfo(struct seq_file *m)
                gef_ppc9a_get_vme_is_syscon() ? "yes" : "no");
 }
 
-static void __devinit gef_ppc9a_nec_fixup(struct pci_dev *pdev)
+static void gef_ppc9a_nec_fixup(struct pci_dev *pdev)
 {
        unsigned int val;
 
index 0b7851330a07aebb9f9f1f5e83252347d4901c57..8a6ac20686ea2b0218c89059521788b7377a0ad9 100644 (file)
@@ -146,7 +146,7 @@ static void gef_sbc310_show_cpuinfo(struct seq_file *m)
 
 }
 
-static void __devinit gef_sbc310_nec_fixup(struct pci_dev *pdev)
+static void gef_sbc310_nec_fixup(struct pci_dev *pdev)
 {
        unsigned int val;
 
index b9eb174897b16c621c3cee6fa8dcabd911f12744..06c72636f2992d5ac3a632cc28ab05ccb8b6048f 100644 (file)
@@ -136,7 +136,7 @@ static void gef_sbc610_show_cpuinfo(struct seq_file *m)
        seq_printf(m, "SVR\t\t: 0x%x\n", svid);
 }
 
-static void __devinit gef_sbc610_nec_fixup(struct pci_dev *pdev)
+static void gef_sbc610_nec_fixup(struct pci_dev *pdev)
 {
        unsigned int val;
 
index 4ab08767118534c780b1136adf909024c7893414..6ae25fb620158fee8386d4f7ef5352f7170ac58b 100644 (file)
@@ -117,7 +117,7 @@ static void cell_fixup_pcie_rootcomplex(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, cell_fixup_pcie_rootcomplex);
 
-static int __devinit cell_setup_phb(struct pci_controller *phb)
+static int cell_setup_phb(struct pci_controller *phb)
 {
        const char *model;
        struct device_node *np;
index 49a65e2dfc71ab2392692a810da0b984c067f37e..d35dbbc8ec7919fe12287ad075b12c40312b4ffc 100644 (file)
@@ -67,7 +67,7 @@ static cpumask_t of_spin_map;
  *     0       - failure
  *     1       - success
  */
-static inline int __devinit smp_startup_cpu(unsigned int lcpu)
+static inline int smp_startup_cpu(unsigned int lcpu)
 {
        int status;
        unsigned long start_here = __pa((u32)*((unsigned long *)
@@ -108,7 +108,7 @@ static int __init smp_iic_probe(void)
        return cpumask_weight(cpu_possible_mask);
 }
 
-static void __devinit smp_cell_setup_cpu(int cpu)
+static void smp_cell_setup_cpu(int cpu)
 {
        if (cpu != boot_cpuid)
                iic_setup_cpu();
@@ -119,7 +119,7 @@ static void __devinit smp_cell_setup_cpu(int cpu)
        mtspr(SPRN_DABRX, DABRX_KERNEL | DABRX_USER);
 }
 
-static int __devinit smp_cell_kick_cpu(int nr)
+static int smp_cell_kick_cpu(int nr)
 {
        BUG_ON(nr < 0 || nr >= NR_CPUS);
 
index 83285c5a2049eb69ed7c35d8f14c4b470d3527da..1b87e198faa78c059fb853532564e55cf985a737 100644 (file)
@@ -323,7 +323,7 @@ chrp_find_bridges(void)
  * ATA controller to be set to fully native mode or bad things
  * will happen.
  */
-static void __devinit chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105)
+static void chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105)
 {
        u8 progif;
 
index feab30bbae233b27ff9ed9f2a84a008af770b0f4..dead91b177b9df702e236d9abba5a379a5aa793d 100644 (file)
@@ -30,7 +30,7 @@
 #include <asm/mpic.h>
 #include <asm/rtas.h>
 
-static int __devinit smp_chrp_kick_cpu(int nr)
+static int smp_chrp_kick_cpu(int nr)
 {
        *(unsigned long *)KERNELBASE = nr;
        asm volatile("dcbf 0,%0"::"r"(KERNELBASE):"memory");
@@ -38,7 +38,7 @@ static int __devinit smp_chrp_kick_cpu(int nr)
        return 0;
 }
 
-static void __devinit smp_chrp_setup_cpu(int cpu_nr)
+static void smp_chrp_setup_cpu(int cpu_nr)
 {
        mpic_setup_this_cpu();
 }
index 64fde058e54570d812de8501631e4ebb03863584..92ac9b52b32dfcfb6a469db4f90e07529042aa25 100644 (file)
@@ -59,7 +59,7 @@ static inline bool is_quirk_valid(void)
 }
 
 /* Bridge */
-static void __devinit early_uli5249(struct pci_dev *dev)
+static void early_uli5249(struct pci_dev *dev)
 {
        unsigned char temp;
 
@@ -82,7 +82,7 @@ static void __devinit early_uli5249(struct pci_dev *dev)
 }
 
 
-static void __devinit quirk_uli1575(struct pci_dev *dev)
+static void quirk_uli1575(struct pci_dev *dev)
 {
        int i;
 
@@ -139,7 +139,7 @@ static void __devinit quirk_uli1575(struct pci_dev *dev)
        pci_write_config_byte(dev, 0x75, ULI_8259_IRQ15);
 }
 
-static void __devinit quirk_final_uli1575(struct pci_dev *dev)
+static void quirk_final_uli1575(struct pci_dev *dev)
 {
        /* Set i8259 interrupt trigger
         * IRQ 3:  Level
@@ -175,7 +175,7 @@ static void __devinit quirk_final_uli1575(struct pci_dev *dev)
 }
 
 /* SATA */
-static void __devinit quirk_uli5288(struct pci_dev *dev)
+static void quirk_uli5288(struct pci_dev *dev)
 {
        unsigned char c;
        unsigned int d;
@@ -200,7 +200,7 @@ static void __devinit quirk_uli5288(struct pci_dev *dev)
 }
 
 /* PATA */
-static void __devinit quirk_uli5229(struct pci_dev *dev)
+static void quirk_uli5229(struct pci_dev *dev)
 {
        unsigned short temp;
 
@@ -216,7 +216,7 @@ static void __devinit quirk_uli5229(struct pci_dev *dev)
 }
 
 /* We have to do a dummy read on the P2P for the RTC to work, WTF */
-static void __devinit quirk_final_uli5249(struct pci_dev *dev)
+static void quirk_final_uli5249(struct pci_dev *dev)
 {
        int i;
        u8 *dummy;
@@ -253,7 +253,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x5249, quirk_final_uli5249);
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x1575, quirk_final_uli1575);
 DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229);
 
-static void __devinit hpcd_quirk_uli1575(struct pci_dev *dev)
+static void hpcd_quirk_uli1575(struct pci_dev *dev)
 {
        u32 temp32;
 
@@ -269,7 +269,7 @@ static void __devinit hpcd_quirk_uli1575(struct pci_dev *dev)
        pci_write_config_dword(dev, 0x90, (temp32 | 1<<22));
 }
 
-static void __devinit hpcd_quirk_uli5288(struct pci_dev *dev)
+static void hpcd_quirk_uli5288(struct pci_dev *dev)
 {
        unsigned char c;
 
@@ -295,7 +295,7 @@ static void __devinit hpcd_quirk_uli5288(struct pci_dev *dev)
  * IRQ14 is a sideband interrupt from IDE device to CPU and we use this
  * as the interrupt for IDE device.
  */
-static void __devinit hpcd_quirk_uli5229(struct pci_dev *dev)
+static void hpcd_quirk_uli5229(struct pci_dev *dev)
 {
        unsigned char c;
 
@@ -317,7 +317,7 @@ static void __devinit hpcd_quirk_uli5229(struct pci_dev *dev)
  * bug by re-assigning a correct irq to 5288.
  *
  */
-static void __devinit hpcd_final_uli5288(struct pci_dev *dev)
+static void hpcd_final_uli5288(struct pci_dev *dev)
 {
        struct pci_controller *hose = pci_bus_to_host(dev->bus);
        struct device_node *hosenode = hose ? hose->dn : NULL;
index 465ee8f5c0868070d9ea8364a340a5aa1a5b6bda..f7136aae8bbf9d5ca51c33a2fd46e61a73aeaea4 100644 (file)
@@ -543,7 +543,7 @@ static int __init maple_add_bridge(struct device_node *dev)
 }
 
 
-void __devinit maple_pci_irq_fixup(struct pci_dev *dev)
+void maple_pci_irq_fixup(struct pci_dev *dev)
 {
        DBG(" -> maple_pci_irq_fixup\n");
 
@@ -648,7 +648,7 @@ int maple_pci_get_legacy_ide_irq(struct pci_dev *pdev, int channel)
        return irq;
 }
 
-static void __devinit quirk_ipr_msi(struct pci_dev *dev)
+static void quirk_ipr_msi(struct pci_dev *dev)
 {
        /* Something prevents MSIs from the IPR from working on Bimini,
         * and the driver has no smarts to recover. So disable MSI
index 9886296e08dac7d32ad0bdf89f8911a3cf134720..0237ab782fb8ba45c3791e8df598f4b9147f1c3e 100644 (file)
@@ -216,7 +216,7 @@ static int gpio_mdio_reset(struct mii_bus *bus)
 }
 
 
-static int __devinit gpio_mdio_probe(struct platform_device *ofdev)
+static int gpio_mdio_probe(struct platform_device *ofdev)
 {
        struct device *dev = &ofdev->dev;
        struct device_node *np = ofdev->dev.of_node;
index b1e524f7489dadb41028777d97bbd9b2854025c4..ea65bf0eb89755b7239b1ba5968164ed4b8a4c76 100644 (file)
@@ -3,8 +3,8 @@
 
 extern unsigned long pas_get_boot_time(void);
 extern void pas_pci_init(void);
-extern void __devinit pas_pci_irq_fixup(struct pci_dev *dev);
-extern void __devinit pas_pci_dma_dev_setup(struct pci_dev *dev);
+extern void pas_pci_irq_fixup(struct pci_dev *dev);
+extern void pas_pci_dma_dev_setup(struct pci_dev *dev);
 
 extern void __iomem *pasemi_pci_getcfgaddr(struct pci_dev *dev, int offset);
 
index 2ed9212d7d59a56aec67df3e631288c0864b5a78..8c54de6d8ec426e11e7a84ee7193159176f0b482 100644 (file)
@@ -76,7 +76,7 @@ static void pas_restart(char *cmd)
 static arch_spinlock_t timebase_lock;
 static unsigned long timebase;
 
-static void __devinit pas_give_timebase(void)
+static void pas_give_timebase(void)
 {
        unsigned long flags;
 
@@ -94,7 +94,7 @@ static void __devinit pas_give_timebase(void)
        local_irq_restore(flags);
 }
 
-static void __devinit pas_take_timebase(void)
+static void pas_take_timebase(void)
 {
        while (!timebase)
                smp_rmb();
index 43bbe1bda9391ad5801112bd4135b6dd813e69c1..2b8af75abc232eb7055abe4ba92bf26f30f0bbba 100644 (file)
@@ -561,7 +561,7 @@ static struct pci_ops u4_pcie_pci_ops =
        .write = u4_pcie_write_config,
 };
 
-static void __devinit pmac_pci_fixup_u4_of_node(struct pci_dev *dev)
+static void pmac_pci_fixup_u4_of_node(struct pci_dev *dev)
 {
        /* Apple's device-tree "hides" the root complex virtual P2P bridge
         * on U4. However, Linux sees it, causing the PCI <-> OF matching
@@ -988,7 +988,7 @@ static int __init pmac_add_bridge(struct device_node *dev)
        return 0;
 }
 
-void __devinit pmac_pci_irq_fixup(struct pci_dev *dev)
+void pmac_pci_irq_fixup(struct pci_dev *dev)
 {
 #ifdef CONFIG_PPC32
        /* Fixup interrupt for the modem/ethernet combo controller.
@@ -1138,7 +1138,7 @@ int pmac_pci_enable_device_hook(struct pci_dev *dev)
        return 0;
 }
 
-void __devinit pmac_pci_fixup_ohci(struct pci_dev *dev)
+void pmac_pci_fixup_ohci(struct pci_dev *dev)
 {
        struct device_node *node = pci_device_to_OF_node(dev);
 
index b4ddaa3fbb298eccc37044f61222d38a688c9f8c..bdb738a69e41890b5bec785ee44257f26cb6f987 100644 (file)
@@ -484,7 +484,7 @@ static void smp_core99_give_timebase(void)
 }
 
 
-static void __devinit smp_core99_take_timebase(void)
+static void smp_core99_take_timebase(void)
 {
        unsigned long flags;
 
@@ -669,7 +669,7 @@ static void smp_core99_gpio_tb_freeze(int freeze)
 volatile static long int core99_l2_cache;
 volatile static long int core99_l3_cache;
 
-static void __devinit core99_init_caches(int cpu)
+static void core99_init_caches(int cpu)
 {
 #ifndef CONFIG_PPC64
        if (!cpu_has_feature(CPU_FTR_L2CR))
@@ -801,7 +801,7 @@ static int __init smp_core99_probe(void)
        return ncpus;
 }
 
-static int __devinit smp_core99_kick_cpu(int nr)
+static int smp_core99_kick_cpu(int nr)
 {
        unsigned int save_vector;
        unsigned long target, flags;
@@ -844,7 +844,7 @@ static int __devinit smp_core99_kick_cpu(int nr)
        return 0;
 }
 
-static void __devinit smp_core99_setup_cpu(int cpu_nr)
+static void smp_core99_setup_cpu(int cpu_nr)
 {
        /* Setup L2/L3 */
        if (cpu_nr != 0)
index 53d052e95cfcb043b339d7d110dc730cae1df9b7..8e90e8906df305b422b7f47b02772c9eb6c552d0 100644 (file)
@@ -76,7 +76,7 @@ static struct pci_dn *pnv_ioda_get_pdn(struct pci_dev *dev)
        return PCI_DN(np);
 }
 
-static int __devinit pnv_ioda_alloc_pe(struct pnv_phb *phb)
+static int pnv_ioda_alloc_pe(struct pnv_phb *phb)
 {
        unsigned long pe;
 
@@ -91,7 +91,7 @@ static int __devinit pnv_ioda_alloc_pe(struct pnv_phb *phb)
        return pe;
 }
 
-static void __devinit pnv_ioda_free_pe(struct pnv_phb *phb, int pe)
+static void pnv_ioda_free_pe(struct pnv_phb *phb, int pe)
 {
        WARN_ON(phb->ioda.pe_array[pe].pdev);
 
@@ -103,7 +103,7 @@ static void __devinit pnv_ioda_free_pe(struct pnv_phb *phb, int pe)
  * but in the meantime, we need to protect them to avoid warnings
  */
 #ifdef CONFIG_PCI_MSI
-static struct pnv_ioda_pe * __devinit pnv_ioda_get_pe(struct pci_dev *dev)
+static struct pnv_ioda_pe *pnv_ioda_get_pe(struct pci_dev *dev)
 {
        struct pci_controller *hose = pci_bus_to_host(dev->bus);
        struct pnv_phb *phb = hose->private_data;
@@ -117,8 +117,7 @@ static struct pnv_ioda_pe * __devinit pnv_ioda_get_pe(struct pci_dev *dev)
 }
 #endif /* CONFIG_PCI_MSI */
 
-static int __devinit pnv_ioda_configure_pe(struct pnv_phb *phb,
-                                          struct pnv_ioda_pe *pe)
+static int pnv_ioda_configure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe)
 {
        struct pci_dev *parent;
        uint8_t bcomp, dcomp, fcomp;
@@ -207,8 +206,8 @@ static int __devinit pnv_ioda_configure_pe(struct pnv_phb *phb,
        return 0;
 }
 
-static void __devinit pnv_ioda_link_pe_by_weight(struct pnv_phb *phb,
-                                                struct pnv_ioda_pe *pe)
+static void pnv_ioda_link_pe_by_weight(struct pnv_phb *phb,
+                                      struct pnv_ioda_pe *pe)
 {
        struct pnv_ioda_pe *lpe;
 
@@ -246,7 +245,7 @@ static unsigned int pnv_ioda_dma_weight(struct pci_dev *dev)
 }
 
 #if 0
-static struct pnv_ioda_pe * __devinit pnv_ioda_setup_dev_PE(struct pci_dev *dev)
+static struct pnv_ioda_pe *pnv_ioda_setup_dev_PE(struct pci_dev *dev)
 {
        struct pci_controller *hose = pci_bus_to_host(dev->bus);
        struct pnv_phb *phb = hose->private_data;
@@ -343,7 +342,7 @@ static void pnv_ioda_setup_same_PE(struct pci_bus *bus, struct pnv_ioda_pe *pe)
  * subordinate PCI devices and buses. The second type of PE is normally
  * orgiriated by PCIe-to-PCI bridge or PLX switch downstream ports.
  */
-static void __devinit pnv_ioda_setup_bus_PE(struct pci_bus *bus, int all)
+static void pnv_ioda_setup_bus_PE(struct pci_bus *bus, int all)
 {
        struct pci_controller *hose = pci_bus_to_host(bus);
        struct pnv_phb *phb = hose->private_data;
@@ -399,7 +398,7 @@ static void __devinit pnv_ioda_setup_bus_PE(struct pci_bus *bus, int all)
        pnv_ioda_link_pe_by_weight(phb, pe);
 }
 
-static void __devinit pnv_ioda_setup_PEs(struct pci_bus *bus)
+static void pnv_ioda_setup_PEs(struct pci_bus *bus)
 {
        struct pci_dev *dev;
 
@@ -423,7 +422,7 @@ static void __devinit pnv_ioda_setup_PEs(struct pci_bus *bus)
  * port to PE# here. The game rule here is expected to be changed
  * as soon as we can detected PLX bridge correctly.
  */
-static void __devinit pnv_pci_ioda_setup_PEs(void)
+static void pnv_pci_ioda_setup_PEs(void)
 {
        struct pci_controller *hose, *tmp;
 
@@ -432,14 +431,12 @@ static void __devinit pnv_pci_ioda_setup_PEs(void)
        }
 }
 
-static void __devinit pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb,
-                                                struct pci_dev *dev)
+static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *dev)
 {
        /* We delay DMA setup after we have assigned all PE# */
 }
 
-static void __devinit pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe,
-                                            struct pci_bus *bus)
+static void pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe, struct pci_bus *bus)
 {
        struct pci_dev *dev;
 
@@ -450,10 +447,9 @@ static void __devinit pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe,
        }
 }
 
-static void __devinit pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb,
-                                               struct pnv_ioda_pe *pe,
-                                               unsigned int base,
-                                               unsigned int segs)
+static void pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb,
+                                     struct pnv_ioda_pe *pe, unsigned int base,
+                                     unsigned int segs)
 {
 
        struct page *tce_mem = NULL;
@@ -541,7 +537,7 @@ static void __devinit pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb,
                __free_pages(tce_mem, get_order(TCE32_TABLE_SIZE * segs));
 }
 
-static void __devinit pnv_ioda_setup_dma(struct pnv_phb *phb)
+static void pnv_ioda_setup_dma(struct pnv_phb *phb)
 {
        struct pci_controller *hose = phb->hose;
        unsigned int residual, remaining, segs, tw, base;
@@ -684,8 +680,8 @@ static void pnv_pci_init_ioda_msis(struct pnv_phb *phb) { }
  * to bottom style. So the the I/O or MMIO segment assigned to
  * parent PE could be overrided by its child PEs if necessary.
  */
-static void __devinit pnv_ioda_setup_pe_seg(struct pci_controller *hose,
-                               struct pnv_ioda_pe *pe)
+static void pnv_ioda_setup_pe_seg(struct pci_controller *hose,
+                                 struct pnv_ioda_pe *pe)
 {
        struct pnv_phb *phb = hose->private_data;
        struct pci_bus_region region;
@@ -753,7 +749,7 @@ static void __devinit pnv_ioda_setup_pe_seg(struct pci_controller *hose,
        }
 }
 
-static void __devinit pnv_pci_ioda_setup_seg(void)
+static void pnv_pci_ioda_setup_seg(void)
 {
        struct pci_controller *tmp, *hose;
        struct pnv_phb *phb;
@@ -767,7 +763,7 @@ static void __devinit pnv_pci_ioda_setup_seg(void)
        }
 }
 
-static void __devinit pnv_pci_ioda_setup_DMA(void)
+static void pnv_pci_ioda_setup_DMA(void)
 {
        struct pci_controller *hose, *tmp;
        struct pnv_phb *phb;
@@ -781,7 +777,7 @@ static void __devinit pnv_pci_ioda_setup_DMA(void)
        }
 }
 
-static void __devinit pnv_pci_ioda_fixup(void)
+static void pnv_pci_ioda_fixup(void)
 {
        pnv_pci_ioda_setup_PEs();
        pnv_pci_ioda_setup_seg();
@@ -829,7 +825,7 @@ static resource_size_t pnv_pci_window_alignment(struct pci_bus *bus,
 /* Prevent enabling devices for which we couldn't properly
  * assign a PE
  */
-static int __devinit pnv_pci_enable_device_hook(struct pci_dev *dev)
+static int pnv_pci_enable_device_hook(struct pci_dev *dev)
 {
        struct pci_controller *hose = pci_bus_to_host(dev->bus);
        struct pnv_phb *phb = hose->private_data;
index 6b4bef4e9d821aa2519cf2a4eecdb7ada4d5f57a..7db8771a40f5e53ab8ea017431ed904f09cb46e2 100644 (file)
@@ -84,8 +84,8 @@ static void pnv_pci_init_p5ioc2_msis(struct pnv_phb *phb)
 static void pnv_pci_init_p5ioc2_msis(struct pnv_phb *phb) { }
 #endif /* CONFIG_PCI_MSI */
 
-static void __devinit pnv_pci_p5ioc2_dma_dev_setup(struct pnv_phb *phb,
-                                                  struct pci_dev *pdev)
+static void pnv_pci_p5ioc2_dma_dev_setup(struct pnv_phb *phb,
+                                        struct pci_dev *pdev)
 {
        if (phb->p5ioc2.iommu_table.it_map == NULL)
                iommu_init_table(&phb->p5ioc2.iommu_table, phb->hose->node);
index c01688a1a741f40ff423fe40761d2fd783a46799..b8b8e0bd9897fb92b08961e79e78584c94599ce2 100644 (file)
@@ -464,8 +464,7 @@ void pnv_pci_setup_iommu_table(struct iommu_table *tbl,
        tbl->it_type = TCE_PCI;
 }
 
-static struct iommu_table * __devinit
-pnv_pci_setup_bml_iommu(struct pci_controller *hose)
+static struct iommu_table *pnv_pci_setup_bml_iommu(struct pci_controller *hose)
 {
        struct iommu_table *tbl;
        const __be64 *basep, *swinvp;
@@ -496,8 +495,8 @@ pnv_pci_setup_bml_iommu(struct pci_controller *hose)
        return tbl;
 }
 
-static void __devinit pnv_pci_dma_fallback_setup(struct pci_controller *hose,
-                                                struct pci_dev *pdev)
+static void pnv_pci_dma_fallback_setup(struct pci_controller *hose,
+                                      struct pci_dev *pdev)
 {
        struct device_node *np = pci_bus_to_OF_node(hose->bus);
        struct pci_dn *pdn;
@@ -512,7 +511,7 @@ static void __devinit pnv_pci_dma_fallback_setup(struct pci_controller *hose,
        set_iommu_table_base(&pdev->dev, pdn->iommu_table);
 }
 
-static void __devinit pnv_pci_dma_dev_setup(struct pci_dev *pdev)
+static void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
 {
        struct pci_controller *hose = pci_bus_to_host(pdev->bus);
        struct pnv_phb *phb = hose->private_data;
@@ -527,7 +526,7 @@ static void __devinit pnv_pci_dma_dev_setup(struct pci_dev *pdev)
 }
 
 /* Fixup wrong class code in p7ioc root complex */
-static void __devinit pnv_p7ioc_rc_quirk(struct pci_dev *dev)
+static void pnv_p7ioc_rc_quirk(struct pci_dev *dev)
 {
        dev->class = PCI_CLASS_BRIDGE_PCI << 8;
 }
index 7698b6e13c57f6312a7505a3610fbf6b27271991..0bdc735db16f41e27d1d2b3e58320060a5b9cc03 100644 (file)
@@ -62,7 +62,7 @@ static int pnv_smp_cpu_bootable(unsigned int nr)
        return 1;
 }
 
-int __devinit pnv_smp_kick_cpu(int nr)
+int pnv_smp_kick_cpu(int nr)
 {
        unsigned int pcpu = get_hard_smp_processor_id(nr);
        unsigned long start_here = __pa(*((unsigned long *)
index 9b47ba7a5de774864f65163da84f31dbd54b5333..bfccdc7cb85f99af8128b5821b0aad0650fb46d7 100644 (file)
@@ -437,7 +437,7 @@ found_dev:
        return 0;
 }
 
-int __devinit ps3_repository_find_devices(enum ps3_bus_type bus_type,
+int ps3_repository_find_devices(enum ps3_bus_type bus_type,
        int (*callback)(const struct ps3_repository_device *repo))
 {
        int result = 0;
index 66442341d3a6009882c0039b2049d1f7e3af1800..1efa28f5fc54c9e4234eef5439b0137f39654b1d 100644 (file)
@@ -49,7 +49,7 @@
  * It will create EEH device according to the given OF node. The function
  * might be called by PCI emunation, DR, PHB hotplug.
  */
-void * __devinit eeh_dev_init(struct device_node *dn, void *data)
+void *eeh_dev_init(struct device_node *dn, void *data)
 {
        struct pci_controller *phb = data;
        struct eeh_dev *edev;
@@ -77,7 +77,7 @@ void * __devinit eeh_dev_init(struct device_node *dn, void *data)
  * Scan the PHB OF node and its child association, then create the
  * EEH devices accordingly
  */
-void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb)
+void eeh_dev_phb_init_dynamic(struct pci_controller *phb)
 {
        struct device_node *dn = phb->dn;
 
index d16c8ded10847ce19d67f26a39179587707ddbf0..fe43d1aa2cf1cafcf0b1ef2cae3f9222be7bdce8 100644 (file)
@@ -66,7 +66,7 @@ static struct eeh_pe *eeh_pe_alloc(struct pci_controller *phb, int type)
  * The function should be called while the PHB is detected during
  * system boot or PCI hotplug in order to create PHB PE.
  */
-int __devinit eeh_phb_pe_create(struct pci_controller *phb)
+int eeh_phb_pe_create(struct pci_controller *phb)
 {
        struct eeh_pe *pe;
 
index 261a577a3dd2db2d3e651648368ec72ef52628fd..c91b22be92889bb742569d500db73373eb5331a3 100644 (file)
@@ -149,7 +149,7 @@ void pcibios_add_pci_devices(struct pci_bus * bus)
 }
 EXPORT_SYMBOL_GPL(pcibios_add_pci_devices);
 
-struct pci_controller * __devinit init_phb_dynamic(struct device_node *dn)
+struct pci_controller *init_phb_dynamic(struct device_node *dn)
 {
        struct pci_controller *phb;
 
index 9fc0a4941908589aa334a96d47f5b6bb96bfe460..80cd0be71e06dcba2241a9162e73d229a7e5267e 100644 (file)
@@ -87,7 +87,7 @@ int smp_query_cpu_stopped(unsigned int pcpu)
  *     0       - failure
  *     1       - success
  */
-static inline int __devinit smp_startup_cpu(unsigned int lcpu)
+static inline int smp_startup_cpu(unsigned int lcpu)
 {
        int status;
        unsigned long start_here = __pa((u32)*((unsigned long *)
@@ -133,7 +133,7 @@ out:
        return 1;
 }
 
-static void __devinit smp_xics_setup_cpu(int cpu)
+static void smp_xics_setup_cpu(int cpu)
 {
        if (cpu != boot_cpuid)
                xics_setup_cpu();
@@ -148,7 +148,7 @@ static void __devinit smp_xics_setup_cpu(int cpu)
 #endif
 }
 
-static int __devinit smp_pSeries_kick_cpu(int nr)
+static int smp_pSeries_kick_cpu(int nr)
 {
        BUG_ON(nr < 0 || nr >= NR_CPUS);
 
index 141e78032097326fc9c17742ea3d67023e6d8238..b56b70aeb4971c6f68a9c0815bfcadce906947ac 100644 (file)
@@ -337,8 +337,7 @@ scom_fail:
        return rc;
 }
 
-int __devinit a2_scom_startup_cpu(unsigned int lcpu, int thr_idx,
-                                 struct device_node *np)
+int a2_scom_startup_cpu(unsigned int lcpu, int thr_idx, struct device_node *np)
 {
        u64 init_iar, init_msr, init_ccr2;
        unsigned long start_here;
index 0ba103ae83a53c5218c5517227e942bf800753ba..332a18b814037843e2b21619b9a7bae2f4bba11e 100644 (file)
@@ -23,7 +23,7 @@
 #include "ics.h"
 #include "wsp.h"
 
-static void __devinit smp_a2_setup_cpu(int cpu)
+static void smp_a2_setup_cpu(int cpu)
 {
        doorbell_setup_this_cpu();
 
@@ -31,7 +31,7 @@ static void __devinit smp_a2_setup_cpu(int cpu)
                xics_setup_cpu();
 }
 
-int __devinit smp_a2_kick_cpu(int nr)
+int smp_a2_kick_cpu(int nr)
 {
        const char *enable_method;
        struct device_node *np;
index 10c1d1fff362e14c8ad85b5badb40c6fd44e5ac7..62ef21afb89a8a56189aa6638ee7a0483f6f64b0 100644 (file)
@@ -18,7 +18,7 @@ extern void a2_setup_smp(void);
 extern int a2_scom_startup_cpu(unsigned int lcpu, int thr_idx,
                               struct device_node *np);
 extern int smp_a2_cpu_bootable(unsigned int nr);
-extern int __devinit smp_a2_kick_cpu(int nr);
+extern int smp_a2_kick_cpu(int nr);
 
 extern void opb_pic_init(void);
 
index 1526551f9fe6b5541f08b15d8bbf343537c3d298..8e22f561d171aad87e0ee8f03f229c9a33abaca8 100644 (file)
@@ -402,7 +402,7 @@ static struct wsp_dma_table *wsp_pci_create_dma32_table(struct wsp_phb *phb,
        return ERR_PTR(-ENOMEM);
 }
 
-static void __devinit wsp_pci_dma_dev_setup(struct pci_dev *pdev)
+static void wsp_pci_dma_dev_setup(struct pci_dev *pdev)
 {
        struct dev_archdata *archdata = &pdev->dev.archdata;
        struct pci_controller *hose = pci_bus_to_host(pdev->bus);
index b3fbb271be875efa2e513fffa6314add3db0dd04..d9130630f7ef6f5b8c4b00cff57843bb172c9580 100644 (file)
@@ -30,7 +30,7 @@
 #define DRIVER_NAME "bestcomm-core"
 
 /* MPC5200 device tree match tables */
-static struct of_device_id mpc52xx_sram_ids[] __devinitdata = {
+static struct of_device_id mpc52xx_sram_ids[] = {
        { .compatible = "fsl,mpc5200-sram", },
        { .compatible = "mpc5200-sram", },
        {}
@@ -273,8 +273,7 @@ static u32 fdt_ops[] = {
 };
 
 
-static int __devinit
-bcom_engine_init(void)
+static int bcom_engine_init(void)
 {
        int task;
        phys_addr_t tdt_pa, ctx_pa, var_pa, fdt_pa;
@@ -365,7 +364,7 @@ bcom_engine_cleanup(void)
 /* OF platform driver                                                       */
 /* ======================================================================== */
 
-static int __devinit mpc52xx_bcom_probe(struct platform_device *op)
+static int mpc52xx_bcom_probe(struct platform_device *op)
 {
        struct device_node *ofn_sram;
        struct resource res_bcom;
index d131c8a1cb15908a955147ae9d4eee3bfa5b3eb4..8cf93f029e178449b5e2b69259d6f1efc6fde6a9 100644 (file)
@@ -69,7 +69,7 @@ static int __init get_offset_from_cmdline(char *str)
 __setup("cache-sram-size=", get_size_from_cmdline);
 __setup("cache-sram-offset=", get_offset_from_cmdline);
 
-static int __devinit mpc85xx_l2ctlr_of_probe(struct platform_device *dev)
+static int mpc85xx_l2ctlr_of_probe(struct platform_device *dev)
 {
        long rval;
        unsigned int rem;
@@ -160,7 +160,7 @@ static int __devinit mpc85xx_l2ctlr_of_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit mpc85xx_l2ctlr_of_remove(struct platform_device *dev)
+static int mpc85xx_l2ctlr_of_remove(struct platform_device *dev)
 {
        BUG_ON(!l2ctlr);
 
@@ -213,7 +213,7 @@ static struct platform_driver mpc85xx_l2ctlr_of_platform_driver = {
                .of_match_table = mpc85xx_l2ctlr_of_match,
        },
        .probe          = mpc85xx_l2ctlr_of_probe,
-       .remove         = __devexit_p(mpc85xx_l2ctlr_of_remove),
+       .remove         = mpc85xx_l2ctlr_of_remove,
 };
 
 static __init int mpc85xx_l2ctlr_of_init(void)
index 097cc9d2585b8341068cbed9699128599dd978ec..2a36fd6a958320b58668f6e4741b10c2ceecffc5 100644 (file)
@@ -73,7 +73,7 @@ int fsl_ifc_find(phys_addr_t addr_base)
 }
 EXPORT_SYMBOL(fsl_ifc_find);
 
-static int __devinit fsl_ifc_ctrl_init(struct fsl_ifc_ctrl *ctrl)
+static int fsl_ifc_ctrl_init(struct fsl_ifc_ctrl *ctrl)
 {
        struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
 
@@ -211,7 +211,7 @@ static irqreturn_t fsl_ifc_ctrl_irq(int irqno, void *data)
  * resources for the NAND banks themselves are allocated
  * in the chip probe function.
 */
-static int __devinit fsl_ifc_ctrl_probe(struct platform_device *dev)
+static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 {
        int ret = 0;
 
index 483126d7b3c0f51dce66f6d73881f1888c7d8e40..300be2d06a26f09bc642c8cad0ef5d84422cdfac 100644 (file)
@@ -185,8 +185,8 @@ int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base, u32 mar)
 }
 EXPORT_SYMBOL(fsl_upm_run_pattern);
 
-static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl,
-                                      struct device_node *node)
+static int fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl,
+                            struct device_node *node)
 {
        struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
 
@@ -273,7 +273,7 @@ static irqreturn_t fsl_lbc_ctrl_irq(int irqno, void *data)
  * in the chip probe function.
 */
 
-static int __devinit fsl_lbc_ctrl_probe(struct platform_device *dev)
+static int fsl_lbc_ctrl_probe(struct platform_device *dev)
 {
        int ret;
 
index 63c5f04ea580177649aba38d101cb3f86b40cb35..6e53d97abd3fccb83c48bd179c7f68bfd76ca48c 100644 (file)
@@ -333,9 +333,8 @@ static int fsl_of_msi_remove(struct platform_device *ofdev)
        return 0;
 }
 
-static int __devinit fsl_msi_setup_hwirq(struct fsl_msi *msi,
-                                        struct platform_device *dev,
-                                        int offset, int irq_index)
+static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev,
+                              int offset, int irq_index)
 {
        struct fsl_msi_cascade_data *cascade_data = NULL;
        int virt_msir;
@@ -363,7 +362,7 @@ static int __devinit fsl_msi_setup_hwirq(struct fsl_msi *msi,
 }
 
 static const struct of_device_id fsl_of_msi_ids[];
-static int __devinit fsl_of_msi_probe(struct platform_device *dev)
+static int fsl_of_msi_probe(struct platform_device *dev)
 {
        const struct of_device_id *match;
        struct fsl_msi *msi;
index 5ba325bff3a28422cbbe2303e24783eca452fb38..92a5915b18276ec2cd0fc3b0d27107e770cd98a8 100644 (file)
@@ -36,7 +36,7 @@
 
 static int fsl_pcie_bus_fixup, is_mpc83xx_pci;
 
-static void __devinit quirk_fsl_pcie_header(struct pci_dev *dev)
+static void quirk_fsl_pcie_header(struct pci_dev *dev)
 {
        u8 hdr_type;
 
@@ -871,7 +871,7 @@ void fsl_pci_assign_primary(void)
        }
 }
 
-static int __devinit fsl_pci_probe(struct platform_device *pdev)
+static int fsl_pci_probe(struct platform_device *pdev)
 {
        int ret;
        struct device_node *node;
index 5b6f556094dd088271b569cd6c79f8c85fe2bf0d..e2fb3171f41b80545a99043b5a222b84adb799ba 100644 (file)
@@ -644,7 +644,7 @@ err_rio_regs:
 
 /* The probe function for RapidIO peer-to-peer network.
  */
-static int __devinit fsl_of_rio_rpn_probe(struct platform_device *dev)
+static int fsl_of_rio_rpn_probe(struct platform_device *dev)
 {
        printk(KERN_INFO "Setting up RapidIO peer-to-peer network %s\n",
                        dev->dev.of_node->full_name);
index 9c6e535daad27b676422ea0813f27d322c576452..3b2efd41abf24d76710e0b38b176870c0e37f502 100644 (file)
@@ -1864,7 +1864,7 @@ int __init smp_mpic_probe(void)
        return nr_cpus;
 }
 
-void __devinit smp_mpic_setup_cpu(int cpu)
+void smp_mpic_setup_cpu(int cpu)
 {
        mpic_setup_this_cpu();
 }
index e961f8c4a8f070f341c2b80bbd8a18456a323ade..c75325865a8573053e0e47279d00d046c19dab9f 100644 (file)
@@ -160,7 +160,7 @@ static int mpic_msgr_block_number(struct device_node *node)
 
 /* The probe function for a single message register block.
  */
-static __devinit int mpic_msgr_probe(struct platform_device *dev)
+static int mpic_msgr_probe(struct platform_device *dev)
 {
        void __iomem *msgr_block_addr;
        int block_number;
index 364b14d4754b995336f7d7058806ddf2ab25c25c..330d56613c5a0ca88513e234cbbe0ce15ce77b11 100644 (file)
@@ -104,7 +104,7 @@ subsys_initcall(mv64x60_sysfs_init);
 
 #endif /* CONFIG_SYSFS */
 
-static void __devinit mv64x60_pci_fixup_early(struct pci_dev *dev)
+static void mv64x60_pci_fixup_early(struct pci_dev *dev)
 {
        /*
         * Set the host bridge hdr_type to an invalid value so that
index 82c6702dcbab7a756a7ed53de6c7638348f15c97..43948da837a799628aed3c33d9b89871ea4dc3b0 100644 (file)
@@ -220,7 +220,7 @@ static int ppc4xx_of_msi_remove(struct platform_device *dev)
        return 0;
 }
 
-static int __devinit ppc4xx_msi_probe(struct platform_device *dev)
+static int ppc4xx_msi_probe(struct platform_device *dev)
 {
        struct ppc4xx_msi *msi;
        struct resource res;
index de015d85e3e5f9ce7f3f308e3bb5175d7bfcd2c0..bb9bdcd20864ea41546e670df5369c7bebfdda2d 100644 (file)
  */
 #define MAX_DMA_ADDRESS         0x80000000
 
+#ifdef CONFIG_PCI
+extern int isa_dma_bridge_buggy;
+#else
+#define isa_dma_bridge_buggy   (0)
+#endif
+
 #endif /* _ASM_S390_DMA_H */
index 16c3eb164f4fe0cdb44b91eb3be271743b8beeb8..27cb32185ce1d950e5a6097198a1864a69e6594b 100644 (file)
@@ -85,6 +85,11 @@ static inline void iounmap(volatile void __iomem *addr)
 #define __raw_writel   zpci_write_u32
 #define __raw_writeq   zpci_write_u64
 
+#define readb_relaxed  readb
+#define readw_relaxed  readw
+#define readl_relaxed  readl
+#define readq_relaxed  readq
+
 #endif /* CONFIG_PCI */
 
 #include <asm-generic/io.h>
index e6972f85d2b0926e58832e955cefb538e58618e7..7def77302d630995a1018cd2ffe02a05ee289e10 100644 (file)
@@ -2,43 +2,61 @@
 #define _ASM_IRQ_H
 
 #include <linux/hardirq.h>
+#include <linux/percpu.h>
+#include <linux/cache.h>
 #include <linux/types.h>
 
-enum interruption_class {
+enum interruption_main_class {
        EXTERNAL_INTERRUPT,
        IO_INTERRUPT,
-       EXTINT_CLK,
-       EXTINT_EXC,
-       EXTINT_EMS,
-       EXTINT_TMR,
-       EXTINT_TLA,
-       EXTINT_PFL,
-       EXTINT_DSD,
-       EXTINT_VRT,
-       EXTINT_SCP,
-       EXTINT_IUC,
-       EXTINT_CMS,
-       EXTINT_CMC,
-       EXTINT_CMR,
-       IOINT_CIO,
-       IOINT_QAI,
-       IOINT_DAS,
-       IOINT_C15,
-       IOINT_C70,
-       IOINT_TAP,
-       IOINT_VMR,
-       IOINT_LCS,
-       IOINT_CLW,
-       IOINT_CTC,
-       IOINT_APB,
-       IOINT_ADM,
-       IOINT_CSC,
-       IOINT_PCI,
-       IOINT_MSI,
+       NR_IRQS
+};
+
+enum interruption_class {
+       IRQEXT_CLK,
+       IRQEXT_EXC,
+       IRQEXT_EMS,
+       IRQEXT_TMR,
+       IRQEXT_TLA,
+       IRQEXT_PFL,
+       IRQEXT_DSD,
+       IRQEXT_VRT,
+       IRQEXT_SCP,
+       IRQEXT_IUC,
+       IRQEXT_CMS,
+       IRQEXT_CMC,
+       IRQEXT_CMR,
+       IRQIO_CIO,
+       IRQIO_QAI,
+       IRQIO_DAS,
+       IRQIO_C15,
+       IRQIO_C70,
+       IRQIO_TAP,
+       IRQIO_VMR,
+       IRQIO_LCS,
+       IRQIO_CLW,
+       IRQIO_CTC,
+       IRQIO_APB,
+       IRQIO_ADM,
+       IRQIO_CSC,
+       IRQIO_PCI,
+       IRQIO_MSI,
        NMI_NMI,
-       NR_IRQS,
+       CPU_RST,
+       NR_ARCH_IRQS
 };
 
+struct irq_stat {
+       unsigned int irqs[NR_ARCH_IRQS];
+};
+
+DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
+
+static __always_inline void inc_irq_stat(enum interruption_class irq)
+{
+       __get_cpu_var(irq_stat).irqs[irq]++;
+}
+
 struct ext_code {
        unsigned short subcode;
        unsigned short code;
index 436d07c23be8febc9ad245fb73e4f1671a004cd9..f99eea7fff0fc4af85cf41ab1fd91ff6e402352b 100644 (file)
@@ -28,7 +28,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -76,4 +76,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _ASM_SOCKET_H */
index 63e6078699f11caf124fdd94ea220cf730f860f3..864f693c237fe440cd02125e588c4b5867b6edb8 100644 (file)
 #define __NR_process_vm_writev 341
 #define __NR_s390_runtime_instr 342
 #define __NR_kcmp              343
-#define NR_syscalls 344
+#define __NR_finit_module      344
+#define NR_syscalls 345
 
 /* 
  * There are some system calls that are not present on 64 bit, some
index 827e094a2f494d09bdf1936cde25df431ec7c012..9b9a805656b505e803a2bb9bb4da21e9c8f6f59c 100644 (file)
@@ -1659,3 +1659,9 @@ ENTRY(sys_kcmp_wrapper)
        llgfr   %r5,%r5                 # unsigned long
        llgfr   %r6,%r6                 # unsigned long
        jg      sys_kcmp
+
+ENTRY(sys_finit_module_wrapper)
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char __user *
+       lgfr    %r4,%r4                 # int
+       jg      sys_finit_module
index ba500d8dc392056ddd66e4978389d072452f6859..4e8215e0d4b6d3047ec7df266e350e0e0ad83992 100644 (file)
@@ -1127,13 +1127,14 @@ debug_register_view(debug_info_t * id, struct debug_view *view)
        if (i == DEBUG_MAX_VIEWS) {
                pr_err("Registering view %s/%s would exceed the maximum "
                       "number of views %i\n", id->name, view->name, i);
-               debugfs_remove(pde);
                rc = -1;
        } else {
                id->views[i] = view;
                id->debugfs_entries[i] = pde;
        }
        spin_unlock_irqrestore(&id->lock, flags);
+       if (rc)
+               debugfs_remove(pde);
 out:
        return rc;
 }
@@ -1146,9 +1147,9 @@ EXPORT_SYMBOL(debug_register_view);
 int
 debug_unregister_view(debug_info_t * id, struct debug_view *view)
 {
-       int rc = 0;
-       int i;
+       struct dentry *dentry = NULL;
        unsigned long flags;
+       int i, rc = 0;
 
        if (!id)
                goto out;
@@ -1160,10 +1161,12 @@ debug_unregister_view(debug_info_t * id, struct debug_view *view)
        if (i == DEBUG_MAX_VIEWS)
                rc = -1;
        else {
-               debugfs_remove(id->debugfs_entries[i]);
+               dentry = id->debugfs_entries[i];
                id->views[i] = NULL;
+               id->debugfs_entries[i] = NULL;
        }
        spin_unlock_irqrestore(&id->lock, flags);
+       debugfs_remove(dentry);
 out:
        return rc;
 }
index bf24293970ce544b358f9bb3f4d4c7daa9bde88f..9df824ea16672aea9e8f6a93ec6c925f7b982a3a 100644 (file)
 #include <asm/irq.h>
 #include "entry.h"
 
+DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
+EXPORT_PER_CPU_SYMBOL_GPL(irq_stat);
+
 struct irq_class {
        char *name;
        char *desc;
 };
 
-static const struct irq_class intrclass_names[] = {
+/*
+ * The list of "main" irq classes on s390. This is the list of interrrupts
+ * that appear both in /proc/stat ("intr" line) and /proc/interrupts.
+ * Historically only external and I/O interrupts have been part of /proc/stat.
+ * We can't add the split external and I/O sub classes since the first field
+ * in the "intr" line in /proc/stat is supposed to be the sum of all other
+ * fields.
+ * Since the external and I/O interrupt fields are already sums we would end
+ * up with having a sum which accounts each interrupt twice.
+ */
+static const struct irq_class irqclass_main_desc[NR_IRQS] = {
        [EXTERNAL_INTERRUPT] = {.name = "EXT"},
-       [IO_INTERRUPT]       = {.name = "I/O"},
-       [EXTINT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"},
-       [EXTINT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"},
-       [EXTINT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"},
-       [EXTINT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"},
-       [EXTINT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"},
-       [EXTINT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"},
-       [EXTINT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"},
-       [EXTINT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"},
-       [EXTINT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"},
-       [EXTINT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"},
-       [EXTINT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"},
-       [EXTINT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
-       [EXTINT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"},
-       [IOINT_CIO]  = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"},
-       [IOINT_QAI]  = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"},
-       [IOINT_DAS]  = {.name = "DAS", .desc = "[I/O] DASD"},
-       [IOINT_C15]  = {.name = "C15", .desc = "[I/O] 3215"},
-       [IOINT_C70]  = {.name = "C70", .desc = "[I/O] 3270"},
-       [IOINT_TAP]  = {.name = "TAP", .desc = "[I/O] Tape"},
-       [IOINT_VMR]  = {.name = "VMR", .desc = "[I/O] Unit Record Devices"},
-       [IOINT_LCS]  = {.name = "LCS", .desc = "[I/O] LCS"},
-       [IOINT_CLW]  = {.name = "CLW", .desc = "[I/O] CLAW"},
-       [IOINT_CTC]  = {.name = "CTC", .desc = "[I/O] CTC"},
-       [IOINT_APB]  = {.name = "APB", .desc = "[I/O] AP Bus"},
-       [IOINT_ADM]  = {.name = "ADM", .desc = "[I/O] EADM Subchannel"},
-       [IOINT_CSC]  = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"},
-       [IOINT_PCI]  = {.name = "PCI", .desc = "[I/O] PCI Interrupt" },
-       [IOINT_MSI] =  {.name = "MSI", .desc = "[I/O] MSI Interrupt" },
+       [IO_INTERRUPT]       = {.name = "I/O"}
+};
+
+/*
+ * The list of split external and I/O interrupts that appear only in
+ * /proc/interrupts.
+ * In addition this list contains non external / I/O events like NMIs.
+ */
+static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = {
+       [IRQEXT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"},
+       [IRQEXT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"},
+       [IRQEXT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"},
+       [IRQEXT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"},
+       [IRQEXT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"},
+       [IRQEXT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"},
+       [IRQEXT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"},
+       [IRQEXT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"},
+       [IRQEXT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"},
+       [IRQEXT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"},
+       [IRQEXT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"},
+       [IRQEXT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"},
+       [IRQEXT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"},
+       [IRQIO_CIO]  = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"},
+       [IRQIO_QAI]  = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"},
+       [IRQIO_DAS]  = {.name = "DAS", .desc = "[I/O] DASD"},
+       [IRQIO_C15]  = {.name = "C15", .desc = "[I/O] 3215"},
+       [IRQIO_C70]  = {.name = "C70", .desc = "[I/O] 3270"},
+       [IRQIO_TAP]  = {.name = "TAP", .desc = "[I/O] Tape"},
+       [IRQIO_VMR]  = {.name = "VMR", .desc = "[I/O] Unit Record Devices"},
+       [IRQIO_LCS]  = {.name = "LCS", .desc = "[I/O] LCS"},
+       [IRQIO_CLW]  = {.name = "CLW", .desc = "[I/O] CLAW"},
+       [IRQIO_CTC]  = {.name = "CTC", .desc = "[I/O] CTC"},
+       [IRQIO_APB]  = {.name = "APB", .desc = "[I/O] AP Bus"},
+       [IRQIO_ADM]  = {.name = "ADM", .desc = "[I/O] EADM Subchannel"},
+       [IRQIO_CSC]  = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"},
+       [IRQIO_PCI]  = {.name = "PCI", .desc = "[I/O] PCI Interrupt" },
+       [IRQIO_MSI]  = {.name = "MSI", .desc = "[I/O] MSI Interrupt" },
        [NMI_NMI]    = {.name = "NMI", .desc = "[NMI] Machine Check"},
+       [CPU_RST]    = {.name = "RST", .desc = "[CPU] CPU Restart"},
 };
 
 /*
@@ -68,30 +90,34 @@ static const struct irq_class intrclass_names[] = {
  */
 int show_interrupts(struct seq_file *p, void *v)
 {
-       int i = *(loff_t *) v, j;
+       int irq = *(loff_t *) v;
+       int cpu;
 
        get_online_cpus();
-       if (i == 0) {
+       if (irq == 0) {
                seq_puts(p, "           ");
-               for_each_online_cpu(j)
-                       seq_printf(p, "CPU%d       ",j);
+               for_each_online_cpu(cpu)
+                       seq_printf(p, "CPU%d       ", cpu);
                seq_putc(p, '\n');
        }
-
-       if (i < NR_IRQS) {
-               seq_printf(p, "%s: ", intrclass_names[i].name);
-#ifndef CONFIG_SMP
-               seq_printf(p, "%10u ", kstat_irqs(i));
-#else
-               for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
-#endif
-               if (intrclass_names[i].desc)
-                       seq_printf(p, "  %s", intrclass_names[i].desc);
-                seq_putc(p, '\n');
-        }
+       if (irq < NR_IRQS) {
+               seq_printf(p, "%s: ", irqclass_main_desc[irq].name);
+               for_each_online_cpu(cpu)
+                       seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[irq]);
+               seq_putc(p, '\n');
+               goto skip_arch_irqs;
+       }
+       for (irq = 0; irq < NR_ARCH_IRQS; irq++) {
+               seq_printf(p, "%s: ", irqclass_sub_desc[irq].name);
+               for_each_online_cpu(cpu)
+                       seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).irqs[irq]);
+               if (irqclass_sub_desc[irq].desc)
+                       seq_printf(p, "  %s", irqclass_sub_desc[irq].desc);
+               seq_putc(p, '\n');
+       }
+skip_arch_irqs:
        put_online_cpus();
-        return 0;
+       return 0;
 }
 
 /*
@@ -222,7 +248,7 @@ void __irq_entry do_extint(struct pt_regs *regs, struct ext_code ext_code,
                /* Serve timer interrupts first. */
                clock_comparator_work();
        }
-       kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++;
+       kstat_incr_irqs_this_cpu(EXTERNAL_INTERRUPT, NULL);
        if (ext_code.code != 0x1004)
                __get_cpu_var(s390_idle).nohz_delay = 1;
 
index a6daa5c5cdb047708be93a173e47095af9d0f9f4..7918fbea36bb31446d6bea5d438854c8c2464938 100644 (file)
@@ -254,7 +254,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs)
        int umode;
 
        nmi_enter();
-       kstat_cpu(smp_processor_id()).irqs[NMI_NMI]++;
+       inc_irq_stat(NMI_NMI);
        mci = (struct mci *) &S390_lowcore.mcck_interruption_code;
        mcck = &__get_cpu_var(cpu_mcck);
        umode = user_mode(regs);
index c4e7269d4a0980d8736c5a9c32e916cb581b0a58..86ec7447e1f5d57f8c4a53eb2867d355db1f45f3 100644 (file)
@@ -229,7 +229,7 @@ static void cpumf_measurement_alert(struct ext_code ext_code,
        if (!(alert & CPU_MF_INT_CF_MASK))
                return;
 
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_CMC]++;
+       inc_irq_stat(IRQEXT_CMC);
        cpuhw = &__get_cpu_var(cpu_hw_events);
 
        /* Measurement alerts are shared and might happen when the PMU
index 61066f6f71a590d3d35fd688e8e6715719919dc1..077a99389b07919a2e0575b6b46249589f3cf968 100644 (file)
@@ -71,7 +71,7 @@ static void runtime_instr_int_handler(struct ext_code ext_code,
        if (!(param32 & CPU_MF_INT_RI_MASK))
                return;
 
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_CMR]++;
+       inc_irq_stat(IRQEXT_CMR);
 
        if (!current->thread.ri_cb)
                return;
index 2568590973ad2e429f394ce4f6147211e7169b11..a5360de85ec7e7eb190f64de6028d08ea2e2c68e 100644 (file)
@@ -16,7 +16,7 @@
 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
 
 #include <linux/errno.h>
-#include <linux/module.h>
+#include <linux/export.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/memblock.h>
@@ -289,6 +289,7 @@ void machine_power_off(void)
  * Dummy power off function.
  */
 void (*pm_power_off)(void) = machine_power_off;
+EXPORT_SYMBOL_GPL(pm_power_off);
 
 static int __init early_parse_mem(char *p)
 {
index ea431e551c6b2704a19d068376d9edb84c3da577..7433a2f9e5ccc3352236f52e8f365147bbb6a433 100644 (file)
@@ -433,9 +433,9 @@ static void do_ext_call_interrupt(struct ext_code ext_code,
 
        cpu = smp_processor_id();
        if (ext_code.code == 0x1202)
-               kstat_cpu(cpu).irqs[EXTINT_EXC]++;
+               inc_irq_stat(IRQEXT_EXC);
        else
-               kstat_cpu(cpu).irqs[EXTINT_EMS]++;
+               inc_irq_stat(IRQEXT_EMS);
        /*
         * handle bit signal external calls
         */
@@ -623,9 +623,9 @@ static struct sclp_cpu_info *smp_get_cpu_info(void)
        return info;
 }
 
-static int __devinit smp_add_present_cpu(int cpu);
+static int __cpuinit smp_add_present_cpu(int cpu);
 
-static int __devinit __smp_rescan_cpus(struct sclp_cpu_info *info,
+static int __cpuinit __smp_rescan_cpus(struct sclp_cpu_info *info,
                                       int sysfs_add)
 {
        struct pcpu *pcpu;
@@ -709,6 +709,7 @@ static void __cpuinit smp_start_secondary(void *cpuvoid)
        pfault_init();
        notify_cpu_starting(smp_processor_id());
        set_cpu_online(smp_processor_id(), true);
+       inc_irq_stat(CPU_RST);
        local_irq_enable();
        /* cpu_idle will call schedule for us */
        cpu_idle();
@@ -986,7 +987,7 @@ static int __cpuinit smp_cpu_notify(struct notifier_block *self,
        return notifier_from_errno(err);
 }
 
-static int __devinit smp_add_present_cpu(int cpu)
+static int __cpuinit smp_add_present_cpu(int cpu)
 {
        struct cpu *c = &pcpu_devices[cpu].cpu;
        struct device *s = &c->dev;
index 48174850f3b0859f05b2b5023f09cdbb827c9d56..6a6c61f94dd32244d62a9d25985ed8844dfb988b 100644 (file)
@@ -352,3 +352,4 @@ SYSCALL(sys_process_vm_readv,sys_process_vm_readv,compat_sys_process_vm_readv_wr
 SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper)
 SYSCALL(sys_ni_syscall,sys_s390_runtime_instr,sys_s390_runtime_instr_wrapper)
 SYSCALL(sys_kcmp,sys_kcmp,sys_kcmp_wrapper)
+SYSCALL(sys_finit_module,sys_finit_module,sys_finit_module_wrapper)
index 7fcd690d42c753bfd027d00b05da12e35cf711cd..aff0e350d776cbc65d68ec11e5aa6418fe4d0651 100644 (file)
@@ -168,7 +168,7 @@ static void clock_comparator_interrupt(struct ext_code ext_code,
                                       unsigned int param32,
                                       unsigned long param64)
 {
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_CLK]++;
+       inc_irq_stat(IRQEXT_CLK);
        if (S390_lowcore.clock_comparator == -1ULL)
                set_clock_comparator(S390_lowcore.clock_comparator);
 }
@@ -179,7 +179,7 @@ static void stp_timing_alert(struct stp_irq_parm *);
 static void timing_alert_interrupt(struct ext_code ext_code,
                                   unsigned int param32, unsigned long param64)
 {
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_TLA]++;
+       inc_irq_stat(IRQEXT_TLA);
        if (param32 & 0x00c40000)
                etr_timing_alert((struct etr_irq_parm *) &param32);
        if (param32 & 0x00038000)
index f1aba87cceb8acfd7d47df98ad3cb0854e3db288..4b2e3e317004a3cf5d725887c1136c9cbcdd4045 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/bootmem.h>
 #include <linux/cpuset.h>
 #include <linux/device.h>
+#include <linux/export.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/init.h>
@@ -42,6 +43,7 @@ static struct mask_info socket_info;
 static struct mask_info book_info;
 
 struct cpu_topology_s390 cpu_topology[NR_CPUS];
+EXPORT_SYMBOL_GPL(cpu_topology);
 
 static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)
 {
index 42601d6e166fe73db1e6e97382df8158212dd5d7..2fb9e63b8fc44e58ae415dddefa3a067f48071da 100644 (file)
@@ -569,7 +569,7 @@ static void pfault_interrupt(struct ext_code ext_code,
        subcode = ext_code.subcode;
        if ((subcode & 0xff00) != __SUBCODE_MASK)
                return;
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++;
+       inc_irq_stat(IRQEXT_PFL);
        /* Get the token (= pid of the affected task). */
        pid = sizeof(void *) == 4 ? param32 : param64;
        rcu_read_lock();
index 0cb385da202c60836fd2cd006e5950ed448de656..b5b2916895e08dd8b562fb7784628c4a0294f55b 100644 (file)
@@ -233,7 +233,7 @@ static void hws_ext_handler(struct ext_code ext_code,
        if (!(param32 & CPU_MF_INT_SF_MASK))
                return;
 
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_CMS]++;
+       inc_irq_stat(IRQEXT_CMS);
        atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);
 
        if (hws_wq)
index 8fa416b8775ffc8a58355d4c9a29c2c4001c94ad..60e0372545d2800778ef067a7da9d139899fc5b8 100644 (file)
@@ -160,35 +160,6 @@ int pci_proc_domain(struct pci_bus *bus)
 }
 EXPORT_SYMBOL_GPL(pci_proc_domain);
 
-/* Store PCI function information block */
-static int zpci_store_fib(struct zpci_dev *zdev, u8 *fc)
-{
-       struct zpci_fib *fib;
-       u8 status, cc;
-
-       fib = (void *) get_zeroed_page(GFP_KERNEL);
-       if (!fib)
-               return -ENOMEM;
-
-       do {
-               cc = __stpcifc(zdev->fh, 0, fib, &status);
-               if (cc == 2) {
-                       msleep(ZPCI_INSN_BUSY_DELAY);
-                       memset(fib, 0, PAGE_SIZE);
-               }
-       } while (cc == 2);
-
-       if (cc)
-               pr_err_once("%s: cc: %u  status: %u\n",
-                           __func__, cc, status);
-
-       /* Return PCI function controls */
-       *fc = fib->fc;
-
-       free_page((unsigned long) fib);
-       return (cc) ? -EIO : 0;
-}
-
 /* Modify PCI: Register adapter interruptions */
 static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb,
                              u64 aibv)
@@ -385,7 +356,7 @@ unsigned int probe_irq_mask(unsigned long val)
 }
 EXPORT_SYMBOL_GPL(probe_irq_mask);
 
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
 }
 
@@ -469,7 +440,7 @@ static void zpci_irq_handler(void *dont, void *need)
        int rescan = 0, max = aisb_max;
        struct zdev_irq_map *imap;
 
-       kstat_cpu(smp_processor_id()).irqs[IOINT_PCI]++;
+       inc_irq_stat(IRQIO_PCI);
        sbit = start;
 
 scan:
@@ -481,7 +452,7 @@ scan:
                /* find vector bit */
                imap = bucket->imap[sbit];
                for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) {
-                       kstat_cpu(smp_processor_id()).irqs[IOINT_MSI]++;
+                       inc_irq_stat(IRQIO_MSI);
                        clear_bit(63 - mbit, &imap->aibv);
 
                        spin_lock(&imap->lock);
index 6138468b420f5653d0e3c96ae485a0e0a1649c95..a547419907c3a46be4e7a64c36f3f1a776abcfcf 100644 (file)
@@ -13,8 +13,6 @@
 #include <linux/pci.h>
 #include <asm/pci_dma.h>
 
-static enum zpci_ioat_dtype zpci_ioat_dt = ZPCI_IOTA_RTTO;
-
 static struct kmem_cache *dma_region_table_cache;
 static struct kmem_cache *dma_page_table_cache;
 
index b25e957436000a1f94f51e8d4264e9500a84469b..f85ec1a7c88e85c683a0cd2faba78513d1b15d0c 100644 (file)
@@ -113,7 +113,7 @@ static inline void setup_protection_map(void)
        protection_map[15] = PAGE_SHARED;
 }
 
-void __devinit cpu_cache_init(void)
+void cpu_cache_init(void)
 {
        setup_protection_map();
 }
index a5fe1b54c952598090fac62b46f31970552a35fc..d6cde700e316950f3abec82476f2e40d2b22ddd2 100644 (file)
@@ -28,7 +28,7 @@
 #include <asm/irq.h>
 #include <mach/pci.h>
 
-static void __devinit gapspci_fixup_resources(struct pci_dev *dev)
+static void gapspci_fixup_resources(struct pci_dev *dev)
 {
        struct pci_channel *p = dev->sysdata;
 
index 81e5dafed3e47aae8b047796f94f85c6bbbef1ef..102f5d58b0371ac512af95a4d8994b91ad53a227 100644 (file)
@@ -32,7 +32,7 @@ static struct pci_channel *hose_head, **hose_tail = &hose_head;
 
 static int pci_initialized;
 
-static void __devinit pcibios_scanbus(struct pci_channel *hose)
+static void pcibios_scanbus(struct pci_channel *hose)
 {
        static int next_busno;
        static int need_domain_info;
@@ -82,7 +82,7 @@ static void __devinit pcibios_scanbus(struct pci_channel *hose)
 DEFINE_RAW_SPINLOCK(pci_config_lock);
 static DEFINE_MUTEX(pci_scan_mutex);
 
-int __devinit register_pci_controller(struct pci_channel *hose)
+int register_pci_controller(struct pci_channel *hose)
 {
        int i;
 
@@ -156,7 +156,7 @@ subsys_initcall(pcibios_init);
  *  Called after each bus is probed, but before its children
  *  are examined.
  */
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
 }
 
index 9e702f2f80452a222e08f490f9095c948b1143e4..c2c85f6cd738c12ed26ca805b7e7acf16f5809da 100644 (file)
@@ -132,7 +132,7 @@ static struct clk fixed_pciexclkp = {
        .rate = 100000000,      /* 100 MHz reference clock */
 };
 
-static void __devinit sh7786_pci_fixup(struct pci_dev *dev)
+static void sh7786_pci_fixup(struct pci_dev *dev)
 {
        /*
         * Prevent enumeration of root complex resources.
index cb33608cc68f3c7c40a01e5ff49949b0ac15f0bf..c55291e5b83e8512f22c107c82ad3a3a49f2c712 100644 (file)
@@ -103,7 +103,7 @@ static inline unsigned int get_dma_residue(unsigned int dmanr)
        return ebus_dma_residue(&sparc_ebus_dmas[dmanr].info);
 }
 
-static int __devinit ecpp_probe(struct platform_device *op)
+static int ecpp_probe(struct platform_device *op)
 {
        unsigned long base = op->resource[0].start;
        unsigned long config = op->resource[1].start;
@@ -192,7 +192,7 @@ out_err:
        return err;
 }
 
-static int __devexit ecpp_remove(struct platform_device *op)
+static int ecpp_remove(struct platform_device *op)
 {
        struct parport *p = dev_get_drvdata(&op->dev);
        int slot = p->dma;
@@ -242,7 +242,7 @@ static struct platform_driver ecpp_driver = {
                .of_match_table = ecpp_match,
        },
        .probe                  = ecpp_probe,
-       .remove                 = __devexit_p(ecpp_remove),
+       .remove                 = ecpp_remove,
 };
 
 static int parport_pc_find_nonpci_ports(int autoirq, int autodma)
index ef3c3682debfde331bed231af7e7466ad070d7a4..01197d8215c4c87c61a40f11f20618ae8dd0a126 100644 (file)
@@ -24,7 +24,7 @@ struct sparc64_tick_ops {
 extern struct sparc64_tick_ops *tick_ops;
 
 extern unsigned long sparc64_get_clock_tick(unsigned int cpu);
-extern void __devinit setup_sparc64_timer(void);
+extern void setup_sparc64_timer(void);
 extern void __init time_init(void);
 
 #endif /* _SPARC64_TIMER_H */
index c83a937ead00676eefef950b6c00d77cd644c8a9..cbbad74b2e06a0c6405ecabd4d054887b404668f 100644 (file)
@@ -15,7 +15,7 @@
 #define SO_PEERCRED    0x0040
 #define SO_LINGER      0x0080
 #define SO_OOBINLINE   0x0100
-/* To add :#define SO_REUSEPORT 0x0200 */
+#define SO_REUSEPORT   0x0200
 #define SO_BSDCOMPAT    0x0400
 #define SO_RCVLOWAT     0x0800
 #define SO_SNDLOWAT     0x1000
@@ -66,6 +66,7 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               0x0027
 
+#define SO_LOCK_FILTER         0x0028
 
 /* Security levels - as per NRL IPv6 - don't actually do anything */
 #define SO_SECURITY_AUTHENTICATION             0x5001
index cac719d1bc5c6b8238ff0b6be5f34bc166980534..62ced589bcf78f1554bcadd4f420fad19c7ebcc1 100644 (file)
 #define __NR_process_vm_writev 339
 #define __NR_kern_features     340
 #define __NR_kcmp              341
+#define __NR_finit_module      342
 
-#define NR_syscalls            342
+#define NR_syscalls            343
 
 /* Bitmask values returned from kern_features system call.  */
 #define KERN_FEATURE_MIXED_MODE_STACK  0x00000001
index 812e10bbb0b332cf648f747884f93d1b3bc22073..348fa1aeabce586fd16ff03fcc89689d20358683 100644 (file)
@@ -31,7 +31,7 @@
 #define APC_DEVNAME "apc"
 
 static u8 __iomem *regs;
-static int apc_no_idle __devinitdata = 0;
+static int apc_no_idle = 0;
 
 #define apc_readb(offs)                (sbus_readb(regs+offs))
 #define apc_writeb(val, offs)  (sbus_writeb(val, regs+offs))
@@ -138,7 +138,7 @@ static const struct file_operations apc_fops = {
 
 static struct miscdevice apc_miscdev = { APC_MINOR, APC_DEVNAME, &apc_fops };
 
-static int __devinit apc_probe(struct platform_device *op)
+static int apc_probe(struct platform_device *op)
 {
        int err;
 
index 773091ac71a31e0ddf9e9e1df63f98d40c6bb222..86e55778e4afa4b68eecfca79628cab52c34cc83 100644 (file)
@@ -102,7 +102,7 @@ static const struct of_device_id auxio_match[] = {
 
 MODULE_DEVICE_TABLE(of, auxio_match);
 
-static int __devinit auxio_probe(struct platform_device *dev)
+static int auxio_probe(struct platform_device *dev)
 {
        struct device_node *dp = dev->dev.of_node;
        unsigned long size;
index 9708851a8b9f3c8a46baaebf708330fcc73a05ed..052b5a44318fd0b4b10c8a5af7e4db5b3c8e12c9 100644 (file)
@@ -33,7 +33,7 @@ struct fhc {
        struct platform_device  leds_pdev;
 };
 
-static int __devinit clock_board_calc_nslots(struct clock_board *p)
+static int clock_board_calc_nslots(struct clock_board *p)
 {
        u8 reg = upa_readb(p->clock_regs + CLOCK_STAT1) & 0xc0;
 
@@ -60,7 +60,7 @@ static int __devinit clock_board_calc_nslots(struct clock_board *p)
        }
 }
 
-static int __devinit clock_board_probe(struct platform_device *op)
+static int clock_board_probe(struct platform_device *op)
 {
        struct clock_board *p = kzalloc(sizeof(*p), GFP_KERNEL);
        int err = -ENOMEM;
@@ -157,7 +157,7 @@ static struct platform_driver clock_board_driver = {
        },
 };
 
-static int __devinit fhc_probe(struct platform_device *op)
+static int fhc_probe(struct platform_device *op)
 {
        struct fhc *p = kzalloc(sizeof(*p), GFP_KERNEL);
        int err = -ENOMEM;
index 5f450260981dd3f564db36387b8e80b817b36986..dbb210d74e21962e58cb5a46ac1ab04fd8c3b1d7 100644 (file)
@@ -336,9 +336,9 @@ static int jbusmc_print_dimm(int syndrome_code,
        return 0;
 }
 
-static u64 __devinit jbusmc_dimm_group_size(u64 base,
-                                           const struct linux_prom64_registers *mem_regs,
-                                           int num_mem_regs)
+static u64 jbusmc_dimm_group_size(u64 base,
+                                 const struct linux_prom64_registers *mem_regs,
+                                 int num_mem_regs)
 {
        u64 max = base + (8UL * 1024 * 1024 * 1024);
        u64 max_seen = base;
@@ -363,10 +363,10 @@ static u64 __devinit jbusmc_dimm_group_size(u64 base,
        return max_seen - base;
 }
 
-static void __devinit jbusmc_construct_one_dimm_group(struct jbusmc *p,
-                                                     unsigned long index,
-                                                     const struct linux_prom64_registers *mem_regs,
-                                                     int num_mem_regs)
+static void jbusmc_construct_one_dimm_group(struct jbusmc *p,
+                                           unsigned long index,
+                                           const struct linux_prom64_registers *mem_regs,
+                                           int num_mem_regs)
 {
        struct jbusmc_dimm_group *dp = &p->dimm_groups[index];
 
@@ -378,9 +378,9 @@ static void __devinit jbusmc_construct_one_dimm_group(struct jbusmc *p,
        dp->size = jbusmc_dimm_group_size(dp->base_addr, mem_regs, num_mem_regs);
 }
 
-static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p,
-                                                  const struct linux_prom64_registers *mem_regs,
-                                                  int num_mem_regs)
+static void jbusmc_construct_dimm_groups(struct jbusmc *p,
+                                        const struct linux_prom64_registers *mem_regs,
+                                        int num_mem_regs)
 {
        if (p->mc_reg_1 & JB_MC_REG1_DIMM1_BANK0) {
                jbusmc_construct_one_dimm_group(p, 0, mem_regs, num_mem_regs);
@@ -392,7 +392,7 @@ static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p,
        }
 }
 
-static int __devinit jbusmc_probe(struct platform_device *op)
+static int jbusmc_probe(struct platform_device *op)
 {
        const struct linux_prom64_registers *mem_regs;
        struct device_node *mem_node;
@@ -689,7 +689,7 @@ static void chmc_fetch_decode_regs(struct chmc *p)
                                      chmc_read_mcreg(p, CHMCTRL_DECODE4));
 }
 
-static int __devinit chmc_probe(struct platform_device *op)
+static int chmc_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        unsigned long ver;
@@ -763,7 +763,7 @@ out_free:
        goto out;
 }
 
-static int __devinit us3mc_probe(struct platform_device *op)
+static int us3mc_probe(struct platform_device *op)
 {
        if (mc_type == MC_TYPE_SAFARI)
                return chmc_probe(op);
@@ -772,21 +772,21 @@ static int __devinit us3mc_probe(struct platform_device *op)
        return -ENODEV;
 }
 
-static void __devexit chmc_destroy(struct platform_device *op, struct chmc *p)
+static void chmc_destroy(struct platform_device *op, struct chmc *p)
 {
        list_del(&p->list);
        of_iounmap(&op->resource[0], p->regs, 0x48);
        kfree(p);
 }
 
-static void __devexit jbusmc_destroy(struct platform_device *op, struct jbusmc *p)
+static void jbusmc_destroy(struct platform_device *op, struct jbusmc *p)
 {
        mc_list_del(&p->list);
        of_iounmap(&op->resource[0], p->regs, JBUSMC_REGS_SIZE);
        kfree(p);
 }
 
-static int __devexit us3mc_remove(struct platform_device *op)
+static int us3mc_remove(struct platform_device *op)
 {
        void *p = dev_get_drvdata(&op->dev);
 
@@ -814,7 +814,7 @@ static struct platform_driver us3mc_driver = {
                .of_match_table = us3mc_match,
        },
        .probe          = us3mc_probe,
-       .remove         = __devexit_p(us3mc_remove),
+       .remove         = us3mc_remove,
 };
 
 static inline bool us3mc_platform(void)
index f09257c86107c0c64cf58076a9204d1d79bb697c..75bb608c423eacb459321c5628ee45d6ce769ba6 100644 (file)
@@ -29,7 +29,7 @@
 #define DRV_MODULE_VERSION     "1.0"
 #define DRV_MODULE_RELDATE     "Jul 11, 2007"
 
-static char version[] __devinitdata =
+static char version[] =
        DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
 MODULE_DESCRIPTION("Sun LDOM domain services driver");
@@ -1146,8 +1146,7 @@ static void ds_event(void *arg, int event)
        spin_unlock_irqrestore(&ds_lock, flags);
 }
 
-static int __devinit ds_probe(struct vio_dev *vdev,
-                             const struct vio_device_id *id)
+static int ds_probe(struct vio_dev *vdev, const struct vio_device_id *id)
 {
        static int ds_version_printed;
        struct ldc_channel_config ds_cfg = {
index 81d92fc9983b1c0244ab395b7dd81c6725d20d26..9fcc6b4e93b35832b2fe7ad88a4086552a722be9 100644 (file)
@@ -27,7 +27,7 @@
 #define DRV_MODULE_VERSION     "1.1"
 #define DRV_MODULE_RELDATE     "July 22, 2008"
 
-static char version[] __devinitdata =
+static char version[] =
        DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 #define LDC_PACKET_SIZE                64
 
index fc05211615685a787ab0a38aa80fe067db105068..852dc843052861f12ca4ee1ca3a03252e6efec68 100644 (file)
@@ -43,7 +43,7 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)
        }
 }
 
-void __devinit pcibios_fixup_bus(struct pci_bus *pbus)
+void pcibios_fixup_bus(struct pci_bus *pbus)
 {
        struct pci_dev *dev;
        int i, has_io, has_mem;
index b1bc38853a3da82200dfacb5c5b0a2439c9ac4b8..fc4320886a3aa5d15f817075cfca261487d21438 100644 (file)
@@ -668,7 +668,7 @@ static irqreturn_t grpci2_err_interrupt(int irq, void *arg)
        return IRQ_HANDLED;
 }
 
-static int __devinit grpci2_of_probe(struct platform_device *ofdev)
+static int grpci2_of_probe(struct platform_device *ofdev)
 {
        struct grpci2_regs *regs;
        struct grpci2_priv *priv;
index 75b31bcdeadf46c89afdd04eb778718d0f09541e..baf4366e2d6afe937db5fe792c3183d56da4c580 100644 (file)
@@ -356,7 +356,7 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
        return dev;
 }
 
-static void __devinit apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)
+static void apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)
 {
        u32 idx, first, last;
 
@@ -378,9 +378,9 @@ static void __devinit apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)
 /* Cook up fake bus resources for SUNW,simba PCI bridges which lack
  * a proper 'ranges' property.
  */
-static void __devinit apb_fake_ranges(struct pci_dev *dev,
-                                     struct pci_bus *bus,
-                                     struct pci_pbm_info *pbm)
+static void apb_fake_ranges(struct pci_dev *dev,
+                           struct pci_bus *bus,
+                           struct pci_pbm_info *pbm)
 {
        struct pci_bus_region region;
        struct resource *res;
@@ -404,15 +404,15 @@ static void __devinit apb_fake_ranges(struct pci_dev *dev,
        pcibios_bus_to_resource(dev, res, &region);
 }
 
-static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm,
-                                     struct device_node *node,
-                                     struct pci_bus *bus);
+static void pci_of_scan_bus(struct pci_pbm_info *pbm,
+                           struct device_node *node,
+                           struct pci_bus *bus);
 
 #define GET_64BIT(prop, i)     ((((u64) (prop)[(i)]) << 32) | (prop)[(i)+1])
 
-static void __devinit of_scan_pci_bridge(struct pci_pbm_info *pbm,
-                                        struct device_node *node,
-                                        struct pci_dev *dev)
+static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
+                              struct device_node *node,
+                              struct pci_dev *dev)
 {
        struct pci_bus *bus;
        const u32 *busrange, *ranges;
@@ -503,9 +503,9 @@ after_ranges:
        pci_of_scan_bus(pbm, node, bus);
 }
 
-static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm,
-                                     struct device_node *node,
-                                     struct pci_bus *bus)
+static void pci_of_scan_bus(struct pci_pbm_info *pbm,
+                           struct device_node *node,
+                           struct pci_bus *bus)
 {
        struct device_node *child;
        const u32 *reg;
@@ -564,7 +564,7 @@ show_pciobppath_attr(struct device * dev, struct device_attribute * attr, char *
 
 static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_pciobppath_attr, NULL);
 
-static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus)
+static void pci_bus_register_of_sysfs(struct pci_bus *bus)
 {
        struct pci_dev *dev;
        struct pci_bus *child_bus;
@@ -585,8 +585,8 @@ static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus)
                pci_bus_register_of_sysfs(child_bus);
 }
 
-struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm,
-                                           struct device *parent)
+struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
+                                struct device *parent)
 {
        LIST_HEAD(resources);
        struct device_node *node = pbm->op->dev.of_node;
@@ -618,7 +618,7 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm,
        return bus;
 }
 
-void __devinit pcibios_fixup_bus(struct pci_bus *pbus)
+void pcibios_fixup_bus(struct pci_bus *pbus)
 {
 }
 
@@ -949,8 +949,7 @@ static int __init pcibios_init(void)
 subsys_initcall(pcibios_init);
 
 #ifdef CONFIG_SYSFS
-static void __devinit pci_bus_slot_names(struct device_node *node,
-                                        struct pci_bus *bus)
+static void pci_bus_slot_names(struct device_node *node, struct pci_bus *bus)
 {
        const struct pci_slot_names {
                u32     slot_mask;
index 188f935276fd75c407dc162c53fe06ffe58cfe3d..e60fc6a67e9be7c98e03dca18eeb247d1bc6d419 100644 (file)
@@ -408,8 +408,8 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm)
        upa_writeq(~(u64)0, pbm->pbm_regs + FIRE_PEC_IENAB);
 }
 
-static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm,
-                                      struct platform_device *op, u32 portid)
+static int pci_fire_pbm_init(struct pci_pbm_info *pbm,
+                            struct platform_device *op, u32 portid)
 {
        const struct linux_prom64_registers *regs;
        struct device_node *dp = op->dev.of_node;
@@ -454,7 +454,7 @@ static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm,
        return 0;
 }
 
-static int __devinit fire_probe(struct platform_device *op)
+static int fire_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct pci_pbm_info *pbm;
index f4d29e15ce715c4fb1c476dc3eec780e148835fb..c647634ead2bc9e0eab04f6d9558579b93990f75 100644 (file)
@@ -366,8 +366,8 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)
        pci_config_write8(addr, 64);
 }
 
-static void __devinit psycho_scan_bus(struct pci_pbm_info *pbm,
-                                     struct device *parent)
+static void psycho_scan_bus(struct pci_pbm_info *pbm,
+                           struct device *parent)
 {
        pbm_config_busmastering(pbm);
        pbm->is_66mhz_capable = 0;
@@ -483,15 +483,15 @@ static void psycho_pbm_strbuf_init(struct pci_pbm_info *pbm,
 #define PSYCHO_MEMSPACE_B      0x180000000UL
 #define PSYCHO_MEMSPACE_SIZE   0x07fffffffUL
 
-static void __devinit psycho_pbm_init(struct pci_pbm_info *pbm,
-                                     struct platform_device *op, int is_pbm_a)
+static void psycho_pbm_init(struct pci_pbm_info *pbm,
+                           struct platform_device *op, int is_pbm_a)
 {
        psycho_pbm_init_common(pbm, op, "PSYCHO", PBM_CHIP_TYPE_PSYCHO);
        psycho_pbm_strbuf_init(pbm, is_pbm_a);
        psycho_scan_bus(pbm, &op->dev);
 }
 
-static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)
+static struct pci_pbm_info *psycho_find_sibling(u32 upa_portid)
 {
        struct pci_pbm_info *pbm;
 
@@ -504,7 +504,7 @@ static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)
 
 #define PSYCHO_CONFIGSPACE     0x001000000UL
 
-static int __devinit psycho_probe(struct platform_device *op)
+static int psycho_probe(struct platform_device *op)
 {
        const struct linux_prom64_registers *pr_regs;
        struct device_node *dp = op->dev.of_node;
index 3efaa4644d600e4aea88c0867df05ae1baee6008..6f00d27e8dacb348283df0f1b30f00b5755de6d9 100644 (file)
@@ -403,8 +403,7 @@ static void apb_init(struct pci_bus *sabre_bus)
        }
 }
 
-static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm,
-                                    struct device *parent)
+static void sabre_scan_bus(struct pci_pbm_info *pbm, struct device *parent)
 {
        static int once;
 
@@ -443,8 +442,8 @@ static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm,
        sabre_register_error_handlers(pbm);
 }
 
-static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,
-                                    struct platform_device *op)
+static void sabre_pbm_init(struct pci_pbm_info *pbm,
+                          struct platform_device *op)
 {
        psycho_pbm_init_common(pbm, op, "SABRE", PBM_CHIP_TYPE_SABRE);
        pbm->pci_afsr = pbm->controller_regs + SABRE_PIOAFSR;
@@ -454,7 +453,7 @@ static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,
 }
 
 static const struct of_device_id sabre_match[];
-static int __devinit sabre_probe(struct platform_device *op)
+static int sabre_probe(struct platform_device *op)
 {
        const struct of_device_id *match;
        const struct linux_prom64_registers *pr_regs;
index 13d4aa20b5a5d7f16a6da42fdce1b7e5825eec23..8f76f23dac38ec66b0afea55a5311e612f2459f0 100644 (file)
@@ -1064,8 +1064,7 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)
        pci_config_write8(addr, 64);
 }
 
-static void __devinit schizo_scan_bus(struct pci_pbm_info *pbm,
-                                     struct device *parent)
+static void schizo_scan_bus(struct pci_pbm_info *pbm, struct device *parent)
 {
        pbm_config_busmastering(pbm);
        pbm->is_66mhz_capable =
@@ -1307,9 +1306,9 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)
        }
 }
 
-static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm,
-                                    struct platform_device *op, u32 portid,
-                                    int chip_type)
+static int schizo_pbm_init(struct pci_pbm_info *pbm,
+                          struct platform_device *op, u32 portid,
+                          int chip_type)
 {
        const struct linux_prom64_registers *regs;
        struct device_node *dp = op->dev.of_node;
@@ -1400,8 +1399,7 @@ static inline int portid_compare(u32 x, u32 y, int chip_type)
        return (x == y);
 }
 
-static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid,
-                                                          int chip_type)
+static struct pci_pbm_info *schizo_find_sibling(u32 portid, int chip_type)
 {
        struct pci_pbm_info *pbm;
 
@@ -1412,7 +1410,7 @@ static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid,
        return NULL;
 }
 
-static int __devinit __schizo_init(struct platform_device *op, unsigned long chip_type)
+static int __schizo_init(struct platform_device *op, unsigned long chip_type)
 {
        struct device_node *dp = op->dev.of_node;
        struct pci_pbm_info *pbm;
@@ -1460,7 +1458,7 @@ out_err:
 }
 
 static const struct of_device_id schizo_match[];
-static int __devinit schizo_probe(struct platform_device *op)
+static int schizo_probe(struct platform_device *op)
 {
        const struct of_device_id *match;
 
index 051b69caeffd382b9252a3986154bb8250b3f87d..d07f6b29aed88510f1625d90655a4fbd10159b4c 100644 (file)
@@ -536,8 +536,7 @@ static struct dma_map_ops sun4v_dma_ops = {
        .unmap_sg                       = dma_4v_unmap_sg,
 };
 
-static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm,
-                                        struct device *parent)
+static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent)
 {
        struct property *prop;
        struct device_node *dp;
@@ -550,8 +549,8 @@ static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm,
        /* XXX register error interrupt handlers XXX */
 }
 
-static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm,
-                                                     struct iommu *iommu)
+static unsigned long probe_existing_entries(struct pci_pbm_info *pbm,
+                                           struct iommu *iommu)
 {
        struct iommu_arena *arena = &iommu->arena;
        unsigned long i, cnt = 0;
@@ -578,7 +577,7 @@ static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm,
        return cnt;
 }
 
-static int __devinit pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
+static int pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
 {
        static const u32 vdma_default[] = { 0x80000000, 0x80000000 };
        struct iommu *iommu = pbm->iommu;
@@ -879,8 +878,8 @@ static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)
 }
 #endif /* !(CONFIG_PCI_MSI) */
 
-static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
-                                       struct platform_device *op, u32 devhandle)
+static int pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
+                             struct platform_device *op, u32 devhandle)
 {
        struct device_node *dp = op->dev.of_node;
        int err;
@@ -919,7 +918,7 @@ static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
        return 0;
 }
 
-static int __devinit pci_sun4v_probe(struct platform_device *op)
+static int pci_sun4v_probe(struct platform_device *op)
 {
        const struct linux_prom64_registers *regs;
        static int hvapi_negotiated = 0;
index 521fdf1b20e592e06f9776c85e04b3a575019b0e..09f4fdd8d8080fd45f8795a193b9b308c5d748cc 100644 (file)
@@ -439,8 +439,7 @@ int pcic_present(void)
        return pcic0_up;
 }
 
-static int __devinit pdev_to_pnode(struct linux_pbm_info *pbm,
-                                   struct pci_dev *pdev)
+static int pdev_to_pnode(struct linux_pbm_info *pbm, struct pci_dev *pdev)
 {
        struct linux_prom_pci_registers regs[PROMREG_MAX];
        int err;
@@ -595,7 +594,7 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node)
 /*
  * Normally called from {do_}pci_scan_bus...
  */
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        struct pci_dev *dev;
        int i, has_io, has_mem;
index 0e3202239ff5b7b1e13441ca1017fb672c9d33d8..dcbb62f63068b53497393a959bfe5b063a014f60 100644 (file)
@@ -52,7 +52,7 @@ static void pmc_swift_idle(void)
 #endif
 }
 
-static int __devinit pmc_probe(struct platform_device *op)
+static int pmc_probe(struct platform_device *op)
 {
        regs = of_ioremap(&op->resource[0], 0,
                          resource_size(&op->resource[0]), PMC_OBPNAME);
index 0d39075063b2d1f82a54c248d036575fdbd4e901..4cb23c41553f1e44f5430d7e85f92c5b0bd70a6f 100644 (file)
@@ -23,7 +23,7 @@ static irqreturn_t power_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit has_button_interrupt(unsigned int irq, struct device_node *dp)
+static int has_button_interrupt(unsigned int irq, struct device_node *dp)
 {
        if (irq == 0xffffffff)
                return 0;
@@ -33,7 +33,7 @@ static int __devinit has_button_interrupt(unsigned int irq, struct device_node *
        return 1;
 }
 
-static int __devinit power_probe(struct platform_device *op)
+static int power_probe(struct platform_device *op)
 {
        struct resource *res = &op->resource[0];
        unsigned int irq = op->archdata.irqs[0];
index d94b878577b7ea34bd674c50ab2817be7d2d93db..537eb66abd0654054aef7402ffaf857ad3971a85 100644 (file)
@@ -1180,7 +1180,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 {
 }
 
-void __devinit smp_prepare_boot_cpu(void)
+void smp_prepare_boot_cpu(void)
 {
 }
 
@@ -1194,7 +1194,7 @@ void __init smp_setup_processor_id(void)
                xcall_deliver_impl = hypervisor_xcall_deliver;
 }
 
-void __devinit smp_fill_in_sib_core_maps(void)
+void smp_fill_in_sib_core_maps(void)
 {
        unsigned int i;
 
index 5147f574f1256a7f3304a716da22bfb2ef68d42a..6ac43c36bbbfb98ad769ba6492f66a5fbb2ab554 100644 (file)
@@ -85,4 +85,4 @@ sys_call_table:
 /*325*/        .long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init
 /*330*/        .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime
 /*335*/        .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
-/*340*/        .long sys_ni_syscall, sys_kcmp
+/*340*/        .long sys_ni_syscall, sys_kcmp, sys_finit_module
index cdbd9b817751472200246245e85830b504478a0f..1009ecb92678185a388d708e8b28be070669524d 100644 (file)
@@ -86,7 +86,7 @@ sys_call_table32:
        .word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init
 /*330*/        .word sys32_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime
        .word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev
-/*340*/        .word sys_kern_features, sys_kcmp
+/*340*/        .word sys_kern_features, sys_kcmp, sys_finit_module
 
 #endif /* CONFIG_COMPAT */
 
@@ -164,4 +164,4 @@ sys_call_table:
        .word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init
 /*330*/        .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime
        .word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
-/*340*/        .word sys_kern_features, sys_kcmp
+/*340*/        .word sys_kern_features, sys_kcmp, sys_finit_module
index 953641549e82941e73a3f39b79eaf14e4eb8b0bf..c4c27b0f9063d74f2a2d6dd8963b3753354976ba 100644 (file)
@@ -278,7 +278,7 @@ static struct platform_device m48t59_rtc = {
        },
 };
 
-static int __devinit clock_probe(struct platform_device *op)
+static int clock_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        const char *model = of_get_property(dp, "model", NULL);
index e861072b9c52b0cbabcc84f9af3d3e525ee35eb1..c3d82b5f54ca8501960d9145990304d5b15e4a3c 100644 (file)
@@ -419,7 +419,7 @@ static struct platform_device rtc_cmos_device = {
        .num_resources  = 1,
 };
 
-static int __devinit rtc_probe(struct platform_device *op)
+static int rtc_probe(struct platform_device *op)
 {
        struct resource *r;
 
@@ -477,7 +477,7 @@ static struct platform_device rtc_bq4802_device = {
        .num_resources  = 1,
 };
 
-static int __devinit bq4802_probe(struct platform_device *op)
+static int bq4802_probe(struct platform_device *op)
 {
 
        printk(KERN_INFO "%s: BQ4802 regs at 0x%llx\n",
@@ -534,7 +534,7 @@ static struct platform_device m48t59_rtc = {
        },
 };
 
-static int __devinit mostek_probe(struct platform_device *op)
+static int mostek_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
 
@@ -746,7 +746,7 @@ void __irq_entry timer_interrupt(int irq, struct pt_regs *regs)
        set_irq_regs(old_regs);
 }
 
-void __devinit setup_sparc64_timer(void)
+void setup_sparc64_timer(void)
 {
        struct clock_event_device *sevt;
        unsigned long pstate;
@@ -844,7 +844,7 @@ unsigned long long sched_clock(void)
                >> SPARC64_NSEC_PER_CYC_SHIFT;
 }
 
-int __devinit read_current_timer(unsigned long *timer_val)
+int read_current_timer(unsigned long *timer_val)
 {
        *timer_val = tick_ops->get_tick();
        return 0;
index 85be1ca539b2e4cc5aea5d6fb8b1587fc7a4e73a..c3b72423c846465373e6c06ab961ac99efce4ea6 100644 (file)
@@ -87,8 +87,8 @@ static unsigned long cpu_pgsz_mask;
 
 #define MAX_BANKS      32
 
-static struct linux_prom64_registers pavail[MAX_BANKS] __devinitdata;
-static int pavail_ents __devinitdata;
+static struct linux_prom64_registers pavail[MAX_BANKS];
+static int pavail_ents;
 
 static int cmp_p64(const void *a, const void *b)
 {
@@ -1931,7 +1931,7 @@ void __init paging_init(void)
        printk("Booting Linux...\n");
 }
 
-int __devinit page_in_phys_avail(unsigned long paddr)
+int page_in_phys_avail(unsigned long paddr)
 {
        int i;
 
index 302cdf71ceed044811731e212f5d499807a38d11..54a924208d3ce5e16ec27615975fcd2e6335c054 100644 (file)
@@ -188,7 +188,7 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
 int __init tile_pci_init(void);
 int __init pcibios_init(void);
 
-void __devinit pcibios_fixup_bus(struct pci_bus *bus);
+void pcibios_fixup_bus(struct pci_bus *bus);
 
 #define pci_domain_nr(bus) (((struct pci_controller *)(bus)->sysdata)->index)
 
index aac1cd586966e42b9057b1beb3bbd430b9e15a47..67237d34c2e2ad7f8b3b1c43f3f28bfe4d6c1acc 100644 (file)
@@ -81,7 +81,7 @@ EXPORT_SYMBOL(pcibios_align_resource);
  * controller_id is the controller number, config type is 0 or 1 for
  * config0 or config1 operations.
  */
-static int __devinit tile_pcie_open(int controller_id, int config_type)
+static int tile_pcie_open(int controller_id, int config_type)
 {
        char filename[32];
        int fd;
@@ -97,8 +97,7 @@ static int __devinit tile_pcie_open(int controller_id, int config_type)
 /*
  * Get the IRQ numbers from the HV and set up the handlers for them.
  */
-static int __devinit tile_init_irqs(int controller_id,
-                                struct pci_controller *controller)
+static int tile_init_irqs(int controller_id, struct pci_controller *controller)
 {
        char filename[32];
        int fd;
@@ -237,7 +236,7 @@ static int tile_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 }
 
 
-static void __devinit fixup_read_and_payload_sizes(void)
+static void fixup_read_and_payload_sizes(void)
 {
        struct pci_dev *dev = NULL;
        int smallest_max_payload = 0x1; /* Tile maxes out at 256 bytes. */
@@ -379,7 +378,7 @@ subsys_initcall(pcibios_init);
 /*
  * No bus fixups needed.
  */
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        /* Nothing needs to be done. */
 }
@@ -458,11 +457,8 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
  * specified bus & slot.
  */
 
-static int __devinit tile_cfg_read(struct pci_bus *bus,
-                                  unsigned int devfn,
-                                  int offset,
-                                  int size,
-                                  u32 *val)
+static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
+                        int size, u32 *val)
 {
        struct pci_controller *controller = bus->sysdata;
        int busnum = bus->number & 0xff;
@@ -504,11 +500,8 @@ static int __devinit tile_cfg_read(struct pci_bus *bus,
  * See tile_cfg_read() for relevant comments.
  * Note that "val" is the value to write, not a pointer to that value.
  */
-static int __devinit tile_cfg_write(struct pci_bus *bus,
-                                   unsigned int devfn,
-                                   int offset,
-                                   int size,
-                                   u32 val)
+static int tile_cfg_write(struct pci_bus *bus, unsigned int devfn, int offset,
+                         int size, u32 val)
 {
        struct pci_controller *controller = bus->sysdata;
        int busnum = bus->number & 0xff;
index 94810d4a63327f418cf21b6b9084da211f6a5df4..11425633b2d7a03e2b04cadf144fbde7efe585cf 100644 (file)
 #define TRACE_CFG_RD(...)
 #endif
 
-static int __devinitdata pci_probe = 1;
+static int pci_probe = 1;
 
 /* Information on the PCIe RC ports configuration. */
-static int __devinitdata pcie_rc[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];
+static int pcie_rc[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];
 
 /*
  * On some platforms with one or more Gx endpoint ports, we need to
@@ -72,7 +72,7 @@ static int __devinitdata pcie_rc[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];
  * the delay in seconds. If the delay is not provided, the value
  * will be DEFAULT_RC_DELAY.
  */
-static int __devinitdata rc_delay[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];
+static int rc_delay[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];
 
 /* Default number of seconds that the PCIe RC port probe can be delayed. */
 #define DEFAULT_RC_DELAY       10
@@ -137,7 +137,7 @@ static int tile_irq_cpu(int irq)
 /*
  * Open a file descriptor to the TRIO shim.
  */
-static int __devinit tile_pcie_open(int trio_index)
+static int tile_pcie_open(int trio_index)
 {
        gxio_trio_context_t *context = &trio_contexts[trio_index];
        int ret;
@@ -265,7 +265,7 @@ trio_handle_level_irq(unsigned int irq, struct irq_desc *desc)
  * Create kernel irqs and set up the handlers for the legacy interrupts.
  * Also some minimum initialization for the MSI support.
  */
-static int __devinit tile_init_irqs(struct pci_controller *controller)
+static int tile_init_irqs(struct pci_controller *controller)
 {
        int i;
        int j;
@@ -459,8 +459,7 @@ static int tile_map_irq(const struct pci_dev *dev, u8 device, u8 pin)
 }
 
 
-static void __devinit fixup_read_and_payload_sizes(struct pci_controller *
-                                               controller)
+static void fixup_read_and_payload_sizes(struct pci_controller *controller)
 {
        gxio_trio_context_t *trio_context = controller->trio;
        struct pci_bus *root_bus = controller->root_bus;
@@ -541,7 +540,7 @@ static void __devinit fixup_read_and_payload_sizes(struct pci_controller *
        }
 }
 
-static int __devinit setup_pcie_rc_delay(char *str)
+static int setup_pcie_rc_delay(char *str)
 {
        unsigned long delay = 0;
        unsigned long trio_index;
@@ -1016,7 +1015,7 @@ alloc_mem_map_failed:
 subsys_initcall(pcibios_init);
 
 /* Note: to be deleted after Linux 3.6 merge. */
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
 }
 
@@ -1024,7 +1023,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
  * This can be called from the generic PCI layer, but doesn't need to
  * do anything.
  */
-char __devinit *pcibios_setup(char *str)
+char *pcibios_setup(char *str)
 {
        if (!strcmp(str, "off")) {
                pci_probe = 0;
@@ -1143,11 +1142,8 @@ EXPORT_SYMBOL(pci_iounmap);
  * specified bus & device.
  */
 
-static int __devinit tile_cfg_read(struct pci_bus *bus,
-                                  unsigned int devfn,
-                                  int offset,
-                                  int size,
-                                  u32 *val)
+static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
+                        int size, u32 *val)
 {
        struct pci_controller *controller = bus->sysdata;
        gxio_trio_context_t *trio_context = controller->trio;
@@ -1271,11 +1267,8 @@ invalid_device:
  * See tile_cfg_read() for relevent comments.
  * Note that "val" is the value to write, not a pointer to that value.
  */
-static int __devinit tile_cfg_write(struct pci_bus *bus,
-                                   unsigned int devfn,
-                                   int offset,
-                                   int size,
-                                   u32 val)
+static int tile_cfg_write(struct pci_bus *bus, unsigned int devfn, int offset,
+                         int size, u32 val)
 {
        struct pci_controller *controller = bus->sysdata;
        gxio_trio_context_t *trio_context = controller->trio;
index 7c4359240b8134c409f252c292d0c98dce6b2869..ef69c0c828253991c7b633a22822acc04d333633 100644 (file)
@@ -167,7 +167,7 @@ static inline int pdev_bad_for_parity(struct pci_dev *dev)
  * pcibios_fixup_bus - Called after each bus is probed,
  * but before its children are examined.
  */
-void __devinit pcibios_fixup_bus(struct pci_bus *bus)
+void pcibios_fixup_bus(struct pci_bus *bus)
 {
        struct pci_dev *dev;
        u16 features = PCI_COMMAND_SERR
index 3c4ffeb467e9886ad62b1a4c6bf60686fcb219a3..0d2d3b29118fe8c5eddeb5c1583927e83b40d6c5 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef _ASM_X86_PARPORT_H
 #define _ASM_X86_PARPORT_H
 
-static int __devinit parport_pc_find_isa_ports(int autoirq, int autodma);
-static int __devinit parport_pc_find_nonpci_ports(int autoirq, int autodma)
+static int parport_pc_find_isa_ports(int autoirq, int autodma);
+static int parport_pc_find_nonpci_ports(int autoirq, int autodma)
 {
        return parport_pc_find_isa_ports(autoirq, autodma);
 }
index 73e8eeff22ee038784b9a88841ba659250f9a18c..747e5a38b59042026b370acf9fcb86b40d1bf3e4 100644 (file)
@@ -140,11 +140,10 @@ struct pci_mmcfg_region {
 
 extern int __init pci_mmcfg_arch_init(void);
 extern void __init pci_mmcfg_arch_free(void);
-extern int __devinit pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg);
+extern int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg);
 extern void pci_mmcfg_arch_unmap(struct pci_mmcfg_region *cfg);
-extern int __devinit pci_mmconfig_insert(struct device *dev,
-                                        u16 seg, u8 start,
-                                        u8 end, phys_addr_t addr);
+extern int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end,
+                              phys_addr_t addr);
 extern int pci_mmconfig_delete(u16 seg, u8 start, u8 end);
 extern struct pci_mmcfg_region *pci_mmconfig_lookup(int segment, int bus);
 
index 3cf3d97cce3a7ab0b02c678f2535dc5ec03d09bb..b43200dbfe7e179d65386f0dfb3b4afd3f33bf36 100644 (file)
@@ -2500,7 +2500,7 @@ static bool pcidrv_registered;
 /*
  * add a pci uncore device
  */
-static int __devinit uncore_pci_add(struct intel_uncore_type *type, struct pci_dev *pdev)
+static int uncore_pci_add(struct intel_uncore_type *type, struct pci_dev *pdev)
 {
        struct intel_uncore_pmu *pmu;
        struct intel_uncore_box *box;
@@ -2571,8 +2571,8 @@ static void uncore_pci_remove(struct pci_dev *pdev)
        kfree(box);
 }
 
-static int __devinit uncore_pci_probe(struct pci_dev *pdev,
-                               const struct pci_device_id *id)
+static int uncore_pci_probe(struct pci_dev *pdev,
+                           const struct pci_device_id *id)
 {
        struct intel_uncore_type *type;
 
index 08b973f64032ba31f5e91a0558e2dc003904531a..9c2bd8bd4b4c1f3cbeb7965b04bb57c3239e41a2 100644 (file)
@@ -43,6 +43,7 @@
 #include <asm/apicdef.h>
 #include <asm/hypervisor.h>
 #include <asm/kvm_guest.h>
+#include <asm/context_tracking.h>
 
 static int kvmapf = 1;
 
@@ -121,6 +122,8 @@ void kvm_async_pf_task_wait(u32 token)
        struct kvm_task_sleep_node n, *e;
        DEFINE_WAIT(wait);
 
+       rcu_irq_enter();
+
        spin_lock(&b->lock);
        e = _find_apf_task(b, token);
        if (e) {
@@ -128,6 +131,8 @@ void kvm_async_pf_task_wait(u32 token)
                hlist_del(&e->link);
                kfree(e);
                spin_unlock(&b->lock);
+
+               rcu_irq_exit();
                return;
        }
 
@@ -152,13 +157,16 @@ void kvm_async_pf_task_wait(u32 token)
                        /*
                         * We cannot reschedule. So halt.
                         */
+                       rcu_irq_exit();
                        native_safe_halt();
+                       rcu_irq_enter();
                        local_irq_disable();
                }
        }
        if (!n.halted)
                finish_wait(&n.wq, &wait);
 
+       rcu_irq_exit();
        return;
 }
 EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait);
@@ -252,10 +260,10 @@ do_async_page_fault(struct pt_regs *regs, unsigned long error_code)
                break;
        case KVM_PV_REASON_PAGE_NOT_PRESENT:
                /* page is swapped out by the host. */
-               rcu_irq_enter();
+               exception_enter(regs);
                exit_idle();
                kvm_async_pf_task_wait((u32)read_cr2());
-               rcu_irq_exit();
+               exception_exit(regs);
                break;
        case KVM_PV_REASON_PAGE_READY:
                rcu_irq_enter();
index de2b7ad70273134e1c3882d9829b387d6aa6c299..0f5dec5c80e0fccbba37474463e724970503faf2 100644 (file)
@@ -265,7 +265,7 @@ rootfs_initcall(pci_iommu_init);
 #ifdef CONFIG_PCI
 /* Many VIA bridges seem to corrupt data for DAC. Disable it here */
 
-static __devinit void via_no_dac(struct pci_dev *dev)
+static void via_no_dac(struct pci_dev *dev)
 {
        if (forbid_dac == 0) {
                dev_info(&dev->dev, "disabling DAC on VIA PCI bridge\n");
index 1b27de563561ae1d6d0d58d0f29f224a4c6602a3..26ee48a33dc42f65f74c13dfb7227c97877b93e5 100644 (file)
@@ -8,7 +8,7 @@
 
 #if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SMP) && defined(CONFIG_PCI)
 
-static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
+static void quirk_intel_irqbalance(struct pci_dev *dev)
 {
        u8 config;
        u16 word;
@@ -512,7 +512,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
 
 #if defined(CONFIG_PCI) && defined(CONFIG_NUMA)
 /* Set correct numa_node information for AMD NB functions */
-static void __devinit quirk_amd_nb_node(struct pci_dev *dev)
+static void quirk_amd_nb_node(struct pci_dev *dev)
 {
        struct pci_dev *nb_ht;
        unsigned int devfn;
index 76f54461f7cb83a13a0ec8e76add8968532a1eae..c243b81e3c74b56bb69d7d26e692ac4181d73320 100644 (file)
@@ -120,7 +120,7 @@ struct kvm_shared_msrs {
 };
 
 static struct kvm_shared_msrs_global __read_mostly shared_msrs_global;
-static DEFINE_PER_CPU(struct kvm_shared_msrs, shared_msrs);
+static struct kvm_shared_msrs __percpu *shared_msrs;
 
 struct kvm_stats_debugfs_item debugfs_entries[] = {
        { "pf_fixed", VCPU_STAT(pf_fixed) },
@@ -191,10 +191,10 @@ static void kvm_on_user_return(struct user_return_notifier *urn)
 
 static void shared_msr_update(unsigned slot, u32 msr)
 {
-       struct kvm_shared_msrs *smsr;
        u64 value;
+       unsigned int cpu = smp_processor_id();
+       struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);
 
-       smsr = &__get_cpu_var(shared_msrs);
        /* only read, and nobody should modify it at this time,
         * so don't need lock */
        if (slot >= shared_msrs_global.nr) {
@@ -226,7 +226,8 @@ static void kvm_shared_msr_cpu_online(void)
 
 void kvm_set_shared_msr(unsigned slot, u64 value, u64 mask)
 {
-       struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs);
+       unsigned int cpu = smp_processor_id();
+       struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);
 
        if (((value ^ smsr->values[slot].curr) & mask) == 0)
                return;
@@ -242,7 +243,8 @@ EXPORT_SYMBOL_GPL(kvm_set_shared_msr);
 
 static void drop_user_return_notifiers(void *ignore)
 {
-       struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs);
+       unsigned int cpu = smp_processor_id();
+       struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);
 
        if (smsr->registered)
                kvm_on_user_return(&smsr->urn);
@@ -5233,9 +5235,16 @@ int kvm_arch_init(void *opaque)
                goto out;
        }
 
+       r = -ENOMEM;
+       shared_msrs = alloc_percpu(struct kvm_shared_msrs);
+       if (!shared_msrs) {
+               printk(KERN_ERR "kvm: failed to allocate percpu kvm_shared_msrs\n");
+               goto out;
+       }
+
        r = kvm_mmu_module_init();
        if (r)
-               goto out;
+               goto out_free_percpu;
 
        kvm_set_mmio_spte_mask();
        kvm_init_msr_list();
@@ -5258,6 +5267,8 @@ int kvm_arch_init(void *opaque)
 
        return 0;
 
+out_free_percpu:
+       free_percpu(shared_msrs);
 out:
        return r;
 }
@@ -5275,6 +5286,7 @@ void kvm_arch_exit(void)
 #endif
        kvm_x86_ops = NULL;
        kvm_mmu_module_exit();
+       free_percpu(shared_msrs);
 }
 
 int kvm_emulate_halt(struct kvm_vcpu *vcpu)
index e395693abdb16068cd2b268f258d9c79d3d0f3f3..7c3bee636e2fc31bd4021d308da7e5af2bc65519 100644 (file)
@@ -98,7 +98,7 @@ void use_tsc_delay(void)
        delay_fn = delay_tsc;
 }
 
-int __devinit read_current_timer(unsigned long *timer_val)
+int read_current_timer(unsigned long *timer_val)
 {
        if (delay_fn == delay_tsc) {
                rdtscll(*timer_val);
index 0c01261fe5a846bc2500fc24c1ff56c2b432e86f..53ea60458e01c941a4a9c7113fbb9eebae24efa2 100644 (file)
@@ -145,7 +145,7 @@ void __init pci_acpi_crs_quirks(void)
 }
 
 #ifdef CONFIG_PCI_MMCONFIG
-static int __devinit check_segment(u16 seg, struct device *dev, char *estr)
+static int check_segment(u16 seg, struct device *dev, char *estr)
 {
        if (seg) {
                dev_err(dev,
@@ -168,9 +168,8 @@ static int __devinit check_segment(u16 seg, struct device *dev, char *estr)
        return 0;
 }
 
-static int __devinit setup_mcfg_map(struct pci_root_info *info,
-                                   u16 seg, u8 start, u8 end,
-                                   phys_addr_t addr)
+static int setup_mcfg_map(struct pci_root_info *info, u16 seg, u8 start,
+                         u8 end, phys_addr_t addr)
 {
        int result;
        struct device *dev = &info->bridge->dev;
@@ -208,7 +207,7 @@ static void teardown_mcfg_map(struct pci_root_info *info)
        }
 }
 #else
-static int __devinit setup_mcfg_map(struct pci_root_info *info,
+static int setup_mcfg_map(struct pci_root_info *info,
                                    u16 seg, u8 start, u8 end,
                                    phys_addr_t addr)
 {
@@ -474,7 +473,7 @@ probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device,
                                info);
 }
 
-struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
+struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
 {
        struct acpi_device *device = root->device;
        struct pci_root_info *info = NULL;
index d37e2fec97e58fd3b4c3d35a5903fd6cf78060d1..c2735feb2508148ec16efab887ec1aab2dcc0aec 100644 (file)
@@ -93,8 +93,8 @@ struct pci_root_info __init *alloc_pci_root_info(int bus_min, int bus_max,
        return info;
 }
 
-void __devinit update_res(struct pci_root_info *info, resource_size_t start,
-                         resource_size_t end, unsigned long flags, int merge)
+void update_res(struct pci_root_info *info, resource_size_t start,
+               resource_size_t end, unsigned long flags, int merge)
 {
        struct resource *res;
        struct pci_root_res *root_res;
index 1b1dda90a945ede1550294e83dfc51d7a2f9f663..ccd0ab3ab8996b764b0166f91e84e15f0dbe8ba7 100644 (file)
@@ -81,14 +81,14 @@ struct pci_ops pci_root_ops = {
  */
 DEFINE_RAW_SPINLOCK(pci_config_lock);
 
-static int __devinit can_skip_ioresource_align(const struct dmi_system_id *d)
+static int can_skip_ioresource_align(const struct dmi_system_id *d)
 {
        pci_probe |= PCI_CAN_SKIP_ISA_ALIGN;
        printk(KERN_INFO "PCI: %s detected, can skip ISA alignment\n", d->ident);
        return 0;
 }
 
-static const struct dmi_system_id can_skip_pciprobe_dmi_table[] __devinitconst = {
+static const struct dmi_system_id can_skip_pciprobe_dmi_table[] = {
 /*
  * Systems where PCI IO resource ISA alignment can be skipped
  * when the ISA enable bit in the bridge control is not set
@@ -125,7 +125,7 @@ void __init dmi_check_skip_isa_align(void)
        dmi_check_system(can_skip_pciprobe_dmi_table);
 }
 
-static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
+static void pcibios_fixup_device_resources(struct pci_dev *dev)
 {
        struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE];
        struct resource *bar_r;
@@ -162,7 +162,7 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
  *  are examined.
  */
 
-void __devinit pcibios_fixup_bus(struct pci_bus *b)
+void pcibios_fixup_bus(struct pci_bus *b)
 {
        struct pci_dev *dev;
 
@@ -176,7 +176,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b)
  * on the kernel command line (which was parsed earlier).
  */
 
-static int __devinit set_bf_sort(const struct dmi_system_id *d)
+static int set_bf_sort(const struct dmi_system_id *d)
 {
        if (pci_bf_sort == pci_bf_sort_default) {
                pci_bf_sort = pci_dmi_bf;
@@ -185,7 +185,7 @@ static int __devinit set_bf_sort(const struct dmi_system_id *d)
        return 0;
 }
 
-static void __devinit read_dmi_type_b1(const struct dmi_header *dm,
+static void read_dmi_type_b1(const struct dmi_header *dm,
                                       void *private_data)
 {
        u8 *d = (u8 *)dm + 4;
@@ -207,7 +207,7 @@ static void __devinit read_dmi_type_b1(const struct dmi_header *dm,
        }
 }
 
-static int __devinit find_sort_method(const struct dmi_system_id *d)
+static int find_sort_method(const struct dmi_system_id *d)
 {
        dmi_walk(read_dmi_type_b1, NULL);
 
@@ -222,7 +222,7 @@ static int __devinit find_sort_method(const struct dmi_system_id *d)
  * Enable renumbering of PCI bus# ranges to reach all PCI busses (Cardbus)
  */
 #ifdef __i386__
-static int __devinit assign_all_busses(const struct dmi_system_id *d)
+static int assign_all_busses(const struct dmi_system_id *d)
 {
        pci_probe |= PCI_ASSIGN_ALL_BUSSES;
        printk(KERN_INFO "%s detected: enabling PCI bus# renumbering"
@@ -231,7 +231,7 @@ static int __devinit assign_all_busses(const struct dmi_system_id *d)
 }
 #endif
 
-static int __devinit set_scan_all(const struct dmi_system_id *d)
+static int set_scan_all(const struct dmi_system_id *d)
 {
        printk(KERN_INFO "PCI: %s detected, enabling pci=pcie_scan_all\n",
               d->ident);
@@ -239,7 +239,7 @@ static int __devinit set_scan_all(const struct dmi_system_id *d)
        return 0;
 }
 
-static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
+static const struct dmi_system_id pciprobe_dmi_table[] = {
 #ifdef __i386__
 /*
  * Laptops which need pci=assign-busses to see Cardbus cards
@@ -434,7 +434,8 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
                .callback = set_scan_all,
                .ident = "Stratus/NEC ftServer",
                .matches = {
-                       DMI_MATCH(DMI_SYS_VENDOR, "ftServer"),
+                       DMI_MATCH(DMI_SYS_VENDOR, "Stratus"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"),
                },
        },
        {}
@@ -445,7 +446,7 @@ void __init dmi_check_pciprobe(void)
        dmi_check_system(pciprobe_dmi_table);
 }
 
-struct pci_bus * __devinit pcibios_scan_root(int busnum)
+struct pci_bus *pcibios_scan_root(int busnum)
 {
        struct pci_bus *bus = NULL;
 
@@ -664,7 +665,7 @@ int pci_ext_cfg_avail(void)
                return 0;
 }
 
-struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node)
+struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node)
 {
        LIST_HEAD(resources);
        struct pci_bus *bus = NULL;
@@ -692,7 +693,7 @@ struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops,
        return bus;
 }
 
-struct pci_bus * __devinit pci_scan_bus_with_sysdata(int busno)
+struct pci_bus *pci_scan_bus_with_sysdata(int busno)
 {
        return pci_scan_bus_on_node(busno, &pci_root_ops, -1);
 }
index af8a224db216adcae94b2957240ea96758bd4325..f5809fa2753e69246f8d361d844c212e03d139e9 100644 (file)
@@ -9,7 +9,7 @@
 #include <linux/vgaarb.h>
 #include <asm/pci_x86.h>
 
-static void __devinit pci_fixup_i450nx(struct pci_dev *d)
+static void pci_fixup_i450nx(struct pci_dev *d)
 {
        /*
         * i450NX -- Find and scan all secondary buses on all PXB's.
@@ -34,7 +34,7 @@ static void __devinit pci_fixup_i450nx(struct pci_dev *d)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx);
 
-static void __devinit pci_fixup_i450gx(struct pci_dev *d)
+static void pci_fixup_i450gx(struct pci_dev *d)
 {
        /*
         * i450GX and i450KX -- Find and scan all secondary buses.
@@ -48,7 +48,7 @@ static void __devinit pci_fixup_i450gx(struct pci_dev *d)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx);
 
-static void __devinit  pci_fixup_umc_ide(struct pci_dev *d)
+static void pci_fixup_umc_ide(struct pci_dev *d)
 {
        /*
         * UM8886BF IDE controller sets region type bits incorrectly,
@@ -62,7 +62,7 @@ static void __devinit  pci_fixup_umc_ide(struct pci_dev *d)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF, pci_fixup_umc_ide);
 
-static void __devinit  pci_fixup_ncr53c810(struct pci_dev *d)
+static void pci_fixup_ncr53c810(struct pci_dev *d)
 {
        /*
         * NCR 53C810 returns class code 0 (at least on some systems).
@@ -75,7 +75,7 @@ static void __devinit  pci_fixup_ncr53c810(struct pci_dev *d)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, pci_fixup_ncr53c810);
 
-static void __devinit  pci_fixup_latency(struct pci_dev *d)
+static void pci_fixup_latency(struct pci_dev *d)
 {
        /*
         *  SiS 5597 and 5598 chipsets require latency timer set to
@@ -87,7 +87,7 @@ static void __devinit  pci_fixup_latency(struct pci_dev *d)
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, pci_fixup_latency);
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5598, pci_fixup_latency);
 
-static void __devinit pci_fixup_piix4_acpi(struct pci_dev *d)
+static void pci_fixup_piix4_acpi(struct pci_dev *d)
 {
        /*
         * PIIX4 ACPI device: hardwired IRQ9
@@ -163,7 +163,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8367_0, pci_fixup_
  * system to PCI bus no matter what are their window settings, so they are
  * "transparent" (or subtractive decoding) from programmers point of view.
  */
-static void __devinit pci_fixup_transparent_bridge(struct pci_dev *dev)
+static void pci_fixup_transparent_bridge(struct pci_dev *dev)
 {
        if ((dev->device & 0xff00) == 0x2400)
                dev->transparent = 1;
@@ -317,7 +317,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,        PCI_DEVICE_ID_INTEL_MCH_PC1,    pcie_r
  * video device at this point.
  */
 
-static void __devinit pci_fixup_video(struct pci_dev *pdev)
+static void pci_fixup_video(struct pci_dev *pdev)
 {
        struct pci_dev *bridge;
        struct pci_bus *bus;
@@ -357,7 +357,7 @@ DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,
                                PCI_CLASS_DISPLAY_VGA, 8, pci_fixup_video);
 
 
-static const struct dmi_system_id __devinitconst msi_k8t_dmi_table[] = {
+static const struct dmi_system_id msi_k8t_dmi_table[] = {
        {
                .ident = "MSI-K8T-Neo2Fir",
                .matches = {
@@ -378,7 +378,7 @@ static const struct dmi_system_id __devinitconst msi_k8t_dmi_table[] = {
  * The soundcard is only enabled, if the mainborad is identified
  * via DMI-tables and the soundcard is detected to be off.
  */
-static void __devinit pci_fixup_msi_k8t_onboard_sound(struct pci_dev *dev)
+static void pci_fixup_msi_k8t_onboard_sound(struct pci_dev *dev)
 {
        unsigned char val;
        if (!dmi_check_system(msi_k8t_dmi_table))
@@ -414,7 +414,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237,
  */
 static u16 toshiba_line_size;
 
-static const struct dmi_system_id __devinitconst toshiba_ohci1394_dmi_table[] = {
+static const struct dmi_system_id toshiba_ohci1394_dmi_table[] = {
        {
                .ident = "Toshiba PS5 based laptop",
                .matches = {
@@ -439,7 +439,7 @@ static const struct dmi_system_id __devinitconst toshiba_ohci1394_dmi_table[] =
        { }
 };
 
-static void __devinit pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev)
+static void pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev)
 {
        if (!dmi_check_system(toshiba_ohci1394_dmi_table))
                return; /* only applies to certain Toshibas (so far) */
@@ -450,7 +450,7 @@ static void __devinit pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev)
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, 0x8032,
                         pci_pre_fixup_toshiba_ohci1394);
 
-static void __devinit pci_post_fixup_toshiba_ohci1394(struct pci_dev *dev)
+static void pci_post_fixup_toshiba_ohci1394(struct pci_dev *dev)
 {
        if (!dmi_check_system(toshiba_ohci1394_dmi_table))
                return; /* only applies to certain Toshibas (so far) */
@@ -488,7 +488,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
  * Siemens Nixdorf AG FSC Multiprocessor Interrupt Controller:
  * prevent update of the BAR0, which doesn't look like a normal BAR.
  */
-static void __devinit pci_siemens_interrupt_controller(struct pci_dev *dev)
+static void pci_siemens_interrupt_controller(struct pci_dev *dev)
 {
        dev->resource[0].flags |= IORESOURCE_PCI_FIXED;
 }
@@ -531,7 +531,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATI, 0x4385, sb600_disable_hpet_bar);
  *
  * Match off the LPC and svid/sdid (older kernels lose the bridge subvendor)
  */
-static void __devinit twinhead_reserve_killing_zone(struct pci_dev *dev)
+static void twinhead_reserve_killing_zone(struct pci_dev *dev)
 {
         if (dev->subsystem_vendor == 0x14FF && dev->subsystem_device == 0xA003) {
                 pr_info("Reserving memory on Twinhead H12Y\n");
index a1df191129d30154e3386dc46ba78e5b540bbb74..4a2ab9cb36591235541a63b7e3c07513b2be641a 100644 (file)
@@ -10,7 +10,7 @@
  * Discover remaining PCI buses in case there are peer host bridges.
  * We use the number of last PCI bus provided by the PCI BIOS.
  */
-static void __devinit pcibios_fixup_peer_bridges(void)
+static void pcibios_fixup_peer_bridges(void)
 {
        int n;
 
@@ -34,7 +34,7 @@ int __init pci_legacy_init(void)
        return 0;
 }
 
-void __devinit pcibios_scan_specific_bus(int busn)
+void pcibios_scan_specific_bus(int busn)
 {
        int devfn;
        long node;
index 704b9ec043d709d787ffd732dc21c2200653de04..fb29968a7cd54c164286a09f9f8721144180f3d0 100644 (file)
@@ -49,7 +49,7 @@ static __init void free_all_mmcfg(void)
                pci_mmconfig_remove(cfg);
 }
 
-static __devinit void list_add_sorted(struct pci_mmcfg_region *new)
+static void list_add_sorted(struct pci_mmcfg_region *new)
 {
        struct pci_mmcfg_region *cfg;
 
@@ -65,9 +65,8 @@ static __devinit void list_add_sorted(struct pci_mmcfg_region *new)
        list_add_tail_rcu(&new->list, &pci_mmcfg_list);
 }
 
-static __devinit struct pci_mmcfg_region *pci_mmconfig_alloc(int segment,
-                                                            int start,
-                                                            int end, u64 addr)
+static struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, int start,
+                                                  int end, u64 addr)
 {
        struct pci_mmcfg_region *new;
        struct resource *res;
@@ -371,8 +370,7 @@ static int __init pci_mmcfg_check_hostbridge(void)
        return !list_empty(&pci_mmcfg_list);
 }
 
-static acpi_status __devinit check_mcfg_resource(struct acpi_resource *res,
-                                                void *data)
+static acpi_status check_mcfg_resource(struct acpi_resource *res, void *data)
 {
        struct resource *mcfg_res = data;
        struct acpi_resource_address64 address;
@@ -408,8 +406,8 @@ static acpi_status __devinit check_mcfg_resource(struct acpi_resource *res,
        return AE_OK;
 }
 
-static acpi_status __devinit find_mboard_resource(acpi_handle handle, u32 lvl,
-                                                 void *context, void **rv)
+static acpi_status find_mboard_resource(acpi_handle handle, u32 lvl,
+                                       void *context, void **rv)
 {
        struct resource *mcfg_res = context;
 
@@ -422,7 +420,7 @@ static acpi_status __devinit find_mboard_resource(acpi_handle handle, u32 lvl,
        return AE_OK;
 }
 
-static int __devinit is_acpi_reserved(u64 start, u64 end, unsigned not_used)
+static int is_acpi_reserved(u64 start, u64 end, unsigned not_used)
 {
        struct resource mcfg_res;
 
@@ -693,9 +691,8 @@ static int __init pci_mmcfg_late_insert_resources(void)
 late_initcall(pci_mmcfg_late_insert_resources);
 
 /* Add MMCFG information for host bridges */
-int __devinit pci_mmconfig_insert(struct device *dev,
-                                 u16 seg, u8 start, u8 end,
-                                 phys_addr_t addr)
+int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end,
+                       phys_addr_t addr)
 {
        int rc;
        struct resource *tmp = NULL;
index db63ac23e3d935d886948da8957bd372456cd19a..5c90975cdf0f8242db167fa9c471c1ea2bf3e512 100644 (file)
@@ -142,7 +142,7 @@ void __init pci_mmcfg_arch_free(void)
 {
 }
 
-int __devinit pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg)
+int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg)
 {
        return 0;
 }
index d4ebd07c306dd0a9abb9bdf69da927aa69d55bca..bea52496aea682f0b2c86e152d23ca52aae31662 100644 (file)
@@ -95,7 +95,7 @@ const struct pci_raw_ops pci_mmcfg = {
        .write =        pci_mmcfg_write,
 };
 
-static void __iomem * __devinit mcfg_ioremap(struct pci_mmcfg_region *cfg)
+static void __iomem *mcfg_ioremap(struct pci_mmcfg_region *cfg)
 {
        void __iomem *addr;
        u64 start, size;
@@ -133,7 +133,7 @@ void __init pci_mmcfg_arch_free(void)
                pci_mmcfg_arch_unmap(cfg);
 }
 
-int __devinit pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg)
+int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg)
 {
        cfg->virt = mcfg_ioremap(cfg);
        if (!cfg->virt) {
index e14a2ff708b5b3642ad5cde03dc27d852d297947..6eb18c42a28a3584546e87a57f9cccf5af3473e3 100644 (file)
@@ -247,7 +247,7 @@ int __init pci_mrst_init(void)
 /* Langwell devices are not true pci devices, they are not subject to 10 ms
  * d3 to d0 delay required by pci spec.
  */
-static void __devinit pci_d3delay_fixup(struct pci_dev *dev)
+static void pci_d3delay_fixup(struct pci_dev *dev)
 {
        /* PCI fixups are effectively decided compile time. If we have a dual
           SoC/non-SoC kernel we don't want to mangle d3 on non SoC devices */
@@ -262,7 +262,7 @@ static void __devinit pci_d3delay_fixup(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_d3delay_fixup);
 
-static void __devinit mrst_power_off_unused_dev(struct pci_dev *dev)
+static void mrst_power_off_unused_dev(struct pci_dev *dev)
 {
        pci_set_power_state(dev, PCI_D3hot);
 }
@@ -275,7 +275,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0815, mrst_power_off_unused_dev);
 /*
  * Langwell devices reside at fixed offsets, don't try to move them.
  */
-static void __devinit pci_fixed_bar_fixup(struct pci_dev *dev)
+static void pci_fixed_bar_fixup(struct pci_dev *dev)
 {
        unsigned long offset;
        u32 size;
index 83e125b95ca6d6502c9b6d12babbe5ea77a464d4..b96b14c250b6d3a9129116440ea662eb19d641de 100644 (file)
@@ -116,7 +116,7 @@ static const struct pci_raw_ops pci_direct_conf1_mq = {
 };
 
 
-static void __devinit pci_fixup_i450nx(struct pci_dev *d)
+static void pci_fixup_i450nx(struct pci_dev *d)
 {
        /*
         * i450NX -- Find and scan all secondary buses on all PXB's.
index da8fe0535ff48950789ed8f1588d0ab7e650fbba..c77b24a8b2daf499e07527be6f27d5b8c2df20d0 100644 (file)
@@ -124,7 +124,7 @@ static struct {
 
 static int pci_bios_present;
 
-static int __devinit check_pcibios(void)
+static int check_pcibios(void)
 {
        u32 signature, eax, ebx, ecx;
        u8 status, major_ver, minor_ver, hw_mech;
@@ -312,7 +312,7 @@ static const struct pci_raw_ops pci_bios_access = {
  * Try to find PCI BIOS.
  */
 
-static const struct pci_raw_ops * __devinit pci_find_bios(void)
+static const struct pci_raw_ops *pci_find_bios(void)
 {
        union bios32 *check;
        unsigned char sum;
index fd41a9262d657ee672be6700b0dcc1fb8c147127..e31bcd8f2eeef2af6d2db13b824864b74867767d 100644 (file)
@@ -782,7 +782,7 @@ BLOCKING_NOTIFIER_HEAD(intel_scu_notifier);
 EXPORT_SYMBOL_GPL(intel_scu_notifier);
 
 /* Called by IPC driver */
-void __devinit intel_scu_devices_create(void)
+void intel_scu_devices_create(void)
 {
        int i;
 
index d75582d1aa5560c657a98a419ac89c31047f0965..ff0174dda810fd026bfde830747d52f48ffbdb0d 100644 (file)
@@ -121,7 +121,7 @@ static const struct platform_suspend_ops xo1_suspend_ops = {
        .enter = xo1_power_state_enter,
 };
 
-static int __devinit xo1_pm_probe(struct platform_device *pdev)
+static int xo1_pm_probe(struct platform_device *pdev)
 {
        struct resource *res;
        int err;
@@ -154,7 +154,7 @@ static int __devinit xo1_pm_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit xo1_pm_remove(struct platform_device *pdev)
+static int xo1_pm_remove(struct platform_device *pdev)
 {
        mfd_cell_disable(pdev);
 
@@ -173,7 +173,7 @@ static struct platform_driver cs5535_pms_driver = {
                .owner = THIS_MODULE,
        },
        .probe = xo1_pm_probe,
-       .remove = __devexit_p(xo1_pm_remove),
+       .remove = xo1_pm_remove,
 };
 
 static struct platform_driver cs5535_acpi_driver = {
@@ -182,7 +182,7 @@ static struct platform_driver cs5535_acpi_driver = {
                .owner = THIS_MODULE,
        },
        .probe = xo1_pm_probe,
-       .remove = __devexit_p(xo1_pm_remove),
+       .remove = xo1_pm_remove,
 };
 
 static int __init xo1_pm_init(void)
index 63d4aa40956e33abe7f98f5ed3c36916a6c7b94f..74704be7b1fe85a4400cc4404a5748f070e39b0a 100644 (file)
@@ -309,7 +309,7 @@ static int xo1_sci_resume(struct platform_device *pdev)
        return 0;
 }
 
-static int __devinit setup_sci_interrupt(struct platform_device *pdev)
+static int setup_sci_interrupt(struct platform_device *pdev)
 {
        u32 lo, hi;
        u32 sts;
@@ -351,7 +351,7 @@ static int __devinit setup_sci_interrupt(struct platform_device *pdev)
        return r;
 }
 
-static int __devinit setup_ec_sci(void)
+static int setup_ec_sci(void)
 {
        int r;
 
@@ -395,7 +395,7 @@ static void free_ec_sci(void)
        gpio_free(OLPC_GPIO_ECSCI);
 }
 
-static int __devinit setup_lid_events(void)
+static int setup_lid_events(void)
 {
        int r;
 
@@ -432,7 +432,7 @@ static void free_lid_events(void)
        gpio_free(OLPC_GPIO_LID);
 }
 
-static int __devinit setup_power_button(struct platform_device *pdev)
+static int setup_power_button(struct platform_device *pdev)
 {
        int r;
 
@@ -463,7 +463,7 @@ static void free_power_button(void)
        input_free_device(power_button_idev);
 }
 
-static int __devinit setup_ebook_switch(struct platform_device *pdev)
+static int setup_ebook_switch(struct platform_device *pdev)
 {
        int r;
 
@@ -494,7 +494,7 @@ static void free_ebook_switch(void)
        input_free_device(ebook_switch_idev);
 }
 
-static int __devinit setup_lid_switch(struct platform_device *pdev)
+static int setup_lid_switch(struct platform_device *pdev)
 {
        int r;
 
@@ -538,7 +538,7 @@ static void free_lid_switch(void)
        input_free_device(lid_switch_idev);
 }
 
-static int __devinit xo1_sci_probe(struct platform_device *pdev)
+static int xo1_sci_probe(struct platform_device *pdev)
 {
        struct resource *res;
        int r;
@@ -613,7 +613,7 @@ err_ebook:
        return r;
 }
 
-static int __devexit xo1_sci_remove(struct platform_device *pdev)
+static int xo1_sci_remove(struct platform_device *pdev)
 {
        mfd_cell_disable(pdev);
        free_irq(sci_irq, pdev);
@@ -632,7 +632,7 @@ static struct platform_driver xo1_sci_driver = {
                .name = "olpc-xo1-sci-acpi",
        },
        .probe = xo1_sci_probe,
-       .remove = __devexit_p(xo1_sci_remove),
+       .remove = xo1_sci_remove,
        .suspend = xo1_sci_suspend,
        .resume = xo1_sci_resume,
 };
index 7a9ad30d6c9f60b47623fcd9b9e72291e7e9a8fd..3dc9aee41d913de3c59a3c04fee8dac814467ca5 100644 (file)
@@ -35,7 +35,7 @@ static struct pci_device_id scx200_tbl[] = {
 };
 MODULE_DEVICE_TABLE(pci,scx200_tbl);
 
-static int __devinit scx200_probe(struct pci_dev *, const struct pci_device_id *);
+static int scx200_probe(struct pci_dev *, const struct pci_device_id *);
 
 static struct pci_driver scx200_pci_driver = {
        .name = "scx200",
@@ -45,7 +45,7 @@ static struct pci_driver scx200_pci_driver = {
 
 static DEFINE_MUTEX(scx200_gpio_config_lock);
 
-static void __devinit scx200_init_shadow(void)
+static void scx200_init_shadow(void)
 {
        int bank;
 
@@ -54,7 +54,7 @@ static void __devinit scx200_init_shadow(void)
                scx200_gpio_shadow[bank] = inl(scx200_gpio_base + 0x10 * bank);
 }
 
-static int __devinit scx200_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int scx200_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        unsigned base;
 
index 38079be1cf1ebc98fa6d9a61aebd59ff81822f78..35905cb6e419a661c04e24bf205f5c4e1f1982f5 100644 (file)
@@ -32,7 +32,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
@@ -81,4 +81,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* _XTENSA_SOCKET_H */
index eb30e5ab4cab6810197aa12c36d6421962a6b3f6..b679bf8478f7a4bd3483127853cceb75185f97aa 100644 (file)
@@ -226,16 +226,6 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
        struct acpi_memory_info *info;
        int node;
 
-
-       /* Get the range from the _CRS */
-       result = acpi_memory_get_device_resources(mem_device);
-       if (result) {
-               dev_err(&mem_device->device->dev,
-                       "get_device_resources failed\n");
-               mem_device->state = MEMORY_INVALID_STATE;
-               return result;
-       }
-
        node = acpi_get_node(mem_device->device->handle);
        /*
         * Tell the VM there is more memory here...
@@ -342,14 +332,6 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
                        break;
                }
 
-               if (acpi_memory_check_device(mem_device))
-                       break;
-
-               if (acpi_memory_enable_device(mem_device)) {
-                       acpi_handle_err(handle,"Cannot enable memory device\n");
-                       break;
-               }
-
                ost_code = ACPI_OST_SC_SUCCESS;
                break;
 
index c8bc24bd1f720580b6e80ce4225277c781576b23..bc7a03ded064520fd88d64a4d335bf1d0a6813e8 100644 (file)
@@ -162,5 +162,5 @@ acpi-y +=           \
        utxferror.o     \
        utxfmutex.o
 
-acpi-$(ACPI_FUTURE_USAGE) += uttrack.o utcache.o utclib.o
+acpi-$(ACPI_FUTURE_USAGE) += uttrack.o utcache.o
 
diff --git a/drivers/acpi/acpica/utclib.c b/drivers/acpi/acpica/utclib.c
deleted file mode 100644 (file)
index 19ea475..0000000
+++ /dev/null
@@ -1,749 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmclib - Local implementation of C library functions
- *
- *****************************************************************************/
-
-/*
- * Copyright (C) 2000 - 2012, Intel Corp.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions, and the following disclaimer,
- *    without modification.
- * 2. Redistributions in binary form must reproduce at minimum a disclaimer
- *    substantially similar to the "NO WARRANTY" disclaimer below
- *    ("Disclaimer") and any redistribution must be conditioned upon
- *    including a substantially similar Disclaimer requirement for further
- *    binary redistribution.
- * 3. Neither the names of the above-listed copyright holders nor the names
- *    of any contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * Alternatively, this software may be distributed under the terms of the
- * GNU General Public License ("GPL") version 2 as published by the Free
- * Software Foundation.
- *
- * NO WARRANTY
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- */
-
-#include <acpi/acpi.h>
-#include "accommon.h"
-
-/*
- * These implementations of standard C Library routines can optionally be
- * used if a C library is not available. In general, they are less efficient
- * than an inline or assembly implementation
- */
-
-#define _COMPONENT          ACPI_UTILITIES
-ACPI_MODULE_NAME("cmclib")
-
-#ifndef ACPI_USE_SYSTEM_CLIBRARY
-#define NEGATIVE    1
-#define POSITIVE    0
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_memcmp (memcmp)
- *
- * PARAMETERS:  buffer1         - First Buffer
- *              buffer2         - Second Buffer
- *              count           - Maximum # of bytes to compare
- *
- * RETURN:      Index where Buffers mismatched, or 0 if Buffers matched
- *
- * DESCRIPTION: Compare two Buffers, with a maximum length
- *
- ******************************************************************************/
-int acpi_ut_memcmp(const char *buffer1, const char *buffer2, acpi_size count)
-{
-
-       return ((count == ACPI_SIZE_MAX) ? 0 : ((unsigned char)*buffer1 -
-                                               (unsigned char)*buffer2));
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_memcpy (memcpy)
- *
- * PARAMETERS:  dest        - Target of the copy
- *              src         - Source buffer to copy
- *              count       - Number of bytes to copy
- *
- * RETURN:      Dest
- *
- * DESCRIPTION: Copy arbitrary bytes of memory
- *
- ******************************************************************************/
-
-void *acpi_ut_memcpy(void *dest, const void *src, acpi_size count)
-{
-       char *new = (char *)dest;
-       char *old = (char *)src;
-
-       while (count) {
-               *new = *old;
-               new++;
-               old++;
-               count--;
-       }
-
-       return (dest);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_memset (memset)
- *
- * PARAMETERS:  dest        - Buffer to set
- *              value       - Value to set each byte of memory
- *              count       - Number of bytes to set
- *
- * RETURN:      Dest
- *
- * DESCRIPTION: Initialize a buffer to a known value.
- *
- ******************************************************************************/
-
-void *acpi_ut_memset(void *dest, u8 value, acpi_size count)
-{
-       char *new = (char *)dest;
-
-       while (count) {
-               *new = (char)value;
-               new++;
-               count--;
-       }
-
-       return (dest);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strlen (strlen)
- *
- * PARAMETERS:  string              - Null terminated string
- *
- * RETURN:      Length
- *
- * DESCRIPTION: Returns the length of the input string
- *
- ******************************************************************************/
-
-acpi_size acpi_ut_strlen(const char *string)
-{
-       u32 length = 0;
-
-       /* Count the string until a null is encountered */
-
-       while (*string) {
-               length++;
-               string++;
-       }
-
-       return (length);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strcpy (strcpy)
- *
- * PARAMETERS:  dst_string      - Target of the copy
- *              src_string      - The source string to copy
- *
- * RETURN:      dst_string
- *
- * DESCRIPTION: Copy a null terminated string
- *
- ******************************************************************************/
-
-char *acpi_ut_strcpy(char *dst_string, const char *src_string)
-{
-       char *string = dst_string;
-
-       /* Move bytes brute force */
-
-       while (*src_string) {
-               *string = *src_string;
-
-               string++;
-               src_string++;
-       }
-
-       /* Null terminate */
-
-       *string = 0;
-       return (dst_string);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strncpy (strncpy)
- *
- * PARAMETERS:  dst_string      - Target of the copy
- *              src_string      - The source string to copy
- *              count           - Maximum # of bytes to copy
- *
- * RETURN:      dst_string
- *
- * DESCRIPTION: Copy a null terminated string, with a maximum length
- *
- ******************************************************************************/
-
-char *acpi_ut_strncpy(char *dst_string, const char *src_string, acpi_size count)
-{
-       char *string = dst_string;
-
-       /* Copy the string */
-
-       for (string = dst_string;
-            count && (count--, (*string++ = *src_string++));) {;
-       }
-
-       /* Pad with nulls if necessary */
-
-       while (count--) {
-               *string = 0;
-               string++;
-       }
-
-       /* Return original pointer */
-
-       return (dst_string);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strcmp (strcmp)
- *
- * PARAMETERS:  string1         - First string
- *              string2         - Second string
- *
- * RETURN:      Index where strings mismatched, or 0 if strings matched
- *
- * DESCRIPTION: Compare two null terminated strings
- *
- ******************************************************************************/
-
-int acpi_ut_strcmp(const char *string1, const char *string2)
-{
-
-       for (; (*string1 == *string2); string2++) {
-               if (!*string1++) {
-                       return (0);
-               }
-       }
-
-       return ((unsigned char)*string1 - (unsigned char)*string2);
-}
-
-#ifdef ACPI_FUTURE_IMPLEMENTATION
-/* Not used at this time */
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strchr (strchr)
- *
- * PARAMETERS:  string          - Search string
- *              ch              - character to search for
- *
- * RETURN:      Ptr to char or NULL if not found
- *
- * DESCRIPTION: Search a string for a character
- *
- ******************************************************************************/
-
-char *acpi_ut_strchr(const char *string, int ch)
-{
-
-       for (; (*string); string++) {
-               if ((*string) == (char)ch) {
-                       return ((char *)string);
-               }
-       }
-
-       return (NULL);
-}
-#endif
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strncmp (strncmp)
- *
- * PARAMETERS:  string1         - First string
- *              string2         - Second string
- *              count           - Maximum # of bytes to compare
- *
- * RETURN:      Index where strings mismatched, or 0 if strings matched
- *
- * DESCRIPTION: Compare two null terminated strings, with a maximum length
- *
- ******************************************************************************/
-
-int acpi_ut_strncmp(const char *string1, const char *string2, acpi_size count)
-{
-
-       for (; count-- && (*string1 == *string2); string2++) {
-               if (!*string1++) {
-                       return (0);
-               }
-       }
-
-       return ((count == ACPI_SIZE_MAX) ? 0 : ((unsigned char)*string1 -
-                                               (unsigned char)*string2));
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strcat (Strcat)
- *
- * PARAMETERS:  dst_string      - Target of the copy
- *              src_string      - The source string to copy
- *
- * RETURN:      dst_string
- *
- * DESCRIPTION: Append a null terminated string to a null terminated string
- *
- ******************************************************************************/
-
-char *acpi_ut_strcat(char *dst_string, const char *src_string)
-{
-       char *string;
-
-       /* Find end of the destination string */
-
-       for (string = dst_string; *string++;) {;
-       }
-
-       /* Concatenate the string */
-
-       for (--string; (*string++ = *src_string++);) {;
-       }
-
-       return (dst_string);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strncat (strncat)
- *
- * PARAMETERS:  dst_string      - Target of the copy
- *              src_string      - The source string to copy
- *              count           - Maximum # of bytes to copy
- *
- * RETURN:      dst_string
- *
- * DESCRIPTION: Append a null terminated string to a null terminated string,
- *              with a maximum count.
- *
- ******************************************************************************/
-
-char *acpi_ut_strncat(char *dst_string, const char *src_string, acpi_size count)
-{
-       char *string;
-
-       if (count) {
-
-               /* Find end of the destination string */
-
-               for (string = dst_string; *string++;) {;
-               }
-
-               /* Concatenate the string */
-
-               for (--string; (*string++ = *src_string++) && --count;) {;
-               }
-
-               /* Null terminate if necessary */
-
-               if (!count) {
-                       *string = 0;
-               }
-       }
-
-       return (dst_string);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strstr (strstr)
- *
- * PARAMETERS:  string1         - Target string
- *              string2         - Substring to search for
- *
- * RETURN:      Where substring match starts, Null if no match found
- *
- * DESCRIPTION: Checks if String2 occurs in String1. This is not really a
- *              full implementation of strstr, only sufficient for command
- *              matching
- *
- ******************************************************************************/
-
-char *acpi_ut_strstr(char *string1, char *string2)
-{
-       char *string;
-
-       if (acpi_ut_strlen(string2) > acpi_ut_strlen(string1)) {
-               return (NULL);
-       }
-
-       /* Walk entire string, comparing the letters */
-
-       for (string = string1; *string2;) {
-               if (*string2 != *string) {
-                       return (NULL);
-               }
-
-               string2++;
-               string++;
-       }
-
-       return (string1);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_strtoul (strtoul)
- *
- * PARAMETERS:  string          - Null terminated string
- *              terminater      - Where a pointer to the terminating byte is
- *                                returned
- *              base            - Radix of the string
- *
- * RETURN:      Converted value
- *
- * DESCRIPTION: Convert a string into a 32-bit unsigned value.
- *              Note: use acpi_ut_strtoul64 for 64-bit integers.
- *
- ******************************************************************************/
-
-u32 acpi_ut_strtoul(const char *string, char **terminator, u32 base)
-{
-       u32 converted = 0;
-       u32 index;
-       u32 sign;
-       const char *string_start;
-       u32 return_value = 0;
-       acpi_status status = AE_OK;
-
-       /*
-        * Save the value of the pointer to the buffer's first
-        * character, save the current errno value, and then
-        * skip over any white space in the buffer:
-        */
-       string_start = string;
-       while (ACPI_IS_SPACE(*string) || *string == '\t') {
-               ++string;
-       }
-
-       /*
-        * The buffer may contain an optional plus or minus sign.
-        * If it does, then skip over it but remember what is was:
-        */
-       if (*string == '-') {
-               sign = NEGATIVE;
-               ++string;
-       } else if (*string == '+') {
-               ++string;
-               sign = POSITIVE;
-       } else {
-               sign = POSITIVE;
-       }
-
-       /*
-        * If the input parameter Base is zero, then we need to
-        * determine if it is octal, decimal, or hexadecimal:
-        */
-       if (base == 0) {
-               if (*string == '0') {
-                       if (acpi_ut_to_lower(*(++string)) == 'x') {
-                               base = 16;
-                               ++string;
-                       } else {
-                               base = 8;
-                       }
-               } else {
-                       base = 10;
-               }
-       } else if (base < 2 || base > 36) {
-               /*
-                * The specified Base parameter is not in the domain of
-                * this function:
-                */
-               goto done;
-       }
-
-       /*
-        * For octal and hexadecimal bases, skip over the leading
-        * 0 or 0x, if they are present.
-        */
-       if (base == 8 && *string == '0') {
-               string++;
-       }
-
-       if (base == 16 &&
-           *string == '0' && acpi_ut_to_lower(*(++string)) == 'x') {
-               string++;
-       }
-
-       /*
-        * Main loop: convert the string to an unsigned long:
-        */
-       while (*string) {
-               if (ACPI_IS_DIGIT(*string)) {
-                       index = (u32)((u8)*string - '0');
-               } else {
-                       index = (u32)acpi_ut_to_upper(*string);
-                       if (ACPI_IS_UPPER(index)) {
-                               index = index - 'A' + 10;
-                       } else {
-                               goto done;
-                       }
-               }
-
-               if (index >= base) {
-                       goto done;
-               }
-
-               /*
-                * Check to see if value is out of range:
-                */
-
-               if (return_value > ((ACPI_UINT32_MAX - (u32)index) / (u32)base)) {
-                       status = AE_ERROR;
-                       return_value = 0;       /* reset */
-               } else {
-                       return_value *= base;
-                       return_value += index;
-                       converted = 1;
-               }
-
-               ++string;
-       }
-
-      done:
-       /*
-        * If appropriate, update the caller's pointer to the next
-        * unconverted character in the buffer.
-        */
-       if (terminator) {
-               if (converted == 0 && return_value == 0 && string != NULL) {
-                       *terminator = (char *)string_start;
-               } else {
-                       *terminator = (char *)string;
-               }
-       }
-
-       if (status == AE_ERROR) {
-               return_value = ACPI_UINT32_MAX;
-       }
-
-       /*
-        * If a minus sign was present, then "the conversion is negated":
-        */
-       if (sign == NEGATIVE) {
-               return_value = (ACPI_UINT32_MAX - return_value) + 1;
-       }
-
-       return (return_value);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_to_upper (TOUPPER)
- *
- * PARAMETERS:  c           - Character to convert
- *
- * RETURN:      Converted character as an int
- *
- * DESCRIPTION: Convert character to uppercase
- *
- ******************************************************************************/
-
-int acpi_ut_to_upper(int c)
-{
-
-       return (ACPI_IS_LOWER(c) ? ((c) - 0x20) : (c));
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_to_lower (TOLOWER)
- *
- * PARAMETERS:  c           - Character to convert
- *
- * RETURN:      Converted character as an int
- *
- * DESCRIPTION: Convert character to lowercase
- *
- ******************************************************************************/
-
-int acpi_ut_to_lower(int c)
-{
-
-       return (ACPI_IS_UPPER(c) ? ((c) + 0x20) : (c));
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    is* functions
- *
- * DESCRIPTION: is* functions use the ctype table below
- *
- ******************************************************************************/
-
-const u8 _acpi_ctype[257] = {
-       _ACPI_CN,               /* 0x00     0 NUL */
-       _ACPI_CN,               /* 0x01     1 SOH */
-       _ACPI_CN,               /* 0x02     2 STX */
-       _ACPI_CN,               /* 0x03     3 ETX */
-       _ACPI_CN,               /* 0x04     4 EOT */
-       _ACPI_CN,               /* 0x05     5 ENQ */
-       _ACPI_CN,               /* 0x06     6 ACK */
-       _ACPI_CN,               /* 0x07     7 BEL */
-       _ACPI_CN,               /* 0x08     8 BS  */
-       _ACPI_CN | _ACPI_SP,    /* 0x09     9 TAB */
-       _ACPI_CN | _ACPI_SP,    /* 0x0A    10 LF  */
-       _ACPI_CN | _ACPI_SP,    /* 0x0B    11 VT  */
-       _ACPI_CN | _ACPI_SP,    /* 0x0C    12 FF  */
-       _ACPI_CN | _ACPI_SP,    /* 0x0D    13 CR  */
-       _ACPI_CN,               /* 0x0E    14 SO  */
-       _ACPI_CN,               /* 0x0F    15 SI  */
-       _ACPI_CN,               /* 0x10    16 DLE */
-       _ACPI_CN,               /* 0x11    17 DC1 */
-       _ACPI_CN,               /* 0x12    18 DC2 */
-       _ACPI_CN,               /* 0x13    19 DC3 */
-       _ACPI_CN,               /* 0x14    20 DC4 */
-       _ACPI_CN,               /* 0x15    21 NAK */
-       _ACPI_CN,               /* 0x16    22 SYN */
-       _ACPI_CN,               /* 0x17    23 ETB */
-       _ACPI_CN,               /* 0x18    24 CAN */
-       _ACPI_CN,               /* 0x19    25 EM  */
-       _ACPI_CN,               /* 0x1A    26 SUB */
-       _ACPI_CN,               /* 0x1B    27 ESC */
-       _ACPI_CN,               /* 0x1C    28 FS  */
-       _ACPI_CN,               /* 0x1D    29 GS  */
-       _ACPI_CN,               /* 0x1E    30 RS  */
-       _ACPI_CN,               /* 0x1F    31 US  */
-       _ACPI_XS | _ACPI_SP,    /* 0x20    32 ' ' */
-       _ACPI_PU,               /* 0x21    33 '!' */
-       _ACPI_PU,               /* 0x22    34 '"' */
-       _ACPI_PU,               /* 0x23    35 '#' */
-       _ACPI_PU,               /* 0x24    36 '$' */
-       _ACPI_PU,               /* 0x25    37 '%' */
-       _ACPI_PU,               /* 0x26    38 '&' */
-       _ACPI_PU,               /* 0x27    39 ''' */
-       _ACPI_PU,               /* 0x28    40 '(' */
-       _ACPI_PU,               /* 0x29    41 ')' */
-       _ACPI_PU,               /* 0x2A    42 '*' */
-       _ACPI_PU,               /* 0x2B    43 '+' */
-       _ACPI_PU,               /* 0x2C    44 ',' */
-       _ACPI_PU,               /* 0x2D    45 '-' */
-       _ACPI_PU,               /* 0x2E    46 '.' */
-       _ACPI_PU,               /* 0x2F    47 '/' */
-       _ACPI_XD | _ACPI_DI,    /* 0x30    48 '0' */
-       _ACPI_XD | _ACPI_DI,    /* 0x31    49 '1' */
-       _ACPI_XD | _ACPI_DI,    /* 0x32    50 '2' */
-       _ACPI_XD | _ACPI_DI,    /* 0x33    51 '3' */
-       _ACPI_XD | _ACPI_DI,    /* 0x34    52 '4' */
-       _ACPI_XD | _ACPI_DI,    /* 0x35    53 '5' */
-       _ACPI_XD | _ACPI_DI,    /* 0x36    54 '6' */
-       _ACPI_XD | _ACPI_DI,    /* 0x37    55 '7' */
-       _ACPI_XD | _ACPI_DI,    /* 0x38    56 '8' */
-       _ACPI_XD | _ACPI_DI,    /* 0x39    57 '9' */
-       _ACPI_PU,               /* 0x3A    58 ':' */
-       _ACPI_PU,               /* 0x3B    59 ';' */
-       _ACPI_PU,               /* 0x3C    60 '<' */
-       _ACPI_PU,               /* 0x3D    61 '=' */
-       _ACPI_PU,               /* 0x3E    62 '>' */
-       _ACPI_PU,               /* 0x3F    63 '?' */
-       _ACPI_PU,               /* 0x40    64 '@' */
-       _ACPI_XD | _ACPI_UP,    /* 0x41    65 'A' */
-       _ACPI_XD | _ACPI_UP,    /* 0x42    66 'B' */
-       _ACPI_XD | _ACPI_UP,    /* 0x43    67 'C' */
-       _ACPI_XD | _ACPI_UP,    /* 0x44    68 'D' */
-       _ACPI_XD | _ACPI_UP,    /* 0x45    69 'E' */
-       _ACPI_XD | _ACPI_UP,    /* 0x46    70 'F' */
-       _ACPI_UP,               /* 0x47    71 'G' */
-       _ACPI_UP,               /* 0x48    72 'H' */
-       _ACPI_UP,               /* 0x49    73 'I' */
-       _ACPI_UP,               /* 0x4A    74 'J' */
-       _ACPI_UP,               /* 0x4B    75 'K' */
-       _ACPI_UP,               /* 0x4C    76 'L' */
-       _ACPI_UP,               /* 0x4D    77 'M' */
-       _ACPI_UP,               /* 0x4E    78 'N' */
-       _ACPI_UP,               /* 0x4F    79 'O' */
-       _ACPI_UP,               /* 0x50    80 'P' */
-       _ACPI_UP,               /* 0x51    81 'Q' */
-       _ACPI_UP,               /* 0x52    82 'R' */
-       _ACPI_UP,               /* 0x53    83 'S' */
-       _ACPI_UP,               /* 0x54    84 'T' */
-       _ACPI_UP,               /* 0x55    85 'U' */
-       _ACPI_UP,               /* 0x56    86 'V' */
-       _ACPI_UP,               /* 0x57    87 'W' */
-       _ACPI_UP,               /* 0x58    88 'X' */
-       _ACPI_UP,               /* 0x59    89 'Y' */
-       _ACPI_UP,               /* 0x5A    90 'Z' */
-       _ACPI_PU,               /* 0x5B    91 '[' */
-       _ACPI_PU,               /* 0x5C    92 '\' */
-       _ACPI_PU,               /* 0x5D    93 ']' */
-       _ACPI_PU,               /* 0x5E    94 '^' */
-       _ACPI_PU,               /* 0x5F    95 '_' */
-       _ACPI_PU,               /* 0x60    96 '`' */
-       _ACPI_XD | _ACPI_LO,    /* 0x61    97 'a' */
-       _ACPI_XD | _ACPI_LO,    /* 0x62    98 'b' */
-       _ACPI_XD | _ACPI_LO,    /* 0x63    99 'c' */
-       _ACPI_XD | _ACPI_LO,    /* 0x64   100 'd' */
-       _ACPI_XD | _ACPI_LO,    /* 0x65   101 'e' */
-       _ACPI_XD | _ACPI_LO,    /* 0x66   102 'f' */
-       _ACPI_LO,               /* 0x67   103 'g' */
-       _ACPI_LO,               /* 0x68   104 'h' */
-       _ACPI_LO,               /* 0x69   105 'i' */
-       _ACPI_LO,               /* 0x6A   106 'j' */
-       _ACPI_LO,               /* 0x6B   107 'k' */
-       _ACPI_LO,               /* 0x6C   108 'l' */
-       _ACPI_LO,               /* 0x6D   109 'm' */
-       _ACPI_LO,               /* 0x6E   110 'n' */
-       _ACPI_LO,               /* 0x6F   111 'o' */
-       _ACPI_LO,               /* 0x70   112 'p' */
-       _ACPI_LO,               /* 0x71   113 'q' */
-       _ACPI_LO,               /* 0x72   114 'r' */
-       _ACPI_LO,               /* 0x73   115 's' */
-       _ACPI_LO,               /* 0x74   116 't' */
-       _ACPI_LO,               /* 0x75   117 'u' */
-       _ACPI_LO,               /* 0x76   118 'v' */
-       _ACPI_LO,               /* 0x77   119 'w' */
-       _ACPI_LO,               /* 0x78   120 'x' */
-       _ACPI_LO,               /* 0x79   121 'y' */
-       _ACPI_LO,               /* 0x7A   122 'z' */
-       _ACPI_PU,               /* 0x7B   123 '{' */
-       _ACPI_PU,               /* 0x7C   124 '|' */
-       _ACPI_PU,               /* 0x7D   125 '}' */
-       _ACPI_PU,               /* 0x7E   126 '~' */
-       _ACPI_CN,               /* 0x7F   127 DEL */
-
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 to 0x8F    */
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 to 0x9F    */
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 to 0xAF    */
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 to 0xBF    */
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 to 0xCF    */
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 to 0xDF    */
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 to 0xEF    */
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 to 0xFF    */
-       0                       /* 0x100 */
-};
-
-#endif                         /* ACPI_USE_SYSTEM_CLIBRARY */
index 903549df809bf1b02cc95df234dd7442cd3fb3ee..04ab5c9d3cedc16ac5250ee70b610829216d6117 100644 (file)
@@ -111,8 +111,17 @@ retry_next:
        if (rc)
                goto out;
        /* no more record */
-       if (id == APEI_ERST_INVALID_RECORD_ID)
+       if (id == APEI_ERST_INVALID_RECORD_ID) {
+               /*
+                * If the persistent store is empty initially, the function
+                * 'erst_read' below will return "-ENOENT" value. This causes
+                * 'retry_next' label is entered again. The returned value
+                * should be zero indicating the read operation is EOF.
+                */
+               len = 0;
+
                goto out;
+       }
 retry:
        rc = len = erst_read(id, erst_dbg_buf, erst_dbg_buf_len);
        /* The record may be cleared by others, try read next record */
index f09dc987cf17bce2ea762cdf902165cdbb7bd3d9..c6ff606c6d5bb35d51b2bff23588914f99a6ba83 100644 (file)
@@ -358,8 +358,7 @@ static struct acpi_device *acpi_dev_pm_get_node(struct device *dev)
        acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
        struct acpi_device *adev;
 
-       return handle && ACPI_SUCCESS(acpi_bus_get_device(handle, &adev)) ?
-               adev : NULL;
+       return handle && !acpi_bus_get_device(handle, &adev) ? adev : NULL;
 }
 
 /**
index 01551840d2365389ae8e0ea3c67054bc8655452f..95af6f674a6cc15b9e726d2cee7440ffa4b130fb 100644 (file)
 
 #define ACPI_GLUE_DEBUG        0
 #if ACPI_GLUE_DEBUG
-#define DBG(x...) printk(PREFIX x)
+#define DBG(fmt, ...)                                          \
+       printk(KERN_DEBUG PREFIX fmt, ##__VA_ARGS__)
 #else
-#define DBG(x...) do { } while(0)
+#define DBG(fmt, ...)                                          \
+do {                                                           \
+       if (0)                                                  \
+               printk(KERN_DEBUG PREFIX fmt, ##__VA_ARGS__);   \
+} while (0)
 #endif
 static LIST_HEAD(bus_type_list);
 static DECLARE_RWSEM(bus_type_sem);
index 7db61b8fa11f0337de7c8dc82e80ae1fb3cb6df8..6e7b9d5238124586ca10a000726472ff29cbc191 100644 (file)
@@ -445,11 +445,8 @@ int acpi_power_resource_register_device(struct device *dev, acpi_handle handle)
                return -ENODEV;
 
        ret = acpi_bus_get_device(handle, &acpi_dev);
-       if (ret)
-               goto no_power_resource;
-
-       if (!acpi_dev->power.flags.power_resources)
-               goto no_power_resource;
+       if (ret || !acpi_dev->power.flags.power_resources)
+               return -ENODEV;
 
        powered_device = kzalloc(sizeof(*powered_device), GFP_KERNEL);
        if (!powered_device)
@@ -471,10 +468,6 @@ int acpi_power_resource_register_device(struct device *dev, acpi_handle handle)
        }
 
        return ret;
-
-no_power_resource:
-       printk(KERN_DEBUG PREFIX "Invalid Power Resource to register!\n");
-       return -ENODEV;
 }
 EXPORT_SYMBOL_GPL(acpi_power_resource_register_device);
 
index 53502d1bbf26f1bc9b5ac46d7db7ec11caa792a7..c88be6c37c309b79b147ea683b9e177b1b8cca33 100644 (file)
@@ -1346,7 +1346,7 @@ static void acpi_device_set_id(struct acpi_device *device)
                        acpi_add_id(device, ACPI_DOCK_HID);
                else if (!acpi_ibm_smbus_match(device))
                        acpi_add_id(device, ACPI_SMBUS_IBM_HID);
-               else if (!acpi_device_hid(device) &&
+               else if (list_empty(&device->pnp.ids) &&
                         ACPI_IS_ROOT_DEVICE(device->parent)) {
                        acpi_add_id(device, ACPI_BUS_HID); /* \_SB, LNXSYBUS */
                        strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME);
index a2fc56d2e6819d04a86474157e330ff0467d6b09..cdbad3a454a085a7aa17bf1ae29e4a22b73c5c37 100644 (file)
@@ -45,7 +45,6 @@ static int amba_match(struct device *dev, struct device_driver *drv)
        return amba_lookup(pcdrv->id_table, pcdev) != NULL;
 }
 
-#ifdef CONFIG_HOTPLUG
 static int amba_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
        struct amba_device *pcdev = to_amba_device(dev);
@@ -58,9 +57,6 @@ static int amba_uevent(struct device *dev, struct kobj_uevent_env *env)
        retval = add_uevent_var(env, "MODALIAS=amba:d%08X", pcdev->periphid);
        return retval;
 }
-#else
-#define amba_uevent NULL
-#endif
 
 #define amba_attr_func(name,fmt,arg...)                                        \
 static ssize_t name##_show(struct device *_dev,                                \
index 0576a7dd32a53a19fa2d7283e396ecf8c901de27..536c166f4253eac9b8bcdf4b9c71c45c35b18b45 100644 (file)
@@ -243,7 +243,7 @@ static void tegra_ahb_gizmo_init(struct tegra_ahb *ahb)
        gizmo_writel(ahb, val, AHB_MEM_PREFETCH_CFG4);
 }
 
-static int __devinit tegra_ahb_probe(struct platform_device *pdev)
+static int tegra_ahb_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct tegra_ahb *ahb;
@@ -267,7 +267,7 @@ static int __devinit tegra_ahb_probe(struct platform_device *pdev)
        return 0;
 }
 
-static const struct of_device_id tegra_ahb_of_match[] __devinitconst = {
+static const struct of_device_id tegra_ahb_of_match[] = {
        { .compatible = "nvidia,tegra30-ahb", },
        { .compatible = "nvidia,tegra20-ahb", },
        {},
index 1cc467bdb63d9e4b456743452c5168e606db79f2..7a8a2841fe64a93effec85f1ff5fc6dc4c610d06 100644 (file)
@@ -86,7 +86,7 @@ static struct scsi_host_template ahci_platform_sht = {
        AHCI_SHT("ahci_platform"),
 };
 
-static int __devinit ahci_probe(struct platform_device *pdev)
+static int ahci_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct ahci_platform_data *pdata = dev_get_platdata(dev);
index acffcf0b3ad3345f00563fbe2a1fdb018e96deaf..174eca609b425e06bf788de9ba50f07c17ffbbdc 100644 (file)
@@ -1270,7 +1270,7 @@ static int piix_disable_ahci(struct pci_dev *pdev)
  *     they are found return an error code so we can turn off DMA
  */
 
-static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev)
+static int piix_check_450nx_errata(struct pci_dev *ata_dev)
 {
        struct pci_dev *pdev = NULL;
        u16 cfg;
@@ -1296,8 +1296,8 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev)
        return no_piix_dma;
 }
 
-static void __devinit piix_init_pcs(struct ata_host *host,
-                                   const struct piix_map_db *map_db)
+static void piix_init_pcs(struct ata_host *host,
+                         const struct piix_map_db *map_db)
 {
        struct pci_dev *pdev = to_pci_dev(host->dev);
        u16 pcs, new_pcs;
@@ -1313,9 +1313,9 @@ static void __devinit piix_init_pcs(struct ata_host *host,
        }
 }
 
-static const int *__devinit piix_init_sata_map(struct pci_dev *pdev,
-                                              struct ata_port_info *pinfo,
-                                              const struct piix_map_db *map_db)
+static const int *piix_init_sata_map(struct pci_dev *pdev,
+                                    struct ata_port_info *pinfo,
+                                    const struct piix_map_db *map_db)
 {
        const int *map;
        int i, invalid_map = 0;
@@ -1392,7 +1392,7 @@ static bool piix_no_sidpr(struct ata_host *host)
        return false;
 }
 
-static int __devinit piix_init_sidpr(struct ata_host *host)
+static int piix_init_sidpr(struct ata_host *host)
 {
        struct pci_dev *pdev = to_pci_dev(host->dev);
        struct piix_host_priv *hpriv = host->private_data;
@@ -1595,8 +1595,7 @@ static void piix_ignore_devices_quirk(struct ata_host *host)
  *     Zero on success, or -ERRNO value.
  */
 
-static int __devinit piix_init_one(struct pci_dev *pdev,
-                                  const struct pci_device_id *ent)
+static int piix_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct device *dev = &pdev->dev;
        struct ata_port_info port_info[2];
index 9764e80f93202bb6d75811885f07bbf98f0f8929..405022d302c3479f9a142ecf93dda695e21878e4 100644 (file)
@@ -791,7 +791,7 @@ static struct ata_port_operations arasan_cf_ops = {
        .set_dmamode = arasan_cf_set_dmamode,
 };
 
-static int __devinit arasan_cf_probe(struct platform_device *pdev)
+static int arasan_cf_probe(struct platform_device *pdev)
 {
        struct arasan_cf_dev *acdev;
        struct arasan_cf_pdata *pdata = dev_get_platdata(&pdev->dev);
@@ -905,7 +905,7 @@ free_clk:
        return ret;
 }
 
-static int __devexit arasan_cf_remove(struct platform_device *pdev)
+static int arasan_cf_remove(struct platform_device *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
        struct arasan_cf_dev *acdev = host->ports[0]->private_data;
@@ -955,7 +955,7 @@ MODULE_DEVICE_TABLE(of, arasan_cf_id_table);
 
 static struct platform_driver arasan_cf_driver = {
        .probe          = arasan_cf_probe,
-       .remove         = __devexit_p(arasan_cf_remove),
+       .remove         = arasan_cf_remove,
        .driver         = {
                .name   = DRIVER_NAME,
                .owner  = THIS_MODULE,
index 2a96bb2c53ee520a3c8f6205dc3c3f7e30c01d52..033f3f4c20adc9def5cca1a683bdd7e08e5a1fa7 100644 (file)
@@ -313,7 +313,7 @@ static struct ata_port_operations pata_at91_port_ops = {
        .cable_detect   = ata_cable_40wire,
 };
 
-static int __devinit pata_at91_probe(struct platform_device *pdev)
+static int pata_at91_probe(struct platform_device *pdev)
 {
        struct at91_cf_data *board = pdev->dev.platform_data;
        struct device *dev = &pdev->dev;
@@ -420,7 +420,7 @@ err_put:
        return ret;
 }
 
-static int __devexit pata_at91_remove(struct platform_device *pdev)
+static int pata_at91_remove(struct platform_device *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
        struct at91_ide_info *info;
@@ -441,7 +441,7 @@ static int __devexit pata_at91_remove(struct platform_device *pdev)
 
 static struct platform_driver pata_at91_driver = {
        .probe          = pata_at91_probe,
-       .remove         = __devexit_p(pata_at91_remove),
+       .remove         = pata_at91_remove,
        .driver         = {
                .name           = DRV_NAME,
                .owner          = THIS_MODULE,
index 1e65842e2ca719a0916bc371c676e68f27c096e2..8d43510c6becbb14a2e66ae54b92200c568af96a 100644 (file)
@@ -1538,7 +1538,7 @@ static unsigned short atapi_io_port[] = {
  *             - IRQ      (IORESOURCE_IRQ)
  *
  */
-static int __devinit bfin_atapi_probe(struct platform_device *pdev)
+static int bfin_atapi_probe(struct platform_device *pdev)
 {
        int board_idx = 0;
        struct resource *res;
@@ -1608,7 +1608,7 @@ static int __devinit bfin_atapi_probe(struct platform_device *pdev)
  *     A bfin atapi device has been unplugged. Perform the needed
  *     cleanup. Also called on module unload for any active devices.
  */
-static int __devexit bfin_atapi_remove(struct platform_device *pdev)
+static int bfin_atapi_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct ata_host *host = dev_get_drvdata(dev);
@@ -1654,7 +1654,7 @@ static int bfin_atapi_resume(struct platform_device *pdev)
 
 static struct platform_driver bfin_atapi_driver = {
        .probe                  = bfin_atapi_probe,
-       .remove                 = __devexit_p(bfin_atapi_remove),
+       .remove                 = bfin_atapi_remove,
        .suspend                = bfin_atapi_suspend,
        .resume                 = bfin_atapi_resume,
        .driver = {
index de74d804f0312f770dba0e9287c721b734f775ce..bfcf377e8f77a81df2b32b5c8525be844e585b21 100644 (file)
@@ -115,7 +115,7 @@ static struct ata_port_operations cs5520_port_ops = {
        .set_piomode            = cs5520_set_piomode,
 };
 
-static int __devinit cs5520_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+static int cs5520_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        static const unsigned int cmd_port[] = { 0x1F0, 0x170 };
        static const unsigned int ctl_port[] = { 0x3F6, 0x376 };
index 3982cef91f3c2da4c7b505c321bb081c98bf9e93..556222f04731ea7326afdaaac3a0ccedf3cc5e10 100644 (file)
@@ -910,7 +910,7 @@ static struct ata_port_operations ep93xx_pata_port_ops = {
        .port_start             = ep93xx_pata_port_start,
 };
 
-static int __devinit ep93xx_pata_probe(struct platform_device *pdev)
+static int ep93xx_pata_probe(struct platform_device *pdev)
 {
        struct ep93xx_pata_data *drv_data;
        struct ata_host *host;
@@ -1011,7 +1011,7 @@ err_rel_gpio:
        return err;
 }
 
-static int __devexit ep93xx_pata_remove(struct platform_device *pdev)
+static int ep93xx_pata_remove(struct platform_device *pdev)
 {
        struct ata_host *host = platform_get_drvdata(pdev);
        struct ep93xx_pata_data *drv_data = host->private_data;
@@ -1029,7 +1029,7 @@ static struct platform_driver ep93xx_pata_platform_driver = {
                .owner = THIS_MODULE,
        },
        .probe = ep93xx_pata_probe,
-       .remove = __devexit_p(ep93xx_pata_remove),
+       .remove = ep93xx_pata_remove,
 };
 
 module_platform_driver(ep93xx_pata_platform_driver);
index 52e7e7b8c74f6cf960245ace818adc8053cbfff4..d7c732042a4fe74775d24d8625d8b7c8e10249b2 100644 (file)
@@ -337,10 +337,9 @@ static struct ata_port_operations pata_icside_port_ops = {
        .port_start             = ATA_OP_NULL,  /* don't need PRD table */
 };
 
-static void __devinit
-pata_icside_setup_ioaddr(struct ata_port *ap, void __iomem *base,
-                        struct pata_icside_info *info,
-                        const struct portinfo *port)
+static void pata_icside_setup_ioaddr(struct ata_port *ap, void __iomem *base,
+                                    struct pata_icside_info *info,
+                                    const struct portinfo *port)
 {
        struct ata_ioports *ioaddr = &ap->ioaddr;
        void __iomem *cmd = base + port->dataoffset;
@@ -368,7 +367,7 @@ pata_icside_setup_ioaddr(struct ata_port *ap, void __iomem *base,
                ata_port_desc(ap, "iocbase 0x%lx", info->raw_ioc_base);
 }
 
-static int __devinit pata_icside_register_v5(struct pata_icside_info *info)
+static int pata_icside_register_v5(struct pata_icside_info *info)
 {
        struct pata_icside_state *state = info->state;
        void __iomem *base;
@@ -391,7 +390,7 @@ static int __devinit pata_icside_register_v5(struct pata_icside_info *info)
        return 0;
 }
 
-static int __devinit pata_icside_register_v6(struct pata_icside_info *info)
+static int pata_icside_register_v6(struct pata_icside_info *info)
 {
        struct pata_icside_state *state = info->state;
        struct expansion_card *ec = info->ec;
@@ -434,7 +433,7 @@ static int __devinit pata_icside_register_v6(struct pata_icside_info *info)
        return icside_dma_init(info);
 }
 
-static int __devinit pata_icside_add_ports(struct pata_icside_info *info)
+static int pata_icside_add_ports(struct pata_icside_info *info)
 {
        struct expansion_card *ec = info->ec;
        struct ata_host *host;
@@ -474,8 +473,8 @@ static int __devinit pata_icside_add_ports(struct pata_icside_info *info)
                                 &pata_icside_sht);
 }
 
-static int __devinit
-pata_icside_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int pata_icside_probe(struct expansion_card *ec,
+                            const struct ecard_id *id)
 {
        struct pata_icside_state *state;
        struct pata_icside_info info;
@@ -575,7 +574,7 @@ static void pata_icside_shutdown(struct expansion_card *ec)
        }
 }
 
-static void __devexit pata_icside_remove(struct expansion_card *ec)
+static void pata_icside_remove(struct expansion_card *ec)
 {
        struct ata_host *host = ecard_get_drvdata(ec);
        struct pata_icside_state *state = host->private_data;
@@ -602,7 +601,7 @@ static const struct ecard_id pata_icside_ids[] = {
 
 static struct ecard_driver pata_icside_driver = {
        .probe          = pata_icside_probe,
-       .remove         = __devexit_p(pata_icside_remove),
+       .remove         = pata_icside_remove,
        .shutdown       = pata_icside_shutdown,
        .id_table       = pata_icside_ids,
        .drv = {
index 7d40b526ef118761194e0ea9a428432e9a1668d3..40849445a9dca0bedad6d2f4ad8edfa747676e00 100644 (file)
@@ -91,7 +91,7 @@ static void pata_imx_setup_port(struct ata_ioports *ioaddr)
        ioaddr->command_addr    = ioaddr->cmd_addr + (ATA_REG_CMD     << 2);
 }
 
-static int __devinit pata_imx_probe(struct platform_device *pdev)
+static int pata_imx_probe(struct platform_device *pdev)
 {
        struct ata_host *host;
        struct ata_port *ap;
@@ -167,7 +167,7 @@ free_priv:
        return -ENOMEM;
 }
 
-static int __devexit pata_imx_remove(struct platform_device *pdev)
+static int pata_imx_remove(struct platform_device *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
        struct pata_imx_priv *priv = host->private_data;
@@ -225,7 +225,7 @@ static const struct dev_pm_ops pata_imx_pm_ops = {
 
 static struct platform_driver pata_imx_driver = {
        .probe          = pata_imx_probe,
-       .remove         = __devexit_p(pata_imx_remove),
+       .remove         = pata_imx_remove,
        .driver = {
                .name           = DRV_NAME,
                .owner          = THIS_MODULE,
index 0566e67b5e125b744d1a34ff897aef4564175186..dcc6b243e525572ba4ac92576c3cb5e7d28863b9 100644 (file)
@@ -137,7 +137,7 @@ static void ixp4xx_setup_port(struct ata_port *ap,
        ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", raw_cmd, raw_ctl);
 }
 
-static __devinit int ixp4xx_pata_probe(struct platform_device *pdev)
+static int ixp4xx_pata_probe(struct platform_device *pdev)
 {
        unsigned int irq;
        struct resource *cs0, *cs1;
index b057e3fa44bcac0b39193335ab559e7bec314891..e5725edcf5159eabae5e6751972aeb0e7d46ed1b 100644 (file)
@@ -935,7 +935,7 @@ static struct ata_port_operations pata_macio_ops = {
        .sff_irq_clear          = pata_macio_irq_clear,
 };
 
-static void __devinit pata_macio_invariants(struct pata_macio_priv *priv)
+static void pata_macio_invariants(struct pata_macio_priv *priv)
 {
        const int *bidp;
 
@@ -976,9 +976,8 @@ static void __devinit pata_macio_invariants(struct pata_macio_priv *priv)
                priv->aapl_bus_id = 1;
 }
 
-static void __devinit pata_macio_setup_ios(struct ata_ioports *ioaddr,
-                                          void __iomem * base,
-                                          void __iomem * dma)
+static void pata_macio_setup_ios(struct ata_ioports *ioaddr,
+                                void __iomem * base, void __iomem * dma)
 {
        /* cmd_addr is the base of regs for that port */
        ioaddr->cmd_addr        = base;
@@ -999,8 +998,8 @@ static void __devinit pata_macio_setup_ios(struct ata_ioports *ioaddr,
        ioaddr->bmdma_addr      = dma;
 }
 
-static void __devinit pmac_macio_calc_timing_masks(struct pata_macio_priv *priv,
-                                                  struct ata_port_info   *pinfo)
+static void pmac_macio_calc_timing_masks(struct pata_macio_priv *priv,
+                                        struct ata_port_info *pinfo)
 {
        int i = 0;
 
@@ -1027,11 +1026,11 @@ static void __devinit pmac_macio_calc_timing_masks(struct pata_macio_priv *priv,
                pinfo->pio_mask, pinfo->mwdma_mask, pinfo->udma_mask);
 }
 
-static int __devinit pata_macio_common_init(struct pata_macio_priv     *priv,
-                                           resource_size_t             tfregs,
-                                           resource_size_t             dmaregs,
-                                           resource_size_t             fcregs,
-                                           unsigned long               irq)
+static int pata_macio_common_init(struct pata_macio_priv *priv,
+                                 resource_size_t tfregs,
+                                 resource_size_t dmaregs,
+                                 resource_size_t fcregs,
+                                 unsigned long irq)
 {
        struct ata_port_info            pinfo;
        const struct ata_port_info      *ppi[] = { &pinfo, NULL };
@@ -1113,8 +1112,8 @@ static int __devinit pata_macio_common_init(struct pata_macio_priv        *priv,
                                 &pata_macio_sht);
 }
 
-static int __devinit pata_macio_attach(struct macio_dev *mdev,
-                                      const struct of_device_id *match)
+static int pata_macio_attach(struct macio_dev *mdev,
+                            const struct of_device_id *match)
 {
        struct pata_macio_priv  *priv;
        resource_size_t         tfregs, dmaregs = 0;
@@ -1190,7 +1189,7 @@ static int __devinit pata_macio_attach(struct macio_dev *mdev,
        return rc;
 }
 
-static int __devexit pata_macio_detach(struct macio_dev *mdev)
+static int pata_macio_detach(struct macio_dev *mdev)
 {
        struct ata_host *host = macio_get_drvdata(mdev);
        struct pata_macio_priv *priv = host->private_data;
@@ -1257,8 +1256,8 @@ static void pata_macio_mb_event(struct macio_dev* mdev, int mb_state)
 #endif /* CONFIG_PMAC_MEDIABAY */
 
 
-static int __devinit pata_macio_pci_attach(struct pci_dev *pdev,
-                                          const struct pci_device_id *id)
+static int pata_macio_pci_attach(struct pci_dev *pdev,
+                                const struct pci_device_id *id)
 {
        struct pata_macio_priv  *priv;
        struct device_node      *np;
@@ -1310,7 +1309,7 @@ static int __devinit pata_macio_pci_attach(struct pci_dev *pdev,
        return 0;
 }
 
-static void __devexit pata_macio_pci_detach(struct pci_dev *pdev)
+static void pata_macio_pci_detach(struct pci_dev *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
 
index ec67f54dc56f5ae4360f27330fe0fa19b0972fe2..652f57e8348466e51b476ec68c4c39ba9b5a5864 100644 (file)
@@ -621,9 +621,10 @@ static struct ata_port_operations mpc52xx_ata_port_ops = {
        .qc_prep                = ata_noop_qc_prep,
 };
 
-static int __devinit
-mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv,
-                    unsigned long raw_ata_regs, int mwdma_mask, int udma_mask)
+static int mpc52xx_ata_init_one(struct device *dev,
+                               struct mpc52xx_ata_priv *priv,
+                               unsigned long raw_ata_regs,
+                               int mwdma_mask, int udma_mask)
 {
        struct ata_host *host;
        struct ata_port *ap;
@@ -667,8 +668,7 @@ mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv,
 /* OF Platform driver                                                       */
 /* ======================================================================== */
 
-static int __devinit
-mpc52xx_ata_probe(struct platform_device *op)
+static int mpc52xx_ata_probe(struct platform_device *op)
 {
        unsigned int ipb_freq;
        struct resource res_mem;
index 4e1194b4c27128a9c6cb0671552ffaba4f97c681..ff2e57f3b5972521377199814a2e4f0a0aaa0ae2 100644 (file)
@@ -840,7 +840,7 @@ static struct ata_port_operations octeon_cf_ops = {
        .dev_config             = octeon_cf_dev_config,
 };
 
-static int __devinit octeon_cf_probe(struct platform_device *pdev)
+static int octeon_cf_probe(struct platform_device *pdev)
 {
        struct resource *res_cs0, *res_cs1;
 
index e5b234c370fa8d3482cc748409ea863b6561a2f5..a7e95a54c7827582c5a47344cb3dcc313e53ce22 100644 (file)
@@ -16,7 +16,7 @@
 #include <linux/ata_platform.h>
 #include <linux/libata.h>
 
-static int __devinit pata_of_platform_probe(struct platform_device *ofdev)
+static int pata_of_platform_probe(struct platform_device *ofdev)
 {
        int ret;
        struct device_node *dn = ofdev->dev.of_node;
index f9f79fc04a8fc67001f69ff27d43790ddc0ecb8d..df2bb7504fc8e073650c271dd147d4d75cbf26a5 100644 (file)
@@ -48,7 +48,7 @@ static struct ata_port_operations palmld_port_ops = {
        .cable_detect           = ata_cable_40wire,
 };
 
-static __devinit int palmld_pata_probe(struct platform_device *pdev)
+static int palmld_pata_probe(struct platform_device *pdev)
 {
        struct ata_host *host;
        struct ata_port *ap;
@@ -109,7 +109,7 @@ err1:
        return ret;
 }
 
-static __devexit int palmld_pata_remove(struct platform_device *dev)
+static int palmld_pata_remove(struct platform_device *dev)
 {
        ata_platform_remove_one(dev);
 
@@ -127,7 +127,7 @@ static struct platform_driver palmld_pata_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = palmld_pata_probe,
-       .remove         = __devexit_p(palmld_pata_remove),
+       .remove         = palmld_pata_remove,
 };
 
 module_platform_driver(palmld_pata_platform_driver);
index c9399c8688c5c62555137d2db5a6ba060e2240c4..3f94a886bb35cb90d833021d41237ccd08002e94 100644 (file)
@@ -700,7 +700,8 @@ static void pdc_ata_setup_port(struct ata_ioports *port, void __iomem *base)
  * @pdev: instance of pci_dev found
  * @ent:  matching entry in the id_tbl[]
  */
-static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int pdc2027x_init_one(struct pci_dev *pdev,
+                            const struct pci_device_id *ent)
 {
        static const unsigned long cmd_offset[] = { 0x17c0, 0x15c0 };
        static const unsigned long bmdma_offset[] = { 0x1000, 0x1008 };
index f4372d0c7ce603c2db18374cf22cc82cec66a4a2..71e093767f4e400e66ea8defe5b7d0ff0c2d0ff7 100644 (file)
@@ -98,12 +98,9 @@ static void pata_platform_setup_port(struct ata_ioports *ioaddr,
  *
  *     If no IRQ resource is present, PIO polling mode is used instead.
  */
-int __devinit __pata_platform_probe(struct device *dev,
-                                   struct resource *io_res,
-                                   struct resource *ctl_res,
-                                   struct resource *irq_res,
-                                   unsigned int ioport_shift,
-                                   int __pio_mask)
+int __pata_platform_probe(struct device *dev, struct resource *io_res,
+                         struct resource *ctl_res, struct resource *irq_res,
+                         unsigned int ioport_shift, int __pio_mask)
 {
        struct ata_host *host;
        struct ata_port *ap;
@@ -178,7 +175,7 @@ int __devinit __pata_platform_probe(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(__pata_platform_probe);
 
-static int __devinit pata_platform_probe(struct platform_device *pdev)
+static int pata_platform_probe(struct platform_device *pdev)
 {
        struct resource *io_res;
        struct resource *ctl_res;
index 4b8ba559fe24cff43808ac586a3d87f18a226f7b..b0ac9e0c5e01e647d205e6597f33614098d66a42 100644 (file)
@@ -229,7 +229,7 @@ static void pxa_ata_dma_irq(int dma, void *port)
                complete(&pd->dma_done);
 }
 
-static int __devinit pxa_ata_probe(struct platform_device *pdev)
+static int pxa_ata_probe(struct platform_device *pdev)
 {
        struct ata_host *host;
        struct ata_port *ap;
@@ -369,7 +369,7 @@ static int __devinit pxa_ata_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int __devexit pxa_ata_remove(struct platform_device *pdev)
+static int pxa_ata_remove(struct platform_device *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
        struct pata_pxa_data *data = host->ports[0]->private_data;
@@ -383,7 +383,7 @@ static int __devexit pxa_ata_remove(struct platform_device *pdev)
 
 static struct platform_driver pxa_ata_driver = {
        .probe          = pxa_ata_probe,
-       .remove         = __devexit_p(pxa_ata_remove),
+       .remove         = pxa_ata_remove,
        .driver         = {
                .name           = DRV_NAME,
                .owner          = THIS_MODULE,
index 9417101bd5ca4524eb4aefdd797e4f41fc6840ae..3c5eb8fa6bd1f6e3538979e8b588f72dfda4cd72 100644 (file)
@@ -102,7 +102,7 @@ static void rb532_pata_setup_ports(struct ata_host *ah)
        ap->ioaddr.error_addr   = info->iobase + RB500_CF_REG_ERR;
 }
 
-static __devinit int rb532_pata_driver_probe(struct platform_device *pdev)
+static int rb532_pata_driver_probe(struct platform_device *pdev)
 {
        int irq;
        int gpio;
@@ -177,7 +177,7 @@ err_free_gpio:
        return ret;
 }
 
-static __devexit int rb532_pata_driver_remove(struct platform_device *pdev)
+static int rb532_pata_driver_remove(struct platform_device *pdev)
 {
        struct ata_host *ah = platform_get_drvdata(pdev);
        struct rb532_cf_info *info = ah->private_data;
@@ -190,7 +190,7 @@ static __devexit int rb532_pata_driver_remove(struct platform_device *pdev)
 
 static struct platform_driver rb532_pata_platform_driver = {
        .probe          = rb532_pata_driver_probe,
-       .remove         = __devexit_p(rb532_pata_driver_remove),
+       .remove         = rb532_pata_driver_remove,
        .driver  = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
index e71f998dd90ddfe4c9101996a5e59011e0a8a1bc..6a8665574fee5ad0e20e2f2423c76e32d8fca6a9 100644 (file)
@@ -321,8 +321,7 @@ static struct scsi_host_template rdc_sht = {
  *     Zero on success, or -ERRNO value.
  */
 
-static int __devinit rdc_init_one(struct pci_dev *pdev,
-                                  const struct pci_device_id *ent)
+static int rdc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct device *dev = &pdev->dev;
        struct ata_port_info port_info[2];
index db0d18cf1c2a3f00191a94fda39b75205b378eef..d3830c45a369cd611ba99ff78bac235c5fc4e258 100644 (file)
@@ -169,8 +169,7 @@ static void sch_set_dmamode(struct ata_port *ap, struct ata_device *adev)
  *     Zero on success, or -ERRNO value.
  */
 
-static int __devinit sch_init_one(struct pci_dev *pdev,
-                                  const struct pci_device_id *ent)
+static int sch_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        const struct ata_port_info *ppi[] = { &sch_port_info, NULL };
 
index 5cfdf94823d07494116b0c3e3f02289156768973..64c5f0d0f81279cad0fb8226b85da5dfdeafe08f 100644 (file)
@@ -323,8 +323,7 @@ static u8 sil680_init_chip(struct pci_dev *pdev, int *try_mmio)
        return tmpbyte & 0x30;
 }
 
-static int __devinit sil680_init_one(struct pci_dev *pdev,
-                                    const struct pci_device_id *id)
+static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        static const struct ata_port_info info = {
                .flags = ATA_FLAG_SLAVE_POSS,
index dc7d78eecb19ce6dd3631e8fcc0393804da359eb..5dba77ccaa0b9e89badebcad04b2525c7d5e9add 100644 (file)
@@ -260,7 +260,7 @@ static const struct of_device_id ahci_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, ahci_of_match);
 
-static int __devinit ahci_highbank_probe(struct platform_device *pdev)
+static int ahci_highbank_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct ahci_host_priv *hpriv;
index 68f4fb54d627f43ba24a758e5ed216668e65eb1e..35c6b6d09c277526d93461388b6971069c644341 100644 (file)
@@ -4148,7 +4148,7 @@ err:
  *      A platform bus SATA device has been unplugged. Perform the needed
  *      cleanup. Also called on module unload for any active devices.
  */
-static int __devexit mv_platform_remove(struct platform_device *pdev)
+static int mv_platform_remove(struct platform_device *pdev)
 {
        struct ata_host *host = platform_get_drvdata(pdev);
 #if defined(CONFIG_HAVE_CLK)
@@ -4215,7 +4215,7 @@ static int mv_platform_resume(struct platform_device *pdev)
 #endif
 
 #ifdef CONFIG_OF
-static struct of_device_id mv_sata_dt_ids[] __devinitdata = {
+static struct of_device_id mv_sata_dt_ids[] = {
        { .compatible = "marvell,orion-sata", },
        {},
 };
@@ -4224,7 +4224,7 @@ MODULE_DEVICE_TABLE(of, mv_sata_dt_ids);
 
 static struct platform_driver mv_platform_driver = {
        .probe          = mv_platform_probe,
-       .remove         = __devexit_p(mv_platform_remove),
+       .remove         = mv_platform_remove,
        .suspend        = mv_platform_suspend,
        .resume         = mv_platform_resume,
        .driver         = {
@@ -4429,7 +4429,7 @@ static int mv_pci_device_resume(struct pci_dev *pdev)
 #endif
 
 static int mv_platform_probe(struct platform_device *pdev);
-static int __devexit mv_platform_remove(struct platform_device *pdev);
+static int mv_platform_remove(struct platform_device *pdev);
 
 static int __init mv_init(void)
 {
index e8cf88ba145d40c96230e8ac77da01e0af9e0713..44f304b3de63c6ee45fa87f88793e900359ac1be 100644 (file)
@@ -312,8 +312,7 @@ static struct ata_port_operations vsc_sata_ops = {
        .scr_write              = vsc_sata_scr_write,
 };
 
-static void __devinit vsc_sata_setup_port(struct ata_ioports *port,
-                                         void __iomem *base)
+static void vsc_sata_setup_port(struct ata_ioports *port, void __iomem *base)
 {
        port->cmd_addr          = base + VSC_SATA_TF_CMD_OFFSET;
        port->data_addr         = base + VSC_SATA_TF_DATA_OFFSET;
@@ -335,8 +334,8 @@ static void __devinit vsc_sata_setup_port(struct ata_ioports *port,
 }
 
 
-static int __devinit vsc_sata_init_one(struct pci_dev *pdev,
-                                      const struct pci_device_id *ent)
+static int vsc_sata_init_one(struct pci_dev *pdev,
+                            const struct pci_device_id *ent)
 {
        static const struct ata_port_info pi = {
                .flags          = ATA_FLAG_SATA,
index ff7bb8a42ed62b042bff5f786b94775f8bfb87bc..77a7480dc4d1bc23881c0b6d4a1e469833576424 100644 (file)
@@ -1507,9 +1507,9 @@ static void do_housekeeping (unsigned long arg) {
 
 /********** creation of communication queues **********/
 
-static int __devinit create_queues (amb_dev * dev, unsigned int cmds,
-                                unsigned int txs, unsigned int * rxs,
-                                unsigned int * rx_buffer_sizes) {
+static int create_queues(amb_dev *dev, unsigned int cmds, unsigned int txs,
+                        unsigned int *rxs, unsigned int *rx_buffer_sizes)
+{
   unsigned char pool;
   size_t total = 0;
   void * memory;
@@ -1737,8 +1737,9 @@ static  int decode_loader_result (loader_command cmd, u32 result)
        return res;
 }
 
-static int __devinit do_loader_command (volatile loader_block * lb,
-                                    const amb_dev * dev, loader_command cmd) {
+static int do_loader_command(volatile loader_block *lb, const amb_dev *dev,
+                            loader_command cmd)
+{
   
   unsigned long timeout;
   
@@ -1793,8 +1794,9 @@ static int __devinit do_loader_command (volatile loader_block * lb,
 
 /* loader: determine loader version */
 
-static int __devinit get_loader_version (loader_block * lb,
-                                     const amb_dev * dev, u32 * version) {
+static int get_loader_version(loader_block *lb, const amb_dev *dev,
+                             u32 *version)
+{
   int res;
   
   PRINTD (DBG_FLOW|DBG_LOAD, "get_loader_version");
@@ -1809,9 +1811,9 @@ static int __devinit get_loader_version (loader_block * lb,
 
 /* loader: write memory data blocks */
 
-static int __devinit loader_write (loader_block* lb,
-                                  const amb_dev *dev,
-                                  const struct ihex_binrec *rec) {
+static int loader_write(loader_block *lb, const amb_dev *dev,
+                       const struct ihex_binrec *rec)
+{
   transfer_block * tb = &lb->payload.transfer;
   
   PRINTD (DBG_FLOW|DBG_LOAD, "loader_write");
@@ -1824,9 +1826,9 @@ static int __devinit loader_write (loader_block* lb,
 
 /* loader: verify memory data blocks */
 
-static int __devinit loader_verify (loader_block * lb,
-                                   const amb_dev *dev,
-                                   const struct ihex_binrec *rec) {
+static int loader_verify(loader_block *lb, const amb_dev *dev,
+                        const struct ihex_binrec *rec)
+{
   transfer_block * tb = &lb->payload.transfer;
   int res;
   
@@ -1842,8 +1844,8 @@ static int __devinit loader_verify (loader_block * lb,
 
 /* loader: start microcode */
 
-static int __devinit loader_start (loader_block * lb,
-                               const amb_dev * dev, u32 address) {
+static int loader_start(loader_block *lb, const amb_dev *dev, u32 address)
+{
   PRINTD (DBG_FLOW|DBG_LOAD, "loader_start");
   
   lb->payload.start = cpu_to_be32 (address);
@@ -1918,7 +1920,8 @@ static int amb_reset (amb_dev * dev, int diags) {
 
 /********** transfer and start the microcode **********/
 
-static int __devinit ucode_init (loader_block * lb, amb_dev * dev) {
+static int ucode_init(loader_block *lb, amb_dev *dev)
+{
   const struct firmware *fw;
   unsigned long start_address;
   const struct ihex_binrec *rec;
@@ -1980,7 +1983,8 @@ static inline __be32 bus_addr(void * addr) {
     return cpu_to_be32 (virt_to_bus (addr));
 }
 
-static int __devinit amb_talk (amb_dev * dev) {
+static int amb_talk(amb_dev *dev)
+{
   adap_talk_block a;
   unsigned char pool;
   unsigned long timeout;
@@ -2027,7 +2031,8 @@ static int __devinit amb_talk (amb_dev * dev) {
 }
 
 // get microcode version
-static void __devinit amb_ucode_version (amb_dev * dev) {
+static void amb_ucode_version(amb_dev *dev)
+{
   u32 major;
   u32 minor;
   command cmd;
@@ -2042,7 +2047,8 @@ static void __devinit amb_ucode_version (amb_dev * dev) {
 }
   
 // get end station address
-static void __devinit amb_esi (amb_dev * dev, u8 * esi) {
+static void amb_esi(amb_dev *dev, u8 *esi)
+{
   u32 lower4;
   u16 upper2;
   command cmd;
@@ -2088,7 +2094,7 @@ static void fixup_plx_window (amb_dev *dev, loader_block *lb)
        return;
 }
 
-static int __devinit amb_init (amb_dev * dev)
+static int amb_init(amb_dev *dev)
 {
   loader_block lb;
   
@@ -2184,7 +2190,8 @@ static void setup_pci_dev(struct pci_dev *pci_dev)
        }
 }
 
-static int __devinit amb_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
+static int amb_probe(struct pci_dev *pci_dev,
+                    const struct pci_device_id *pci_ent)
 {
        amb_dev * dev;
        int err;
@@ -2285,7 +2292,7 @@ out_disable:
 }
 
 
-static void __devexit amb_remove_one(struct pci_dev *pci_dev)
+static void amb_remove_one(struct pci_dev *pci_dev)
 {
        struct amb_dev *dev;
 
@@ -2379,7 +2386,7 @@ MODULE_DEVICE_TABLE(pci, amb_pci_tbl);
 static struct pci_driver amb_driver = {
        .name =         "amb",
        .probe =        amb_probe,
-       .remove =       __devexit_p(amb_remove_one),
+       .remove =       amb_remove_one,
        .id_table =     amb_pci_tbl,
 };
 
index 81e44f7b0ab6669b4e88bc28cac5402f2856452f..c1eb6fa8ac35b0e05125b0f5955d30a6f39d9ef7 100644 (file)
@@ -1567,7 +1567,7 @@ tx_complete++;
 /*--------------------------------- entries ---------------------------------*/
 
 
-static char * const media_name[] __devinitconst = {
+static char * const media_name[] = {
     "MMF", "SMF", "MMF", "03?", /*  0- 3 */
     "UTP", "05?", "06?", "07?", /*  4- 7 */
     "TAXI","09?", "10?", "11?", /*  8-11 */
@@ -1591,7 +1591,7 @@ static char * const media_name[] __devinitconst = {
   } })
 
 
-static int __devinit get_esi_asic(struct atm_dev *dev)
+static int get_esi_asic(struct atm_dev *dev)
 {
        struct eni_dev *eni_dev;
        unsigned char tonga;
@@ -1683,7 +1683,7 @@ static int __devinit get_esi_asic(struct atm_dev *dev)
 #undef GET_SEPROM
 
 
-static int __devinit get_esi_fpga(struct atm_dev *dev, void __iomem *base)
+static int get_esi_fpga(struct atm_dev *dev, void __iomem *base)
 {
        void __iomem *mac_base;
        int i;
@@ -1694,7 +1694,7 @@ static int __devinit get_esi_fpga(struct atm_dev *dev, void __iomem *base)
 }
 
 
-static int __devinit eni_do_init(struct atm_dev *dev)
+static int eni_do_init(struct atm_dev *dev)
 {
        struct midway_eprom __iomem *eprom;
        struct eni_dev *eni_dev;
@@ -1797,7 +1797,7 @@ static void eni_do_release(struct atm_dev *dev)
        iounmap(ed->ioaddr);
 }
 
-static int __devinit eni_start(struct atm_dev *dev)
+static int eni_start(struct atm_dev *dev)
 {
        struct eni_dev *eni_dev;
        
@@ -2226,8 +2226,8 @@ static const struct atmdev_ops ops = {
 };
 
 
-static int __devinit eni_init_one(struct pci_dev *pci_dev,
-                                 const struct pci_device_id *ent)
+static int eni_init_one(struct pci_dev *pci_dev,
+                       const struct pci_device_id *ent)
 {
        struct atm_dev *dev;
        struct eni_dev *eni_dev;
@@ -2292,7 +2292,7 @@ static struct pci_device_id eni_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci,eni_pci_tbl);
 
 
-static void __devexit eni_remove_one(struct pci_dev *pdev)
+static void eni_remove_one(struct pci_dev *pdev)
 {
        struct atm_dev *dev = pci_get_drvdata(pdev);
        struct eni_dev *ed = ENI_DEV(dev);
@@ -2310,7 +2310,7 @@ static struct pci_driver eni_driver = {
        .name           = DEV_LABEL,
        .id_table       = eni_pci_tbl,
        .probe          = eni_init_one,
-       .remove         = __devexit_p(eni_remove_one),
+       .remove         = eni_remove_one,
 };
 
 
index 86fed1b916957623130923714ce877c69543af37..b41c9481b67b94bf8331c9401b18123eb47ffaef 100644 (file)
@@ -252,7 +252,7 @@ struct reginit_item {
 };
 
 
-static struct reginit_item PHY_NTC_INIT[] __devinitdata = {
+static struct reginit_item PHY_NTC_INIT[] = {
        { PHY_CLEARALL, 0x40 }, 
        { 0x12,  0x0001 },
        { 0x13,  0x7605 },
@@ -1295,7 +1295,7 @@ static const struct atmdev_ops ops = {
 };
 
 
-static void __devinit undocumented_pci_fix (struct pci_dev *pdev)
+static void undocumented_pci_fix(struct pci_dev *pdev)
 {
        u32 tint;
 
@@ -1319,13 +1319,13 @@ static void __devinit undocumented_pci_fix (struct pci_dev *pdev)
  *                              PHY routines                              *
  **************************************************************************/
 
-static void __devinit write_phy (struct fs_dev *dev, int regnum, int val)
+static void write_phy(struct fs_dev *dev, int regnum, int val)
 {
        submit_command (dev,  &dev->hp_txq, QE_CMD_PRP_WR | QE_CMD_IMM_INQ,
                        regnum, val, 0);
 }
 
-static int __devinit init_phy (struct fs_dev *dev, struct reginit_item *reginit)
+static int init_phy(struct fs_dev *dev, struct reginit_item *reginit)
 {
        int i;
 
@@ -1381,7 +1381,7 @@ static void reset_chip (struct fs_dev *dev)
        }
 }
 
-static void __devinit *aligned_kmalloc (int size, gfp_t flags, int alignment)
+static void *aligned_kmalloc(int size, gfp_t flags, int alignment)
 {
        void  *t;
 
@@ -1398,8 +1398,8 @@ static void __devinit *aligned_kmalloc (int size, gfp_t flags, int alignment)
        return NULL;
 }
 
-static int __devinit init_q (struct fs_dev *dev, 
-                         struct queue *txq, int queue, int nentries, int is_rq)
+static int init_q(struct fs_dev *dev, struct queue *txq, int queue,
+                 int nentries, int is_rq)
 {
        int sz = nentries * sizeof (struct FS_QENTRY);
        struct FS_QENTRY *p;
@@ -1434,8 +1434,8 @@ static int __devinit init_q (struct fs_dev *dev,
 }
 
 
-static int __devinit init_fp (struct fs_dev *dev, 
-                          struct freepool *fp, int queue, int bufsize, int nr_buffers)
+static int init_fp(struct fs_dev *dev, struct freepool *fp, int queue,
+                  int bufsize, int nr_buffers)
 {
        func_enter ();
 
@@ -1528,7 +1528,7 @@ static void top_off_fp (struct fs_dev *dev, struct freepool *fp,
        fs_dprintk (FS_DEBUG_QUEUE, "Added %d entries. \n", n);
 }
 
-static void __devexit free_queue (struct fs_dev *dev, struct queue *txq)
+static void free_queue(struct fs_dev *dev, struct queue *txq)
 {
        func_enter ();
 
@@ -1544,7 +1544,7 @@ static void __devexit free_queue (struct fs_dev *dev, struct queue *txq)
        func_exit ();
 }
 
-static void __devexit free_freepool (struct fs_dev *dev, struct freepool *fp)
+static void free_freepool(struct fs_dev *dev, struct freepool *fp)
 {
        func_enter ();
 
@@ -1662,7 +1662,7 @@ static void fs_poll (unsigned long data)
 }
 #endif
 
-static int __devinit fs_init (struct fs_dev *dev)
+static int fs_init(struct fs_dev *dev)
 {
        struct pci_dev  *pci_dev;
        int isr, to;
@@ -1897,8 +1897,8 @@ unmap:
        return 1;
 }
 
-static int __devinit firestream_init_one (struct pci_dev *pci_dev,
-                                      const struct pci_device_id *ent) 
+static int firestream_init_one(struct pci_dev *pci_dev,
+                              const struct pci_device_id *ent)
 {
        struct atm_dev *atm_dev;
        struct fs_dev *fs_dev;
@@ -1934,7 +1934,7 @@ static int __devinit firestream_init_one (struct pci_dev *pci_dev,
        return -ENODEV;
 }
 
-static void __devexit firestream_remove_one (struct pci_dev *pdev)
+static void firestream_remove_one(struct pci_dev *pdev)
 {
        int i;
        struct fs_dev *dev, *nxtdev;
@@ -2038,7 +2038,7 @@ static struct pci_driver firestream_driver = {
        .name           = "firestream",
        .id_table       = firestream_pci_tbl,
        .probe          = firestream_init_one,
-       .remove         = __devexit_p(firestream_remove_one),
+       .remove         = firestream_remove_one,
 };
 
 static int __init firestream_init_module (void)
index 361f5aee3be12fec5afd8796eaa784b6d3291b89..204814e88e464480248a6ddef6fe292d095514ad 100644 (file)
@@ -527,8 +527,7 @@ fore200e_pca_reset(struct fore200e* fore200e)
 }
 
 
-static int __devinit
-fore200e_pca_map(struct fore200e* fore200e)
+static int fore200e_pca_map(struct fore200e* fore200e)
 {
     DPRINTK(2, "device %s being mapped in memory\n", fore200e->name);
 
@@ -561,8 +560,7 @@ fore200e_pca_unmap(struct fore200e* fore200e)
 }
 
 
-static int __devinit
-fore200e_pca_configure(struct fore200e* fore200e)
+static int fore200e_pca_configure(struct fore200e *fore200e)
 {
     struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
     u8              master_ctrl, latency;
@@ -2028,8 +2026,7 @@ fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags)
 }
     
 
-static int __devinit
-fore200e_irq_request(struct fore200e* fore200e)
+static int fore200e_irq_request(struct fore200e *fore200e)
 {
     if (request_irq(fore200e->irq, fore200e_interrupt, IRQF_SHARED, fore200e->name, fore200e->atm_dev) < 0) {
 
@@ -2051,8 +2048,7 @@ fore200e_irq_request(struct fore200e* fore200e)
 }
 
 
-static int __devinit
-fore200e_get_esi(struct fore200e* fore200e)
+static int fore200e_get_esi(struct fore200e *fore200e)
 {
     struct prom_data* prom = kzalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA);
     int ok, i;
@@ -2081,8 +2077,7 @@ fore200e_get_esi(struct fore200e* fore200e)
 }
 
 
-static int __devinit
-fore200e_alloc_rx_buf(struct fore200e* fore200e)
+static int fore200e_alloc_rx_buf(struct fore200e *fore200e)
 {
     int scheme, magn, nbr, size, i;
 
@@ -2146,8 +2141,7 @@ fore200e_alloc_rx_buf(struct fore200e* fore200e)
 }
 
 
-static int __devinit
-fore200e_init_bs_queue(struct fore200e* fore200e)
+static int fore200e_init_bs_queue(struct fore200e *fore200e)
 {
     int scheme, magn, i;
 
@@ -2209,8 +2203,7 @@ fore200e_init_bs_queue(struct fore200e* fore200e)
 }
 
 
-static int __devinit
-fore200e_init_rx_queue(struct fore200e* fore200e)
+static int fore200e_init_rx_queue(struct fore200e *fore200e)
 {
     struct host_rxq*     rxq =  &fore200e->host_rxq;
     struct cp_rxq_entry __iomem * cp_entry;
@@ -2269,8 +2262,7 @@ fore200e_init_rx_queue(struct fore200e* fore200e)
 }
 
 
-static int __devinit
-fore200e_init_tx_queue(struct fore200e* fore200e)
+static int fore200e_init_tx_queue(struct fore200e *fore200e)
 {
     struct host_txq*     txq =  &fore200e->host_txq;
     struct cp_txq_entry __iomem * cp_entry;
@@ -2332,8 +2324,7 @@ fore200e_init_tx_queue(struct fore200e* fore200e)
 }
 
 
-static int __devinit
-fore200e_init_cmd_queue(struct fore200e* fore200e)
+static int fore200e_init_cmd_queue(struct fore200e *fore200e)
 {
     struct host_cmdq*     cmdq =  &fore200e->host_cmdq;
     struct cp_cmdq_entry __iomem * cp_entry;
@@ -2374,10 +2365,10 @@ fore200e_init_cmd_queue(struct fore200e* fore200e)
 }
 
 
-static void __devinit
-fore200e_param_bs_queue(struct fore200e* fore200e,
-                       enum buffer_scheme scheme, enum buffer_magn magn,
-                       int queue_length, int pool_size, int supply_blksize)
+static void fore200e_param_bs_queue(struct fore200e *fore200e,
+                                   enum buffer_scheme scheme,
+                                   enum buffer_magn magn, int queue_length,
+                                   int pool_size, int supply_blksize)
 {
     struct bs_spec __iomem * bs_spec = &fore200e->cp_queues->init.bs_spec[ scheme ][ magn ];
 
@@ -2388,8 +2379,7 @@ fore200e_param_bs_queue(struct fore200e* fore200e,
 }
 
 
-static int __devinit
-fore200e_initialize(struct fore200e* fore200e)
+static int fore200e_initialize(struct fore200e *fore200e)
 {
     struct cp_queues __iomem * cpq;
     int               ok, scheme, magn;
@@ -2440,8 +2430,7 @@ fore200e_initialize(struct fore200e* fore200e)
 }
 
 
-static void __devinit
-fore200e_monitor_putc(struct fore200e* fore200e, char c)
+static void fore200e_monitor_putc(struct fore200e *fore200e, char c)
 {
     struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
 
@@ -2452,8 +2441,7 @@ fore200e_monitor_putc(struct fore200e* fore200e, char c)
 }
 
 
-static int __devinit
-fore200e_monitor_getc(struct fore200e* fore200e)
+static int fore200e_monitor_getc(struct fore200e *fore200e)
 {
     struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
     unsigned long      timeout = jiffies + msecs_to_jiffies(50);
@@ -2477,8 +2465,7 @@ fore200e_monitor_getc(struct fore200e* fore200e)
 }
 
 
-static void __devinit
-fore200e_monitor_puts(struct fore200e* fore200e, char* str)
+static void fore200e_monitor_puts(struct fore200e *fore200e, char *str)
 {
     while (*str) {
 
@@ -2497,8 +2484,7 @@ fore200e_monitor_puts(struct fore200e* fore200e, char* str)
 #define FW_EXT "_ecd.bin2"
 #endif
 
-static int __devinit
-fore200e_load_and_start_fw(struct fore200e* fore200e)
+static int fore200e_load_and_start_fw(struct fore200e *fore200e)
 {
     const struct firmware *firmware;
     struct device *device;
@@ -2566,8 +2552,7 @@ release:
 }
 
 
-static int __devinit
-fore200e_register(struct fore200e* fore200e, struct device *parent)
+static int fore200e_register(struct fore200e *fore200e, struct device *parent)
 {
     struct atm_dev* atm_dev;
 
@@ -2593,8 +2578,7 @@ fore200e_register(struct fore200e* fore200e, struct device *parent)
 }
 
 
-static int __devinit
-fore200e_init(struct fore200e* fore200e, struct device *parent)
+static int fore200e_init(struct fore200e *fore200e, struct device *parent)
 {
     if (fore200e_register(fore200e, parent) < 0)
        return -ENODEV;
@@ -2644,7 +2628,7 @@ fore200e_init(struct fore200e* fore200e, struct device *parent)
 
 #ifdef CONFIG_SBUS
 static const struct of_device_id fore200e_sba_match[];
-static int __devinit fore200e_sba_probe(struct platform_device *op)
+static int fore200e_sba_probe(struct platform_device *op)
 {
        const struct of_device_id *match;
        const struct fore200e_bus *bus;
@@ -2681,7 +2665,7 @@ static int __devinit fore200e_sba_probe(struct platform_device *op)
        return 0;
 }
 
-static int __devexit fore200e_sba_remove(struct platform_device *op)
+static int fore200e_sba_remove(struct platform_device *op)
 {
        struct fore200e *fore200e = dev_get_drvdata(&op->dev);
 
@@ -2707,13 +2691,13 @@ static struct platform_driver fore200e_sba_driver = {
                .of_match_table = fore200e_sba_match,
        },
        .probe          = fore200e_sba_probe,
-       .remove         = __devexit_p(fore200e_sba_remove),
+       .remove         = fore200e_sba_remove,
 };
 #endif
 
 #ifdef CONFIG_PCI
-static int __devinit
-fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
+static int fore200e_pca_detect(struct pci_dev *pci_dev,
+                              const struct pci_device_id *pci_ent)
 {
     const struct fore200e_bus* bus = (struct fore200e_bus*) pci_ent->driver_data;
     struct fore200e* fore200e;
@@ -2766,7 +2750,7 @@ out_disable:
 }
 
 
-static void __devexit fore200e_pca_remove_one(struct pci_dev *pci_dev)
+static void fore200e_pca_remove_one(struct pci_dev *pci_dev)
 {
     struct fore200e *fore200e;
 
@@ -2789,7 +2773,7 @@ MODULE_DEVICE_TABLE(pci, fore200e_pca_tbl);
 static struct pci_driver fore200e_pca_driver = {
     .name =     "fore_200e",
     .probe =    fore200e_pca_detect,
-    .remove =   __devexit_p(fore200e_pca_remove_one),
+    .remove =   fore200e_pca_remove_one,
     .id_table = fore200e_pca_tbl,
 };
 #endif
index b182c2f7d777c077806d79a261a600454a701438..72b6960fa95f6ea6ef33a17e24b0e53c3b752c4b 100644 (file)
@@ -349,8 +349,8 @@ __find_vcc(struct he_dev *he_dev, unsigned cid)
        return NULL;
 }
 
-static int __devinit
-he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
+static int he_init_one(struct pci_dev *pci_dev,
+                      const struct pci_device_id *pci_ent)
 {
        struct atm_dev *atm_dev = NULL;
        struct he_dev *he_dev = NULL;
@@ -406,8 +406,7 @@ init_one_failure:
        return err;
 }
 
-static void __devexit
-he_remove_one (struct pci_dev *pci_dev)
+static void he_remove_one(struct pci_dev *pci_dev)
 {
        struct atm_dev *atm_dev;
        struct he_dev *he_dev;
@@ -445,8 +444,7 @@ rate_to_atmf(unsigned rate)         /* cps to atm forum format */
        return (NONZERO | (exp << 9) | (rate & 0x1ff));
 }
 
-static void __devinit
-he_init_rx_lbfp0(struct he_dev *he_dev)
+static void he_init_rx_lbfp0(struct he_dev *he_dev)
 {
        unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
        unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
@@ -476,8 +474,7 @@ he_init_rx_lbfp0(struct he_dev *he_dev)
        he_writel(he_dev, he_dev->r0_numbuffs, RLBF0_C);
 }
 
-static void __devinit
-he_init_rx_lbfp1(struct he_dev *he_dev)
+static void he_init_rx_lbfp1(struct he_dev *he_dev)
 {
        unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
        unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
@@ -507,8 +504,7 @@ he_init_rx_lbfp1(struct he_dev *he_dev)
        he_writel(he_dev, he_dev->r1_numbuffs, RLBF1_C);
 }
 
-static void __devinit
-he_init_tx_lbfp(struct he_dev *he_dev)
+static void he_init_tx_lbfp(struct he_dev *he_dev)
 {
        unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count;
        unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf;
@@ -537,8 +533,7 @@ he_init_tx_lbfp(struct he_dev *he_dev)
        he_writel(he_dev, lbufd_index - 1, TLBF_T);
 }
 
-static int __devinit
-he_init_tpdrq(struct he_dev *he_dev)
+static int he_init_tpdrq(struct he_dev *he_dev)
 {
        he_dev->tpdrq_base = pci_alloc_consistent(he_dev->pci_dev,
                CONFIG_TPDRQ_SIZE * sizeof(struct he_tpdrq), &he_dev->tpdrq_phys);
@@ -559,8 +554,7 @@ he_init_tpdrq(struct he_dev *he_dev)
        return 0;
 }
 
-static void __devinit
-he_init_cs_block(struct he_dev *he_dev)
+static void he_init_cs_block(struct he_dev *he_dev)
 {
        unsigned clock, rate, delta;
        int reg;
@@ -655,8 +649,7 @@ he_init_cs_block(struct he_dev *he_dev)
 
 }
 
-static int __devinit
-he_init_cs_block_rcm(struct he_dev *he_dev)
+static int he_init_cs_block_rcm(struct he_dev *he_dev)
 {
        unsigned (*rategrid)[16][16];
        unsigned rate, delta;
@@ -776,8 +769,7 @@ he_init_cs_block_rcm(struct he_dev *he_dev)
        return 0;
 }
 
-static int __devinit
-he_init_group(struct he_dev *he_dev, int group)
+static int he_init_group(struct he_dev *he_dev, int group)
 {
        struct he_buff *heb, *next;
        dma_addr_t mapping;
@@ -915,8 +907,7 @@ out_free_rbpl_table:
        return -ENOMEM;
 }
 
-static int __devinit
-he_init_irq(struct he_dev *he_dev)
+static int he_init_irq(struct he_dev *he_dev)
 {
        int i;
 
@@ -978,8 +969,7 @@ he_init_irq(struct he_dev *he_dev)
        return 0;
 }
 
-static int __devinit
-he_start(struct atm_dev *dev)
+static int he_start(struct atm_dev *dev)
 {
        struct he_dev *he_dev;
        struct pci_dev *pci_dev;
@@ -2879,7 +2869,7 @@ MODULE_DEVICE_TABLE(pci, he_pci_tbl);
 static struct pci_driver he_driver = {
        .name =         "he",
        .probe =        he_init_one,
-       .remove =       __devexit_p(he_remove_one),
+       .remove =       he_remove_one,
        .id_table =     he_pci_tbl,
 };
 
index 7d01c2a7525657f1da1654b4cf40ea04aec00b46..1dc0519333f291ab859b58739e762b2aa5ae5834 100644 (file)
@@ -1789,7 +1789,7 @@ static void CLOCK_IT (const hrz_dev *dev, u32 ctrl)
        WRITE_IT_WAIT(dev, ctrl | SEEPROM_SK);
 }
 
-static u16 __devinit read_bia (const hrz_dev * dev, u16 addr)
+static u16 read_bia(const hrz_dev *dev, u16 addr)
 {
   u32 ctrl = rd_regl (dev, CONTROL_0_REG);
   
@@ -1845,7 +1845,8 @@ static u16 __devinit read_bia (const hrz_dev * dev, u16 addr)
 
 /********** initialise a card **********/
 
-static int __devinit hrz_init (hrz_dev * dev) {
+static int hrz_init(hrz_dev *dev)
+{
   int onefivefive;
   
   u16 chan;
@@ -2681,7 +2682,8 @@ static const struct atmdev_ops hrz_ops = {
   .owner       = THIS_MODULE,
 };
 
-static int __devinit hrz_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
+static int hrz_probe(struct pci_dev *pci_dev,
+                    const struct pci_device_id *pci_ent)
 {
        hrz_dev * dev;
        int err = 0;
@@ -2836,7 +2838,7 @@ out_disable:
        goto out;
 }
 
-static void __devexit hrz_remove_one(struct pci_dev *pci_dev)
+static void hrz_remove_one(struct pci_dev *pci_dev)
 {
        hrz_dev *dev;
 
@@ -2901,7 +2903,7 @@ MODULE_DEVICE_TABLE(pci, hrz_pci_tbl);
 static struct pci_driver hrz_driver = {
        .name =         "horizon",
        .probe =        hrz_probe,
-       .remove =       __devexit_p(hrz_remove_one),
+       .remove =       hrz_remove_one,
        .id_table =     hrz_pci_tbl,
 };
 
index 8974bd2b961e605b3b03c9c52e8dbedc897fb485..272f00927761b1e34e5676ad018e0f72ef623b8c 100644 (file)
@@ -3109,8 +3109,7 @@ deinit_card(struct idt77252_dev *card)
 }
 
 
-static void __devinit
-init_sram(struct idt77252_dev *card)
+static void init_sram(struct idt77252_dev *card)
 {
        int i;
 
@@ -3257,8 +3256,7 @@ init_sram(struct idt77252_dev *card)
        IPRINTK("%s: SRAM initialization complete.\n", card->name);
 }
 
-static int __devinit
-init_card(struct atm_dev *dev)
+static int init_card(struct atm_dev *dev)
 {
        struct idt77252_dev *card = dev->dev_data;
        struct pci_dev *pcidev = card->pcidev;
@@ -3537,8 +3535,7 @@ init_card(struct atm_dev *dev)
 /*****************************************************************************/
 
 
-static int __devinit
-idt77252_preset(struct idt77252_dev *card)
+static int idt77252_preset(struct idt77252_dev *card)
 {
        u16 pci_command;
 
@@ -3579,8 +3576,7 @@ idt77252_preset(struct idt77252_dev *card)
 }
 
 
-static unsigned long __devinit
-probe_sram(struct idt77252_dev *card)
+static unsigned long probe_sram(struct idt77252_dev *card)
 {
        u32 data, addr;
 
@@ -3601,8 +3597,8 @@ probe_sram(struct idt77252_dev *card)
        return addr * sizeof(u32);
 }
 
-static int __devinit
-idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
+static int idt77252_init_one(struct pci_dev *pcidev,
+                            const struct pci_device_id *id)
 {
        static struct idt77252_dev **last = &idt77252_chain;
        static int index = 0;
index 96cce6d5319592b20fbc8536c350d3cffdd841e8..4217f29a85e0473b9686e428cf11c75599b13b41 100644 (file)
@@ -2299,7 +2299,7 @@ static int reset_sar(struct atm_dev *dev)
 }  
          
          
-static int __devinit ia_init(struct atm_dev *dev)
+static int ia_init(struct atm_dev *dev)
 {  
        IADEV *iadev;  
        unsigned long real_base;
@@ -2492,7 +2492,7 @@ static void ia_free_rx(IADEV *iadev)
                          iadev->rx_dle_dma);  
 }
 
-static int __devinit ia_start(struct atm_dev *dev)
+static int ia_start(struct atm_dev *dev)
 {  
        IADEV *iadev;  
        int error;  
@@ -3168,8 +3168,7 @@ static const struct atmdev_ops ops = {
        .owner          = THIS_MODULE,
 };  
          
-static int __devinit ia_init_one(struct pci_dev *pdev,
-                                const struct pci_device_id *ent)
+static int ia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {  
        struct atm_dev *dev;  
        IADEV *iadev;  
@@ -3229,7 +3228,7 @@ err_out:
        return ret;
 }
 
-static void __devexit ia_remove_one(struct pci_dev *pdev)
+static void ia_remove_one(struct pci_dev *pdev)
 {
        struct atm_dev *dev = pci_get_drvdata(pdev);
        IADEV *iadev = INPH_IA_DEV(dev);
@@ -3270,7 +3269,7 @@ static struct pci_driver ia_driver = {
        .name =         DEV_LABEL,
        .id_table =     ia_pci_tbl,
        .probe =        ia_init_one,
-       .remove =       __devexit_p(ia_remove_one),
+       .remove =       ia_remove_one,
 };
 
 static int __init ia_module_init(void)
index 68c75887181203eb7a7cee93ca19964cd13c9c36..fa7d701933bab7cbfd0fa60c2e113de8c255a597 100644 (file)
@@ -551,8 +551,8 @@ static inline void sram_write(const struct lanai_dev *lanai,
        writel(val, sram_addr(lanai, offset));
 }
 
-static int __devinit sram_test_word(const struct lanai_dev *lanai,
-                                   int offset, u32 pattern)
+static int sram_test_word(const struct lanai_dev *lanai, int offset,
+                         u32 pattern)
 {
        u32 readback;
        sram_write(lanai, pattern, offset);
@@ -566,7 +566,7 @@ static int __devinit sram_test_word(const struct lanai_dev *lanai,
        return -EIO;
 }
 
-static int __devinit sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
+static int sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
 {
        int offset, result = 0;
        for (offset = 0; offset < SRAM_BYTES && result == 0; offset += 4)
@@ -574,7 +574,7 @@ static int __devinit sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
        return result;
 }
 
-static int __devinit sram_test_and_clear(const struct lanai_dev *lanai)
+static int sram_test_and_clear(const struct lanai_dev *lanai)
 {
 #ifdef FULL_MEMORY_TEST
        int result;
@@ -860,7 +860,7 @@ static inline void aal0_buffer_free(struct lanai_dev *lanai)
 #ifndef READ_EEPROM
 
 /* Stub functions to use if EEPROM reading is disabled */
-static int __devinit eeprom_read(struct lanai_dev *lanai)
+static int eeprom_read(struct lanai_dev *lanai)
 {
        printk(KERN_INFO DEV_LABEL "(itf %d): *NOT* reading EEPROM\n",
            lanai->number);
@@ -868,7 +868,7 @@ static int __devinit eeprom_read(struct lanai_dev *lanai)
        return 0;
 }
 
-static int __devinit eeprom_validate(struct lanai_dev *lanai)
+static int eeprom_validate(struct lanai_dev *lanai)
 {
        lanai->serialno = 0;
        lanai->magicno = EEPROM_MAGIC_VALUE;
@@ -877,7 +877,7 @@ static int __devinit eeprom_validate(struct lanai_dev *lanai)
 
 #else /* READ_EEPROM */
 
-static int __devinit eeprom_read(struct lanai_dev *lanai)
+static int eeprom_read(struct lanai_dev *lanai)
 {
        int i, address;
        u8 data;
@@ -953,7 +953,7 @@ static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address)
 }
 
 /* Checksum/validate EEPROM contents */
-static int __devinit eeprom_validate(struct lanai_dev *lanai)
+static int eeprom_validate(struct lanai_dev *lanai)
 {
        int i, s;
        u32 v;
@@ -1448,7 +1448,7 @@ static void vcc_rx_aal0(struct lanai_dev *lanai)
 #include <linux/vmalloc.h>
 #endif
 
-static int __devinit vcc_table_allocate(struct lanai_dev *lanai)
+static int vcc_table_allocate(struct lanai_dev *lanai)
 {
 #ifdef VCCTABLE_GETFREEPAGE
        APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE,
@@ -1588,7 +1588,7 @@ static void lanai_reset(struct lanai_dev *lanai)
 /*
  * Allocate service buffer and tell card about it
  */
-static int __devinit service_buffer_allocate(struct lanai_dev *lanai)
+static int service_buffer_allocate(struct lanai_dev *lanai)
 {
        lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 8,
            lanai->pci);
@@ -1942,7 +1942,7 @@ static int check_board_id_and_rev(const char *name, u32 val, int *revp)
 
 /* -------------------- PCI INITIALIZATION/SHUTDOWN: */
 
-static int __devinit lanai_pci_start(struct lanai_dev *lanai)
+static int lanai_pci_start(struct lanai_dev *lanai)
 {
        struct pci_dev *pci = lanai->pci;
        int result;
@@ -2123,7 +2123,7 @@ static inline void lanai_cbr_shutdown(struct lanai_dev *lanai)
 /* -------------------- OPERATIONS: */
 
 /* setup a newly detected device */
-static int __devinit lanai_dev_open(struct atm_dev *atmdev)
+static int lanai_dev_open(struct atm_dev *atmdev)
 {
        struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
        unsigned long raw_base;
@@ -2566,8 +2566,8 @@ static const struct atmdev_ops ops = {
 };
 
 /* initialize one probed card */
-static int __devinit lanai_init_one(struct pci_dev *pci,
-                                   const struct pci_device_id *ident)
+static int lanai_init_one(struct pci_dev *pci,
+                         const struct pci_device_id *ident)
 {
        struct lanai_dev *lanai;
        struct atm_dev *atmdev;
index 1c70c45fa044837d1b3e872c7bafe9220d074aef..ed1d2b7f923b33334f4b07d288a63015071a3226 100644 (file)
 static u32 ns_read_sram(ns_dev * card, u32 sram_address);
 static void ns_write_sram(ns_dev * card, u32 sram_address, u32 * value,
                          int count);
-static int __devinit ns_init_card(int i, struct pci_dev *pcidev);
-static void __devinit ns_init_card_error(ns_dev * card, int error);
+static int ns_init_card(int i, struct pci_dev *pcidev);
+static void ns_init_card_error(ns_dev * card, int error);
 static scq_info *get_scq(ns_dev *card, int size, u32 scd);
 static void free_scq(ns_dev *card, scq_info * scq, struct atm_vcc *vcc);
 static void push_rxbufs(ns_dev *, struct sk_buff *);
@@ -180,8 +180,8 @@ MODULE_LICENSE("GPL");
 
 /* Functions */
 
-static int __devinit nicstar_init_one(struct pci_dev *pcidev,
-                                     const struct pci_device_id *ent)
+static int nicstar_init_one(struct pci_dev *pcidev,
+                           const struct pci_device_id *ent)
 {
        static int index = -1;
        unsigned int error;
@@ -200,7 +200,7 @@ err_out:
        return -ENODEV;
 }
 
-static void __devexit nicstar_remove_one(struct pci_dev *pcidev)
+static void nicstar_remove_one(struct pci_dev *pcidev)
 {
        int i, j;
        ns_dev *card = pci_get_drvdata(pcidev);
@@ -262,7 +262,7 @@ static void __devexit nicstar_remove_one(struct pci_dev *pcidev)
        kfree(card);
 }
 
-static struct pci_device_id nicstar_pci_tbl[] __devinitdata = {
+static struct pci_device_id nicstar_pci_tbl[] = {
        { PCI_VDEVICE(IDT, PCI_DEVICE_ID_IDT_IDT77201), 0 },
        {0,}                    /* terminate list */
 };
@@ -273,7 +273,7 @@ static struct pci_driver nicstar_driver = {
        .name = "nicstar",
        .id_table = nicstar_pci_tbl,
        .probe = nicstar_init_one,
-       .remove = __devexit_p(nicstar_remove_one),
+       .remove = nicstar_remove_one,
 };
 
 static int __init nicstar_init(void)
@@ -351,7 +351,7 @@ static void ns_write_sram(ns_dev * card, u32 sram_address, u32 * value,
        spin_unlock_irqrestore(&card->res_lock, flags);
 }
 
-static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
+static int ns_init_card(int i, struct pci_dev *pcidev)
 {
        int j;
        struct ns_dev *card = NULL;
@@ -821,7 +821,7 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
        return error;
 }
 
-static void __devinit ns_init_card_error(ns_dev * card, int error)
+static void ns_init_card_error(ns_dev *card, int error)
 {
        if (error >= 17) {
                writel(0x00000000, card->membase + CFG);
index d47db401027ff24b0da5d2dee2b68924ec6a0cdd..0474a89170b9cc0d969f4917dd889ae7a0a679bb 100644 (file)
@@ -1462,7 +1462,7 @@ static void fpga_remove(struct pci_dev *dev)
        kfree(card);
 }
 
-static struct pci_device_id fpga_pci_tbl[] __devinitdata = {
+static struct pci_device_id fpga_pci_tbl[] = {
        { 0x10ee, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
        { 0, }
 };
index abe4e20b07660bcec8fd9b1cac15878ae78c5f0e..969c3c29000c3622094068d940b854d251393673 100644 (file)
@@ -1094,8 +1094,8 @@ static irqreturn_t zatm_int(int irq,void *dev_id)
 /*----------------------------- (E)EPROM access -----------------------------*/
 
 
-static void __devinit eprom_set(struct zatm_dev *zatm_dev,unsigned long value,
-    unsigned short cmd)
+static void eprom_set(struct zatm_dev *zatm_dev, unsigned long value,
+                     unsigned short cmd)
 {
        int error;
 
@@ -1105,8 +1105,7 @@ static void __devinit eprom_set(struct zatm_dev *zatm_dev,unsigned long value,
 }
 
 
-static unsigned long __devinit eprom_get(struct zatm_dev *zatm_dev,
-    unsigned short cmd)
+static unsigned long eprom_get(struct zatm_dev *zatm_dev, unsigned short cmd)
 {
        unsigned int value;
        int error;
@@ -1118,8 +1117,8 @@ static unsigned long __devinit eprom_get(struct zatm_dev *zatm_dev,
 }
 
 
-static void __devinit eprom_put_bits(struct zatm_dev *zatm_dev,
-    unsigned long data,int bits,unsigned short cmd)
+static void eprom_put_bits(struct zatm_dev *zatm_dev, unsigned long data,
+                          int bits, unsigned short cmd)
 {
        unsigned long value;
        int i;
@@ -1133,8 +1132,8 @@ static void __devinit eprom_put_bits(struct zatm_dev *zatm_dev,
 }
 
 
-static void __devinit eprom_get_byte(struct zatm_dev *zatm_dev,
-    unsigned char *byte,unsigned short cmd)
+static void eprom_get_byte(struct zatm_dev *zatm_dev, unsigned char *byte,
+                          unsigned short cmd)
 {
        int i;
 
@@ -1149,8 +1148,8 @@ static void __devinit eprom_get_byte(struct zatm_dev *zatm_dev,
 }
 
 
-static unsigned char __devinit eprom_try_esi(struct atm_dev *dev,
-    unsigned short cmd,int offset,int swap)
+static unsigned char eprom_try_esi(struct atm_dev *dev, unsigned short cmd,
+                                  int offset, int swap)
 {
        unsigned char buf[ZEPROM_SIZE];
        struct zatm_dev *zatm_dev;
@@ -1170,7 +1169,7 @@ static unsigned char __devinit eprom_try_esi(struct atm_dev *dev,
 }
 
 
-static void __devinit eprom_get_esi(struct atm_dev *dev)
+static void eprom_get_esi(struct atm_dev *dev)
 {
        if (eprom_try_esi(dev,ZEPROM_V1_REG,ZEPROM_V1_ESI_OFF,1)) return;
        (void) eprom_try_esi(dev,ZEPROM_V2_REG,ZEPROM_V2_ESI_OFF,0);
@@ -1180,7 +1179,7 @@ static void __devinit eprom_get_esi(struct atm_dev *dev)
 /*--------------------------------- entries ---------------------------------*/
 
 
-static int __devinit zatm_init(struct atm_dev *dev)
+static int zatm_init(struct atm_dev *dev)
 {
        struct zatm_dev *zatm_dev;
        struct pci_dev *pci_dev;
@@ -1257,7 +1256,7 @@ static int __devinit zatm_init(struct atm_dev *dev)
 }
 
 
-static int __devinit zatm_start(struct atm_dev *dev)
+static int zatm_start(struct atm_dev *dev)
 {
        struct zatm_dev *zatm_dev = ZATM_DEV(dev);
        struct pci_dev *pdev = zatm_dev->pci_dev;
@@ -1584,8 +1583,8 @@ static const struct atmdev_ops ops = {
        .change_qos     = zatm_change_qos,
 };
 
-static int __devinit zatm_init_one(struct pci_dev *pci_dev,
-                                  const struct pci_device_id *ent)
+static int zatm_init_one(struct pci_dev *pci_dev,
+                        const struct pci_device_id *ent)
 {
        struct atm_dev *dev;
        struct zatm_dev *zatm_dev;
@@ -1636,7 +1635,7 @@ out_free:
 
 MODULE_LICENSE("GPL");
 
-static struct pci_device_id zatm_pci_tbl[] __devinitdata = {
+static struct pci_device_id zatm_pci_tbl[] = {
        { PCI_VDEVICE(ZEITNET, PCI_DEVICE_ID_ZEITNET_1221), ZATM_COPPER },
        { PCI_VDEVICE(ZEITNET, PCI_DEVICE_ID_ZEITNET_1225), 0 },
        { 0, }
index 5ad3bad2b0a53ecf0aa57d656f7aaf5a01752152..d585735430dd6c7eb763a8a3fe53dba6b0e858c3 100644 (file)
@@ -37,7 +37,7 @@
 
 #define CFAG12864BFB_NAME "cfag12864bfb"
 
-static struct fb_fix_screeninfo cfag12864bfb_fix __devinitdata = {
+static struct fb_fix_screeninfo cfag12864bfb_fix = {
        .id = "cfag12864b",
        .type = FB_TYPE_PACKED_PIXELS,
        .visual = FB_VISUAL_MONO10,
@@ -48,7 +48,7 @@ static struct fb_fix_screeninfo cfag12864bfb_fix __devinitdata = {
        .accel = FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo cfag12864bfb_var __devinitdata = {
+static struct fb_var_screeninfo cfag12864bfb_var = {
        .xres = CFAG12864B_WIDTH,
        .yres = CFAG12864B_HEIGHT,
        .xres_virtual = CFAG12864B_WIDTH,
@@ -80,7 +80,7 @@ static struct fb_ops cfag12864bfb_ops = {
        .fb_mmap = cfag12864bfb_mmap,
 };
 
-static int __devinit cfag12864bfb_probe(struct platform_device *device)
+static int cfag12864bfb_probe(struct platform_device *device)
 {
        int ret = -EINVAL;
        struct fb_info *info = framebuffer_alloc(0, &device->dev);
@@ -114,7 +114,7 @@ none:
        return ret;
 }
 
-static int __devexit cfag12864bfb_remove(struct platform_device *device)
+static int cfag12864bfb_remove(struct platform_device *device)
 {
        struct fb_info *info = platform_get_drvdata(device);
 
@@ -128,7 +128,7 @@ static int __devexit cfag12864bfb_remove(struct platform_device *device)
 
 static struct platform_driver cfag12864bfb_driver = {
        .probe  = cfag12864bfb_probe,
-       .remove = __devexit_p(cfag12864bfb_remove),
+       .remove = cfag12864bfb_remove,
        .driver = {
                .name   = CFAG12864BFB_NAME,
        },
index a3c1404c79338c3b7e82b7b71835971dc42ec358..2b7f77d3fcb0d518d2a1f4e041f29b61d6e4521b 100644 (file)
@@ -513,6 +513,8 @@ static int device_resume_early(struct device *dev, pm_message_t state)
 
  Out:
        TRACE_RESUME(error);
+
+       pm_runtime_enable(dev);
        return error;
 }
 
@@ -589,8 +591,6 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
        if (!dev->power.is_suspended)
                goto Unlock;
 
-       pm_runtime_enable(dev);
-
        if (dev->pm_domain) {
                info = "power domain ";
                callback = pm_op(&dev->pm_domain->ops, state);
@@ -930,6 +930,8 @@ static int device_suspend_late(struct device *dev, pm_message_t state)
        pm_callback_t callback = NULL;
        char *info = NULL;
 
+       __pm_runtime_disable(dev, false);
+
        if (dev->power.syscore)
                return 0;
 
@@ -1133,11 +1135,8 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
 
  Complete:
        complete_all(&dev->power.completion);
-
        if (error)
                async_error = error;
-       else if (dev->power.is_suspended)
-               __pm_runtime_disable(dev, false);
 
        return error;
 }
index ff46387f5308394d913d5789c16265253b56b5f0..d21349544ce5b8131b0ca217ec5618af7beca346 100644 (file)
@@ -542,19 +542,19 @@ int dev_pm_qos_add_ancestor_request(struct device *dev,
                                    struct dev_pm_qos_request *req, s32 value)
 {
        struct device *ancestor = dev->parent;
-       int error = -ENODEV;
+       int ret = -ENODEV;
 
        while (ancestor && !ancestor->power.ignore_children)
                ancestor = ancestor->parent;
 
        if (ancestor)
-               error = dev_pm_qos_add_request(ancestor, req,
-                                              DEV_PM_QOS_LATENCY, value);
+               ret = dev_pm_qos_add_request(ancestor, req,
+                                            DEV_PM_QOS_LATENCY, value);
 
-       if (error < 0)
+       if (ret < 0)
                req->dev = NULL;
 
-       return error;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(dev_pm_qos_add_ancestor_request);
 
index d7b56a88c9f4d7211317484f441864263e4b0a20..8b4221cfd118bdb390fea9fa5e6bbfdfe37060f7 100644 (file)
@@ -67,8 +67,7 @@ config BCMA_DRIVER_GMAC_CMN
 
 config BCMA_DRIVER_GPIO
        bool "BCMA GPIO driver"
-       depends on BCMA
-       select GPIOLIB
+       depends on BCMA && GPIOLIB
        help
          Driver to provide access to the GPIO pins of the bcma bus.
 
index 4a2d72ec6d4325f49dd93baa09c99b8baff6d48c..19e3fbfd5757368790980dfec756135e981b0eaf 100644 (file)
@@ -22,7 +22,7 @@
 struct bcma_bus;
 
 /* main.c */
-int __devinit bcma_bus_register(struct bcma_bus *bus);
+int bcma_bus_register(struct bcma_bus *bus);
 void bcma_bus_unregister(struct bcma_bus *bus);
 int __init bcma_bus_early_register(struct bcma_bus *bus,
                                   struct bcma_device *core_cc,
@@ -87,8 +87,8 @@ u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
 extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
 
 #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
-bool __devinit bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc);
-void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc);
+bool bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc);
+void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc);
 #endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */
 
 #ifdef CONFIG_BCMA_DRIVER_GPIO
index c62c788b3289f0d338667dfd3ecaa4f50d39ada6..932b101dee36a5398a53904072d32d32541af23a 100644 (file)
@@ -264,7 +264,7 @@ static u32 bcma_pmu_pll_clock_bcm4706(struct bcma_drv_cc *cc, u32 pll0, u32 m)
 }
 
 /* query bus clock frequency for PMU-enabled chipcommon */
-static u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc)
+u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc)
 {
        struct bcma_bus *bus = cc->core->bus;
 
@@ -293,6 +293,7 @@ static u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc)
        }
        return BCMA_CC_PMU_HT_CLOCK;
 }
+EXPORT_SYMBOL_GPL(bcma_pmu_get_bus_clock);
 
 /* query cpu clock frequency for PMU-enabled chipcommon */
 u32 bcma_pmu_get_cpu_clock(struct bcma_drv_cc *cc)
index 63e688393825539b5f2c64537cbefb1659c579c3..1e694db4532dd7aa41f95fc207b5bb0adea1556b 100644 (file)
@@ -35,7 +35,7 @@ static struct bcma_sflash_tbl_e bcma_sflash_st_tbl[] = {
        { "M25P40", 0x12, 0x10000, 8, },
 
        { "M25P16", 0x14, 0x10000, 32, },
-       { "M25P32", 0x14, 0x10000, 64, },
+       { "M25P32", 0x15, 0x10000, 64, },
        { "M25P64", 0x16, 0x10000, 128, },
        { "M25FL128", 0x17, 0x10000, 256, },
        { 0 },
index 834225f65e8fca0804a644d1eaf55e48362efede..dcb137926d31e423dd51872c15cb7780cff8885f 100644 (file)
@@ -8,7 +8,7 @@
 #include "bcma_private.h"
 #include <linux/bcma/bcma.h>
 
-void __devinit bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc)
+void bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc)
 {
        mutex_init(&gc->phy_mutex);
 }
index c39ee6d458506d6bb9c44eae651742e692255207..cf7a476a519f1809ec5313765c4e236e074a5230 100644 (file)
@@ -207,14 +207,14 @@ static void bcma_core_pci_config_fixup(struct bcma_drv_pci *pc)
  * Init.
  **************************************************/
 
-static void __devinit bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc)
+static void bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc)
 {
        bcma_core_pci_fixcfg(pc);
        bcma_pcicore_serdes_workaround(pc);
        bcma_core_pci_config_fixup(pc);
 }
 
-void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc)
+void bcma_core_pci_init(struct bcma_drv_pci *pc)
 {
        if (pc->setup_done)
                return;
index e6b5c89469dcea0fd7dec00809934b54eccafcbe..af0c9fabee54f212833809ecbfab0007bc9105fb 100644 (file)
@@ -24,7 +24,7 @@
 #define BCMA_PCI_SLOT_MAX      16
 #define        PCI_CONFIG_SPACE_SIZE   256
 
-bool __devinit bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc)
+bool bcma_core_pci_is_in_hostmode(struct bcma_drv_pci *pc)
 {
        struct bcma_bus *bus = pc->core->bus;
        u16 chipid_top;
@@ -264,10 +264,9 @@ static int bcma_core_pci_hostmode_write_config(struct pci_bus *bus,
 }
 
 /* return cap_offset if requested capability exists in the PCI config space */
-static u8 __devinit bcma_find_pci_capability(struct bcma_drv_pci *pc,
-                                            unsigned int dev,
-                                            unsigned int func, u8 req_cap_id,
-                                            unsigned char *buf, u32 *buflen)
+static u8 bcma_find_pci_capability(struct bcma_drv_pci *pc, unsigned int dev,
+                                  unsigned int func, u8 req_cap_id,
+                                  unsigned char *buf, u32 *buflen)
 {
        u8 cap_id;
        u8 cap_ptr = 0;
@@ -334,7 +333,7 @@ static u8 __devinit bcma_find_pci_capability(struct bcma_drv_pci *pc,
  * Retry Status (CRS) Completion Status to software then
  * enable the feature.
  */
-static void __devinit bcma_core_pci_enable_crs(struct bcma_drv_pci *pc)
+static void bcma_core_pci_enable_crs(struct bcma_drv_pci *pc)
 {
        struct bcma_bus *bus = pc->core->bus;
        u8 cap_ptr, root_ctrl, root_cap, dev;
@@ -381,7 +380,7 @@ static void __devinit bcma_core_pci_enable_crs(struct bcma_drv_pci *pc)
        }
 }
 
-void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc)
+void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc)
 {
        struct bcma_bus *bus = pc->core->bus;
        struct bcma_drv_pci_host *pc_host;
index 98fdc3e014e7f5ada5dd70cb26a511632d4d6acb..fbf2759e7e4e4d5f0777a058e37c5ab21976a2ce 100644 (file)
@@ -155,8 +155,8 @@ static const struct bcma_host_ops bcma_host_pci_ops = {
        .awrite32       = bcma_host_pci_awrite32,
 };
 
-static int __devinit bcma_host_pci_probe(struct pci_dev *dev,
-                                        const struct pci_device_id *id)
+static int bcma_host_pci_probe(struct pci_dev *dev,
+                              const struct pci_device_id *id)
 {
        struct bcma_bus *bus;
        int err = -ENOMEM;
@@ -226,7 +226,7 @@ err_kfree_bus:
        return err;
 }
 
-static void __devexit bcma_host_pci_remove(struct pci_dev *dev)
+static void bcma_host_pci_remove(struct pci_dev *dev)
 {
        struct bcma_bus *bus = pci_get_drvdata(dev);
 
@@ -284,7 +284,7 @@ static struct pci_driver bcma_pci_bridge_driver = {
        .name = "bcma-pci-bridge",
        .id_table = bcma_pci_bridge_tbl,
        .probe = bcma_host_pci_probe,
-       .remove = __devexit_p(bcma_host_pci_remove),
+       .remove = bcma_host_pci_remove,
        .driver.pm = BCMA_PM_OPS,
 };
 
index 53ba20ca17e0d00b1fc9087b540b41645c0f64bb..4a92f647b58bdef4fa28f28b772d960036469c78 100644 (file)
@@ -192,7 +192,7 @@ static void bcma_unregister_cores(struct bcma_bus *bus)
                platform_device_unregister(bus->drv_cc.watchdog);
 }
 
-int __devinit bcma_bus_register(struct bcma_bus *bus)
+int bcma_bus_register(struct bcma_bus *bus)
 {
        int err;
        struct bcma_device *core;
index 6526157edafc151e2761adf740a6404a6c046f26..ade58bc8f3c4dee67f69edde4ce20b1ef18d7cc8 100644 (file)
@@ -181,8 +181,8 @@ static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol,
                        sector_t total_size,
                        unsigned int block_size, InquiryData_struct *inq_buff,
                                   drive_info_struct *drv);
-static void __devinit cciss_interrupt_mode(ctlr_info_t *);
-static int __devinit cciss_enter_simple_mode(struct ctlr_info *h);
+static void cciss_interrupt_mode(ctlr_info_t *);
+static int cciss_enter_simple_mode(struct ctlr_info *h);
 static void start_io(ctlr_info_t *h);
 static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size,
                        __u8 page_code, unsigned char scsi3addr[],
@@ -199,14 +199,13 @@ static void cciss_device_release(struct device *dev);
 static void cciss_free_gendisk(ctlr_info_t *h, int drv_index);
 static void cciss_free_drive_info(ctlr_info_t *h, int drv_index);
 static inline u32 next_command(ctlr_info_t *h);
-static int __devinit cciss_find_cfg_addrs(struct pci_dev *pdev,
-       void __iomem *vaddr, u32 *cfg_base_addr, u64 *cfg_base_addr_index,
-       u64 *cfg_offset);
-static int __devinit cciss_pci_find_memory_BAR(struct pci_dev *pdev,
-       unsigned long *memory_bar);
+static int cciss_find_cfg_addrs(struct pci_dev *pdev, void __iomem *vaddr,
+                               u32 *cfg_base_addr, u64 *cfg_base_addr_index,
+                               u64 *cfg_offset);
+static int cciss_pci_find_memory_BAR(struct pci_dev *pdev,
+                                    unsigned long *memory_bar);
 static inline u32 cciss_tag_discard_error_bits(ctlr_info_t *h, u32 tag);
-static __devinit int write_driver_ver_to_cfgtable(
-       CfgTable_struct __iomem *cfgtable);
+static int write_driver_ver_to_cfgtable(CfgTable_struct __iomem *cfgtable);
 
 /* performant mode helper functions */
 static void  calc_bucket_map(int *bucket, int num_buckets, int nsgs,
@@ -550,7 +549,7 @@ static const struct file_operations cciss_proc_fops = {
        .write   = cciss_proc_write,
 };
 
-static void __devinit cciss_procinit(ctlr_info_t *h)
+static void cciss_procinit(ctlr_info_t *h)
 {
        struct proc_dir_entry *pde;
 
@@ -2663,8 +2662,8 @@ static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff,
        return status;
 }
 
-static int __devinit cciss_send_reset(ctlr_info_t *h, unsigned char *scsi3addr,
-       u8 reset_type)
+static int cciss_send_reset(ctlr_info_t *h, unsigned char *scsi3addr,
+                           u8 reset_type)
 {
        CommandList_struct *c;
        int return_status;
@@ -3919,7 +3918,7 @@ static void  calc_bucket_map(int bucket[], int num_buckets,
        }
 }
 
-static void __devinit cciss_wait_for_mode_change_ack(ctlr_info_t *h)
+static void cciss_wait_for_mode_change_ack(ctlr_info_t *h)
 {
        int i;
 
@@ -3933,8 +3932,7 @@ static void __devinit cciss_wait_for_mode_change_ack(ctlr_info_t *h)
        }
 }
 
-static __devinit void cciss_enter_performant_mode(ctlr_info_t *h,
-       u32 use_short_tags)
+static void cciss_enter_performant_mode(ctlr_info_t *h, u32 use_short_tags)
 {
        /* This is a bit complicated.  There are 8 registers on
         * the controller which we write to to tell it 8 different
@@ -4000,7 +3998,7 @@ static __devinit void cciss_enter_performant_mode(ctlr_info_t *h,
                                        " performant mode\n");
 }
 
-static void __devinit cciss_put_controller_into_performant_mode(ctlr_info_t *h)
+static void cciss_put_controller_into_performant_mode(ctlr_info_t *h)
 {
        __u32 trans_support;
 
@@ -4062,7 +4060,7 @@ clean_up:
  * controllers that are capable. If not, we use IO-APIC mode.
  */
 
-static void __devinit cciss_interrupt_mode(ctlr_info_t *h)
+static void cciss_interrupt_mode(ctlr_info_t *h)
 {
 #ifdef CONFIG_PCI_MSI
        int err;
@@ -4108,7 +4106,7 @@ default_int_mode:
        return;
 }
 
-static int __devinit cciss_lookup_board_id(struct pci_dev *pdev, u32 *board_id)
+static int cciss_lookup_board_id(struct pci_dev *pdev, u32 *board_id)
 {
        int i;
        u32 subsystem_vendor_id, subsystem_device_id;
@@ -4134,8 +4132,8 @@ static inline bool cciss_board_disabled(ctlr_info_t *h)
        return ((command & PCI_COMMAND_MEMORY) == 0);
 }
 
-static int __devinit cciss_pci_find_memory_BAR(struct pci_dev *pdev,
-       unsigned long *memory_bar)
+static int cciss_pci_find_memory_BAR(struct pci_dev *pdev,
+                                    unsigned long *memory_bar)
 {
        int i;
 
@@ -4151,8 +4149,8 @@ static int __devinit cciss_pci_find_memory_BAR(struct pci_dev *pdev,
        return -ENODEV;
 }
 
-static int __devinit cciss_wait_for_board_state(struct pci_dev *pdev,
-       void __iomem *vaddr, int wait_for_ready)
+static int cciss_wait_for_board_state(struct pci_dev *pdev,
+                                     void __iomem *vaddr, int wait_for_ready)
 #define BOARD_READY 1
 #define BOARD_NOT_READY 0
 {
@@ -4179,9 +4177,9 @@ static int __devinit cciss_wait_for_board_state(struct pci_dev *pdev,
        return -ENODEV;
 }
 
-static int __devinit cciss_find_cfg_addrs(struct pci_dev *pdev,
-       void __iomem *vaddr, u32 *cfg_base_addr, u64 *cfg_base_addr_index,
-       u64 *cfg_offset)
+static int cciss_find_cfg_addrs(struct pci_dev *pdev, void __iomem *vaddr,
+                               u32 *cfg_base_addr, u64 *cfg_base_addr_index,
+                               u64 *cfg_offset)
 {
        *cfg_base_addr = readl(vaddr + SA5_CTCFG_OFFSET);
        *cfg_offset = readl(vaddr + SA5_CTMEM_OFFSET);
@@ -4195,7 +4193,7 @@ static int __devinit cciss_find_cfg_addrs(struct pci_dev *pdev,
        return 0;
 }
 
-static int __devinit cciss_find_cfgtables(ctlr_info_t *h)
+static int cciss_find_cfgtables(ctlr_info_t *h)
 {
        u64 cfg_offset;
        u32 cfg_base_addr;
@@ -4224,7 +4222,7 @@ static int __devinit cciss_find_cfgtables(ctlr_info_t *h)
        return 0;
 }
 
-static void __devinit cciss_get_max_perf_mode_cmds(struct ctlr_info *h)
+static void cciss_get_max_perf_mode_cmds(struct ctlr_info *h)
 {
        h->max_commands = readl(&(h->cfgtable->MaxPerformantModeCommands));
 
@@ -4245,7 +4243,7 @@ static void __devinit cciss_get_max_perf_mode_cmds(struct ctlr_info *h)
  * max commands, max SG elements without chaining, and with chaining,
  * SG chain block size, etc.
  */
-static void __devinit cciss_find_board_params(ctlr_info_t *h)
+static void cciss_find_board_params(ctlr_info_t *h)
 {
        cciss_get_max_perf_mode_cmds(h);
        h->nr_cmds = h->max_commands - 4 - cciss_tape_cmds;
@@ -4304,7 +4302,7 @@ static inline void cciss_p600_dma_prefetch_quirk(ctlr_info_t *h)
        pci_write_config_dword(h->pdev, PCI_COMMAND_PARITY, dma_refetch);
 }
 
-static int __devinit cciss_pci_init(ctlr_info_t *h)
+static int cciss_pci_init(ctlr_info_t *h)
 {
        int prod_index, err;
 
@@ -4424,7 +4422,8 @@ static void free_hba(ctlr_info_t *h)
 }
 
 /* Send a message CDB to the firmware. */
-static __devinit int cciss_message(struct pci_dev *pdev, unsigned char opcode, unsigned char type)
+static int cciss_message(struct pci_dev *pdev, unsigned char opcode,
+                        unsigned char type)
 {
        typedef struct {
                CommandListHeader_struct CommandHeader;
@@ -4571,14 +4570,13 @@ static int cciss_controller_hard_reset(struct pci_dev *pdev,
        return 0;
 }
 
-static __devinit void init_driver_version(char *driver_version, int len)
+static void init_driver_version(char *driver_version, int len)
 {
        memset(driver_version, 0, len);
        strncpy(driver_version, "cciss " DRIVER_NAME, len - 1);
 }
 
-static __devinit int write_driver_ver_to_cfgtable(
-       CfgTable_struct __iomem *cfgtable)
+static int write_driver_ver_to_cfgtable(CfgTable_struct __iomem *cfgtable)
 {
        char *driver_version;
        int i, size = sizeof(cfgtable->driver_version);
@@ -4594,8 +4592,8 @@ static __devinit int write_driver_ver_to_cfgtable(
        return 0;
 }
 
-static __devinit void read_driver_ver_from_cfgtable(
-       CfgTable_struct __iomem *cfgtable, unsigned char *driver_ver)
+static void read_driver_ver_from_cfgtable(CfgTable_struct __iomem *cfgtable,
+                                         unsigned char *driver_ver)
 {
        int i;
 
@@ -4603,8 +4601,7 @@ static __devinit void read_driver_ver_from_cfgtable(
                driver_ver[i] = readb(&cfgtable->driver_version[i]);
 }
 
-static __devinit int controller_reset_failed(
-       CfgTable_struct __iomem *cfgtable)
+static int controller_reset_failed(CfgTable_struct __iomem *cfgtable)
 {
 
        char *driver_ver, *old_driver_ver;
@@ -4627,7 +4624,7 @@ static __devinit int controller_reset_failed(
 
 /* This does a hard reset of the controller using PCI power management
  * states or using the doorbell register. */
-static __devinit int cciss_kdump_hard_reset_controller(struct pci_dev *pdev)
+static int cciss_kdump_hard_reset_controller(struct pci_dev *pdev)
 {
        u64 cfg_offset;
        u32 cfg_base_addr;
@@ -4772,7 +4769,7 @@ unmap_vaddr:
        return rc;
 }
 
-static __devinit int cciss_init_reset_devices(struct pci_dev *pdev)
+static int cciss_init_reset_devices(struct pci_dev *pdev)
 {
        int rc, i;
 
@@ -4806,7 +4803,7 @@ static __devinit int cciss_init_reset_devices(struct pci_dev *pdev)
        return 0;
 }
 
-static __devinit int cciss_allocate_cmd_pool(ctlr_info_t *h)
+static int cciss_allocate_cmd_pool(ctlr_info_t *h)
 {
        h->cmd_pool_bits = kmalloc(BITS_TO_LONGS(h->nr_cmds) *
                sizeof(unsigned long), GFP_KERNEL);
@@ -4825,7 +4822,7 @@ static __devinit int cciss_allocate_cmd_pool(ctlr_info_t *h)
        return 0;
 }
 
-static __devinit int cciss_allocate_scatterlists(ctlr_info_t *h)
+static int cciss_allocate_scatterlists(ctlr_info_t *h)
 {
        int i;
 
@@ -4893,7 +4890,7 @@ static int cciss_request_irq(ctlr_info_t *h,
        return -1;
 }
 
-static int __devinit cciss_kdump_soft_reset(ctlr_info_t *h)
+static int cciss_kdump_soft_reset(ctlr_info_t *h)
 {
        if (cciss_send_reset(h, CTLR_LUNID, CCISS_RESET_TYPE_CONTROLLER)) {
                dev_warn(&h->pdev->dev, "Resetting array controller failed.\n");
@@ -4952,8 +4949,7 @@ static void cciss_undo_allocations_after_kdump_soft_reset(ctlr_info_t *h)
  *  stealing all these major device numbers.
  *  returns the number of block devices registered.
  */
-static int __devinit cciss_init_one(struct pci_dev *pdev,
-                                   const struct pci_device_id *ent)
+static int cciss_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int i;
        int j = 0;
@@ -5207,7 +5203,7 @@ static void cciss_shutdown(struct pci_dev *pdev)
        free_irq(h->intr[h->intr_mode], h);
 }
 
-static int __devinit cciss_enter_simple_mode(struct ctlr_info *h)
+static int cciss_enter_simple_mode(struct ctlr_info *h)
 {
        u32 trans_support;
 
@@ -5229,7 +5225,7 @@ static int __devinit cciss_enter_simple_mode(struct ctlr_info *h)
 }
 
 
-static void __devexit cciss_remove_one(struct pci_dev *pdev)
+static void cciss_remove_one(struct pci_dev *pdev)
 {
        ctlr_info_t *h;
        int i, j;
@@ -5308,7 +5304,7 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev)
 static struct pci_driver cciss_pci_driver = {
        .name = "cciss",
        .probe = cciss_init_one,
-       .remove = __devexit_p(cciss_remove_one),
+       .remove = cciss_remove_one,
        .id_table = cciss_pci_device_id,        /* id_table */
        .shutdown = cciss_shutdown,
 };
index 9125bbeacd4dcc6fa49043b7fe795b1c1c78b013..3f087133a25a0d2da7a0de32f26f83e7392ae4bd 100644 (file)
@@ -320,7 +320,7 @@ static void release_io_mem(ctlr_info_t *c)
        c->io_mem_length = 0;
 }
 
-static void __devexit cpqarray_remove_one(int i)
+static void cpqarray_remove_one(int i)
 {
        int j;
        char buff[4];
@@ -352,7 +352,7 @@ static void __devexit cpqarray_remove_one(int i)
        free_hba(i);
 }
 
-static void __devexit cpqarray_remove_one_pci (struct pci_dev *pdev)
+static void cpqarray_remove_one_pci(struct pci_dev *pdev)
 {
        int i;
        ctlr_info_t *tmp_ptr;
@@ -377,7 +377,7 @@ static void __devexit cpqarray_remove_one_pci (struct pci_dev *pdev)
 /* removing an instance that was not removed automatically..
  * must be an eisa card.
  */
-static void __devexit cpqarray_remove_one_eisa (int i)
+static void cpqarray_remove_one_eisa(int i)
 {
        if (hba[i] == NULL) {
                printk(KERN_ERR "cpqarray: controller %d appears to have"
@@ -388,7 +388,7 @@ static void __devexit cpqarray_remove_one_eisa (int i)
 }
 
 /* pdev is NULL for eisa */
-static int __devinit cpqarray_register_ctlr( int i, struct pci_dev *pdev)
+static int cpqarray_register_ctlr(int i, struct pci_dev *pdev)
 {
        struct request_queue *q;
        int j;
@@ -505,8 +505,8 @@ Enomem4:
        return -1;
 }
 
-static int __devinit cpqarray_init_one( struct pci_dev *pdev,
-       const struct pci_device_id *ent)
+static int cpqarray_init_one(struct pci_dev *pdev,
+                            const struct pci_device_id *ent)
 {
        int i;
 
@@ -536,7 +536,7 @@ static int __devinit cpqarray_init_one( struct pci_dev *pdev,
 static struct pci_driver cpqarray_pci_driver = {
        .name = "cpqarray",
        .probe = cpqarray_init_one,
-       .remove = __devexit_p(cpqarray_remove_one_pci),
+       .remove = cpqarray_remove_one_pci,
        .id_table = cpqarray_pci_device_id,
 };
 
@@ -742,7 +742,7 @@ __setup("smart2=", cpqarray_setup);
 /*
  * Find an EISA controller's signature.  Set up an hba if we find it.
  */
-static int __devinit cpqarray_eisa_detect(void)
+static int cpqarray_eisa_detect(void)
 {
        int i=0, j;
        __u32 board_id;
index 931769e133e5995b0cbe1e73e9dd7f5488f86f89..07fb2dfaae13f02588128ea0d73372a8859b63ba 100644 (file)
@@ -975,8 +975,8 @@ static int queue_request_irq(struct nvme_dev *dev, struct nvme_queue *nvmeq,
                                IRQF_DISABLED | IRQF_SHARED, name, nvmeq);
 }
 
-static __devinit struct nvme_queue *nvme_create_queue(struct nvme_dev *dev,
-                                       int qid, int cq_size, int vector)
+static struct nvme_queue *nvme_create_queue(struct nvme_dev *dev, int qid,
+                                           int cq_size, int vector)
 {
        int result;
        struct nvme_queue *nvmeq = nvme_alloc_queue(dev, qid, cq_size, vector);
@@ -1011,7 +1011,7 @@ static __devinit struct nvme_queue *nvme_create_queue(struct nvme_dev *dev,
        return ERR_PTR(result);
 }
 
-static int __devinit nvme_configure_admin_queue(struct nvme_dev *dev)
+static int nvme_configure_admin_queue(struct nvme_dev *dev)
 {
        int result = 0;
        u32 aqa;
@@ -1408,7 +1408,7 @@ static int set_queue_count(struct nvme_dev *dev, int count)
        return min(result & 0xffff, result >> 16) + 1;
 }
 
-static int __devinit nvme_setup_io_queues(struct nvme_dev *dev)
+static int nvme_setup_io_queues(struct nvme_dev *dev)
 {
        int result, cpu, i, nr_io_queues, db_bar_size, q_depth;
 
@@ -1481,7 +1481,7 @@ static void nvme_free_queues(struct nvme_dev *dev)
                nvme_free_queue(dev, i);
 }
 
-static int __devinit nvme_dev_add(struct nvme_dev *dev)
+static int nvme_dev_add(struct nvme_dev *dev)
 {
        int res, nn, i;
        struct nvme_ns *ns, *next;
@@ -1619,8 +1619,7 @@ static void nvme_release_instance(struct nvme_dev *dev)
        spin_unlock(&dev_list_lock);
 }
 
-static int __devinit nvme_probe(struct pci_dev *pdev,
-                                               const struct pci_device_id *id)
+static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int bars, result = -ENOMEM;
        struct nvme_dev *dev;
@@ -1702,7 +1701,7 @@ static int __devinit nvme_probe(struct pci_dev *pdev,
        return result;
 }
 
-static void __devexit nvme_remove(struct pci_dev *pdev)
+static void nvme_remove(struct pci_dev *pdev)
 {
        struct nvme_dev *dev = pci_get_drvdata(pdev);
        nvme_dev_remove(dev);
@@ -1747,7 +1746,7 @@ static struct pci_driver nvme_driver = {
        .name           = "nvme",
        .id_table       = nvme_id_table,
        .probe          = nvme_probe,
-       .remove         = __devexit_p(nvme_remove),
+       .remove         = nvme_remove,
        .suspend        = nvme_suspend,
        .resume         = nvme_resume,
        .err_handler    = &nvme_err_handler,
index da0abc1838c196680bd093f0664924140ae4834f..d754a88d75858ef46f8553ac54b0163ff7b60d8a 100644 (file)
@@ -401,7 +401,7 @@ static unsigned long ps3disk_mask;
 
 static DEFINE_MUTEX(ps3disk_mask_mutex);
 
-static int __devinit ps3disk_probe(struct ps3_system_bus_device *_dev)
+static int ps3disk_probe(struct ps3_system_bus_device *_dev)
 {
        struct ps3_storage_device *dev = to_ps3_storage_device(&_dev->core);
        struct ps3disk_private *priv;
index f58cdcfb305f2c497f408ac427e80fd1c536e648..75e112d660069411f5cb7d60c15733bac7b248d4 100644 (file)
@@ -536,7 +536,7 @@ static const struct file_operations ps3vram_proc_fops = {
        .release        = single_release,
 };
 
-static void __devinit ps3vram_proc_init(struct ps3_system_bus_device *dev)
+static void ps3vram_proc_init(struct ps3_system_bus_device *dev)
 {
        struct ps3vram_priv *priv = ps3_system_bus_get_drvdata(dev);
        struct proc_dir_entry *pde;
@@ -618,7 +618,7 @@ static void ps3vram_make_request(struct request_queue *q, struct bio *bio)
        } while (bio);
 }
 
-static int __devinit ps3vram_probe(struct ps3_system_bus_device *dev)
+static int ps3vram_probe(struct ps3_system_bus_device *dev)
 {
        struct ps3vram_priv *priv;
        int error, status;
index 9dcf76a10bb64584b2d43bfbcc4d06a735711f43..564156a8e57251f68181a706f959f5b5299bfdf5 100644 (file)
@@ -25,7 +25,7 @@
 #define DRV_MODULE_VERSION     "1.0"
 #define DRV_MODULE_RELDATE     "June 25, 2007"
 
-static char version[] __devinitdata =
+static char version[] =
        DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
 MODULE_DESCRIPTION("Sun LDOM virtual disk client driver");
@@ -592,7 +592,7 @@ static int generic_request(struct vdc_port *port, u8 op, void *buf, int len)
        return err;
 }
 
-static int __devinit vdc_alloc_tx_ring(struct vdc_port *port)
+static int vdc_alloc_tx_ring(struct vdc_port *port)
 {
        struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
        unsigned long len, entry_size;
@@ -725,7 +725,7 @@ static struct vio_driver_ops vdc_vio_ops = {
        .handshake_complete     = vdc_handshake_complete,
 };
 
-static void __devinit print_version(void)
+static void print_version(void)
 {
        static int version_printed;
 
@@ -733,8 +733,7 @@ static void __devinit print_version(void)
                printk(KERN_INFO "%s", version);
 }
 
-static int __devinit vdc_port_probe(struct vio_dev *vdev,
-                                   const struct vio_device_id *id)
+static int vdc_port_probe(struct vio_dev *vdev, const struct vio_device_id *id)
 {
        struct mdesc_handle *hp;
        struct vdc_port *port;
index 6d5a914b9619c98a12475222d0bc75be80e603ee..765fa2b3d33763449bd8f322f2183b456e1bca5f 100644 (file)
@@ -788,8 +788,7 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data)
        return get_disk(swd->unit[drive].disk);
 }
 
-static int __devinit swim_add_floppy(struct swim_priv *swd,
-                                    enum drive_location location)
+static int swim_add_floppy(struct swim_priv *swd, enum drive_location location)
 {
        struct floppy_state *fs = &swd->unit[swd->floppy_count];
        struct swim __iomem *base = swd->base;
@@ -812,7 +811,7 @@ static int __devinit swim_add_floppy(struct swim_priv *swd,
        return 0;
 }
 
-static int __devinit swim_floppy_init(struct swim_priv *swd)
+static int swim_floppy_init(struct swim_priv *swd)
 {
        int err;
        int drive;
@@ -875,7 +874,7 @@ exit_put_disks:
        return err;
 }
 
-static int __devinit swim_probe(struct platform_device *dev)
+static int swim_probe(struct platform_device *dev)
 {
        struct resource *res;
        struct swim __iomem *swim_base;
@@ -936,7 +935,7 @@ out:
        return ret;
 }
 
-static int __devexit swim_remove(struct platform_device *dev)
+static int swim_remove(struct platform_device *dev)
 {
        struct swim_priv *swd = platform_get_drvdata(dev);
        int drive;
@@ -972,7 +971,7 @@ static int __devexit swim_remove(struct platform_device *dev)
 
 static struct platform_driver swim_driver = {
        .probe  = swim_probe,
-       .remove = __devexit_p(swim_remove),
+       .remove = swim_remove,
        .driver   = {
                .name   = CARDNAME,
                .owner  = THIS_MODULE,
index 89ddab127e33df525924b73f23501fc9fcab1006..57763c54363aaf18a03f44464c7496f1c0fd4232 100644 (file)
@@ -1194,7 +1194,8 @@ static int swim3_add_device(struct macio_dev *mdev, int index)
        return rc;
 }
 
-static int __devinit swim3_attach(struct macio_dev *mdev, const struct of_device_id *match)
+static int swim3_attach(struct macio_dev *mdev,
+                       const struct of_device_id *match)
 {
        struct gendisk *disk;
        int index, rc;
index eb0d8216f557434b36e6fbc809b75c33bbbc1292..ad70868f8a967b40bc866bc5430387b55f4601ac 100644 (file)
@@ -789,8 +789,7 @@ static const struct block_device_operations mm_fops = {
        .revalidate_disk = mm_revalidate,
 };
 
-static int __devinit mm_pci_probe(struct pci_dev *dev,
-                               const struct pci_device_id *id)
+static int mm_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        int ret = -ENODEV;
        struct cardinfo *card = &cards[num_cards];
index 0bdde8fba3970d81010736f3a1b4bf5f9fb53a07..9d8409c02082f5fbb75c456faeb9323b86fbe9f3 100644 (file)
@@ -696,7 +696,7 @@ static const struct device_attribute dev_attr_cache_type_rw =
        __ATTR(cache_type, S_IRUGO|S_IWUSR,
               virtblk_cache_type_show, virtblk_cache_type_store);
 
-static int __devinit virtblk_probe(struct virtio_device *vdev)
+static int virtblk_probe(struct virtio_device *vdev)
 {
        struct virtio_blk *vblk;
        struct request_queue *q;
@@ -885,7 +885,7 @@ out:
        return err;
 }
 
-static void __devexit virtblk_remove(struct virtio_device *vdev)
+static void virtblk_remove(struct virtio_device *vdev)
 {
        struct virtio_blk *vblk = vdev->priv;
        int index = vblk->index;
@@ -961,19 +961,14 @@ static unsigned int features[] = {
        VIRTIO_BLK_F_WCE, VIRTIO_BLK_F_TOPOLOGY, VIRTIO_BLK_F_CONFIG_WCE
 };
 
-/*
- * virtio_blk causes spurious section mismatch warning by
- * simultaneously referring to a __devinit and a __devexit function.
- * Use __refdata to avoid this warning.
- */
-static struct virtio_driver __refdata virtio_blk = {
+static struct virtio_driver virtio_blk = {
        .feature_table          = features,
        .feature_table_size     = ARRAY_SIZE(features),
        .driver.name            = KBUILD_MODNAME,
        .driver.owner           = THIS_MODULE,
        .id_table               = id_table,
        .probe                  = virtblk_probe,
-       .remove                 = __devexit_p(virtblk_remove),
+       .remove                 = virtblk_remove,
        .config_changed         = virtblk_config_changed,
 #ifdef CONFIG_PM
        .freeze                 = virtblk_freeze,
index 1a17e338735e363b3ebdf7624aca334d507144c9..1f38643173caa3968f6f1b53f778a2a4f24411fc 100644 (file)
@@ -961,7 +961,7 @@ static const struct block_device_operations ace_fops = {
 /* --------------------------------------------------------------------
  * SystemACE device setup/teardown code
  */
-static int __devinit ace_setup(struct ace_device *ace)
+static int ace_setup(struct ace_device *ace)
 {
        u16 version;
        u16 val;
@@ -1074,7 +1074,7 @@ err_ioremap:
        return -ENOMEM;
 }
 
-static void __devexit ace_teardown(struct ace_device *ace)
+static void ace_teardown(struct ace_device *ace)
 {
        if (ace->gd) {
                del_gendisk(ace->gd);
@@ -1092,9 +1092,8 @@ static void __devexit ace_teardown(struct ace_device *ace)
        iounmap(ace->baseaddr);
 }
 
-static int __devinit
-ace_alloc(struct device *dev, int id, resource_size_t physaddr,
-         int irq, int bus_width)
+static int ace_alloc(struct device *dev, int id, resource_size_t physaddr,
+                    int irq, int bus_width)
 {
        struct ace_device *ace;
        int rc;
@@ -1135,7 +1134,7 @@ err_noreg:
        return rc;
 }
 
-static void __devexit ace_free(struct device *dev)
+static void ace_free(struct device *dev)
 {
        struct ace_device *ace = dev_get_drvdata(dev);
        dev_dbg(dev, "ace_free(%p)\n", dev);
@@ -1151,7 +1150,7 @@ static void __devexit ace_free(struct device *dev)
  * Platform Bus Support
  */
 
-static int __devinit ace_probe(struct platform_device *dev)
+static int ace_probe(struct platform_device *dev)
 {
        resource_size_t physaddr = 0;
        int bus_width = ACE_BUS_WIDTH_16; /* FIXME: should not be hard coded */
@@ -1182,7 +1181,7 @@ static int __devinit ace_probe(struct platform_device *dev)
 /*
  * Platform bus remove() method
  */
-static int __devexit ace_remove(struct platform_device *dev)
+static int ace_remove(struct platform_device *dev)
 {
        ace_free(&dev->dev);
        return 0;
@@ -1190,7 +1189,7 @@ static int __devexit ace_remove(struct platform_device *dev)
 
 #if defined(CONFIG_OF)
 /* Match table for of_platform binding */
-static const struct of_device_id ace_of_match[] __devinitconst = {
+static const struct of_device_id ace_of_match[] = {
        { .compatible = "xlnx,opb-sysace-1.00.b", },
        { .compatible = "xlnx,opb-sysace-1.00.c", },
        { .compatible = "xlnx,xps-sysace-1.00.a", },
@@ -1204,7 +1203,7 @@ MODULE_DEVICE_TABLE(of, ace_of_match);
 
 static struct platform_driver ace_platform_driver = {
        .probe = ace_probe,
-       .remove = __devexit_p(ace_remove),
+       .remove = ace_remove,
        .driver = {
                .owner = THIS_MODULE,
                .name = "xsysace",
index 0c48b0e05ed6e7165a221399822e894e09c9fa18..fe7191663bbde4bdafdb3d2097af30de450059b9 100644 (file)
@@ -52,7 +52,7 @@ static int ocp2scp_remove_devices(struct device *dev, void *c)
        return 0;
 }
 
-static int __devinit omap_ocp2scp_probe(struct platform_device *pdev)
+static int omap_ocp2scp_probe(struct platform_device *pdev)
 {
        int ret;
        unsigned res_cnt, i;
@@ -116,7 +116,7 @@ err0:
        return ret;
 }
 
-static int __devexit omap_ocp2scp_remove(struct platform_device *pdev)
+static int omap_ocp2scp_remove(struct platform_device *pdev)
 {
        pm_runtime_disable(&pdev->dev);
        device_for_each_child(&pdev->dev, NULL, ocp2scp_remove_devices);
@@ -134,7 +134,7 @@ MODULE_DEVICE_TABLE(of, omap_ocp2scp_id_table);
 
 static struct platform_driver omap_ocp2scp_driver = {
        .probe          = omap_ocp2scp_probe,
-       .remove         = __devexit_p(omap_ocp2scp_remove),
+       .remove         = omap_ocp2scp_remove,
        .driver         = {
                .name   = "omap-ocp2scp",
                .owner  = THIS_MODULE,
index ab911a33f8a894a9ea06d04428e4db3b50d7c342..feeecae623f66721a734f524e9fcf8fd0511a5f4 100644 (file)
@@ -128,7 +128,7 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
        return IRQ_HANDLED;
 }
 
-static int __devinit omap4_l3_probe(struct platform_device *pdev)
+static int omap4_l3_probe(struct platform_device *pdev)
 {
        static struct omap4_l3 *l3;
        struct resource *res;
@@ -219,7 +219,7 @@ err0:
        return ret;
 }
 
-static int __devexit omap4_l3_remove(struct platform_device *pdev)
+static int omap4_l3_remove(struct platform_device *pdev)
 {
        struct omap4_l3 *l3 = platform_get_drvdata(pdev);
 
@@ -245,7 +245,7 @@ MODULE_DEVICE_TABLE(of, l3_noc_match);
 
 static struct platform_driver omap4_l3_driver = {
        .probe          = omap4_l3_probe,
-       .remove         = __devexit_p(omap4_l3_remove),
+       .remove         = omap4_l3_remove,
        .driver         = {
                .name           = "omap_l3_noc",
                .owner          = THIS_MODULE,
index 75d485afe56c7bf685e4f83e76473ca3516a6f54..d59cdcb8fe399b43c714370c1a5a3cb68cbed91d 100644 (file)
@@ -557,7 +557,7 @@ static irqreturn_t gdrom_dma_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit gdrom_set_interrupt_handlers(void)
+static int gdrom_set_interrupt_handlers(void)
 {
        int err;
 
@@ -681,7 +681,7 @@ static void gdrom_request(struct request_queue *rq)
 }
 
 /* Print string identifying GD ROM device */
-static int __devinit gdrom_outputversion(void)
+static int gdrom_outputversion(void)
 {
        struct gdrom_id *id;
        char *model_name, *manuf_name, *firmw_ver;
@@ -715,7 +715,7 @@ free_id:
 }
 
 /* set the default mode for DMA transfer */
-static int __devinit gdrom_init_dma_mode(void)
+static int gdrom_init_dma_mode(void)
 {
        __raw_writeb(0x13, GDROM_ERROR_REG);
        __raw_writeb(0x22, GDROM_INTSEC_REG);
@@ -736,7 +736,7 @@ static int __devinit gdrom_init_dma_mode(void)
        return 0;
 }
 
-static void __devinit probe_gdrom_setupcd(void)
+static void probe_gdrom_setupcd(void)
 {
        gd.cd_info->ops = &gdrom_ops;
        gd.cd_info->capacity = 1;
@@ -745,7 +745,7 @@ static void __devinit probe_gdrom_setupcd(void)
                CDC_SELECT_DISC;
 }
 
-static void __devinit probe_gdrom_setupdisk(void)
+static void probe_gdrom_setupdisk(void)
 {
        gd.disk->major = gdrom_major;
        gd.disk->first_minor = 1;
@@ -753,7 +753,7 @@ static void __devinit probe_gdrom_setupdisk(void)
        strcpy(gd.disk->disk_name, GDROM_DEV_NAME);
 }
 
-static int __devinit probe_gdrom_setupqueue(void)
+static int probe_gdrom_setupqueue(void)
 {
        blk_queue_logical_block_size(gd.gdrom_rq, GDROM_HARD_SECTOR);
        /* using DMA so memory will need to be contiguous */
@@ -768,7 +768,7 @@ static int __devinit probe_gdrom_setupqueue(void)
  * register this as a block device and as compliant with the
  * universal CD Rom driver interface
  */
-static int __devinit probe_gdrom(struct platform_device *devptr)
+static int probe_gdrom(struct platform_device *devptr)
 {
        int err;
        /* Start the device */
@@ -838,7 +838,7 @@ probe_fail_no_mem:
        return err;
 }
 
-static int __devexit remove_gdrom(struct platform_device *devptr)
+static int remove_gdrom(struct platform_device *devptr)
 {
        flush_work(&work);
        blk_cleanup_queue(gd.gdrom_rq);
@@ -854,7 +854,7 @@ static int __devexit remove_gdrom(struct platform_device *devptr)
 
 static struct platform_driver gdrom_driver = {
        .probe = probe_gdrom,
-       .remove = __devexit_p(remove_gdrom),
+       .remove = remove_gdrom,
        .driver = {
                        .name = GDROM_DEV_NAME,
        },
index 478493543b32391a8f520c84c223851c50304cfd..443cd6751ca21f3fe9ff985f77ace62112d43d8e 100644 (file)
@@ -299,8 +299,7 @@ static struct agp_device_ids ali_agp_device_ids[] =
        { }, /* dummy final entry, always present */
 };
 
-static int __devinit agp_ali_probe(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int agp_ali_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct agp_device_ids *devs = ali_agp_device_ids;
        struct agp_bridge_data *bridge;
index 1b2101160e98ce9550c7ad833b0a5f25e08b6259..779f0ab845a949063ffc578dd31d7a758b7c0482 100644 (file)
@@ -405,8 +405,8 @@ static struct agp_device_ids amd_agp_device_ids[] =
        { }, /* dummy final entry, always present */
 };
 
-static int __devinit agp_amdk7_probe(struct pci_dev *pdev,
-                                    const struct pci_device_id *ent)
+static int agp_amdk7_probe(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        struct agp_bridge_data *bridge;
        u8 cap_ptr;
index 061d46209b1a97422449cb4d9d1b65abf3437277..d79d692d05b8f3c4a2d87e3422569ef084f365f8 100644 (file)
@@ -240,7 +240,7 @@ static const struct agp_bridge_driver amd_8151_driver = {
 };
 
 /* Some basic sanity checks for the aperture. */
-static int __devinit agp_aperture_valid(u64 aper, u32 size)
+static int agp_aperture_valid(u64 aper, u32 size)
 {
        if (!aperture_valid(aper, size, 32*1024*1024))
                return 0;
@@ -267,8 +267,7 @@ static int __devinit agp_aperture_valid(u64 aper, u32 size)
  * to allocate that much memory. But at least error out cleanly instead of
  * crashing.
  */
-static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,
-                                                                u16 cap)
+static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap)
 {
        u32 aper_low, aper_hi;
        u64 aper, nb_aper;
@@ -326,7 +325,7 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,
        return 0;
 }
 
-static __devinit int cache_nbs(struct pci_dev *pdev, u32 cap_ptr)
+static int cache_nbs(struct pci_dev *pdev, u32 cap_ptr)
 {
        int i;
 
@@ -352,7 +351,7 @@ static __devinit int cache_nbs(struct pci_dev *pdev, u32 cap_ptr)
 }
 
 /* Handle AMD 8151 quirks */
-static void __devinit amd8151_init(struct pci_dev *pdev, struct agp_bridge_data *bridge)
+static void amd8151_init(struct pci_dev *pdev, struct agp_bridge_data *bridge)
 {
        char *revstring;
 
@@ -390,7 +389,7 @@ static const struct aper_size_info_32 uli_sizes[7] =
        {8, 2048, 1, 4},
        {4, 1024, 0, 3}
 };
-static int __devinit uli_agp_init(struct pci_dev *pdev)
+static int uli_agp_init(struct pci_dev *pdev)
 {
        u32 httfea,baseaddr,enuscr;
        struct pci_dev *dev1;
@@ -513,8 +512,8 @@ put:
        return ret;
 }
 
-static int __devinit agp_amd64_probe(struct pci_dev *pdev,
-                                    const struct pci_device_id *ent)
+static int agp_amd64_probe(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        struct agp_bridge_data *bridge;
        u8 cap_ptr;
index ed0433576e74e8cde3ce8caff0919bb6e704b58d..0628d7b65c71c4073d2ff1428a2e7dfad4b5d720 100644 (file)
@@ -490,8 +490,7 @@ static struct agp_device_ids ati_agp_device_ids[] =
        { }, /* dummy final entry, always present */
 };
 
-static int __devinit agp_ati_probe(struct pci_dev *pdev,
-                                  const struct pci_device_id *ent)
+static int agp_ati_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct agp_device_ids *devs = ati_agp_device_ids;
        struct agp_bridge_data *bridge;
index 55f3e33a309fbc03f191ca640fa309dc6b798fa8..6974d50320532af7280bbd8ea9b593998c435f6d 100644 (file)
@@ -343,8 +343,8 @@ static const struct agp_bridge_driver efficeon_driver = {
        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
-static int __devinit agp_efficeon_probe(struct pci_dev *pdev,
-                                    const struct pci_device_id *ent)
+static int agp_efficeon_probe(struct pci_dev *pdev,
+                             const struct pci_device_id *ent)
 {
        struct agp_bridge_data *bridge;
        u8 cap_ptr;
index d328b662e50da33f4c1ed57c10257a55033319af..15b240ea4848f1b83e9f4c816ed381e11c175ee4 100644 (file)
@@ -587,8 +587,8 @@ const struct agp_bridge_driver intel_i460_driver = {
        .cant_use_aperture      = true,
 };
 
-static int __devinit agp_intel_i460_probe(struct pci_dev *pdev,
-                                         const struct pci_device_id *ent)
+static int agp_intel_i460_probe(struct pci_dev *pdev,
+                               const struct pci_device_id *ent)
 {
        struct agp_bridge_data *bridge;
        u8 cap_ptr;
@@ -637,7 +637,7 @@ static struct pci_driver agp_intel_i460_pci_driver = {
        .name           = "agpgart-intel-i460",
        .id_table       = agp_intel_i460_pci_table,
        .probe          = agp_intel_i460_probe,
-       .remove         = __devexit_p(agp_intel_i460_remove),
+       .remove         = agp_intel_i460_remove,
 };
 
 static int __init agp_intel_i460_init(void)
index f3a8f52b5a00eabebc4f6d338155c7c92c591530..a426ee1f57a6fd71b30fbd80429cac7c97aa1b4c 100644 (file)
@@ -732,8 +732,8 @@ static const struct intel_agp_driver_description {
        { 0, NULL, NULL }
 };
 
-static int __devinit agp_intel_probe(struct pci_dev *pdev,
-                                    const struct pci_device_id *ent)
+static int agp_intel_probe(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        struct agp_bridge_data *bridge;
        u8 cap_ptr = 0;
@@ -912,7 +912,7 @@ static struct pci_driver agp_intel_pci_driver = {
        .name           = "agpgart-intel",
        .id_table       = agp_intel_pci_table,
        .probe          = agp_intel_probe,
-       .remove         = __devexit_p(agp_intel_remove),
+       .remove         = agp_intel_remove,
 #ifdef CONFIG_PM
        .resume         = agp_intel_resume,
 #endif
index 66e0868000f4fb1441e80ea5176407941bf21a8d..62be3ec0da4b1ae6f8f9cb9f05f6b0fb1eed2740 100644 (file)
@@ -332,8 +332,8 @@ static const struct agp_bridge_driver nvidia_driver = {
        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
-static int __devinit agp_nvidia_probe(struct pci_dev *pdev,
-                                     const struct pci_device_id *ent)
+static int agp_nvidia_probe(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        struct agp_bridge_data *bridge;
        u8 cap_ptr;
index a18791d7718a9d1bcc3e5512b161275c481e0b15..05b8d0241bdefe2df440bf7637f37efe7ee367df 100644 (file)
@@ -270,7 +270,7 @@ const struct agp_bridge_driver sgi_tioca_driver = {
        .num_aperture_sizes = 1,
 };
 
-static int __devinit agp_sgi_init(void)
+static int agp_sgi_init(void)
 {
        unsigned int j;
        struct tioca_kernel *info;
index 93d1d31f9d0cf2f7a7811c6994aff22bc5dec9f5..79c838c434bc89806a81ee0d260f5acce9a5a3b6 100644 (file)
@@ -154,7 +154,7 @@ static int sis_broken_chipsets[] = {
        0 // terminator
 };
 
-static void __devinit sis_get_driver(struct agp_bridge_data *bridge)
+static void sis_get_driver(struct agp_bridge_data *bridge)
 {
        int i;
 
@@ -180,8 +180,7 @@ static void __devinit sis_get_driver(struct agp_bridge_data *bridge)
 }
 
 
-static int __devinit agp_sis_probe(struct pci_dev *pdev,
-                                  const struct pci_device_id *ent)
+static int agp_sis_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct agp_bridge_data *bridge;
        u8 cap_ptr;
index 26020fb8d7a992b3daae19b5bf8b72922bee698a..9b163b49d976323fae9828f963f5e593031ffb68 100644 (file)
@@ -445,8 +445,8 @@ static const struct agp_bridge_driver sworks_driver = {
        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
-static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
-                                          const struct pci_device_id *ent)
+static int agp_serverworks_probe(struct pci_dev *pdev,
+                                const struct pci_device_id *ent)
 {
        struct agp_bridge_data *bridge;
        struct pci_dev *bridge_dev;
index 011967ad3eedfb7a447261ed0c1e9150ab8b8c12..a56ee9bedd112ddeea5551ba922a7d767ab7cd3b 100644 (file)
@@ -592,8 +592,8 @@ static struct agp_device_ids uninorth_agp_device_ids[] = {
        },
 };
 
-static int __devinit agp_uninorth_probe(struct pci_dev *pdev,
-                                       const struct pci_device_id *ent)
+static int agp_uninorth_probe(struct pci_dev *pdev,
+                             const struct pci_device_id *ent)
 {
        struct agp_device_ids *devs = uninorth_agp_device_ids;
        struct agp_bridge_data *bridge;
index 6818595bb863d6f3e8f1a8c2d10d21718fdcc791..74d3aa3773bf2b3300a7d3212607cca16c8d7277 100644 (file)
@@ -438,8 +438,7 @@ static void check_via_agp3 (struct agp_bridge_data *bridge)
 }
 
 
-static int __devinit agp_via_probe(struct pci_dev *pdev,
-                                  const struct pci_device_id *ent)
+static int agp_via_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct agp_device_ids *devs = via_agp_device_ids;
        struct agp_bridge_data *bridge;
index 5a4a6e70478b469418ad5d5da36eebc640de0f2a..7c73d4aca36b146f569682c04e65b9cacd72c4d7 100644 (file)
@@ -138,7 +138,7 @@ static const struct dev_pm_ops atmel_trng_pm_ops = {
 
 static struct platform_driver atmel_trng_driver = {
        .probe          = atmel_trng_probe,
-       .remove         = __devexit_p(atmel_trng_remove),
+       .remove         = atmel_trng_remove,
        .driver         = {
                .name   = "atmel-trng",
                .owner  = THIS_MODULE,
index ae95bcb18d4a8390d9c0cdd99047ddabb982c097..f343b7d0dfa1047c24319be8f447e4f90deaea2d 100644 (file)
@@ -61,7 +61,7 @@ static int bcm63xx_rng_data_read(struct hwrng *rng, u32 *data)
        return 4;
 }
 
-static int __devinit bcm63xx_rng_probe(struct platform_device *pdev)
+static int bcm63xx_rng_probe(struct platform_device *pdev)
 {
        struct resource *r;
        struct clk *clk;
@@ -161,7 +161,7 @@ static int bcm63xx_rng_remove(struct platform_device *pdev)
 
 static struct platform_driver bcm63xx_rng_driver = {
        .probe          = bcm63xx_rng_probe,
-       .remove         = __devexit_p(bcm63xx_rng_remove),
+       .remove         = bcm63xx_rng_remove,
        .driver         = {
                .name   = "bcm63xx-rng",
                .owner  = THIS_MODULE,
index bdc852ea76323772743fe4972b5bc532dbc23144..48bbfeca4b5de82a870eae679c59e0d8baca4751 100644 (file)
@@ -101,7 +101,7 @@ static int exynos_read(struct hwrng *rng, void *buf,
        return 4;
 }
 
-static int __devinit exynos_rng_probe(struct platform_device *pdev)
+static int exynos_rng_probe(struct platform_device *pdev)
 {
        struct exynos_rng *exynos_rng;
 
@@ -172,7 +172,7 @@ static struct platform_driver exynos_rng_driver = {
                .pm     = &exynos_rng_pm_ops,
        },
        .probe          = exynos_rng_probe,
-       .remove         = __devexit_p(exynos_rng_remove),
+       .remove         = exynos_rng_remove,
 };
 
 module_platform_driver(exynos_rng_driver);
index d68a72a08b5128d9ac175b4338c6bb2aaccd018e..20b962e1d83265fdb6ff8504179a7948894164fb 100644 (file)
@@ -611,7 +611,7 @@ static void n2rng_work(struct work_struct *work)
                schedule_delayed_work(&np->work, HZ * 2);
 }
 
-static void __devinit n2rng_driver_version(void)
+static void n2rng_driver_version(void)
 {
        static int n2rng_version_printed;
 
@@ -620,7 +620,7 @@ static void __devinit n2rng_driver_version(void)
 }
 
 static const struct of_device_id n2rng_match[];
-static int __devinit n2rng_probe(struct platform_device *op)
+static int n2rng_probe(struct platform_device *op)
 {
        const struct of_device_id *match;
        int multi_capable;
@@ -767,7 +767,7 @@ static struct platform_driver n2rng_driver = {
                .of_match_table = n2rng_match,
        },
        .probe          = n2rng_probe,
-       .remove         = __devexit_p(n2rng_remove),
+       .remove         = n2rng_remove,
 };
 
 module_platform_driver(n2rng_driver);
index 5c34c092af711cd9c92705b745726ad9fac3f6cd..1eada566ca701f02468f7400b7cc8221e1a91a7f 100644 (file)
@@ -56,7 +56,7 @@ static int octeon_rng_data_read(struct hwrng *rng, u32 *data)
        return sizeof(u32);
 }
 
-static int __devinit octeon_rng_probe(struct platform_device *pdev)
+static int octeon_rng_probe(struct platform_device *pdev)
 {
        struct resource *res_ports;
        struct resource *res_result;
index 45e467dcc8c886996966a2488c148b68d7f792b2..d8c54e253761c5e2025c2e3941868b7e282eb8b3 100644 (file)
@@ -104,7 +104,7 @@ static struct hwrng omap_rng_ops = {
        .data_read      = omap_rng_data_read,
 };
 
-static int __devinit omap_rng_probe(struct platform_device *pdev)
+static int omap_rng_probe(struct platform_device *pdev)
 {
        struct omap_rng_private_data *priv;
        int ret;
index a1f70407cc9e03070cd627230726b4246602e986..c6df5b29af08f7f7ba99f6439b0d5d6f120379c7 100644 (file)
@@ -94,7 +94,7 @@ static struct hwrng pasemi_rng = {
        .data_read      = pasemi_rng_data_read,
 };
 
-static int __devinit rng_probe(struct platform_device *ofdev)
+static int rng_probe(struct platform_device *ofdev)
 {
        void __iomem *rng_regs;
        struct device_node *rng_np = ofdev->dev.of_node;
index d4b24c1dd48e37e4077ca01b56bf191b35bc6990..973b95113edf7580e09bcb078db0038c047dd7f6 100644 (file)
@@ -181,7 +181,7 @@ static const struct dev_pm_ops picoxcell_trng_pm_ops = {
 
 static struct platform_driver picoxcell_trng_driver = {
        .probe          = picoxcell_trng_probe,
-       .remove         = __devexit_p(picoxcell_trng_remove),
+       .remove         = picoxcell_trng_remove,
        .driver         = {
                .name   = "picoxcell-trng",
                .owner  = THIS_MODULE,
index af6506a69cd9473343538d48bf17cb32a9877e92..732c330805fd318451be8e3654c484bed6416de8 100644 (file)
@@ -90,7 +90,7 @@ static struct hwrng ppc4xx_rng = {
        .data_read = ppc4xx_rng_data_read,
 };
 
-static int __devinit ppc4xx_rng_probe(struct platform_device *dev)
+static int ppc4xx_rng_probe(struct platform_device *dev)
 {
        void __iomem *rng_regs;
        int err = 0;
index 3a1abc9417e4e8fd3e86628f75d4e3d71521fea7..849db199c02c1f363a17848b2ca428a9e3b724ad 100644 (file)
@@ -88,7 +88,7 @@ static struct hwrng timeriomem_rng_ops = {
        .priv           = 0,
 };
 
-static int __devinit timeriomem_rng_probe(struct platform_device *pdev)
+static int timeriomem_rng_probe(struct platform_device *pdev)
 {
        struct resource *res;
        int ret;
@@ -146,7 +146,7 @@ static struct platform_driver timeriomem_rng_driver = {
                .owner          = THIS_MODULE,
        },
        .probe          = timeriomem_rng_probe,
-       .remove         = __devexit_p(timeriomem_rng_remove),
+       .remove         = timeriomem_rng_remove,
 };
 
 module_platform_driver(timeriomem_rng_driver);
index 621f595f1a98b55b066d6e77a710e7c31a6d91c6..b65c10395959b507480a028d7a6dd12a02ff0871 100644 (file)
@@ -147,7 +147,7 @@ static struct virtio_driver virtio_rng_driver = {
        .driver.owner = THIS_MODULE,
        .id_table =     id_table,
        .probe =        virtrng_probe,
-       .remove =       __devexit_p(virtrng_remove),
+       .remove =       virtrng_remove,
 #ifdef CONFIG_PM
        .freeze =       virtrng_freeze,
        .restore =      virtrng_restore,
index cfdfecd5bc763026762bd9e26b08e4e3c15e7b67..1c7fdcd22a98f0ee3d5ae92959ef2467124c98c9 100644 (file)
@@ -2243,7 +2243,7 @@ static const struct pnp_device_id pnp_dev_table[] = {
 static struct pnp_driver ipmi_pnp_driver = {
        .name           = DEVICE_NAME,
        .probe          = ipmi_pnp_probe,
-       .remove         = __devexit_p(ipmi_pnp_remove),
+       .remove         = ipmi_pnp_remove,
        .id_table       = pnp_dev_table,
 };
 #endif
@@ -2546,7 +2546,7 @@ static struct pci_driver ipmi_pci_driver = {
        .name =         DEVICE_NAME,
        .id_table =     ipmi_pci_devices,
        .probe =        ipmi_pci_probe,
-       .remove =       __devexit_p(ipmi_pci_remove),
+       .remove =       ipmi_pci_remove,
 };
 #endif /* CONFIG_PCI */
 
@@ -2661,7 +2661,7 @@ static struct platform_driver ipmi_driver = {
                .of_match_table = ipmi_match,
        },
        .probe          = ipmi_probe,
-       .remove         = __devexit_p(ipmi_remove),
+       .remove         = ipmi_remove,
 };
 
 static int wait_for_msg_done(struct smi_info *smi_info)
index c594cb16c37bf5312f7b38946c6e3a562cc16c18..684b0d53764f38d218b8cff41d5a9e0c3e248979 100644 (file)
@@ -2186,11 +2186,7 @@ static struct virtio_driver virtio_console = {
 #endif
 };
 
-/*
- * virtio_rproc_serial refers to __devinit function which causes
- * section mismatch warnings. So use __refdata to silence warnings.
- */
-static struct virtio_driver __refdata virtio_rproc_serial = {
+static struct virtio_driver virtio_rproc_serial = {
        .feature_table = rproc_serial_features,
        .feature_table_size = ARRAY_SIZE(rproc_serial_features),
        .driver.name =  "virtio_rproc_serial",
index bc1e713e7b9cb282e2c601ee14ddf27bfda2eb62..3af729b1b89d16f48692b3bdb7fce217cf1e92f0 100644 (file)
@@ -78,7 +78,7 @@ static struct clk_init_data wm831x_clkout_init = {
        .flags = CLK_IS_ROOT,
 };
 
-static int __devinit twl6040_clk_probe(struct platform_device *pdev)
+static int twl6040_clk_probe(struct platform_device *pdev)
 {
        struct twl6040 *twl6040 = dev_get_drvdata(pdev->dev.parent);
        struct twl6040_clk *clkdata;
@@ -100,7 +100,7 @@ static int __devinit twl6040_clk_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit twl6040_clk_remove(struct platform_device *pdev)
+static int twl6040_clk_remove(struct platform_device *pdev)
 {
        struct twl6040_clk *clkdata = dev_get_drvdata(&pdev->dev);
 
@@ -115,7 +115,7 @@ static struct platform_driver twl6040_clk_driver = {
                .owner = THIS_MODULE,
        },
        .probe = twl6040_clk_probe,
-       .remove = __devexit_p(twl6040_clk_remove),
+       .remove = twl6040_clk_remove,
 };
 
 module_platform_driver(twl6040_clk_driver);
index c6d3c263b070cc2a66303fc09a861dfae2560c8f..8fa5408b6c7dfeef356ec102d6bf0eab3662835e 100644 (file)
@@ -32,7 +32,7 @@ struct mvebu_soc_descr {
 
 #define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw)
 
-static struct clk __init *mvebu_clk_gating_get_src(
+static struct clk *mvebu_clk_gating_get_src(
        struct of_phandle_args *clkspec, void *data)
 {
        struct mvebu_gating_ctrl *ctrl = (struct mvebu_gating_ctrl *)data;
index e27c52317ffe41a7ab3ff595ff277eec52b789ef..9f7400d74fa77d9a8ef1a7c3b6933544f5a22985 100644 (file)
@@ -34,7 +34,7 @@ static int ab9540_reg_clks(struct device *dev)
        return 0;
 }
 
-static int __devinit abx500_clk_probe(struct platform_device *pdev)
+static int abx500_clk_probe(struct platform_device *pdev)
 {
        struct ab8500 *parent = dev_get_drvdata(pdev->dev.parent);
        int ret;
index 5d1b9268bcaf4a99d3f7024852c962209a62bb5d..6efe4d1ab3aa7939cf4f431ca0891f4290b807c0 100644 (file)
@@ -73,7 +73,7 @@ static struct clocksource clocksource_acpi_pm = {
 
 
 #ifdef CONFIG_PCI
-static int __devinitdata acpi_pm_good;
+static int acpi_pm_good;
 static int __init acpi_pm_good_setup(char *__str)
 {
        acpi_pm_good = 1;
@@ -102,7 +102,7 @@ static inline void acpi_pm_need_workaround(void)
  * incorrect when read). As a result, the ACPI free running count up
  * timer specification is violated due to erroneous reads.
  */
-static void __devinit acpi_pm_check_blacklist(struct pci_dev *dev)
+static void acpi_pm_check_blacklist(struct pci_dev *dev)
 {
        if (acpi_pm_good)
                return;
@@ -120,7 +120,7 @@ static void __devinit acpi_pm_check_blacklist(struct pci_dev *dev)
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3,
                        acpi_pm_check_blacklist);
 
-static void __devinit acpi_pm_check_graylist(struct pci_dev *dev)
+static void acpi_pm_check_graylist(struct pci_dev *dev)
 {
        if (acpi_pm_good)
                return;
index 372051d1bba87b5796a68a543a5d628c61317642..e6a553cb73e807545270e3a873295b8b88dfc907 100644 (file)
@@ -311,7 +311,7 @@ static void em_sti_register_clockevent(struct em_sti_priv *p)
        clockevents_config_and_register(ced, 1, 2, 0xffffffff);
 }
 
-static int __devinit em_sti_probe(struct platform_device *pdev)
+static int em_sti_probe(struct platform_device *pdev)
 {
        struct em_sti_priv *p;
        struct resource *res;
@@ -379,12 +379,12 @@ err0:
        return ret;
 }
 
-static int __devexit em_sti_remove(struct platform_device *pdev)
+static int em_sti_remove(struct platform_device *pdev)
 {
        return -EBUSY; /* cannot unregister clockevent and clocksource */
 }
 
-static const struct of_device_id em_sti_dt_ids[] __devinitconst = {
+static const struct of_device_id em_sti_dt_ids[] = {
        { .compatible = "renesas,em-sti", },
        {},
 };
@@ -392,7 +392,7 @@ MODULE_DEVICE_TABLE(of, em_sti_dt_ids);
 
 static struct platform_driver em_sti_device_driver = {
        .probe          = em_sti_probe,
-       .remove         = __devexit_p(em_sti_remove),
+       .remove         = em_sti_remove,
        .driver         = {
                .name   = "em_sti",
                .of_match_table = em_sti_dt_ids,
index a5f7829f27993b8fefea105357229413b78e5309..488c14cc8dbf4848085142ca03e171ed35526b40 100644 (file)
@@ -726,7 +726,7 @@ err0:
        return ret;
 }
 
-static int __devinit sh_cmt_probe(struct platform_device *pdev)
+static int sh_cmt_probe(struct platform_device *pdev)
 {
        struct sh_cmt_priv *p = platform_get_drvdata(pdev);
        struct sh_timer_config *cfg = pdev->dev.platform_data;
@@ -767,14 +767,14 @@ static int __devinit sh_cmt_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit sh_cmt_remove(struct platform_device *pdev)
+static int sh_cmt_remove(struct platform_device *pdev)
 {
        return -EBUSY; /* cannot unregister clockevent and clocksource */
 }
 
 static struct platform_driver sh_cmt_device_driver = {
        .probe          = sh_cmt_probe,
-       .remove         = __devexit_p(sh_cmt_remove),
+       .remove         = sh_cmt_remove,
        .driver         = {
                .name   = "sh_cmt",
        }
index c5eea858054aa4e67195edf69c1b1951fa8cf11c..83943e27cfac9193e659ecf7221afcfb48bcd73d 100644 (file)
@@ -321,7 +321,7 @@ static int sh_mtu2_setup(struct sh_mtu2_priv *p, struct platform_device *pdev)
        return ret;
 }
 
-static int __devinit sh_mtu2_probe(struct platform_device *pdev)
+static int sh_mtu2_probe(struct platform_device *pdev)
 {
        struct sh_mtu2_priv *p = platform_get_drvdata(pdev);
        struct sh_timer_config *cfg = pdev->dev.platform_data;
@@ -362,14 +362,14 @@ static int __devinit sh_mtu2_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit sh_mtu2_remove(struct platform_device *pdev)
+static int sh_mtu2_remove(struct platform_device *pdev)
 {
        return -EBUSY; /* cannot unregister clockevent */
 }
 
 static struct platform_driver sh_mtu2_device_driver = {
        .probe          = sh_mtu2_probe,
-       .remove         = __devexit_p(sh_mtu2_remove),
+       .remove         = sh_mtu2_remove,
        .driver         = {
                .name   = "sh_mtu2",
        }
index 0cc4add882795ed048e5b98a9e215a758b8ad147..b4502edce2a140eb3d1f197d0cb39c294e5f0b2f 100644 (file)
@@ -484,7 +484,7 @@ static int sh_tmu_setup(struct sh_tmu_priv *p, struct platform_device *pdev)
        return ret;
 }
 
-static int __devinit sh_tmu_probe(struct platform_device *pdev)
+static int sh_tmu_probe(struct platform_device *pdev)
 {
        struct sh_tmu_priv *p = platform_get_drvdata(pdev);
        struct sh_timer_config *cfg = pdev->dev.platform_data;
@@ -525,14 +525,14 @@ static int __devinit sh_tmu_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit sh_tmu_remove(struct platform_device *pdev)
+static int sh_tmu_remove(struct platform_device *pdev)
 {
        return -EBUSY; /* cannot unregister clockevent and clocksource */
 }
 
 static struct platform_driver sh_tmu_device_driver = {
        .probe          = sh_tmu_probe,
-       .remove         = __devexit_p(sh_tmu_remove),
+       .remove         = sh_tmu_remove,
        .driver         = {
                .name   = "sh_tmu",
        }
index 965b7811e04f37100151dc441b7713cdee065bbf..7b695913cb309afa55f253eb7ae2273945dda041 100644 (file)
@@ -256,7 +256,7 @@ static struct cn_dev cdev = {
        .input   = cn_rx_skb,
 };
 
-static int __devinit cn_init(void)
+static int cn_init(void)
 {
        struct cn_dev *dev = &cdev;
        struct netlink_kernel_cfg cfg = {
@@ -281,7 +281,7 @@ static int __devinit cn_init(void)
        return 0;
 }
 
-static void __devexit cn_fini(void)
+static void cn_fini(void)
 {
        struct cn_dev *dev = &cdev;
 
index ea512f47b789b49c842a78388f15957fb65d62be..e0a899f25e37445491574f34e8350032d6d228ae 100644 (file)
@@ -20,6 +20,9 @@ if CPU_FREQ
 config CPU_FREQ_TABLE
        tristate
 
+config CPU_FREQ_GOV_COMMON
+       bool
+
 config CPU_FREQ_STAT
        tristate "CPU frequency translation statistics"
        select CPU_FREQ_TABLE
@@ -141,6 +144,7 @@ config CPU_FREQ_GOV_USERSPACE
 config CPU_FREQ_GOV_ONDEMAND
        tristate "'ondemand' cpufreq policy governor"
        select CPU_FREQ_TABLE
+       select CPU_FREQ_GOV_COMMON
        help
          'ondemand' - This driver adds a dynamic cpufreq policy governor.
          The governor does a periodic polling and 
@@ -159,6 +163,7 @@ config CPU_FREQ_GOV_ONDEMAND
 config CPU_FREQ_GOV_CONSERVATIVE
        tristate "'conservative' cpufreq governor"
        depends on CPU_FREQ
+       select CPU_FREQ_GOV_COMMON
        help
          'conservative' - this driver is rather similar to the 'ondemand'
          governor both in its source code and its purpose, the difference is
index 1f254ec087c1c398d3da2035d477e37d8523b969..fadc4d496e2fc55383c2f9ddf6c59b9ff2072ec3 100644 (file)
@@ -7,8 +7,9 @@ obj-$(CONFIG_CPU_FREQ_STAT)             += cpufreq_stats.o
 obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE) += cpufreq_performance.o
 obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE)   += cpufreq_powersave.o
 obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE)   += cpufreq_userspace.o
-obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND)    += cpufreq_ondemand.o cpufreq_governor.o
-obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE)        += cpufreq_conservative.o cpufreq_governor.o
+obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND)    += cpufreq_ondemand.o
+obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE)        += cpufreq_conservative.o
+obj-$(CONFIG_CPU_FREQ_GOV_COMMON)              += cpufreq_governor.o
 
 # CPUfreq cross-arch helpers
 obj-$(CONFIG_CPU_FREQ_TABLE)           += freq_table.o
index e40e508096443b683d7e3b9b2571af2a9a0d6c17..9d7732b810445f6b73318e574924b6bed6ac6829 100644 (file)
@@ -364,18 +364,21 @@ static int __init cpufreq_stats_init(void)
        if (ret)
                return ret;
 
+       register_hotcpu_notifier(&cpufreq_stat_cpu_notifier);
+       for_each_online_cpu(cpu)
+               cpufreq_update_policy(cpu);
+
        ret = cpufreq_register_notifier(&notifier_trans_block,
                                CPUFREQ_TRANSITION_NOTIFIER);
        if (ret) {
                cpufreq_unregister_notifier(&notifier_policy_block,
                                CPUFREQ_POLICY_NOTIFIER);
+               unregister_hotcpu_notifier(&cpufreq_stat_cpu_notifier);
+               for_each_online_cpu(cpu)
+                       cpufreq_stats_free_table(cpu);
                return ret;
        }
 
-       register_hotcpu_notifier(&cpufreq_stat_cpu_notifier);
-       for_each_online_cpu(cpu) {
-               cpufreq_update_policy(cpu);
-       }
        return 0;
 }
 static void __exit cpufreq_stats_exit(void)
index f1fa500ac1056e30242cfc4de6b94d267ada23d0..1180d536d1eb6cf8c2d59b4d1432a0f65be85675 100644 (file)
@@ -77,7 +77,7 @@ static unsigned int longhaul_index;
 static int scale_voltage;
 static int disable_acpi_c3;
 static int revid_errata;
-
+static int enable;
 
 /* Clock ratios multiplied by 10 */
 static int mults[32];
@@ -965,6 +965,10 @@ static int __init longhaul_init(void)
        if (!x86_match_cpu(longhaul_id))
                return -ENODEV;
 
+       if (!enable) {
+               printk(KERN_ERR PFX "Option \"enable\" not set. Aborting.\n");
+               return -ENODEV;
+       }
 #ifdef CONFIG_SMP
        if (num_online_cpus() > 1) {
                printk(KERN_ERR PFX "More than 1 CPU detected, "
@@ -1021,6 +1025,10 @@ MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor");
  * such. */
 module_param(revid_errata, int, 0644);
 MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID");
+/* By default driver is disabled to prevent incompatible
+ * system freeze. */
+module_param(enable, int, 0644);
+MODULE_PARM_DESC(enable, "Enable driver");
 
 MODULE_AUTHOR("Dave Jones <davej@redhat.com>");
 MODULE_DESCRIPTION("Longhaul driver for VIA Cyrix processors.");
index 3265844839bfe9c79ef8849705262a52d16cc4e1..2a297f86dbad25be5f17e0f41029e92dd23afeaf 100644 (file)
@@ -209,7 +209,7 @@ inline int cpuidle_coupled_set_not_ready(struct cpuidle_coupled *coupled)
        int all;
        int ret;
 
-       all = coupled->online_count || (coupled->online_count << WAITING_BITS);
+       all = coupled->online_count | (coupled->online_count << WAITING_BITS);
        ret = atomic_add_unless(&coupled->ready_waiting_counts,
                -MAX_WAITING_CPUS, all);
 
index 8df53dd8dbe17b4bb0c0d432bbec56d31895dc84..fb4a7dd57f94f479adf8a3dd93e35e4f348b65d3 100644 (file)
@@ -70,7 +70,7 @@ int cpuidle_play_dead(void)
        struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
        struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
        int i, dead_state = -1;
-       int power_usage = -1;
+       int power_usage = INT_MAX;
 
        if (!drv)
                return -ENODEV;
index 3af841fb397a0cda095b9ca794c04271c5164332..c2b281afe0ed03ce13a3a3122d96084319a93635 100644 (file)
@@ -235,16 +235,10 @@ EXPORT_SYMBOL_GPL(cpuidle_get_driver);
  */
 struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev)
 {
-       struct cpuidle_driver *drv;
-
        if (!dev)
                return NULL;
 
-       spin_lock(&cpuidle_driver_lock);
-       drv = __cpuidle_get_cpu_driver(dev->cpu);
-       spin_unlock(&cpuidle_driver_lock);
-
-       return drv;
+       return __cpuidle_get_cpu_driver(dev->cpu);
 }
 EXPORT_SYMBOL_GPL(cpuidle_get_cpu_driver);
 
index bd40b943b6db134eb30f0f6fe3fc0cf1dc7aaad0..20ea33afdda10c3e80ea99e716790c4494babf3e 100644 (file)
@@ -312,7 +312,7 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
 {
        struct menu_device *data = &__get_cpu_var(menu_devices);
        int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);
-       int power_usage = -1;
+       int power_usage = INT_MAX;
        int i;
        int multiplier;
        struct timespec t;
index 8061336e07e7c74789e46a86438756dddc855e6e..c9d9d5c16f94903ec5c90e939ecbb84767585474 100644 (file)
@@ -1036,7 +1036,7 @@ err_aes_algs:
        return err;
 }
 
-static int __devinit atmel_aes_probe(struct platform_device *pdev)
+static int atmel_aes_probe(struct platform_device *pdev)
 {
        struct atmel_aes_dev *aes_dd;
        struct aes_platform_data        *pdata;
@@ -1152,7 +1152,7 @@ aes_dd_err:
        return err;
 }
 
-static int __devexit atmel_aes_remove(struct platform_device *pdev)
+static int atmel_aes_remove(struct platform_device *pdev)
 {
        static struct atmel_aes_dev *aes_dd;
 
@@ -1185,7 +1185,7 @@ static int __devexit atmel_aes_remove(struct platform_device *pdev)
 
 static struct platform_driver atmel_aes_driver = {
        .probe          = atmel_aes_probe,
-       .remove         = __devexit_p(atmel_aes_remove),
+       .remove         = atmel_aes_remove,
        .driver         = {
                .name   = "atmel_aes",
                .owner  = THIS_MODULE,
index bcdf55fdc6236e49afdc4ade1ece2ed24b61a755..4918e9424d3112a4b5feae51fc30babba444437c 100644 (file)
@@ -964,7 +964,7 @@ err_sha_algs:
        return err;
 }
 
-static int __devinit atmel_sha_probe(struct platform_device *pdev)
+static int atmel_sha_probe(struct platform_device *pdev)
 {
        struct atmel_sha_dev *sha_dd;
        struct device *dev = &pdev->dev;
@@ -1063,7 +1063,7 @@ sha_dd_err:
        return err;
 }
 
-static int __devexit atmel_sha_remove(struct platform_device *pdev)
+static int atmel_sha_remove(struct platform_device *pdev)
 {
        static struct atmel_sha_dev *sha_dd;
 
@@ -1093,7 +1093,7 @@ static int __devexit atmel_sha_remove(struct platform_device *pdev)
 
 static struct platform_driver atmel_sha_driver = {
        .probe          = atmel_sha_probe,
-       .remove         = __devexit_p(atmel_sha_remove),
+       .remove         = atmel_sha_remove,
        .driver         = {
                .name   = "atmel_sha",
                .owner  = THIS_MODULE,
index 7495f98c722135ea76820a63496138bbc7491f73..7c73fbb17538adaaf7550b96889c66d9b8f0b04e 100644 (file)
@@ -1053,7 +1053,7 @@ err_tdes_algs:
        return err;
 }
 
-static int __devinit atmel_tdes_probe(struct platform_device *pdev)
+static int atmel_tdes_probe(struct platform_device *pdev)
 {
        struct atmel_tdes_dev *tdes_dd;
        struct device *dev = &pdev->dev;
@@ -1162,7 +1162,7 @@ tdes_dd_err:
        return err;
 }
 
-static int __devexit atmel_tdes_remove(struct platform_device *pdev)
+static int atmel_tdes_remove(struct platform_device *pdev)
 {
        static struct atmel_tdes_dev *tdes_dd;
 
@@ -1195,7 +1195,7 @@ static int __devexit atmel_tdes_remove(struct platform_device *pdev)
 
 static struct platform_driver atmel_tdes_driver = {
        .probe          = atmel_tdes_probe,
-       .remove         = __devexit_p(atmel_tdes_remove),
+       .remove         = atmel_tdes_remove,
        .driver         = {
                .name   = "atmel_tdes",
                .owner  = THIS_MODULE,
index 5398580b431340eb85210cd80393872a730a15c3..a22f1a9f895f587b00662c7442258e161fcdc017 100644 (file)
@@ -586,7 +586,7 @@ static int bfin_crypto_crc_suspend(struct platform_device *pdev, pm_message_t st
  *     bfin_crypto_crc_probe - Initialize module
  *
  */
-static int __devinit bfin_crypto_crc_probe(struct platform_device *pdev)
+static int bfin_crypto_crc_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct resource *res;
@@ -707,7 +707,7 @@ out_error_free_mem:
  *     bfin_crypto_crc_remove - Initialize module
  *
  */
-static int __devexit bfin_crypto_crc_remove(struct platform_device *pdev)
+static int bfin_crypto_crc_remove(struct platform_device *pdev)
 {
        struct bfin_crypto_crc *crc = platform_get_drvdata(pdev);
 
@@ -731,7 +731,7 @@ static int __devexit bfin_crypto_crc_remove(struct platform_device *pdev)
 
 static struct platform_driver bfin_crypto_crc_driver = {
        .probe     = bfin_crypto_crc_probe,
-       .remove    = __devexit_p(bfin_crypto_crc_remove),
+       .remove    = bfin_crypto_crc_remove,
        .suspend   = bfin_crypto_crc_suspend,
        .resume    = bfin_crypto_crc_resume,
        .driver    = {
index bf20dd891705890ad544086af82cfaf7e4a97fac..1c56f63524f27b2139860518f3ee672fdeef07cb 100644 (file)
@@ -420,7 +420,7 @@ static struct platform_driver caam_driver = {
                .of_match_table = caam_match,
        },
        .probe       = caam_probe,
-       .remove      = __devexit_p(caam_remove),
+       .remove      = caam_remove,
 };
 
 module_platform_driver(caam_driver);
index 51f196d77f2185cacaf8a53ff965081669593f6f..0c9ff497172425f617bd753c912b7b62567c7e74 100644 (file)
@@ -498,8 +498,7 @@ static struct crypto_alg geode_ecb_alg = {
        }
 };
 
-static void __devexit
-geode_aes_remove(struct pci_dev *dev)
+static void geode_aes_remove(struct pci_dev *dev)
 {
        crypto_unregister_alg(&geode_alg);
        crypto_unregister_alg(&geode_ecb_alg);
@@ -513,8 +512,7 @@ geode_aes_remove(struct pci_dev *dev)
 }
 
 
-static int __devinit
-geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        int ret;
        ret = pci_enable_device(dev);
@@ -582,7 +580,7 @@ static struct pci_driver geode_aes_driver = {
        .name = "Geode LX AES",
        .id_table = geode_aes_tbl,
        .probe = geode_aes_probe,
-       .remove = __devexit_p(geode_aes_remove)
+       .remove = geode_aes_remove,
 };
 
 module_pci_driver(geode_aes_driver);
index fda32968a66b660cf5ff4faf3048394736458264..ebf130e894b50da2bb69bf08a7d3f5210af70d7d 100644 (file)
@@ -2561,7 +2561,7 @@ static void hifn_tasklet_callback(unsigned long data)
                hifn_process_queue(dev);
 }
 
-static int __devinit hifn_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+static int hifn_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int err, i;
        struct hifn_device *dev;
@@ -2696,7 +2696,7 @@ err_out_disable_pci_device:
        return err;
 }
 
-static void __devexit hifn_remove(struct pci_dev *pdev)
+static void hifn_remove(struct pci_dev *pdev)
 {
        int i;
        struct hifn_device *dev;
@@ -2740,7 +2740,7 @@ static struct pci_driver hifn_pci_driver = {
        .name     = "hifn795x",
        .id_table = hifn_pci_tbl,
        .probe    = hifn_probe,
-       .remove   = __devexit_p(hifn_remove),
+       .remove   = hifn_remove,
 };
 
 static int __init hifn_init(void)
index 24ccae453e7940c8e74c60c245072eb7754354cc..ce6290e5471ab3ca2e46857b7c7e8550cae66768 100644 (file)
@@ -1184,7 +1184,7 @@ MODULE_DEVICE_TABLE(of, mv_cesa_of_match_table);
 
 static struct platform_driver marvell_crypto = {
        .probe          = mv_probe,
-       .remove         = __devexit_p(mv_remove),
+       .remove         = mv_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "mv_crypto",
index aab257403b4a54ac4d75d4db3340c9b48855478b..e1f0ab413c3b80a59b55bb4f079524067c09d22f 100644 (file)
@@ -34,7 +34,7 @@
 #define DRV_MODULE_VERSION     "0.2"
 #define DRV_MODULE_RELDATE     "July 28, 2011"
 
-static char version[] __devinitdata =
+static char version[] =
        DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 
 MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
@@ -1388,7 +1388,7 @@ static int n2_cipher_cra_init(struct crypto_tfm *tfm)
        return 0;
 }
 
-static int __devinit __n2_register_one_cipher(const struct n2_cipher_tmpl *tmpl)
+static int __n2_register_one_cipher(const struct n2_cipher_tmpl *tmpl)
 {
        struct n2_cipher_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
        struct crypto_alg *alg;
@@ -1424,7 +1424,7 @@ static int __devinit __n2_register_one_cipher(const struct n2_cipher_tmpl *tmpl)
        return err;
 }
 
-static int __devinit __n2_register_one_hmac(struct n2_ahash_alg *n2ahash)
+static int __n2_register_one_hmac(struct n2_ahash_alg *n2ahash)
 {
        struct n2_hmac_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
        struct ahash_alg *ahash;
@@ -1462,7 +1462,7 @@ static int __devinit __n2_register_one_hmac(struct n2_ahash_alg *n2ahash)
        return err;
 }
 
-static int __devinit __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
+static int __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
 {
        struct n2_ahash_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
        struct hash_alg_common *halg;
@@ -1517,7 +1517,7 @@ static int __devinit __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
        return err;
 }
 
-static int __devinit n2_register_algs(void)
+static int n2_register_algs(void)
 {
        int i, err = 0;
 
@@ -1545,7 +1545,7 @@ out:
        return err;
 }
 
-static void __devexit n2_unregister_algs(void)
+static void n2_unregister_algs(void)
 {
        mutex_lock(&spu_lock);
        if (!--algs_registered)
@@ -1822,8 +1822,8 @@ static int spu_mdesc_scan(struct mdesc_handle *mdesc, struct platform_device *de
        return err;
 }
 
-static int __devinit get_irq_props(struct mdesc_handle *mdesc, u64 node,
-                                  struct spu_mdesc_info *ip)
+static int get_irq_props(struct mdesc_handle *mdesc, u64 node,
+                        struct spu_mdesc_info *ip)
 {
        const u64 *ino;
        int ino_len;
@@ -1851,10 +1851,10 @@ static int __devinit get_irq_props(struct mdesc_handle *mdesc, u64 node,
        return 0;
 }
 
-static int __devinit grab_mdesc_irq_props(struct mdesc_handle *mdesc,
-                                         struct platform_device *dev,
-                                         struct spu_mdesc_info *ip,
-                                         const char *node_name)
+static int grab_mdesc_irq_props(struct mdesc_handle *mdesc,
+                               struct platform_device *dev,
+                               struct spu_mdesc_info *ip,
+                               const char *node_name)
 {
        const unsigned int *reg;
        u64 node;
@@ -1883,7 +1883,7 @@ static int __devinit grab_mdesc_irq_props(struct mdesc_handle *mdesc,
 static unsigned long n2_spu_hvapi_major;
 static unsigned long n2_spu_hvapi_minor;
 
-static int __devinit n2_spu_hvapi_register(void)
+static int n2_spu_hvapi_register(void)
 {
        int err;
 
@@ -1909,7 +1909,7 @@ static void n2_spu_hvapi_unregister(void)
 
 static int global_ref;
 
-static int __devinit grab_global_resources(void)
+static int grab_global_resources(void)
 {
        int err = 0;
 
@@ -1973,7 +1973,7 @@ static void release_global_resources(void)
        mutex_unlock(&spu_lock);
 }
 
-static struct n2_crypto * __devinit alloc_n2cp(void)
+static struct n2_crypto *alloc_n2cp(void)
 {
        struct n2_crypto *np = kzalloc(sizeof(struct n2_crypto), GFP_KERNEL);
 
@@ -1993,7 +1993,7 @@ static void free_n2cp(struct n2_crypto *np)
        kfree(np);
 }
 
-static void __devinit n2_spu_driver_version(void)
+static void n2_spu_driver_version(void)
 {
        static int n2_spu_version_printed;
 
@@ -2001,7 +2001,7 @@ static void __devinit n2_spu_driver_version(void)
                pr_info("%s", version);
 }
 
-static int __devinit n2_crypto_probe(struct platform_device *dev)
+static int n2_crypto_probe(struct platform_device *dev)
 {
        struct mdesc_handle *mdesc;
        const char *full_name;
@@ -2077,7 +2077,7 @@ out_free_n2cp:
        return err;
 }
 
-static int __devexit n2_crypto_remove(struct platform_device *dev)
+static int n2_crypto_remove(struct platform_device *dev)
 {
        struct n2_crypto *np = dev_get_drvdata(&dev->dev);
 
@@ -2092,7 +2092,7 @@ static int __devexit n2_crypto_remove(struct platform_device *dev)
        return 0;
 }
 
-static struct n2_mau * __devinit alloc_ncp(void)
+static struct n2_mau *alloc_ncp(void)
 {
        struct n2_mau *mp = kzalloc(sizeof(struct n2_mau), GFP_KERNEL);
 
@@ -2112,7 +2112,7 @@ static void free_ncp(struct n2_mau *mp)
        kfree(mp);
 }
 
-static int __devinit n2_mau_probe(struct platform_device *dev)
+static int n2_mau_probe(struct platform_device *dev)
 {
        struct mdesc_handle *mdesc;
        const char *full_name;
@@ -2179,7 +2179,7 @@ out_free_ncp:
        return err;
 }
 
-static int __devexit n2_mau_remove(struct platform_device *dev)
+static int n2_mau_remove(struct platform_device *dev)
 {
        struct n2_mau *mp = dev_get_drvdata(&dev->dev);
 
@@ -2217,7 +2217,7 @@ static struct platform_driver n2_crypto_driver = {
                .of_match_table =       n2_crypto_match,
        },
        .probe          =       n2_crypto_probe,
-       .remove         =       __devexit_p(n2_crypto_remove),
+       .remove         =       n2_crypto_remove,
 };
 
 static struct of_device_id n2_mau_match[] = {
@@ -2245,7 +2245,7 @@ static struct platform_driver n2_mau_driver = {
                .of_match_table =       n2_mau_match,
        },
        .probe          =       n2_mau_probe,
-       .remove         =       __devexit_p(n2_mau_remove),
+       .remove         =       n2_mau_remove,
 };
 
 static int __init n2_init(void)
index f7a8a16aa7d39d796a07385540eddf60df79661d..c767f232e6933bc876adedd56a1f7e655f93c815 100644 (file)
@@ -634,8 +634,7 @@ void nx_crypto_ctx_exit(struct crypto_tfm *tfm)
        nx_ctx->out_sg = NULL;
 }
 
-static int __devinit nx_probe(struct vio_dev *viodev,
-                             const struct vio_device_id *id)
+static int nx_probe(struct vio_dev *viodev, const struct vio_device_id *id)
 {
        dev_dbg(&viodev->dev, "driver probed: %s resource id: 0x%x\n",
                viodev->name, viodev->resource_id);
@@ -653,7 +652,7 @@ static int __devinit nx_probe(struct vio_dev *viodev,
        return nx_register_algs();
 }
 
-static int __devexit nx_remove(struct vio_dev *viodev)
+static int nx_remove(struct vio_dev *viodev)
 {
        dev_dbg(&viodev->dev, "entering nx_remove for UA 0x%x\n",
                viodev->unit_address);
@@ -689,7 +688,7 @@ static void __exit nx_fini(void)
        vio_unregister_driver(&nx_driver.viodriver);
 }
 
-static struct vio_device_id nx_crypto_driver_ids[] __devinitdata = {
+static struct vio_device_id nx_crypto_driver_ids[] = {
        { "ibm,sym-encryption-v1", "ibm,sym-encryption" },
        { "", "" }
 };
index 1d75e6f95a5877fab7c987dfe5b50bf2d8394017..90d34adc2a66ba36ccfce82142e154db04e87d83 100644 (file)
@@ -1137,7 +1137,7 @@ static void omap_sham_dma_cleanup(struct omap_sham_dev *dd)
        }
 }
 
-static int __devinit omap_sham_probe(struct platform_device *pdev)
+static int omap_sham_probe(struct platform_device *pdev)
 {
        struct omap_sham_dev *dd;
        struct device *dev = &pdev->dev;
@@ -1250,7 +1250,7 @@ data_err:
        return err;
 }
 
-static int __devexit omap_sham_remove(struct platform_device *pdev)
+static int omap_sham_remove(struct platform_device *pdev)
 {
        static struct omap_sham_dev *dd;
        int i;
index c983f869d2b7a58e0a7e7978e294dae6dd0cc5d4..2096d4685a9e362a1837f58ee8b3477a4340a410 100644 (file)
@@ -1708,7 +1708,7 @@ static bool spacc_is_compatible(struct platform_device *pdev,
        return false;
 }
 
-static int __devinit spacc_probe(struct platform_device *pdev)
+static int spacc_probe(struct platform_device *pdev)
 {
        int i, err, ret = -EINVAL;
        struct resource *mem, *irq;
@@ -1841,7 +1841,7 @@ static int __devinit spacc_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int __devexit spacc_remove(struct platform_device *pdev)
+static int spacc_remove(struct platform_device *pdev)
 {
        struct spacc_alg *alg, *next;
        struct spacc_engine *engine = platform_get_drvdata(pdev);
@@ -1868,7 +1868,7 @@ static const struct platform_device_id spacc_id_table[] = {
 
 static struct platform_driver spacc_driver = {
        .probe          = spacc_probe,
-       .remove         = __devexit_p(spacc_remove),
+       .remove         = spacc_remove,
        .driver         = {
                .name   = "picochip,spacc",
 #ifdef CONFIG_PM
index eb32fd8cad147eacbaaf115516945736fa37ad7d..85ea7525fa36242bda4cb21c37ce788981d3b502 100644 (file)
@@ -1047,7 +1047,7 @@ out:
        return err;
 }
 
-static int __devexit tegra_aes_remove(struct platform_device *pdev)
+static int tegra_aes_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct tegra_aes_dev *dd = platform_get_drvdata(pdev);
@@ -1074,7 +1074,7 @@ static int __devexit tegra_aes_remove(struct platform_device *pdev)
        return 0;
 }
 
-static struct of_device_id tegra_aes_of_match[] __devinitdata = {
+static struct of_device_id tegra_aes_of_match[] = {
        { .compatible = "nvidia,tegra20-aes", },
        { .compatible = "nvidia,tegra30-aes", },
        { },
@@ -1082,7 +1082,7 @@ static struct of_device_id tegra_aes_of_match[] __devinitdata = {
 
 static struct platform_driver tegra_aes_driver = {
        .probe  = tegra_aes_probe,
-       .remove = __devexit_p(tegra_aes_remove),
+       .remove = tegra_aes_remove,
        .driver = {
                .name   = "tegra-aes",
                .owner  = THIS_MODULE,
index 741837208716e293d06bbe9cfa94fac4051303d4..80c745e83082bf6d9dade7a81dffbb89931632a7 100644 (file)
@@ -980,7 +980,7 @@ unlock:
        return NOTIFY_DONE;
 }
 
-static __devinit int exynos4_busfreq_probe(struct platform_device *pdev)
+static int exynos4_busfreq_probe(struct platform_device *pdev)
 {
        struct busfreq_data *data;
        struct opp *opp;
@@ -1056,7 +1056,7 @@ static __devinit int exynos4_busfreq_probe(struct platform_device *pdev)
        return 0;
 }
 
-static __devexit int exynos4_busfreq_remove(struct platform_device *pdev)
+static int exynos4_busfreq_remove(struct platform_device *pdev)
 {
        struct busfreq_data *data = platform_get_drvdata(pdev);
 
@@ -1087,7 +1087,7 @@ static const struct platform_device_id exynos4_busfreq_id[] = {
 
 static struct platform_driver exynos4_busfreq_driver = {
        .probe  = exynos4_busfreq_probe,
-       .remove = __devexit_p(exynos4_busfreq_remove),
+       .remove = exynos4_busfreq_remove,
        .id_table = exynos4_busfreq_id,
        .driver = {
                .name   = "exynos4-busfreq",
index 8f0b111af4de435c75f62d0e1b85ac3db2d38f6e..3e8ba02ba29227a89d4950b18d64811c7b9b5667 100644 (file)
@@ -1634,7 +1634,7 @@ static int dw_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit dw_remove(struct platform_device *pdev)
+static int dw_remove(struct platform_device *pdev)
 {
        struct dw_dma           *dw = platform_get_drvdata(pdev);
        struct dw_dma_chan      *dwc, *_dwc;
index 232b4583ae93b3f3f68b14e4dbaff04d4d72361f..f424298f1ac5094513f6ac9f3e3a64cbaa681ba6 100644 (file)
@@ -585,7 +585,7 @@ err_reg1:
        return ret;
 }
 
-static int __devexit edma_remove(struct platform_device *pdev)
+static int edma_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct edma_cc *ecc = dev_get_drvdata(dev);
index bc764afacd9ba748ce572dea5d4bb39258f898f9..a0de82e21a7c30d00f122071783c9280583990f4 100644 (file)
@@ -1308,7 +1308,7 @@ err_enable_device:
  * Free up all resources and data
  * Call shutdown_dma to complete contoller and chan cleanup
  */
-static void __devexit intel_mid_dma_remove(struct pci_dev *pdev)
+static void intel_mid_dma_remove(struct pci_dev *pdev)
 {
        struct middma_device *device = pci_get_drvdata(pdev);
 
index d6668071bd0d4cfca02996978818d65a62ce7630..9b041858d10dcb6bdc1fcbef9eab59006116c96d 100644 (file)
@@ -242,8 +242,7 @@ static struct dca_ops ioat_dca_ops = {
 };
 
 
-struct dca_provider * __devinit
-ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase)
+struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase)
 {
        struct dca_provider *dca;
        struct ioat_dca_priv *ioatdca;
@@ -408,8 +407,7 @@ static int ioat2_dca_count_dca_slots(void __iomem *iobase, u16 dca_offset)
        return slots;
 }
 
-struct dca_provider * __devinit
-ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase)
+struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase)
 {
        struct dca_provider *dca;
        struct ioat_dca_priv *ioatdca;
@@ -621,8 +619,7 @@ static inline int dca3_tag_map_invalid(u8 *tag_map)
                (tag_map[4] == DCA_TAG_MAP_VALID));
 }
 
-struct dca_provider * __devinit
-ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase)
+struct dca_provider *ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase)
 {
        struct dca_provider *dca;
        struct ioat_dca_priv *ioatdca;
index 73b2b65cb1deed2ccfb16d5f3e81dbeaa47f7ec1..1a68a8ba87e6c74f2f5afb72afac2d0254eae5cd 100644 (file)
@@ -782,7 +782,7 @@ static void ioat1_dma_start_null_desc(struct ioat_dma_chan *ioat)
  */
 #define IOAT_TEST_SIZE 2000
 
-static void __devinit ioat_dma_test_callback(void *dma_async_param)
+static void ioat_dma_test_callback(void *dma_async_param)
 {
        struct completion *cmp = dma_async_param;
 
@@ -793,7 +793,7 @@ static void __devinit ioat_dma_test_callback(void *dma_async_param)
  * ioat_dma_self_test - Perform a IOAT transaction to verify the HW works.
  * @device: device to be tested
  */
-int __devinit ioat_dma_self_test(struct ioatdma_device *device)
+int ioat_dma_self_test(struct ioatdma_device *device)
 {
        int i;
        u8 *src;
@@ -994,7 +994,7 @@ static void ioat_disable_interrupts(struct ioatdma_device *device)
        writeb(0, device->reg_base + IOAT_INTRCTRL_OFFSET);
 }
 
-int __devinit ioat_probe(struct ioatdma_device *device)
+int ioat_probe(struct ioatdma_device *device)
 {
        int err = -ENODEV;
        struct dma_device *dma = &device->common;
@@ -1049,7 +1049,7 @@ err_dma_pool:
        return err;
 }
 
-int __devinit ioat_register(struct ioatdma_device *device)
+int ioat_register(struct ioatdma_device *device)
 {
        int err = dma_async_device_register(&device->common);
 
@@ -1183,7 +1183,7 @@ void ioat_kobject_del(struct ioatdma_device *device)
        }
 }
 
-int __devinit ioat1_dma_probe(struct ioatdma_device *device, int dca)
+int ioat1_dma_probe(struct ioatdma_device *device, int dca)
 {
        struct pci_dev *pdev = device->pdev;
        struct dma_device *dma;
@@ -1216,7 +1216,7 @@ int __devinit ioat1_dma_probe(struct ioatdma_device *device, int dca)
        return err;
 }
 
-void __devexit ioat_dma_remove(struct ioatdma_device *device)
+void ioat_dma_remove(struct ioatdma_device *device)
 {
        struct dma_device *dma = &device->common;
 
index 5e8fe01ba69d574c3eef5cf0cb8f3ab765fb7c72..087935f1565f583df394476ae8bf85abfd84c6d0 100644 (file)
@@ -303,13 +303,12 @@ static inline void ioat_unmap(struct pci_dev *pdev, dma_addr_t addr, size_t len,
                pci_unmap_page(pdev, addr, len, direction);
 }
 
-int __devinit ioat_probe(struct ioatdma_device *device);
-int __devinit ioat_register(struct ioatdma_device *device);
-int __devinit ioat1_dma_probe(struct ioatdma_device *dev, int dca);
-int __devinit ioat_dma_self_test(struct ioatdma_device *device);
-void __devexit ioat_dma_remove(struct ioatdma_device *device);
-struct dca_provider * __devinit ioat_dca_init(struct pci_dev *pdev,
-                                             void __iomem *iobase);
+int ioat_probe(struct ioatdma_device *device);
+int ioat_register(struct ioatdma_device *device);
+int ioat1_dma_probe(struct ioatdma_device *dev, int dca);
+int ioat_dma_self_test(struct ioatdma_device *device);
+void ioat_dma_remove(struct ioatdma_device *device);
+struct dca_provider *ioat_dca_init(struct pci_dev *pdev, void __iomem *iobase);
 dma_addr_t ioat_get_current_completion(struct ioat_chan_common *chan);
 void ioat_init_channel(struct ioatdma_device *device,
                       struct ioat_chan_common *chan, int idx);
index b9d66785144511ff294cb59096d6de1b766cbece..82d4e306c32e8d8efb609834d859dc3723fbe30d 100644 (file)
@@ -862,7 +862,7 @@ struct kobj_type ioat2_ktype = {
        .default_attrs = ioat2_attrs,
 };
 
-int __devinit ioat2_dma_probe(struct ioatdma_device *device, int dca)
+int ioat2_dma_probe(struct ioatdma_device *device, int dca)
 {
        struct pci_dev *pdev = device->pdev;
        struct dma_device *dma;
index be2a55b95c2365848a6da33de2bf91269ea97b14..e100f644e3446449d09cc09dbc639d096d75d305 100644 (file)
@@ -155,10 +155,10 @@ static inline void ioat2_set_chainaddr(struct ioat2_dma_chan *ioat, u64 addr)
               chan->reg_base + IOAT2_CHAINADDR_OFFSET_HIGH);
 }
 
-int __devinit ioat2_dma_probe(struct ioatdma_device *dev, int dca);
-int __devinit ioat3_dma_probe(struct ioatdma_device *dev, int dca);
-struct dca_provider * __devinit ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase);
-struct dca_provider * __devinit ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase);
+int ioat2_dma_probe(struct ioatdma_device *dev, int dca);
+int ioat3_dma_probe(struct ioatdma_device *dev, int dca);
+struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase);
+struct dca_provider *ioat3_dca_init(struct pci_dev *pdev, void __iomem *iobase);
 int ioat2_check_space_lock(struct ioat2_dma_chan *ioat, int num_descs);
 int ioat2_enumerate_channels(struct ioatdma_device *device);
 struct dma_async_tx_descriptor *
index f7f1dc62c15c1a0dc4d27f676f86eefaebe73e5e..e5fc944de1f025edd5492e4208ae0dce5a5a5093 100644 (file)
@@ -836,7 +836,7 @@ ioat3_prep_interrupt_lock(struct dma_chan *c, unsigned long flags)
        return &desc->txd;
 }
 
-static void __devinit ioat3_dma_test_callback(void *dma_async_param)
+static void ioat3_dma_test_callback(void *dma_async_param)
 {
        struct completion *cmp = dma_async_param;
 
@@ -844,7 +844,7 @@ static void __devinit ioat3_dma_test_callback(void *dma_async_param)
 }
 
 #define IOAT_NUM_SRC_TEST 6 /* must be <= 8 */
-static int __devinit ioat_xor_val_self_test(struct ioatdma_device *device)
+static int ioat_xor_val_self_test(struct ioatdma_device *device)
 {
        int i, src_idx;
        struct page *dest;
@@ -1096,7 +1096,7 @@ out:
        return err;
 }
 
-static int __devinit ioat3_dma_self_test(struct ioatdma_device *device)
+static int ioat3_dma_self_test(struct ioatdma_device *device)
 {
        int rc = ioat_dma_self_test(device);
 
@@ -1187,7 +1187,7 @@ static bool is_snb_ioat(struct pci_dev *pdev)
        }
 }
 
-int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca)
+int ioat3_dma_probe(struct ioatdma_device *device, int dca)
 {
        struct pci_dev *pdev = device->pdev;
        int dca_en = system_has_dca_enabled(pdev);
index bfa9a3536e092c6fe465a646a10624921b5814f1..4f686c527ab606750951c98af85acdb007f303ed 100644 (file)
@@ -109,9 +109,8 @@ static struct pci_device_id ioat_pci_tbl[] = {
 };
 MODULE_DEVICE_TABLE(pci, ioat_pci_tbl);
 
-static int __devinit ioat_pci_probe(struct pci_dev *pdev,
-                                   const struct pci_device_id *id);
-static void __devexit ioat_remove(struct pci_dev *pdev);
+static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id);
+static void ioat_remove(struct pci_dev *pdev);
 
 static int ioat_dca_enabled = 1;
 module_param(ioat_dca_enabled, int, 0644);
@@ -141,7 +140,7 @@ alloc_ioatdma(struct pci_dev *pdev, void __iomem *iobase)
        return d;
 }
 
-static int __devinit ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        void __iomem * const *iomap;
        struct device *dev = &pdev->dev;
@@ -195,7 +194,7 @@ static int __devinit ioat_pci_probe(struct pci_dev *pdev, const struct pci_devic
        return 0;
 }
 
-static void __devexit ioat_remove(struct pci_dev *pdev)
+static void ioat_remove(struct pci_dev *pdev)
 {
        struct ioatdma_device *device = pci_get_drvdata(pdev);
 
index 9072e173b86079b7bc0caea10d25e8b75979bb32..eacb8be99812dc85168d0d521346f5e7f4d01ea6 100644 (file)
@@ -1406,7 +1406,7 @@ out:
 }
 #endif
 
-static int __devexit iop_adma_remove(struct platform_device *dev)
+static int iop_adma_remove(struct platform_device *dev)
 {
        struct iop_adma_device *device = platform_get_drvdata(dev);
        struct dma_chan *chan, *_chan;
index 13bdf4a7e1ec67a0bfe9bfb0e1938707c2d8c339..c6d98c00f05c9bbe64a87696194cc12f29094bb3 100644 (file)
@@ -712,7 +712,7 @@ static void dma_do_tasklet(unsigned long data)
        }
 }
 
-static int __devexit mmp_pdma_remove(struct platform_device *op)
+static int mmp_pdma_remove(struct platform_device *op)
 {
        struct mmp_pdma_device *pdev = platform_get_drvdata(op);
 
index 323821c0c095ecf0001ee3d13826499ca2b0c5ef..a9f1cd56689c06a1995aaca6ee53717ecc28a5e0 100644 (file)
@@ -467,7 +467,7 @@ static void mmp_tdma_issue_pending(struct dma_chan *chan)
        mmp_tdma_enable_chan(tdmac);
 }
 
-static int __devexit mmp_tdma_remove(struct platform_device *pdev)
+static int mmp_tdma_remove(struct platform_device *pdev)
 {
        struct mmp_tdma_device *tdev = platform_get_drvdata(pdev);
 
index 2cd024a91d402103386d1c1e2f749859c3e10849..2d956732aa3d262aa2c5e1c603ff530bab31db78 100644 (file)
@@ -799,7 +799,7 @@ static int mpc_dma_probe(struct platform_device *op)
        return retval;
 }
 
-static int __devexit mpc_dma_remove(struct platform_device *op)
+static int mpc_dma_remove(struct platform_device *op)
 {
        struct device *dev = &op->dev;
        struct mpc_dma *mdma = dev_get_drvdata(dev);
index ac71f555dd729cd0a234f02b473f06271f36ae89..e17fad03cb804b7d538bd2928923a50928475d4f 100644 (file)
@@ -1361,13 +1361,16 @@ static int mv_xor_probe(struct platform_device *pdev)
 err_channel_add:
        for (i = 0; i < MV_XOR_MAX_CHANNELS; i++)
                if (xordev->channels[i]) {
+                       mv_xor_channel_remove(xordev->channels[i]);
                        if (pdev->dev.of_node)
                                irq_dispose_mapping(xordev->channels[i]->irq);
-                       mv_xor_channel_remove(xordev->channels[i]);
                }
 
-       clk_disable_unprepare(xordev->clk);
-       clk_put(xordev->clk);
+       if (!IS_ERR(xordev->clk)) {
+               clk_disable_unprepare(xordev->clk);
+               clk_put(xordev->clk);
+       }
+
        return ret;
 }
 
index eca1c4ddf039db8ff04daf99ee3fbdfc1135904f..3f2617255ef21b07fde6a6d71279e1ec80ba91ce 100644 (file)
@@ -961,7 +961,7 @@ err_free_mem:
        return err;
 }
 
-static void __devexit pch_dma_remove(struct pci_dev *pdev)
+static void pch_dma_remove(struct pci_dev *pdev)
 {
        struct pch_dma *pd = pci_get_drvdata(pdev);
        struct pch_dma_chan *pd_chan;
index 95555f37ea6da96fcd78e0964b493cc4711f189a..80680eee017141aa86f72388e0a98305533e7966 100644 (file)
@@ -2988,7 +2988,7 @@ probe_err1:
        return ret;
 }
 
-static int __devexit pl330_remove(struct amba_device *adev)
+static int pl330_remove(struct amba_device *adev)
 {
        struct dma_pl330_dmac *pdmac = amba_get_drvdata(adev);
        struct dma_pl330_chan *pch, *_p;
index b94afc339e7f9156624323fb91568981903dc604..5d3d95569a1e76afc6e294a09ccf538846cae9f6 100644 (file)
@@ -4592,7 +4592,7 @@ out:
 /**
  * ppc440spe_adma_remove - remove the asynch device
  */
-static int __devexit ppc440spe_adma_remove(struct platform_device *ofdev)
+static int ppc440spe_adma_remove(struct platform_device *ofdev)
 {
        struct ppc440spe_adma_device *adev = dev_get_drvdata(&ofdev->dev);
        struct device_node *np = ofdev->dev.of_node;
@@ -4905,7 +4905,7 @@ out_free:
        return ret;
 }
 
-static const struct of_device_id ppc440spe_adma_of_match[] __devinitconst = {
+static const struct of_device_id ppc440spe_adma_of_match[] = {
        { .compatible   = "ibm,dma-440spe", },
        { .compatible   = "amcc,xor-accelerator", },
        {},
index 2ad628df822303012c56fd6583de54c69f00989f..461a91ab70bb4feca82cd27c1582f81c2905bcde 100644 (file)
@@ -967,7 +967,7 @@ static int sa11x0_dma_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int __devexit sa11x0_dma_remove(struct platform_device *pdev)
+static int sa11x0_dma_remove(struct platform_device *pdev)
 {
        struct sa11x0_dma_dev *d = platform_get_drvdata(pdev);
        unsigned pch;
index 8201bb4e0cd7f74397bf1bd4d0960d4ed6cb9a6e..3315e4be9b854e6b100fcfe002b3d616190fbe25 100644 (file)
@@ -880,7 +880,7 @@ ermrdmars:
        return err;
 }
 
-static int __devexit sh_dmae_remove(struct platform_device *pdev)
+static int sh_dmae_remove(struct platform_device *pdev)
 {
        struct sh_dmae_device *shdev = platform_get_drvdata(pdev);
        struct dma_device *dma_dev = &shdev->shdma_dev.dma_dev;
index c3de6edb96511bdf1e1e1201563f5d6c550fbcb1..94674a96c64613a0b2e79b04a62d4c1f4007c0d0 100644 (file)
@@ -655,7 +655,7 @@ irq_dispose:
        return ret;
 }
 
-static int __devexit sirfsoc_dma_remove(struct platform_device *op)
+static int sirfsoc_dma_remove(struct platform_device *op)
 {
        struct device *dev = &op->dev;
        struct sirfsoc_dma *sdma = dev_get_drvdata(dev);
index efdfffa13349f517d95ee362a9ac37606fed1a16..c39e61bc8172e5c277dfd4cdb0997cfcc08e407f 100644 (file)
@@ -1184,7 +1184,7 @@ static const struct tegra_dma_chip_data tegra30_dma_chip_data = {
        .max_dma_count          = 1024UL * 64,
 };
 
-static const struct of_device_id tegra_dma_of_match[] __devinitconst = {
+static const struct of_device_id tegra_dma_of_match[] = {
        {
                .compatible = "nvidia,tegra30-apbdma",
                .data = &tegra30_dma_chip_data,
@@ -1360,7 +1360,7 @@ err_pm_disable:
        return ret;
 }
 
-static int __devexit tegra_dma_remove(struct platform_device *pdev)
+static int tegra_dma_remove(struct platform_device *pdev)
 {
        struct tegra_dma *tdma = platform_get_drvdata(pdev);
        int i;
@@ -1403,7 +1403,7 @@ static int tegra_dma_runtime_resume(struct device *dev)
        return 0;
 }
 
-static const struct dev_pm_ops tegra_dma_dev_pm_ops __devinitconst = {
+static const struct dev_pm_ops tegra_dma_dev_pm_ops = {
 #ifdef CONFIG_PM_RUNTIME
        .runtime_suspend = tegra_dma_runtime_suspend,
        .runtime_resume = tegra_dma_runtime_resume,
index 98cf51e1544c54d6bf61e98b709fcc5fae6a44de..952f823901a6cb5d168ce0b90f2429383ed5bfc3 100644 (file)
@@ -798,7 +798,7 @@ err_release_region:
 
 }
 
-static int __devexit td_remove(struct platform_device *pdev)
+static int td_remove(struct platform_device *pdev)
 {
        struct timb_dma *td = platform_get_drvdata(pdev);
        struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
index 4c6c876d9dc3f0fa949352c89039a00b3c0bc79a..66719925970f74755865320e81a83fb43a5d8992 100644 (file)
@@ -4,6 +4,9 @@
 #      Licensed and distributed under the GPL
 #
 
+config EDAC_SUPPORT
+       bool
+
 menuconfig EDAC
        bool "EDAC (Error Detection And Correction) reporting"
        depends on HAS_IOMEM
@@ -27,13 +30,8 @@ menuconfig EDAC
          There is also a mailing list for the EDAC project, which can
          be found via the sourceforge page.
 
-config EDAC_SUPPORT
-       bool
-
 if EDAC
 
-comment "Reporting subsystems"
-
 config EDAC_LEGACY_SYSFS
        bool "EDAC legacy sysfs"
        default y
index f74a684269ff6c8ceb25241d82816ddbab035888..ad8bf2aa629d3b23510053f6c88b23c0c2d9d504 100644 (file)
@@ -2563,8 +2563,8 @@ err_ret:
        return ret;
 }
 
-static int __devinit amd64_probe_one_instance(struct pci_dev *pdev,
-                                            const struct pci_device_id *mc_type)
+static int amd64_probe_one_instance(struct pci_dev *pdev,
+                                   const struct pci_device_id *mc_type)
 {
        u8 nid = get_node_id(pdev);
        struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
@@ -2612,7 +2612,7 @@ err_out:
        return ret;
 }
 
-static void __devexit amd64_remove_one_instance(struct pci_dev *pdev)
+static void amd64_remove_one_instance(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
        struct amd64_pvt *pvt;
@@ -2686,7 +2686,7 @@ MODULE_DEVICE_TABLE(pci, amd64_pci_table);
 static struct pci_driver amd64_pci_driver = {
        .name           = EDAC_MOD_STR,
        .probe          = amd64_probe_one_instance,
-       .remove         = __devexit_p(amd64_remove_one_instance),
+       .remove         = amd64_remove_one_instance,
        .id_table       = amd64_pci_table,
 };
 
index 29eeb68a200caf7cb091698d1acbecf4eca80bcb..96e3ee3460a566a96928eb45b332ced184902fe8 100644 (file)
@@ -301,8 +301,8 @@ fail:
 }
 
 /* returns count (>= 0), or negative on error */
-static int __devinit amd76x_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int amd76x_init_one(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        edac_dbg(0, "\n");
 
@@ -318,7 +318,7 @@ static int __devinit amd76x_init_one(struct pci_dev *pdev,
  *     structure for the device then delete the mci and free the
  *     resources.
  */
-static void __devexit amd76x_remove_one(struct pci_dev *pdev)
+static void amd76x_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
 
@@ -350,7 +350,7 @@ MODULE_DEVICE_TABLE(pci, amd76x_pci_tbl);
 static struct pci_driver amd76x_driver = {
        .name = EDAC_MOD_STR,
        .probe = amd76x_init_one,
-       .remove = __devexit_p(amd76x_remove_one),
+       .remove = amd76x_remove_one,
        .id_table = amd76x_pci_tbl,
 };
 
index a1bbd8edd2575e4faf0633c972f1a6cf12a3815a..c2eaf334b90b0f4c2cff3cc4039c1c85577fbcaf 100644 (file)
@@ -124,7 +124,7 @@ static void cell_edac_check(struct mem_ctl_info *mci)
        }
 }
 
-static void __devinit cell_edac_init_csrows(struct mem_ctl_info *mci)
+static void cell_edac_init_csrows(struct mem_ctl_info *mci)
 {
        struct csrow_info               *csrow = mci->csrows[0];
        struct dimm_info                *dimm;
@@ -164,7 +164,7 @@ static void __devinit cell_edac_init_csrows(struct mem_ctl_info *mci)
        }
 }
 
-static int __devinit cell_edac_probe(struct platform_device *pdev)
+static int cell_edac_probe(struct platform_device *pdev)
 {
        struct cbe_mic_tm_regs __iomem  *regs;
        struct mem_ctl_info             *mci;
@@ -233,7 +233,7 @@ static int __devinit cell_edac_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit cell_edac_remove(struct platform_device *pdev)
+static int cell_edac_remove(struct platform_device *pdev)
 {
        struct mem_ctl_info *mci = edac_mc_del_mc(&pdev->dev);
        if (mci)
@@ -247,7 +247,7 @@ static struct platform_driver cell_edac_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = cell_edac_probe,
-       .remove         = __devexit_p(cell_edac_remove),
+       .remove         = cell_edac_remove,
 };
 
 static int __init cell_edac_init(void)
index c2ef1349587368d666d9465a3c6996b893d10771..7f3c57113ba11c1d8867a3cdd4f65894c3b37f29 100644 (file)
@@ -932,7 +932,7 @@ static int cpc925_mc_get_channels(void __iomem *vbase)
        return dual;
 }
 
-static int __devinit cpc925_probe(struct platform_device *pdev)
+static int cpc925_probe(struct platform_device *pdev)
 {
        static int edac_mc_idx;
        struct mem_ctl_info *mci;
index a5ed6b795fd4331452dd112626218c102f565d40..644fec54681fcb5c56bac57a5ced18505ee4da46 100644 (file)
@@ -1390,8 +1390,7 @@ fail:
 }
 
 /* returns count (>= 0), or negative on error */
-static int __devinit e752x_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int e752x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        edac_dbg(0, "\n");
 
@@ -1402,7 +1401,7 @@ static int __devinit e752x_init_one(struct pci_dev *pdev,
        return e752x_probe1(pdev, ent->driver_data);
 }
 
-static void __devexit e752x_remove_one(struct pci_dev *pdev)
+static void e752x_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
        struct e752x_pvt *pvt;
@@ -1445,7 +1444,7 @@ MODULE_DEVICE_TABLE(pci, e752x_pci_tbl);
 static struct pci_driver e752x_driver = {
        .name = EDAC_MOD_STR,
        .probe = e752x_init_one,
-       .remove = __devexit_p(e752x_remove_one),
+       .remove = e752x_remove_one,
        .id_table = e752x_pci_tbl,
 };
 
index 9ff57f361a43384e0d86be624067fb64cdc6e36b..1c4056a5038396e11c10945d695de060d00ad47c 100644 (file)
@@ -528,8 +528,7 @@ fail0:
 }
 
 /* returns count (>= 0), or negative on error */
-static int __devinit e7xxx_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int e7xxx_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        edac_dbg(0, "\n");
 
@@ -538,7 +537,7 @@ static int __devinit e7xxx_init_one(struct pci_dev *pdev,
                -EIO : e7xxx_probe1(pdev, ent->driver_data);
 }
 
-static void __devexit e7xxx_remove_one(struct pci_dev *pdev)
+static void e7xxx_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
        struct e7xxx_pvt *pvt;
@@ -579,7 +578,7 @@ MODULE_DEVICE_TABLE(pci, e7xxx_pci_tbl);
 static struct pci_driver e7xxx_driver = {
        .name = EDAC_MOD_STR,
        .probe = e7xxx_init_one,
-       .remove = __devexit_p(e7xxx_remove_one),
+       .remove = e7xxx_remove_one,
        .id_table = e7xxx_pci_tbl,
 };
 
index de2df92f9c77126709d2c8388b2d88ba7f6ed55c..0ca1ca71157f2b7320e418d13deceeb63965c030 100644 (file)
@@ -472,8 +472,7 @@ static void edac_delete_csrow_objects(struct mem_ctl_info *mci)
                        device_remove_file(&csrow->dev,
                                                dynamic_csrow_ce_count_attr[chan]);
                }
-               put_device(&mci->csrows[i]->dev);
-               device_del(&mci->csrows[i]->dev);
+               device_unregister(&mci->csrows[i]->dev);
        }
 }
 #endif
@@ -1055,11 +1054,9 @@ fail:
                struct dimm_info *dimm = mci->dimms[i];
                if (dimm->nr_pages == 0)
                        continue;
-               put_device(&dimm->dev);
-               device_del(&dimm->dev);
+               device_unregister(&dimm->dev);
        }
-       put_device(&mci->dev);
-       device_del(&mci->dev);
+       device_unregister(&mci->dev);
        bus_unregister(&mci->bus);
        kfree(mci->bus.name);
        return err;
@@ -1086,16 +1083,14 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
                if (dimm->nr_pages == 0)
                        continue;
                edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev));
-               put_device(&dimm->dev);
-               device_del(&dimm->dev);
+               device_unregister(&dimm->dev);
        }
 }
 
 void edac_unregister_sysfs(struct mem_ctl_info *mci)
 {
        edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev));
-       put_device(&mci->dev);
-       device_del(&mci->dev);
+       device_unregister(&mci->dev);
        bus_unregister(&mci->bus);
        kfree(mci->bus.name);
 }
@@ -1159,8 +1154,6 @@ int __init edac_mc_sysfs_init(void)
 
 void __exit edac_mc_sysfs_exit(void)
 {
-       put_device(mci_pdev);
-       device_del(mci_pdev);
+       device_unregister(mci_pdev);
        edac_put_sysfs_subsys();
-       kfree(mci_pdev);
 }
index e599b00c05a823f788ce5c36e17f740cdb06e91d..c2bd8c6a43499b74d4c29a0490a49a89a6ead12b 100644 (file)
@@ -50,7 +50,7 @@ static irqreturn_t highbank_l2_err_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit highbank_l2_err_probe(struct platform_device *pdev)
+static int highbank_l2_err_probe(struct platform_device *pdev)
 {
        struct edac_device_ctl_info *dci;
        struct hb_l2_drvdata *drvdata;
index 7ea4cc2e8bd2292ca8871b6d27493d94ab9cda80..4695dd2d71fd87b6886a4947786ce9290c540127 100644 (file)
@@ -119,7 +119,7 @@ static const struct file_operations highbank_mc_debug_inject_fops = {
        .llseek = generic_file_llseek,
 };
 
-static void __devinit highbank_mc_create_debugfs_nodes(struct mem_ctl_info *mci)
+static void highbank_mc_create_debugfs_nodes(struct mem_ctl_info *mci)
 {
        if (mci->debugfs)
                debugfs_create_file("inject_ctrl", S_IWUSR, mci->debugfs, mci,
@@ -127,11 +127,11 @@ static void __devinit highbank_mc_create_debugfs_nodes(struct mem_ctl_info *mci)
 ;
 }
 #else
-static void __devinit highbank_mc_create_debugfs_nodes(struct mem_ctl_info *mci)
+static void highbank_mc_create_debugfs_nodes(struct mem_ctl_info *mci)
 {}
 #endif
 
-static int __devinit highbank_mc_probe(struct platform_device *pdev)
+static int highbank_mc_probe(struct platform_device *pdev)
 {
        struct edac_mc_layer layers[2];
        struct mem_ctl_info *mci;
index d3d19cc4e9a1a48eccb84820dbe8df519955cc96..694efcbf19c097d45f715c06eda1f234bc89788c 100644 (file)
@@ -455,8 +455,7 @@ fail:
 }
 
 /* returns count (>= 0), or negative on error */
-static int __devinit i3000_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int i3000_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int rc;
 
@@ -472,7 +471,7 @@ static int __devinit i3000_init_one(struct pci_dev *pdev,
        return rc;
 }
 
-static void __devexit i3000_remove_one(struct pci_dev *pdev)
+static void i3000_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
 
@@ -502,7 +501,7 @@ MODULE_DEVICE_TABLE(pci, i3000_pci_tbl);
 static struct pci_driver i3000_driver = {
        .name = EDAC_MOD_STR,
        .probe = i3000_init_one,
-       .remove = __devexit_p(i3000_remove_one),
+       .remove = i3000_remove_one,
        .id_table = i3000_pci_tbl,
 };
 
index b6653a6fc5d56af68e55b0f2ea10855a1927ee2f..4e8337602e781fed8d99ffbbb099a5523e585160 100644 (file)
@@ -419,8 +419,7 @@ fail:
        return rc;
 }
 
-static int __devinit i3200_init_one(struct pci_dev *pdev,
-               const struct pci_device_id *ent)
+static int i3200_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int rc;
 
@@ -436,7 +435,7 @@ static int __devinit i3200_init_one(struct pci_dev *pdev,
        return rc;
 }
 
-static void __devexit i3200_remove_one(struct pci_dev *pdev)
+static void i3200_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
        struct i3200_priv *priv;
@@ -467,7 +466,7 @@ MODULE_DEVICE_TABLE(pci, i3200_pci_tbl);
 static struct pci_driver i3200_driver = {
        .name = EDAC_MOD_STR,
        .probe = i3200_init_one,
-       .remove = __devexit_p(i3200_remove_one),
+       .remove = i3200_remove_one,
        .id_table = i3200_pci_tbl,
 };
 
index 6a49dd00b81b8fce1181a0e0d436bb8e4ce211d5..63b2194e8c20683b38570d269300c82e96d8a3bf 100644 (file)
@@ -1489,8 +1489,7 @@ fail0:
  *             negative on error
  *             count (>= 0)
  */
-static int __devinit i5000_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *id)
+static int i5000_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int rc;
 
@@ -1509,7 +1508,7 @@ static int __devinit i5000_init_one(struct pci_dev *pdev,
  *     i5000_remove_one        destructor for one instance of device
  *
  */
-static void __devexit i5000_remove_one(struct pci_dev *pdev)
+static void i5000_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
 
@@ -1547,7 +1546,7 @@ MODULE_DEVICE_TABLE(pci, i5000_pci_tbl);
 static struct pci_driver i5000_driver = {
        .name = KBUILD_BASENAME,
        .probe = i5000_init_one,
-       .remove = __devexit_p(i5000_remove_one),
+       .remove = i5000_remove_one,
        .id_table = i5000_pci_tbl,
 };
 
index c4b5e5f868e85ea1e60b0a301d0a7bdc68585a2e..d6955b2cc99fa47bc9ac665fa93eb5f59cafc88e 100644 (file)
@@ -638,8 +638,7 @@ static struct pci_dev *pci_get_device_func(unsigned vendor,
        return ret;
 }
 
-static unsigned long __devinit i5100_npages(struct mem_ctl_info *mci,
-                                           int csrow)
+static unsigned long i5100_npages(struct mem_ctl_info *mci, int csrow)
 {
        struct i5100_priv *priv = mci->pvt_info;
        const unsigned chan_rank = i5100_csrow_to_rank(mci, csrow);
@@ -660,7 +659,7 @@ static unsigned long __devinit i5100_npages(struct mem_ctl_info *mci,
                ((unsigned long long) (1ULL << addr_lines) / PAGE_SIZE);
 }
 
-static void __devinit i5100_init_mtr(struct mem_ctl_info *mci)
+static void i5100_init_mtr(struct mem_ctl_info *mci)
 {
        struct i5100_priv *priv = mci->pvt_info;
        struct pci_dev *mms[2] = { priv->ch0mm, priv->ch1mm };
@@ -732,7 +731,7 @@ static int i5100_read_spd_byte(const struct mem_ctl_info *mci,
  *   o not the only way to may chip selects to dimm slots
  *   o investigate if there is some way to obtain this map from the bios
  */
-static void __devinit i5100_init_dimm_csmap(struct mem_ctl_info *mci)
+static void i5100_init_dimm_csmap(struct mem_ctl_info *mci)
 {
        struct i5100_priv *priv = mci->pvt_info;
        int i;
@@ -762,8 +761,8 @@ static void __devinit i5100_init_dimm_csmap(struct mem_ctl_info *mci)
        }
 }
 
-static void __devinit i5100_init_dimm_layout(struct pci_dev *pdev,
-                                            struct mem_ctl_info *mci)
+static void i5100_init_dimm_layout(struct pci_dev *pdev,
+                                  struct mem_ctl_info *mci)
 {
        struct i5100_priv *priv = mci->pvt_info;
        int i;
@@ -784,8 +783,8 @@ static void __devinit i5100_init_dimm_layout(struct pci_dev *pdev,
        i5100_init_dimm_csmap(mci);
 }
 
-static void __devinit i5100_init_interleaving(struct pci_dev *pdev,
-                                             struct mem_ctl_info *mci)
+static void i5100_init_interleaving(struct pci_dev *pdev,
+                                   struct mem_ctl_info *mci)
 {
        u16 w;
        u32 dw;
@@ -830,7 +829,7 @@ static void __devinit i5100_init_interleaving(struct pci_dev *pdev,
        i5100_init_mtr(mci);
 }
 
-static void __devinit i5100_init_csrows(struct mem_ctl_info *mci)
+static void i5100_init_csrows(struct mem_ctl_info *mci)
 {
        int i;
        struct i5100_priv *priv = mci->pvt_info;
@@ -864,8 +863,7 @@ static void __devinit i5100_init_csrows(struct mem_ctl_info *mci)
        }
 }
 
-static int __devinit i5100_init_one(struct pci_dev *pdev,
-                                   const struct pci_device_id *id)
+static int i5100_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int rc;
        struct mem_ctl_info *mci;
@@ -1020,7 +1018,7 @@ bail:
        return ret;
 }
 
-static void __devexit i5100_remove_one(struct pci_dev *pdev)
+static void i5100_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
        struct i5100_priv *priv;
@@ -1054,7 +1052,7 @@ MODULE_DEVICE_TABLE(pci, i5100_pci_tbl);
 static struct pci_driver i5100_driver = {
        .name = KBUILD_BASENAME,
        .probe = i5100_init_one,
-       .remove = __devexit_p(i5100_remove_one),
+       .remove = i5100_remove_one,
        .id_table = i5100_pci_tbl,
 };
 
index 277246998b805024517f0641841996e8bfd85d29..0a05bbceb08f4e870eb97f50443f6c7e6447676a 100644 (file)
@@ -1373,8 +1373,7 @@ fail0:
  *             negative on error
  *             count (>= 0)
  */
-static int __devinit i5400_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *id)
+static int i5400_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int rc;
 
@@ -1393,7 +1392,7 @@ static int __devinit i5400_init_one(struct pci_dev *pdev,
  *     i5400_remove_one        destructor for one instance of device
  *
  */
-static void __devexit i5400_remove_one(struct pci_dev *pdev)
+static void i5400_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
 
@@ -1431,7 +1430,7 @@ MODULE_DEVICE_TABLE(pci, i5400_pci_tbl);
 static struct pci_driver i5400_driver = {
        .name = "i5400_edac",
        .probe = i5400_init_one,
-       .remove = __devexit_p(i5400_remove_one),
+       .remove = i5400_remove_one,
        .id_table = i5400_pci_tbl,
 };
 
index 9d669cd43618b605d7db354fde86df8c90c64f08..087c27bc5d4247b9b7647f4c4c7695e6a2445036 100644 (file)
@@ -923,7 +923,7 @@ static void i7300_put_devices(struct mem_ctl_info *mci)
  *    Device 21 function 0:            PCI_DEVICE_ID_INTEL_I7300_MCH_FB0
  *    Device 22 function 0:            PCI_DEVICE_ID_INTEL_I7300_MCH_FB1
  */
-static int __devinit i7300_get_devices(struct mem_ctl_info *mci)
+static int i7300_get_devices(struct mem_ctl_info *mci)
 {
        struct i7300_pvt *pvt;
        struct pci_dev *pdev;
@@ -1008,8 +1008,7 @@ error:
  * @pdev: struct pci_dev pointer
  * @id: struct pci_device_id pointer - currently unused
  */
-static int __devinit i7300_init_one(struct pci_dev *pdev,
-                                   const struct pci_device_id *id)
+static int i7300_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct mem_ctl_info *mci;
        struct edac_mc_layer layers[3];
@@ -1122,7 +1121,7 @@ fail0:
  * i7300_remove_one() - Remove the driver
  * @pdev: struct pci_dev pointer
  */
-static void __devexit i7300_remove_one(struct pci_dev *pdev)
+static void i7300_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
        char *tmp;
@@ -1163,7 +1162,7 @@ MODULE_DEVICE_TABLE(pci, i7300_pci_tbl);
 static struct pci_driver i7300_driver = {
        .name = "i7300_edac",
        .probe = i7300_init_one,
-       .remove = __devexit_p(i7300_remove_one),
+       .remove = i7300_remove_one,
        .id_table = i7300_pci_tbl,
 };
 
index 10c8c00d6469398a211dc23b413d4d6495851b5a..e213d030b0dd7968756193f185a5661b7a4b9441 100644 (file)
@@ -2305,8 +2305,7 @@ fail0:
  *             < 0 for error code
  */
 
-static int __devinit i7core_probe(struct pci_dev *pdev,
-                                 const struct pci_device_id *id)
+static int i7core_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int rc, count = 0;
        struct i7core_dev *i7core_dev;
@@ -2368,7 +2367,7 @@ fail0:
  *     i7core_remove   destructor for one instance of device
  *
  */
-static void __devexit i7core_remove(struct pci_dev *pdev)
+static void i7core_remove(struct pci_dev *pdev)
 {
        struct i7core_dev *i7core_dev;
 
@@ -2409,7 +2408,7 @@ MODULE_DEVICE_TABLE(pci, i7core_pci_tbl);
 static struct pci_driver i7core_driver = {
        .name     = "i7core_edac",
        .probe    = i7core_probe,
-       .remove   = __devexit_p(i7core_remove),
+       .remove   = i7core_remove,
        .id_table = i7core_pci_tbl,
 };
 
index 90f303db5d1dfd0d6ee0b4d77a0e1b899834fa68..57fdb77903ba9a142513a94cabd7b5775defed1a 100644 (file)
@@ -353,8 +353,8 @@ fail:
 EXPORT_SYMBOL_GPL(i82443bxgx_edacmc_probe1);
 
 /* returns count (>= 0), or negative on error */
-static int __devinit i82443bxgx_edacmc_init_one(struct pci_dev *pdev,
-                                               const struct pci_device_id *ent)
+static int i82443bxgx_edacmc_init_one(struct pci_dev *pdev,
+                                     const struct pci_device_id *ent)
 {
        int rc;
 
@@ -369,7 +369,7 @@ static int __devinit i82443bxgx_edacmc_init_one(struct pci_dev *pdev,
        return rc;
 }
 
-static void __devexit i82443bxgx_edacmc_remove_one(struct pci_dev *pdev)
+static void i82443bxgx_edacmc_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
 
@@ -399,7 +399,7 @@ MODULE_DEVICE_TABLE(pci, i82443bxgx_pci_tbl);
 static struct pci_driver i82443bxgx_edacmc_driver = {
        .name = EDAC_MOD_STR,
        .probe = i82443bxgx_edacmc_init_one,
-       .remove = __devexit_p(i82443bxgx_edacmc_remove_one),
+       .remove = i82443bxgx_edacmc_remove_one,
        .id_table = i82443bxgx_pci_tbl,
 };
 
index 1faa749715131c1e19b34134d6c01626fb34dd7a..3e3e431c83011313dadc901afe8347501a23e911 100644 (file)
@@ -254,8 +254,8 @@ fail:
 }
 
 /* returns count (>= 0), or negative on error */
-static int __devinit i82860_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int i82860_init_one(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        int rc;
 
@@ -273,7 +273,7 @@ static int __devinit i82860_init_one(struct pci_dev *pdev,
        return rc;
 }
 
-static void __devexit i82860_remove_one(struct pci_dev *pdev)
+static void i82860_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
 
@@ -302,7 +302,7 @@ MODULE_DEVICE_TABLE(pci, i82860_pci_tbl);
 static struct pci_driver i82860_driver = {
        .name = EDAC_MOD_STR,
        .probe = i82860_init_one,
-       .remove = __devexit_p(i82860_remove_one),
+       .remove = i82860_remove_one,
        .id_table = i82860_pci_tbl,
 };
 
index 3e416b1a6b53680b3f5d78f3a579fb04439caa62..2f8535fc451e64745be644b6a685b6be414005ed 100644 (file)
@@ -479,8 +479,8 @@ fail0:
 }
 
 /* returns count (>= 0), or negative on error */
-static int __devinit i82875p_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int i82875p_init_one(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        int rc;
 
@@ -498,7 +498,7 @@ static int __devinit i82875p_init_one(struct pci_dev *pdev,
        return rc;
 }
 
-static void __devexit i82875p_remove_one(struct pci_dev *pdev)
+static void i82875p_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
        struct i82875p_pvt *pvt = NULL;
@@ -541,7 +541,7 @@ MODULE_DEVICE_TABLE(pci, i82875p_pci_tbl);
 static struct pci_driver i82875p_driver = {
        .name = EDAC_MOD_STR,
        .probe = i82875p_init_one,
-       .remove = __devexit_p(i82875p_remove_one),
+       .remove = i82875p_remove_one,
        .id_table = i82875p_pci_tbl,
 };
 
index a98020409fa9933181fe93a550fdb2abaf572ebd..0c8d4b0eaa32876c1eecc8f83b708242244855a1 100644 (file)
@@ -592,8 +592,8 @@ fail0:
 }
 
 /* returns count (>= 0), or negative on error */
-static int __devinit i82975x_init_one(struct pci_dev *pdev,
-               const struct pci_device_id *ent)
+static int i82975x_init_one(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        int rc;
 
@@ -610,7 +610,7 @@ static int __devinit i82975x_init_one(struct pci_dev *pdev,
        return rc;
 }
 
-static void __devexit i82975x_remove_one(struct pci_dev *pdev)
+static void i82975x_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
        struct i82975x_pvt *pvt;
@@ -643,7 +643,7 @@ MODULE_DEVICE_TABLE(pci, i82975x_pci_tbl);
 static struct pci_driver i82975x_driver = {
        .name = EDAC_MOD_STR,
        .probe = i82975x_init_one,
-       .remove = __devexit_p(i82975x_remove_one),
+       .remove = i82975x_remove_one,
        .id_table = i82975x_pci_tbl,
 };
 
index 4fe66fa183ec964acc27781ed8f8b90eaaaa41eb..42a840d530a527ef5c6cad6da6de932bacd4f6aa 100644 (file)
@@ -212,7 +212,7 @@ static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-int __devinit mpc85xx_pci_err_probe(struct platform_device *op)
+int mpc85xx_pci_err_probe(struct platform_device *op)
 {
        struct edac_pci_ctl_info *pci;
        struct mpc85xx_pci_pdata *pdata;
@@ -504,7 +504,7 @@ static irqreturn_t mpc85xx_l2_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit mpc85xx_l2_err_probe(struct platform_device *op)
+static int mpc85xx_l2_err_probe(struct platform_device *op)
 {
        struct edac_device_ctl_info *edac_dev;
        struct mpc85xx_l2_pdata *pdata;
@@ -885,7 +885,7 @@ static irqreturn_t mpc85xx_mc_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static void __devinit mpc85xx_init_csrows(struct mem_ctl_info *mci)
+static void mpc85xx_init_csrows(struct mem_ctl_info *mci)
 {
        struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
        struct csrow_info *csrow;
@@ -964,7 +964,7 @@ static void __devinit mpc85xx_init_csrows(struct mem_ctl_info *mci)
        }
 }
 
-static int __devinit mpc85xx_mc_err_probe(struct platform_device *op)
+static int mpc85xx_mc_err_probe(struct platform_device *op)
 {
        struct mem_ctl_info *mci;
        struct edac_mc_layer layers[2];
index 2b315c2edc3cac14c5247e33a398283fd098b26d..542fad70e360d60f7c51c7db8f39ab9dc3de9038 100644 (file)
@@ -100,7 +100,7 @@ static int __init mv64x60_pci_fixup(struct platform_device *pdev)
        return 0;
 }
 
-static int __devinit mv64x60_pci_err_probe(struct platform_device *pdev)
+static int mv64x60_pci_err_probe(struct platform_device *pdev)
 {
        struct edac_pci_ctl_info *pci;
        struct mv64x60_pci_pdata *pdata;
@@ -221,7 +221,7 @@ static int mv64x60_pci_err_remove(struct platform_device *pdev)
 
 static struct platform_driver mv64x60_pci_err_driver = {
        .probe = mv64x60_pci_err_probe,
-       .remove = __devexit_p(mv64x60_pci_err_remove),
+       .remove = mv64x60_pci_err_remove,
        .driver = {
                   .name = "mv64x60_pci_err",
        }
@@ -271,7 +271,7 @@ static irqreturn_t mv64x60_sram_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit mv64x60_sram_err_probe(struct platform_device *pdev)
+static int mv64x60_sram_err_probe(struct platform_device *pdev)
 {
        struct edac_device_ctl_info *edac_dev;
        struct mv64x60_sram_pdata *pdata;
@@ -439,7 +439,7 @@ static irqreturn_t mv64x60_cpu_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit mv64x60_cpu_err_probe(struct platform_device *pdev)
+static int mv64x60_cpu_err_probe(struct platform_device *pdev)
 {
        struct edac_device_ctl_info *edac_dev;
        struct resource *r;
@@ -697,7 +697,7 @@ static void mv64x60_init_csrows(struct mem_ctl_info *mci,
        dimm->edac_mode = EDAC_SECDED;
 }
 
-static int __devinit mv64x60_mc_err_probe(struct platform_device *pdev)
+static int mv64x60_mc_err_probe(struct platform_device *pdev)
 {
        struct mem_ctl_info *mci;
        struct edac_mc_layer layers[2];
index 40fde6a51ed6f820220a3ca7f1b9b276d5376a25..7e98084d36451efe894f5f33c1a3b77748183af3 100644 (file)
@@ -131,7 +131,7 @@ static void octeon_l2c_poll_oct2(struct edac_device_ctl_info *l2c)
                _octeon_l2c_poll_oct2(l2c, i);
 }
 
-static int __devinit octeon_l2c_probe(struct platform_device *pdev)
+static int octeon_l2c_probe(struct platform_device *pdev)
 {
        struct edac_device_ctl_info *l2c;
 
index 33bca766e37d236ce30132e1b339b7fbcd710b45..93412d6b3af1703ccfd220aa759fbf8d553eeec7 100644 (file)
@@ -86,7 +86,7 @@ static void octeon_lmc_edac_poll_o2(struct mem_ctl_info *mci)
                cvmx_write_csr(CVMX_LMCX_INT(mci->mc_idx), int_reg.u64);
 }
 
-static int __devinit octeon_lmc_edac_probe(struct platform_device *pdev)
+static int octeon_lmc_edac_probe(struct platform_device *pdev)
 {
        struct mem_ctl_info *mci;
        struct edac_mc_layer layers[1];
index 14a5e57f2b32218ebf0276a712a5d46e34bdc628..0f83c33a7d1fcbb08180d60609aafc92e76a6425 100644 (file)
@@ -82,7 +82,7 @@ static int  co_cache_error_event(struct notifier_block *this,
        return NOTIFY_STOP;
 }
 
-static int __devinit co_cache_error_probe(struct platform_device *pdev)
+static int co_cache_error_probe(struct platform_device *pdev)
 {
        struct co_cache_error *p = devm_kzalloc(&pdev->dev, sizeof(*p),
                                                GFP_KERNEL);
index 758c1ef5fc9ea12fba2c93d593bf95b4ceb93c07..9ca73cec74e75a7d4476d3f387ccfb7a022dc1a0 100644 (file)
@@ -58,7 +58,7 @@ static void octeon_pci_poll(struct edac_pci_ctl_info *pci)
        }
 }
 
-static int __devinit octeon_pci_probe(struct platform_device *pdev)
+static int octeon_pci_probe(struct platform_device *pdev)
 {
        struct edac_pci_ctl_info *pci;
        int res = 0;
index 2d35b78ada3c819a5879d9357eadbb5ec2da00e7..9c971b57553022ec7857ae6b1ca41c03bc551584 100644 (file)
@@ -188,8 +188,8 @@ static int pasemi_edac_init_csrows(struct mem_ctl_info *mci,
        return 0;
 }
 
-static int __devinit pasemi_edac_probe(struct pci_dev *pdev,
-               const struct pci_device_id *ent)
+static int pasemi_edac_probe(struct pci_dev *pdev,
+                            const struct pci_device_id *ent)
 {
        struct mem_ctl_info *mci = NULL;
        struct edac_mc_layer layers[2];
@@ -266,7 +266,7 @@ fail:
        return -ENODEV;
 }
 
-static void __devexit pasemi_edac_remove(struct pci_dev *pdev)
+static void pasemi_edac_remove(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci = edac_mc_del_mc(&pdev->dev);
 
@@ -287,7 +287,7 @@ MODULE_DEVICE_TABLE(pci, pasemi_edac_pci_tbl);
 static struct pci_driver pasemi_edac_driver = {
        .name = MODULE_NAME,
        .probe = pasemi_edac_probe,
-       .remove = __devexit_p(pasemi_edac_remove),
+       .remove = pasemi_edac_remove,
        .id_table = pasemi_edac_pci_tbl,
 };
 
index bf09576359911c51f8d548b04605387c77466a1e..ef6b7e08f4856817163ef6dbf9d14aee90c65b9a 100644 (file)
@@ -838,8 +838,7 @@ ppc4xx_edac_isr(int irq, void *dev_id)
  *
  * Returns a device type width enumeration.
  */
-static enum dev_type __devinit
-ppc4xx_edac_get_dtype(u32 mcopt1)
+static enum dev_type ppc4xx_edac_get_dtype(u32 mcopt1)
 {
        switch (mcopt1 & SDRAM_MCOPT1_WDTH_MASK) {
        case SDRAM_MCOPT1_WDTH_16:
@@ -862,8 +861,7 @@ ppc4xx_edac_get_dtype(u32 mcopt1)
  *
  * Returns a memory type enumeration.
  */
-static enum mem_type __devinit
-ppc4xx_edac_get_mtype(u32 mcopt1)
+static enum mem_type ppc4xx_edac_get_mtype(u32 mcopt1)
 {
        bool rden = ((mcopt1 & SDRAM_MCOPT1_RDEN_MASK) == SDRAM_MCOPT1_RDEN);
 
@@ -893,8 +891,7 @@ ppc4xx_edac_get_mtype(u32 mcopt1)
  * Returns 0 if OK; otherwise, -EINVAL if the memory bank size
  * configuration cannot be determined.
  */
-static int __devinit
-ppc4xx_edac_init_csrows(struct mem_ctl_info *mci, u32 mcopt1)
+static int ppc4xx_edac_init_csrows(struct mem_ctl_info *mci, u32 mcopt1)
 {
        const struct ppc4xx_edac_pdata *pdata = mci->pvt_info;
        int status = 0;
@@ -1011,11 +1008,9 @@ ppc4xx_edac_init_csrows(struct mem_ctl_info *mci, u32 mcopt1)
  *
  * Returns 0 if OK; otherwise, < 0 on error.
  */
-static int __devinit
-ppc4xx_edac_mc_init(struct mem_ctl_info *mci,
-                   struct platform_device *op,
-                   const dcr_host_t *dcr_host,
-                   u32 mcopt1)
+static int ppc4xx_edac_mc_init(struct mem_ctl_info *mci,
+                              struct platform_device *op,
+                              const dcr_host_t *dcr_host, u32 mcopt1)
 {
        int status = 0;
        const u32 memcheck = (mcopt1 & SDRAM_MCOPT1_MCHK_MASK);
@@ -1105,8 +1100,8 @@ ppc4xx_edac_mc_init(struct mem_ctl_info *mci,
  * Returns 0 if OK; otherwise, -ENODEV if the interrupts could not be
  * mapped and assigned.
  */
-static int __devinit
-ppc4xx_edac_register_irq(struct platform_device *op, struct mem_ctl_info *mci)
+static int ppc4xx_edac_register_irq(struct platform_device *op,
+                                   struct mem_ctl_info *mci)
 {
        int status = 0;
        int ded_irq, sec_irq;
@@ -1183,8 +1178,8 @@ ppc4xx_edac_register_irq(struct platform_device *op, struct mem_ctl_info *mci)
  * Returns 0 if the DCRs were successfully mapped; otherwise, < 0 on
  * error.
  */
-static int __devinit
-ppc4xx_edac_map_dcrs(const struct device_node *np, dcr_host_t *dcr_host)
+static int ppc4xx_edac_map_dcrs(const struct device_node *np,
+                               dcr_host_t *dcr_host)
 {
        unsigned int dcr_base, dcr_len;
 
@@ -1232,7 +1227,7 @@ ppc4xx_edac_map_dcrs(const struct device_node *np, dcr_host_t *dcr_host)
  * Returns 0 if the controller instance was successfully bound to the
  * driver; otherwise, < 0 on error.
  */
-static int __devinit ppc4xx_edac_probe(struct platform_device *op)
+static int ppc4xx_edac_probe(struct platform_device *op)
 {
        int status = 0;
        u32 mcopt1, memcheck;
index f854debd553306a6eeae079067c2a35bc6a5988d..2fd6a549090584b8ac69848acfd30750a9f68e0b 100644 (file)
@@ -359,8 +359,8 @@ fail:
 }
 
 /* returns count (>= 0), or negative on error */
-static int __devinit r82600_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int r82600_init_one(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        edac_dbg(0, "\n");
 
@@ -368,7 +368,7 @@ static int __devinit r82600_init_one(struct pci_dev *pdev,
        return r82600_probe1(pdev, ent->driver_data);
 }
 
-static void __devexit r82600_remove_one(struct pci_dev *pdev)
+static void r82600_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
 
@@ -397,7 +397,7 @@ MODULE_DEVICE_TABLE(pci, r82600_pci_tbl);
 static struct pci_driver r82600_driver = {
        .name = EDAC_MOD_STR,
        .probe = r82600_init_one,
-       .remove = __devexit_p(r82600_remove_one),
+       .remove = r82600_remove_one,
        .id_table = r82600_pci_tbl,
 };
 
index 5715b7c2c5177a6c76ed732fb6f20de9b7578220..da7e2986e3d53c9aa721b9f1dd60901672828cc4 100644 (file)
@@ -1692,8 +1692,7 @@ fail0:
  *             < 0 for error code
  */
 
-static int __devinit sbridge_probe(struct pci_dev *pdev,
-                                 const struct pci_device_id *id)
+static int sbridge_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int rc;
        u8 mc, num_mc = 0;
@@ -1744,7 +1743,7 @@ fail0:
  *     sbridge_remove  destructor for one instance of device
  *
  */
-static void __devexit sbridge_remove(struct pci_dev *pdev)
+static void sbridge_remove(struct pci_dev *pdev)
 {
        struct sbridge_dev *sbridge_dev;
 
@@ -1785,7 +1784,7 @@ MODULE_DEVICE_TABLE(pci, sbridge_pci_tbl);
 static struct pci_driver sbridge_driver = {
        .name     = "sbridge_edac",
        .probe    = sbridge_probe,
-       .remove   = __devexit_p(sbridge_remove),
+       .remove   = sbridge_remove,
        .id_table = sbridge_pci_tbl,
 };
 
index 1e904b7b79a042671c83bb10e07547bfcf3eee12..a0820536b7d9d8edf0905ed04bf913d6fb6f21db 100644 (file)
@@ -82,7 +82,7 @@ static void tile_edac_check(struct mem_ctl_info *mci)
  * Initialize the 'csrows' table within the mci control structure with the
  * addressing of memory.
  */
-static int __devinit tile_edac_init_csrows(struct mem_ctl_info *mci)
+static int tile_edac_init_csrows(struct mem_ctl_info *mci)
 {
        struct csrow_info       *csrow = mci->csrows[0];
        struct tile_edac_priv   *priv = mci->pvt_info;
@@ -120,7 +120,7 @@ static int __devinit tile_edac_init_csrows(struct mem_ctl_info *mci)
        return 0;
 }
 
-static int __devinit tile_edac_mc_probe(struct platform_device *pdev)
+static int tile_edac_mc_probe(struct platform_device *pdev)
 {
        char                    hv_file[32];
        int                     hv_devhdl;
@@ -186,7 +186,7 @@ static int __devinit tile_edac_mc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit tile_edac_mc_remove(struct platform_device *pdev)
+static int tile_edac_mc_remove(struct platform_device *pdev)
 {
        struct mem_ctl_info *mci = platform_get_drvdata(pdev);
 
@@ -202,7 +202,7 @@ static struct platform_driver tile_edac_mc_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = tile_edac_mc_probe,
-       .remove         = __devexit_p(tile_edac_mc_remove),
+       .remove         = tile_edac_mc_remove,
 };
 
 /*
index 08a992693e62ed8b7e994782ce824945001f220a..c9db24d95caad3b7550f936a24bd802428b8d4e2 100644 (file)
@@ -418,8 +418,7 @@ fail:
        return rc;
 }
 
-static int __devinit x38_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int x38_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int rc;
 
@@ -435,7 +434,7 @@ static int __devinit x38_init_one(struct pci_dev *pdev,
        return rc;
 }
 
-static void __devexit x38_remove_one(struct pci_dev *pdev)
+static void x38_remove_one(struct pci_dev *pdev)
 {
        struct mem_ctl_info *mci;
 
@@ -464,7 +463,7 @@ MODULE_DEVICE_TABLE(pci, x38_pci_tbl);
 static struct pci_driver x38_driver = {
        .name = EDAC_MOD_STR,
        .probe = x38_init_one,
-       .remove = __devexit_p(x38_remove_one),
+       .remove = x38_remove_one,
        .id_table = x38_pci_tbl,
 };
 
index e7a711f53a6f7cd8f0b1316d324034b1ca2acc1c..2b27bff2591a029a193878812e3e8d00ca1134b4 100644 (file)
@@ -270,7 +270,7 @@ static int fwnet_header_cache(const struct neighbour *neigh,
        if (type == cpu_to_be16(ETH_P_802_3))
                return -1;
        net = neigh->dev;
-       h = (struct fwnet_header *)((u8 *)hh->hh_data + 16 - sizeof(*h));
+       h = (struct fwnet_header *)((u8 *)hh->hh_data + HH_DATA_OFF(sizeof(*h)));
        h->h_proto = type;
        memcpy(h->h_dest, neigh->ha, net->addr_len);
        hh->hh_len = FWNET_HLEN;
@@ -282,7 +282,7 @@ static int fwnet_header_cache(const struct neighbour *neigh,
 static void fwnet_header_cache_update(struct hh_cache *hh,
                const struct net_device *net, const unsigned char *haddr)
 {
-       memcpy((u8 *)hh->hh_data + 16 - FWNET_HLEN, haddr, net->addr_len);
+       memcpy((u8 *)hh->hh_data + HH_DATA_OFF(FWNET_HLEN), haddr, net->addr_len);
 }
 
 static int fwnet_header_parse(const struct sk_buff *skb, unsigned char *haddr)
@@ -398,11 +398,11 @@ static struct fwnet_partial_datagram *fwnet_pd_new(struct net_device *net,
 
        new->datagram_label = datagram_label;
        new->datagram_size = dg_size;
-       new->skb = dev_alloc_skb(dg_size + net->hard_header_len + 15);
+       new->skb = dev_alloc_skb(dg_size + LL_RESERVED_SPACE(net));
        if (new->skb == NULL)
                goto fail_w_fi;
 
-       skb_reserve(new->skb, (net->hard_header_len + 15) & ~15);
+       skb_reserve(new->skb, LL_RESERVED_SPACE(net));
        new->pbuf = skb_put(new->skb, dg_size);
        memcpy(new->pbuf + frag_off, frag_buf, frag_len);
        list_add_tail(&new->pd_link, &peer->pd_list);
@@ -520,7 +520,7 @@ static int fwnet_finish_incoming_packet(struct net_device *net,
        dev = netdev_priv(net);
        /* Write metadata, and then pass to the receive level */
        skb->dev = net;
-       skb->ip_summed = CHECKSUM_UNNECESSARY;  /* don't check it */
+       skb->ip_summed = CHECKSUM_NONE;
 
        /*
         * Parse the encapsulation header. This actually does the job of
@@ -690,14 +690,14 @@ static int fwnet_incoming_packet(struct fwnet_device *dev, __be32 *buf, int len,
                buf++;
                len -= RFC2374_UNFRAG_HDR_SIZE;
 
-               skb = dev_alloc_skb(len + net->hard_header_len + 15);
+               skb = dev_alloc_skb(len + LL_RESERVED_SPACE(net));
                if (unlikely(!skb)) {
                        dev_err(&net->dev, "out of memory\n");
                        net->stats.rx_dropped++;
 
                        return -ENOMEM;
                }
-               skb_reserve(skb, (net->hard_header_len + 15) & ~15);
+               skb_reserve(skb, LL_RESERVED_SPACE(net));
                memcpy(skb_put(skb, len), buf, len);
 
                return fwnet_finish_incoming_packet(net, skb, source_node_id,
index ea5ac2dc1233748a7722fec6df4e5d3aa0b44f49..8e77c02edb24608d10aff9c186ce95aa0f4e5e47 100644 (file)
@@ -537,7 +537,7 @@ static struct attribute_group dcdbas_attr_group = {
        .attrs = dcdbas_dev_attrs,
 };
 
-static int __devinit dcdbas_probe(struct platform_device *dev)
+static int dcdbas_probe(struct platform_device *dev)
 {
        int i, error;
 
@@ -575,7 +575,7 @@ static int __devinit dcdbas_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit dcdbas_remove(struct platform_device *dev)
+static int dcdbas_remove(struct platform_device *dev)
 {
        int i;
 
@@ -593,7 +593,7 @@ static struct platform_driver dcdbas_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = dcdbas_probe,
-       .remove         = __devexit_p(dcdbas_remove),
+       .remove         = dcdbas_remove,
 };
 
 /**
index 55d83c7d9c7f1e51342a1230133f7e1d70844577..fd6dfe382f13c650170a4f0f20cf3ed6a612dba5 100644 (file)
@@ -126,7 +126,7 @@ static int da9055_gpio_to_irq(struct gpio_chip *gc, u32 offset)
                                  DA9055_IRQ_GPI0 + offset);
 }
 
-static struct gpio_chip reference_gp __devinitdata = {
+static struct gpio_chip reference_gp = {
        .label = "da9055-gpio",
        .owner = THIS_MODULE,
        .get = da9055_gpio_get,
@@ -139,7 +139,7 @@ static struct gpio_chip reference_gp __devinitdata = {
        .base = -1,
 };
 
-static int __devinit da9055_gpio_probe(struct platform_device *pdev)
+static int da9055_gpio_probe(struct platform_device *pdev)
 {
        struct da9055_gpio *gpio;
        struct da9055_pdata *pdata;
@@ -170,7 +170,7 @@ err_mem:
        return ret;
 }
 
-static int __devexit da9055_gpio_remove(struct platform_device *pdev)
+static int da9055_gpio_remove(struct platform_device *pdev)
 {
        struct da9055_gpio *gpio = platform_get_drvdata(pdev);
 
@@ -179,7 +179,7 @@ static int __devexit da9055_gpio_remove(struct platform_device *pdev)
 
 static struct platform_driver da9055_gpio_driver = {
        .probe = da9055_gpio_probe,
-       .remove = __devexit_p(da9055_gpio_remove),
+       .remove = da9055_gpio_remove,
        .driver = {
                .name   = "da9055-gpio",
                .owner  = THIS_MODULE,
index 0634ceea3c244765593e427f683865ed6a01903f..cc53cab8df2acb89042673347acf128056c57026 100644 (file)
@@ -319,7 +319,7 @@ static void ts5500_disable_irq(struct ts5500_priv *priv)
        spin_unlock_irqrestore(&priv->lock, flags);
 }
 
-static int __devinit ts5500_dio_probe(struct platform_device *pdev)
+static int ts5500_dio_probe(struct platform_device *pdev)
 {
        enum ts5500_blocks block = platform_get_device_id(pdev)->driver_data;
        struct ts5500_dio_platform_data *pdata = pdev->dev.platform_data;
@@ -432,7 +432,7 @@ cleanup:
        return ret;
 }
 
-static int __devexit ts5500_dio_remove(struct platform_device *pdev)
+static int ts5500_dio_remove(struct platform_device *pdev)
 {
        struct ts5500_priv *priv = platform_get_drvdata(pdev);
 
@@ -455,7 +455,7 @@ static struct platform_driver ts5500_dio_driver = {
                .owner = THIS_MODULE,
        },
        .probe = ts5500_dio_probe,
-       .remove = __devexit_p(ts5500_dio_remove),
+       .remove = ts5500_dio_remove,
        .id_table = ts5500_dio_ids,
 };
 
index 13772996cf2418e0ef40f60b51232f7bd624c911..59d72391de264155de8af0428d618fc354e53c50 100644 (file)
@@ -400,7 +400,7 @@ static int vprbrd_gpiob_direction_output(struct gpio_chip *chip,
 
 /* ----- end of gpio b chip ---------------------------------------------- */
 
-static int __devinit vprbrd_gpio_probe(struct platform_device *pdev)
+static int vprbrd_gpio_probe(struct platform_device *pdev)
 {
        struct vprbrd *vb = dev_get_drvdata(pdev->dev.parent);
        struct vprbrd_gpio *vb_gpio;
@@ -456,7 +456,7 @@ err_gpioa:
        return ret;
 }
 
-static int __devexit vprbrd_gpio_remove(struct platform_device *pdev)
+static int vprbrd_gpio_remove(struct platform_device *pdev)
 {
        struct vprbrd_gpio *vb_gpio = platform_get_drvdata(pdev);
        int ret;
@@ -472,7 +472,7 @@ static struct platform_driver vprbrd_gpio_driver = {
        .driver.name    = "viperboard-gpio",
        .driver.owner   = THIS_MODULE,
        .probe          = vprbrd_gpio_probe,
-       .remove         = __devexit_p(vprbrd_gpio_remove),
+       .remove         = vprbrd_gpio_remove,
 };
 
 static int __init vprbrd_gpio_init(void)
index 31123b6a0be5eae06ce34aa20127a1fd8d84d1ba..2d2c2f8d6dc668e29202b947461314fc4ccf71be 100644 (file)
@@ -60,8 +60,7 @@ static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
 
 MODULE_DEVICE_TABLE(pci, pciidlist);
 
-static int __devinit
-ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        return drm_get_pci_dev(pdev, ent, &driver);
 }
index dcd1a8c029ebb8958ab617e03dd53768c8b71e2d..8ecb601152effe17019967c559e48cddfac2f7b4 100644 (file)
@@ -56,8 +56,8 @@ static int cirrus_kick_out_firmware_fb(struct pci_dev *pdev)
        return 0;
 }
 
-static int __devinit
-cirrus_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int cirrus_pci_probe(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        int ret;
 
index 0761a03cdbb2d4f0af455097d1c09d3710c2749f..2aa331499f81da1dfbe8f5c51216ed0096f67951 100644 (file)
@@ -184,19 +184,27 @@ EXPORT_SYMBOL(drm_mm_get_block_generic);
  * -ENOSPC if no suitable free area is available. The preallocated memory node
  * must be cleared.
  */
-int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
-                      unsigned long size, unsigned alignment)
+int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node,
+                              unsigned long size, unsigned alignment,
+                              unsigned long color)
 {
        struct drm_mm_node *hole_node;
 
-       hole_node = drm_mm_search_free(mm, size, alignment, false);
+       hole_node = drm_mm_search_free_generic(mm, size, alignment,
+                                              color, 0);
        if (!hole_node)
                return -ENOSPC;
 
-       drm_mm_insert_helper(hole_node, node, size, alignment, 0);
-
+       drm_mm_insert_helper(hole_node, node, size, alignment, color);
        return 0;
 }
+EXPORT_SYMBOL(drm_mm_insert_node_generic);
+
+int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
+                      unsigned long size, unsigned alignment)
+{
+       return drm_mm_insert_node_generic(mm, node, size, alignment, 0);
+}
 EXPORT_SYMBOL(drm_mm_insert_node);
 
 static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
@@ -213,11 +221,13 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
 
        BUG_ON(!hole_node->hole_follows || node->allocated);
 
-       if (mm->color_adjust)
-               mm->color_adjust(hole_node, color, &adj_start, &adj_end);
-
        if (adj_start < start)
                adj_start = start;
+       if (adj_end > end)
+               adj_end = end;
+
+       if (mm->color_adjust)
+               mm->color_adjust(hole_node, color, &adj_start, &adj_end);
 
        if (alignment) {
                unsigned tmp = adj_start % alignment;
@@ -275,22 +285,31 @@ EXPORT_SYMBOL(drm_mm_get_block_range_generic);
  * -ENOSPC if no suitable free area is available. This is for range
  * restricted allocations. The preallocated memory node must be cleared.
  */
-int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node,
-                               unsigned long size, unsigned alignment,
-                               unsigned long start, unsigned long end)
+int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *node,
+                                       unsigned long size, unsigned alignment, unsigned long color,
+                                       unsigned long start, unsigned long end)
 {
        struct drm_mm_node *hole_node;
 
-       hole_node = drm_mm_search_free_in_range(mm, size, alignment,
-                                               start, end, false);
+       hole_node = drm_mm_search_free_in_range_generic(mm,
+                                                       size, alignment, color,
+                                                       start, end, 0);
        if (!hole_node)
                return -ENOSPC;
 
-       drm_mm_insert_helper_range(hole_node, node, size, alignment, 0,
+       drm_mm_insert_helper_range(hole_node, node,
+                                  size, alignment, color,
                                   start, end);
-
        return 0;
 }
+EXPORT_SYMBOL(drm_mm_insert_node_in_range_generic);
+
+int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node,
+                               unsigned long size, unsigned alignment,
+                               unsigned long start, unsigned long end)
+{
+       return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, 0, start, end);
+}
 EXPORT_SYMBOL(drm_mm_insert_node_in_range);
 
 /**
@@ -489,7 +508,7 @@ void drm_mm_init_scan(struct drm_mm *mm,
        mm->scan_size = size;
        mm->scanned_blocks = 0;
        mm->scan_hit_start = 0;
-       mm->scan_hit_size = 0;
+       mm->scan_hit_end = 0;
        mm->scan_check_range = 0;
        mm->prev_scanned_node = NULL;
 }
@@ -516,7 +535,7 @@ void drm_mm_init_scan_with_range(struct drm_mm *mm,
        mm->scan_size = size;
        mm->scanned_blocks = 0;
        mm->scan_hit_start = 0;
-       mm->scan_hit_size = 0;
+       mm->scan_hit_end = 0;
        mm->scan_start = start;
        mm->scan_end = end;
        mm->scan_check_range = 1;
@@ -535,8 +554,7 @@ int drm_mm_scan_add_block(struct drm_mm_node *node)
        struct drm_mm *mm = node->mm;
        struct drm_mm_node *prev_node;
        unsigned long hole_start, hole_end;
-       unsigned long adj_start;
-       unsigned long adj_end;
+       unsigned long adj_start, adj_end;
 
        mm->scanned_blocks++;
 
@@ -553,14 +571,8 @@ int drm_mm_scan_add_block(struct drm_mm_node *node)
        node->node_list.next = &mm->prev_scanned_node->node_list;
        mm->prev_scanned_node = node;
 
-       hole_start = drm_mm_hole_node_start(prev_node);
-       hole_end = drm_mm_hole_node_end(prev_node);
-
-       adj_start = hole_start;
-       adj_end = hole_end;
-
-       if (mm->color_adjust)
-               mm->color_adjust(prev_node, mm->scan_color, &adj_start, &adj_end);
+       adj_start = hole_start = drm_mm_hole_node_start(prev_node);
+       adj_end = hole_end = drm_mm_hole_node_end(prev_node);
 
        if (mm->scan_check_range) {
                if (adj_start < mm->scan_start)
@@ -569,11 +581,14 @@ int drm_mm_scan_add_block(struct drm_mm_node *node)
                        adj_end = mm->scan_end;
        }
 
+       if (mm->color_adjust)
+               mm->color_adjust(prev_node, mm->scan_color,
+                                &adj_start, &adj_end);
+
        if (check_free_hole(adj_start, adj_end,
                            mm->scan_size, mm->scan_alignment)) {
                mm->scan_hit_start = hole_start;
-               mm->scan_hit_size = hole_end;
-
+               mm->scan_hit_end = hole_end;
                return 1;
        }
 
@@ -609,19 +624,10 @@ int drm_mm_scan_remove_block(struct drm_mm_node *node)
                               node_list);
 
        prev_node->hole_follows = node->scanned_preceeds_hole;
-       INIT_LIST_HEAD(&node->node_list);
        list_add(&node->node_list, &prev_node->node_list);
 
-       /* Only need to check for containement because start&size for the
-        * complete resulting free block (not just the desired part) is
-        * stored. */
-       if (node->start >= mm->scan_hit_start &&
-           node->start + node->size
-                       <= mm->scan_hit_start + mm->scan_hit_size) {
-               return 1;
-       }
-
-       return 0;
+        return (drm_mm_hole_node_end(node) > mm->scan_hit_start &&
+                node->start < mm->scan_hit_end);
 }
 EXPORT_SYMBOL(drm_mm_scan_remove_block);
 
index bef43e0342a69e82dcb7e91756158552c6ca8159..4e9b5ba8edff962bd1a5bd6720daa782e5388619 100644 (file)
@@ -66,6 +66,6 @@ struct i2c_driver ddc_driver = {
        },
        .id_table       = ddc_idtable,
        .probe          = s5p_ddc_probe,
-       .remove         = __devexit_p(s5p_ddc_remove),
+       .remove         = s5p_ddc_remove,
        .command                = NULL,
 };
index 9601bad47a2e6d5a2bd04deffec5ec5744bfbcee..57affae9568b22c1b4713fb0fe330a33ffe6ca01 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
  * Author: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
@@ -29,6 +15,7 @@
 #include "exynos_drm_drv.h"
 #include "exynos_drm_gem.h"
 #include "exynos_drm_buf.h"
+#include "exynos_drm_iommu.h"
 
 static int lowlevel_buffer_allocate(struct drm_device *dev,
                unsigned int flags, struct exynos_drm_gem_buf *buf)
@@ -51,7 +38,7 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
         * region will be allocated else physically contiguous
         * as possible.
         */
-       if (flags & EXYNOS_BO_CONTIG)
+       if (!(flags & EXYNOS_BO_NONCONTIG))
                dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &buf->dma_attrs);
 
        /*
@@ -66,14 +53,45 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
        dma_set_attr(attr, &buf->dma_attrs);
        dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &buf->dma_attrs);
 
-       buf->pages = dma_alloc_attrs(dev->dev, buf->size,
-                       &buf->dma_addr, GFP_KERNEL, &buf->dma_attrs);
-       if (!buf->pages) {
-               DRM_ERROR("failed to allocate buffer.\n");
-               return -ENOMEM;
+       nr_pages = buf->size >> PAGE_SHIFT;
+
+       if (!is_drm_iommu_supported(dev)) {
+               dma_addr_t start_addr;
+               unsigned int i = 0;
+
+               buf->pages = kzalloc(sizeof(struct page) * nr_pages,
+                                       GFP_KERNEL);
+               if (!buf->pages) {
+                       DRM_ERROR("failed to allocate pages.\n");
+                       return -ENOMEM;
+               }
+
+               buf->kvaddr = dma_alloc_attrs(dev->dev, buf->size,
+                                       &buf->dma_addr, GFP_KERNEL,
+                                       &buf->dma_attrs);
+               if (!buf->kvaddr) {
+                       DRM_ERROR("failed to allocate buffer.\n");
+                       kfree(buf->pages);
+                       return -ENOMEM;
+               }
+
+               start_addr = buf->dma_addr;
+               while (i < nr_pages) {
+                       buf->pages[i] = phys_to_page(start_addr);
+                       start_addr += PAGE_SIZE;
+                       i++;
+               }
+       } else {
+
+               buf->pages = dma_alloc_attrs(dev->dev, buf->size,
+                                       &buf->dma_addr, GFP_KERNEL,
+                                       &buf->dma_attrs);
+               if (!buf->pages) {
+                       DRM_ERROR("failed to allocate buffer.\n");
+                       return -ENOMEM;
+               }
        }
 
-       nr_pages = buf->size >> PAGE_SHIFT;
        buf->sgt = drm_prime_pages_to_sg(buf->pages, nr_pages);
        if (!buf->sgt) {
                DRM_ERROR("failed to get sg table.\n");
@@ -92,6 +110,9 @@ err_free_attrs:
                        (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
        buf->dma_addr = (dma_addr_t)NULL;
 
+       if (!is_drm_iommu_supported(dev))
+               kfree(buf->pages);
+
        return ret;
 }
 
@@ -114,8 +135,14 @@ static void lowlevel_buffer_deallocate(struct drm_device *dev,
        kfree(buf->sgt);
        buf->sgt = NULL;
 
-       dma_free_attrs(dev->dev, buf->size, buf->pages,
+       if (!is_drm_iommu_supported(dev)) {
+               dma_free_attrs(dev->dev, buf->size, buf->kvaddr,
                                (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
+               kfree(buf->pages);
+       } else
+               dma_free_attrs(dev->dev, buf->size, buf->pages,
+                               (dma_addr_t)buf->dma_addr, &buf->dma_attrs);
+
        buf->dma_addr = (dma_addr_t)NULL;
 }
 
index 25cf162850330457fd977779157f34b304e91a8d..a6412f19673cb3277ad17137700b006f024b8c84 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
  * Author: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_BUF_H_
index 0f68a28726739dd6b795ad066edb645799cfc6d2..ab37437bad8a9f0f5baa8b0425584ba95f5eb2c0 100644 (file)
@@ -5,24 +5,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
index 22f6cc442c3d94e816d9302faa2cef12b25f7fa6..547c6b590357609a2c4f1e6811cb018ea75b1cff 100644 (file)
@@ -5,24 +5,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_CONNECTOR_H_
index 94026ad76a775d9cfb826fa65f9e2da74d14660f..4667c9f67acdf0a03b68a3e717b8c56cda4d127b 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
index 2efa4b031d7340d075e86f9f4136d7f8d2a2a40c..e8894bc9e6d5edf0ecf07cea5078f3961191030d 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
@@ -407,3 +393,33 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc)
        exynos_drm_fn_encoder(private->crtc[crtc], &crtc,
                        exynos_drm_disable_vblank);
 }
+
+void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc)
+{
+       struct exynos_drm_private *dev_priv = dev->dev_private;
+       struct drm_pending_vblank_event *e, *t;
+       struct timeval now;
+       unsigned long flags;
+
+       DRM_DEBUG_KMS("%s\n", __FILE__);
+
+       spin_lock_irqsave(&dev->event_lock, flags);
+
+       list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
+                       base.link) {
+               /* if event's pipe isn't same as crtc then ignore it. */
+               if (crtc != e->pipe)
+                       continue;
+
+               do_gettimeofday(&now);
+               e->event.sequence = 0;
+               e->event.tv_sec = now.tv_sec;
+               e->event.tv_usec = now.tv_usec;
+
+               list_move_tail(&e->base.link, &e->base.file_priv->event_list);
+               wake_up_interruptible(&e->base.file_priv->event_wait);
+               drm_vblank_put(dev, crtc);
+       }
+
+       spin_unlock_irqrestore(&dev->event_lock, flags);
+}
index 6bae8d8c250ec7d6cd84c85268d99cf5f40669b6..3e197e6ae7d938f23c98a88c66a09478aa97f60b 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_CRTC_H_
@@ -32,5 +18,6 @@
 int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr);
 int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc);
 void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc);
+void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc);
 
 #endif
index 61d5a8402eb8be71857a4b119f3647dfa5975807..9df97714b6c0b8a2244fa1f61da5eb4a76c774dd 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  * Author: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
@@ -222,7 +208,7 @@ struct dma_buf *exynos_dmabuf_prime_export(struct drm_device *drm_dev,
        struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
 
        return dma_buf_export(exynos_gem_obj, &exynos_dmabuf_ops,
-                               exynos_gem_obj->base.size, 0600);
+                               exynos_gem_obj->base.size, flags);
 }
 
 struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev,
@@ -246,7 +232,12 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev,
 
                /* is it from our device? */
                if (obj->dev == drm_dev) {
+                       /*
+                        * Importing dmabuf exported from out own gem increases
+                        * refcount on gem itself instead of f_count of dmabuf.
+                        */
                        drm_gem_object_reference(obj);
+                       dma_buf_put(dma_buf);
                        return obj;
                }
        }
index 662a8f98ccdbebc82cc7bfcdddd90beade422fc3..49acfafb4fdb60852139fc5745fdbad867193ad4 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  * Author: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_DMABUF_H_
index e0a8e8024b010683a32a6ef8a9754e6ade1adcce..3da5c2d214d88777b2dd550295c8e939673289dd 100644 (file)
@@ -5,24 +5,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
@@ -325,7 +311,7 @@ static int exynos_drm_platform_remove(struct platform_device *pdev)
 
 static struct platform_driver exynos_drm_platform_driver = {
        .probe          = exynos_drm_platform_probe,
-       .remove         = __devexit_p(exynos_drm_platform_remove),
+       .remove         = exynos_drm_platform_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "exynos-drm",
index f5a97745bf93b44a6872f8daaca88642d2912c54..b9e51bc09e81ad3ba81943e860ebb7a2580e0f2d 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_DRV_H_
index 301485215a70d782aa28e182633ca0f1b1592afc..c63721f64aecd15518392d254b9857cfc6c2ab54 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
index 88bb25a2a917119d102104aa613ea9745fadfbbd..89e2fb0770af12ba7405ba8b116edb831b67c4fd 100644 (file)
@@ -5,24 +5,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_ENCODER_H_
index 5426cc5a5e8d53b30409a980aa5e8878a30e7c83..294c0513f587901a15fdd9e57de8c3c48fdf3d34 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
index 96262e54f76dc212183702fe4ab2027ff4e97820..517471b37566cd8b5224720954113865549cf12d 100644 (file)
@@ -5,24 +5,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_FB_H_
index f433eb7533a97e9550f86f2f94c4f5fa173d0427..71f867340a88b43a98572c1b84c6776528e919fc 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
@@ -34,6 +20,7 @@
 #include "exynos_drm_drv.h"
 #include "exynos_drm_fb.h"
 #include "exynos_drm_gem.h"
+#include "exynos_drm_iommu.h"
 
 #define MAX_CONNECTOR          4
 #define PREFERRED_BPP          32
@@ -111,9 +98,18 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
 
        /* map pages with kernel virtual space. */
        if (!buffer->kvaddr) {
-               unsigned int nr_pages = buffer->size >> PAGE_SHIFT;
-               buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP,
+               if (is_drm_iommu_supported(dev)) {
+                       unsigned int nr_pages = buffer->size >> PAGE_SHIFT;
+
+                       buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP,
                                        pgprot_writecombine(PAGE_KERNEL));
+               } else {
+                       phys_addr_t dma_addr = buffer->dma_addr;
+                       if (dma_addr)
+                               buffer->kvaddr = phys_to_virt(dma_addr);
+                       else
+                               buffer->kvaddr = (void __iomem *)NULL;
+               }
                if (!buffer->kvaddr) {
                        DRM_ERROR("failed to map pages to kernel space.\n");
                        return -EIO;
@@ -128,8 +124,12 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
 
        dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr;
        fbi->screen_base = buffer->kvaddr + offset;
-       fbi->fix.smem_start = (unsigned long)
+       if (is_drm_iommu_supported(dev))
+               fbi->fix.smem_start = (unsigned long)
                        (page_to_phys(sg_page(buffer->sgt->sgl)) + offset);
+       else
+               fbi->fix.smem_start = (unsigned long)buffer->dma_addr;
+
        fbi->screen_size = size;
        fbi->fix.smem_len = size;
 
@@ -320,7 +320,7 @@ static void exynos_drm_fbdev_destroy(struct drm_device *dev,
        struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;
        struct drm_framebuffer *fb;
 
-       if (exynos_gem_obj->buffer->kvaddr)
+       if (is_drm_iommu_supported(dev) && exynos_gem_obj->buffer->kvaddr)
                vunmap(exynos_gem_obj->buffer->kvaddr);
 
        /* release drm framebuffer and real buffer */
index ccfce8a1a4519c9bdd142eb1d5c3200b7314fcc6..e16d7f0ae1920eb944364747b3f009e7976654f4 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_FBDEV_H_
index 61ea24296b526f4c00d76dc77a0002bd94401da7..67a83e69544bb4e285088be9227c3ed2176ebcb6 100644 (file)
@@ -25,7 +25,7 @@
 #include "exynos_drm_fimc.h"
 
 /*
- * FIMC is stand for Fully Interactive Mobile Camera and
+ * FIMC stands for Fully Interactive Mobile Camera and
  * supports image scaler/rotator and input/output DMA operations.
  * input DMA reads image data from the memory.
  * output DMA writes image data to memory.
@@ -163,19 +163,29 @@ struct fimc_context {
        bool    suspended;
 };
 
-static void fimc_sw_reset(struct fimc_context *ctx, bool pattern)
+static void fimc_sw_reset(struct fimc_context *ctx)
 {
        u32 cfg;
 
-       DRM_DEBUG_KMS("%s:pattern[%d]\n", __func__, pattern);
+       DRM_DEBUG_KMS("%s\n", __func__);
+
+       /* stop dma operation */
+       cfg = fimc_read(EXYNOS_CISTATUS);
+       if (EXYNOS_CISTATUS_GET_ENVID_STATUS(cfg)) {
+               cfg = fimc_read(EXYNOS_MSCTRL);
+               cfg &= ~EXYNOS_MSCTRL_ENVID;
+               fimc_write(cfg, EXYNOS_MSCTRL);
+       }
 
        cfg = fimc_read(EXYNOS_CISRCFMT);
        cfg |= EXYNOS_CISRCFMT_ITU601_8BIT;
-       if (pattern)
-               cfg |= EXYNOS_CIGCTRL_TESTPATTERN_COLOR_BAR;
-
        fimc_write(cfg, EXYNOS_CISRCFMT);
 
+       /* disable image capture */
+       cfg = fimc_read(EXYNOS_CIIMGCPT);
+       cfg &= ~(EXYNOS_CIIMGCPT_IMGCPTEN_SC | EXYNOS_CIIMGCPT_IMGCPTEN);
+       fimc_write(cfg, EXYNOS_CIIMGCPT);
+
        /* s/w reset */
        cfg = fimc_read(EXYNOS_CIGCTRL);
        cfg |= (EXYNOS_CIGCTRL_SWRST);
@@ -695,7 +705,7 @@ static int fimc_src_set_addr(struct device *dev,
 {
        struct fimc_context *ctx = get_fimc_context(dev);
        struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_property *property;
        struct drm_exynos_ipp_config *config;
 
@@ -705,10 +715,6 @@ static int fimc_src_set_addr(struct device *dev,
        }
 
        property = &c_node->property;
-       if (!property) {
-               DRM_ERROR("failed to get property.\n");
-               return -EINVAL;
-       }
 
        DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,
                property->prop_id, buf_id, buf_type);
@@ -1206,7 +1212,7 @@ static int fimc_dst_set_buf_seq(struct fimc_context *ctx, u32 buf_id,
        }
 
        /* sequence id */
-       cfg &= (~mask);
+       cfg &= ~mask;
        cfg |= (enable << buf_id);
        fimc_write(cfg, EXYNOS_CIFCNTSEQ);
 
@@ -1231,7 +1237,7 @@ static int fimc_dst_set_addr(struct device *dev,
 {
        struct fimc_context *ctx = get_fimc_context(dev);
        struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_property *property;
        struct drm_exynos_ipp_config *config;
 
@@ -1241,10 +1247,6 @@ static int fimc_dst_set_addr(struct device *dev,
        }
 
        property = &c_node->property;
-       if (!property) {
-               DRM_ERROR("failed to get property.\n");
-               return -EINVAL;
-       }
 
        DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,
                property->prop_id, buf_id, buf_type);
@@ -1317,7 +1319,7 @@ static irqreturn_t fimc_irq_handler(int irq, void *dev_id)
 {
        struct fimc_context *ctx = dev_id;
        struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_event_work *event_work =
                c_node->event_work;
        int buf_id;
@@ -1395,6 +1397,7 @@ static inline bool fimc_check_drm_flip(enum drm_exynos_flip flip)
        case EXYNOS_DRM_FLIP_NONE:
        case EXYNOS_DRM_FLIP_VERTICAL:
        case EXYNOS_DRM_FLIP_HORIZONTAL:
+       case EXYNOS_DRM_FLIP_BOTH:
                return true;
        default:
                DRM_DEBUG_KMS("%s:invalid flip\n", __func__);
@@ -1543,7 +1546,7 @@ static int fimc_ippdrv_reset(struct device *dev)
        DRM_DEBUG_KMS("%s\n", __func__);
 
        /* reset h/w block */
-       fimc_sw_reset(ctx, false);
+       fimc_sw_reset(ctx);
 
        /* reset scaler capability */
        memset(&ctx->sc, 0x0, sizeof(ctx->sc));
@@ -1557,7 +1560,7 @@ static int fimc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)
 {
        struct fimc_context *ctx = get_fimc_context(dev);
        struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_property *property;
        struct drm_exynos_ipp_config *config;
        struct drm_exynos_pos   img_pos[EXYNOS_DRM_OPS_MAX];
@@ -1573,10 +1576,6 @@ static int fimc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)
        }
 
        property = &c_node->property;
-       if (!property) {
-               DRM_ERROR("failed to get property.\n");
-               return -EINVAL;
-       }
 
        fimc_handle_irq(ctx, true, false, true);
 
@@ -1714,7 +1713,7 @@ static void fimc_ippdrv_stop(struct device *dev, enum drm_exynos_ipp_cmd cmd)
        fimc_write(cfg, EXYNOS_CIGCTRL);
 }
 
-static int __devinit fimc_probe(struct platform_device *pdev)
+static int fimc_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct fimc_context *ctx;
@@ -1739,93 +1738,64 @@ static int __devinit fimc_probe(struct platform_device *pdev)
                platform_get_device_id(pdev)->driver_data;
 
        /* clock control */
-       ctx->sclk_fimc_clk = clk_get(dev, "sclk_fimc");
+       ctx->sclk_fimc_clk = devm_clk_get(dev, "sclk_fimc");
        if (IS_ERR(ctx->sclk_fimc_clk)) {
                dev_err(dev, "failed to get src fimc clock.\n");
-               ret = PTR_ERR(ctx->sclk_fimc_clk);
-               goto err_ctx;
+               return PTR_ERR(ctx->sclk_fimc_clk);
        }
        clk_enable(ctx->sclk_fimc_clk);
 
-       ctx->fimc_clk = clk_get(dev, "fimc");
+       ctx->fimc_clk = devm_clk_get(dev, "fimc");
        if (IS_ERR(ctx->fimc_clk)) {
                dev_err(dev, "failed to get fimc clock.\n");
-               ret = PTR_ERR(ctx->fimc_clk);
                clk_disable(ctx->sclk_fimc_clk);
-               clk_put(ctx->sclk_fimc_clk);
-               goto err_ctx;
+               return PTR_ERR(ctx->fimc_clk);
        }
 
-       ctx->wb_clk = clk_get(dev, "pxl_async0");
+       ctx->wb_clk = devm_clk_get(dev, "pxl_async0");
        if (IS_ERR(ctx->wb_clk)) {
                dev_err(dev, "failed to get writeback a clock.\n");
-               ret = PTR_ERR(ctx->wb_clk);
                clk_disable(ctx->sclk_fimc_clk);
-               clk_put(ctx->sclk_fimc_clk);
-               clk_put(ctx->fimc_clk);
-               goto err_ctx;
+               return PTR_ERR(ctx->wb_clk);
        }
 
-       ctx->wb_b_clk = clk_get(dev, "pxl_async1");
+       ctx->wb_b_clk = devm_clk_get(dev, "pxl_async1");
        if (IS_ERR(ctx->wb_b_clk)) {
                dev_err(dev, "failed to get writeback b clock.\n");
-               ret = PTR_ERR(ctx->wb_b_clk);
                clk_disable(ctx->sclk_fimc_clk);
-               clk_put(ctx->sclk_fimc_clk);
-               clk_put(ctx->fimc_clk);
-               clk_put(ctx->wb_clk);
-               goto err_ctx;
+               return PTR_ERR(ctx->wb_b_clk);
        }
 
-       parent_clk = clk_get(dev, ddata->parent_clk);
+       parent_clk = devm_clk_get(dev, ddata->parent_clk);
 
        if (IS_ERR(parent_clk)) {
                dev_err(dev, "failed to get parent clock.\n");
-               ret = PTR_ERR(parent_clk);
                clk_disable(ctx->sclk_fimc_clk);
-               clk_put(ctx->sclk_fimc_clk);
-               clk_put(ctx->fimc_clk);
-               clk_put(ctx->wb_clk);
-               clk_put(ctx->wb_b_clk);
-               goto err_ctx;
+               return PTR_ERR(parent_clk);
        }
 
        if (clk_set_parent(ctx->sclk_fimc_clk, parent_clk)) {
                dev_err(dev, "failed to set parent.\n");
-               ret = -EINVAL;
-               clk_put(parent_clk);
                clk_disable(ctx->sclk_fimc_clk);
-               clk_put(ctx->sclk_fimc_clk);
-               clk_put(ctx->fimc_clk);
-               clk_put(ctx->wb_clk);
-               clk_put(ctx->wb_b_clk);
-               goto err_ctx;
+               return -EINVAL;
        }
 
-       clk_put(parent_clk);
+       devm_clk_put(dev, parent_clk);
        clk_set_rate(ctx->sclk_fimc_clk, pdata->clk_rate);
 
        /* resource memory */
        ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!ctx->regs_res) {
-               dev_err(dev, "failed to find registers.\n");
-               ret = -ENOENT;
-               goto err_clk;
-       }
-
        ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res);
        if (!ctx->regs) {
                dev_err(dev, "failed to map registers.\n");
-               ret = -ENXIO;
-               goto err_clk;
+               return -ENXIO;
        }
 
        /* resource irq */
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!res) {
                dev_err(dev, "failed to request irq resource.\n");
-               ret = -ENOENT;
-               goto err_get_regs;
+               return -ENOENT;
        }
 
        ctx->irq = res->start;
@@ -1833,7 +1803,7 @@ static int __devinit fimc_probe(struct platform_device *pdev)
                IRQF_ONESHOT, "drm_fimc", ctx);
        if (ret < 0) {
                dev_err(dev, "failed to request irq.\n");
-               goto err_get_regs;
+               return ret;
        }
 
        /* context initailization */
@@ -1879,19 +1849,11 @@ err_ippdrv_register:
        pm_runtime_disable(dev);
 err_get_irq:
        free_irq(ctx->irq, ctx);
-err_get_regs:
-       devm_iounmap(dev, ctx->regs);
-err_clk:
-       clk_put(ctx->sclk_fimc_clk);
-       clk_put(ctx->fimc_clk);
-       clk_put(ctx->wb_clk);
-       clk_put(ctx->wb_b_clk);
-err_ctx:
-       devm_kfree(dev, ctx);
+
        return ret;
 }
 
-static int __devexit fimc_remove(struct platform_device *pdev)
+static int fimc_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct fimc_context *ctx = get_fimc_context(dev);
@@ -1905,14 +1867,6 @@ static int __devexit fimc_remove(struct platform_device *pdev)
        pm_runtime_disable(dev);
 
        free_irq(ctx->irq, ctx);
-       devm_iounmap(dev, ctx->regs);
-
-       clk_put(ctx->sclk_fimc_clk);
-       clk_put(ctx->fimc_clk);
-       clk_put(ctx->wb_clk);
-       clk_put(ctx->wb_b_clk);
-
-       devm_kfree(dev, ctx);
 
        return 0;
 }
@@ -1990,7 +1944,7 @@ static const struct dev_pm_ops fimc_pm_ops = {
 
 struct platform_driver fimc_driver = {
        .probe          = fimc_probe,
-       .remove         = __devexit_p(fimc_remove),
+       .remove         = fimc_remove,
        .id_table       = fimc_driver_ids,
        .driver         = {
                .name   = "exynos-drm-fimc",
index dc970fa0d8886f228edac1ba00ad46338d4fad80..127a424c5fdfb9e5ca7948bdeba607e452f50b1d 100644 (file)
@@ -6,24 +6,10 @@
  *     Jinyoung Jeon <jy0.jeon@samsung.com>
  *     Sangmin Lee <lsmin.lee@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_FIMC_H_
index bf0d9baca2bc2436c077cf62391da74fe2288e83..9537761931ee297fb33c8cf8888a2842b1e4fc1a 100644 (file)
@@ -663,34 +663,6 @@ static struct exynos_drm_manager fimd_manager = {
        .display_ops    = &fimd_display_ops,
 };
 
-static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc)
-{
-       struct exynos_drm_private *dev_priv = drm_dev->dev_private;
-       struct drm_pending_vblank_event *e, *t;
-       struct timeval now;
-       unsigned long flags;
-
-       spin_lock_irqsave(&drm_dev->event_lock, flags);
-
-       list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
-                       base.link) {
-               /* if event's pipe isn't same as crtc then ignore it. */
-               if (crtc != e->pipe)
-                       continue;
-
-               do_gettimeofday(&now);
-               e->event.sequence = 0;
-               e->event.tv_sec = now.tv_sec;
-               e->event.tv_usec = now.tv_usec;
-
-               list_move_tail(&e->base.link, &e->base.file_priv->event_list);
-               wake_up_interruptible(&e->base.file_priv->event_wait);
-               drm_vblank_put(drm_dev, crtc);
-       }
-
-       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
-}
-
 static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
 {
        struct fimd_context *ctx = (struct fimd_context *)dev_id;
@@ -710,7 +682,7 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
                goto out;
 
        drm_handle_vblank(drm_dev, manager->pipe);
-       fimd_finish_pageflip(drm_dev, manager->pipe);
+       exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);
 
        /* set wait vsync event to zero and wake up queue. */
        if (atomic_read(&ctx->wait_vsync_event)) {
@@ -898,7 +870,7 @@ static int fimd_activate(struct fimd_context *ctx, bool enable)
        return 0;
 }
 
-static int __devinit fimd_probe(struct platform_device *pdev)
+static int fimd_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct fimd_context *ctx;
@@ -997,7 +969,7 @@ static int __devinit fimd_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit fimd_remove(struct platform_device *pdev)
+static int fimd_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct fimd_context *ctx = platform_get_drvdata(pdev);
@@ -1046,7 +1018,7 @@ static int fimd_resume(struct device *dev)
         * of pm runtime would still be 1 so in this case, fimd driver
         * should be on directly not drawing on pm runtime interface.
         */
-       if (pm_runtime_suspended(dev)) {
+       if (!pm_runtime_suspended(dev)) {
                int ret;
 
                ret = fimd_activate(ctx, true);
@@ -1105,7 +1077,7 @@ static const struct dev_pm_ops fimd_pm_ops = {
 
 struct platform_driver fimd_driver = {
        .probe          = fimd_probe,
-       .remove         = __devexit_p(fimd_remove),
+       .remove         = fimd_remove,
        .id_table       = fimd_driver_ids,
        .driver         = {
                .name   = "exynos4-fb",
index 6ffa0763c0789e2f36cf0cf9076f4583a0ed03f3..36c3905536a65e824766ec61a385bb44a5f6c3f9 100644 (file)
@@ -1090,7 +1090,7 @@ static void g2d_close(struct drm_device *drm_dev, struct device *dev,
        kfree(file_priv->g2d_priv);
 }
 
-static int __devinit g2d_probe(struct platform_device *pdev)
+static int g2d_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct resource *res;
@@ -1188,7 +1188,7 @@ err_destroy_slab:
        return ret;
 }
 
-static int __devexit g2d_remove(struct platform_device *pdev)
+static int g2d_remove(struct platform_device *pdev)
 {
        struct g2d_data *g2d = platform_get_drvdata(pdev);
 
@@ -1242,7 +1242,7 @@ static SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume);
 
 struct platform_driver g2d_driver = {
        .probe          = g2d_probe,
-       .remove         = __devexit_p(g2d_remove),
+       .remove         = g2d_remove,
        .driver         = {
                .name   = "s5p-g2d",
                .owner  = THIS_MODULE,
index d48183e7e056d56a8932ae06baf1bc172ce02893..4731807765287a35ce2bb5ea087fc6bc3844eac8 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
  * Author: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drm/drmP.h>
index f11f2afd5bfc58254eb0b064535ae4b8131b91c3..35ebac47dc2bacfec928d54001b6065aa9e75564 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
  * Authoer: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_GEM_H_
index 5639353d47b98467c803b36c0b4ca8d0a53c5eec..8140753ec9c824202173e631bfc1f4ba711c9ef7 100644 (file)
@@ -25,7 +25,7 @@
 #include "exynos_drm_gsc.h"
 
 /*
- * GSC is stand for General SCaler and
+ * GSC stands for General SCaler and
  * supports image scaler/rotator and input/output DMA operations.
  * input DMA reads image data from the memory.
  * output DMA writes image data to memory.
@@ -711,7 +711,7 @@ static int gsc_src_set_addr(struct device *dev,
 {
        struct gsc_context *ctx = get_gsc_context(dev);
        struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_property *property;
 
        if (!c_node) {
@@ -720,10 +720,6 @@ static int gsc_src_set_addr(struct device *dev,
        }
 
        property = &c_node->property;
-       if (!property) {
-               DRM_ERROR("failed to get property.\n");
-               return -EFAULT;
-       }
 
        DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,
                property->prop_id, buf_id, buf_type);
@@ -1171,7 +1167,7 @@ static int gsc_dst_set_addr(struct device *dev,
 {
        struct gsc_context *ctx = get_gsc_context(dev);
        struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_property *property;
 
        if (!c_node) {
@@ -1180,10 +1176,6 @@ static int gsc_dst_set_addr(struct device *dev,
        }
 
        property = &c_node->property;
-       if (!property) {
-               DRM_ERROR("failed to get property.\n");
-               return -EFAULT;
-       }
 
        DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]buf_type[%d]\n", __func__,
                property->prop_id, buf_id, buf_type);
@@ -1312,7 +1304,7 @@ static irqreturn_t gsc_irq_handler(int irq, void *dev_id)
 {
        struct gsc_context *ctx = dev_id;
        struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_event_work *event_work =
                c_node->event_work;
        u32 status;
@@ -1399,7 +1391,7 @@ static inline bool gsc_check_drm_flip(enum drm_exynos_flip flip)
        case EXYNOS_DRM_FLIP_NONE:
        case EXYNOS_DRM_FLIP_VERTICAL:
        case EXYNOS_DRM_FLIP_HORIZONTAL:
-       case EXYNOS_DRM_FLIP_VERTICAL | EXYNOS_DRM_FLIP_HORIZONTAL:
+       case EXYNOS_DRM_FLIP_BOTH:
                return true;
        default:
                DRM_DEBUG_KMS("%s:invalid flip\n", __func__);
@@ -1549,7 +1541,7 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)
 {
        struct gsc_context *ctx = get_gsc_context(dev);
        struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_property *property;
        struct drm_exynos_ipp_config *config;
        struct drm_exynos_pos   img_pos[EXYNOS_DRM_OPS_MAX];
@@ -1565,10 +1557,6 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)
        }
 
        property = &c_node->property;
-       if (!property) {
-               DRM_ERROR("failed to get property.\n");
-               return -EINVAL;
-       }
 
        gsc_handle_irq(ctx, true, false, true);
 
@@ -1604,7 +1592,7 @@ static int gsc_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)
                exynos_drm_ippnb_send_event(IPP_SET_WRITEBACK, (void *)&set_wb);
 
                /* src local path */
-               cfg = readl(GSC_IN_CON);
+               cfg = gsc_read(GSC_IN_CON);
                cfg &= ~(GSC_IN_PATH_MASK | GSC_IN_LOCAL_SEL_MASK);
                cfg |= (GSC_IN_PATH_LOCAL | GSC_IN_LOCAL_FIMD_WB);
                gsc_write(cfg, GSC_IN_CON);
@@ -1683,7 +1671,7 @@ static void gsc_ippdrv_stop(struct device *dev, enum drm_exynos_ipp_cmd cmd)
        gsc_write(cfg, GSC_ENABLE);
 }
 
-static int __devinit gsc_probe(struct platform_device *pdev)
+static int gsc_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct gsc_context *ctx;
@@ -1696,34 +1684,25 @@ static int __devinit gsc_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        /* clock control */
-       ctx->gsc_clk = clk_get(dev, "gscl");
+       ctx->gsc_clk = devm_clk_get(dev, "gscl");
        if (IS_ERR(ctx->gsc_clk)) {
                dev_err(dev, "failed to get gsc clock.\n");
-               ret = PTR_ERR(ctx->gsc_clk);
-               goto err_ctx;
+               return PTR_ERR(ctx->gsc_clk);
        }
 
        /* resource memory */
        ctx->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!ctx->regs_res) {
-               dev_err(dev, "failed to find registers.\n");
-               ret = -ENOENT;
-               goto err_clk;
-       }
-
        ctx->regs = devm_request_and_ioremap(dev, ctx->regs_res);
        if (!ctx->regs) {
                dev_err(dev, "failed to map registers.\n");
-               ret = -ENXIO;
-               goto err_clk;
+               return -ENXIO;
        }
 
        /* resource irq */
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!res) {
                dev_err(dev, "failed to request irq resource.\n");
-               ret = -ENOENT;
-               goto err_get_regs;
+               return -ENOENT;
        }
 
        ctx->irq = res->start;
@@ -1731,7 +1710,7 @@ static int __devinit gsc_probe(struct platform_device *pdev)
                IRQF_ONESHOT, "drm_gsc", ctx);
        if (ret < 0) {
                dev_err(dev, "failed to request irq.\n");
-               goto err_get_regs;
+               return ret;
        }
 
        /* context initailization */
@@ -1775,16 +1754,10 @@ err_ippdrv_register:
        pm_runtime_disable(dev);
 err_get_irq:
        free_irq(ctx->irq, ctx);
-err_get_regs:
-       devm_iounmap(dev, ctx->regs);
-err_clk:
-       clk_put(ctx->gsc_clk);
-err_ctx:
-       devm_kfree(dev, ctx);
        return ret;
 }
 
-static int __devexit gsc_remove(struct platform_device *pdev)
+static int gsc_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct gsc_context *ctx = get_gsc_context(dev);
@@ -1798,11 +1771,6 @@ static int __devexit gsc_remove(struct platform_device *pdev)
        pm_runtime_disable(dev);
 
        free_irq(ctx->irq, ctx);
-       devm_iounmap(dev, ctx->regs);
-
-       clk_put(ctx->gsc_clk);
-
-       devm_kfree(dev, ctx);
 
        return 0;
 }
@@ -1860,7 +1828,7 @@ static const struct dev_pm_ops gsc_pm_ops = {
 
 struct platform_driver gsc_driver = {
        .probe          = gsc_probe,
-       .remove         = __devexit_p(gsc_remove),
+       .remove         = gsc_remove,
        .driver         = {
                .name   = "exynos-drm-gsc",
                .owner  = THIS_MODULE,
index b3c3bc618c0f24d7ca21315ecb7b97477e800477..29ec1c5efcf2913cbb44e1fda3e9a830be0d2192 100644 (file)
@@ -6,24 +6,10 @@
  *     Jinyoung Jeon <jy0.jeon@samsung.com>
  *     Sangmin Lee <lsmin.lee@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_GSC_H_
index 55793c46e3c21c3c0e86125aa51a29f77382b14e..850e9950b7da06c44d7fddaed4afdee812ce88ac 100644 (file)
@@ -385,7 +385,7 @@ static void hdmi_subdrv_remove(struct drm_device *drm_dev, struct device *dev)
                mixer_ops->iommu_on(ctx->mixer_ctx->ctx, false);
 }
 
-static int __devinit exynos_drm_hdmi_probe(struct platform_device *pdev)
+static int exynos_drm_hdmi_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct exynos_drm_subdrv *subdrv;
@@ -413,7 +413,7 @@ static int __devinit exynos_drm_hdmi_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit exynos_drm_hdmi_remove(struct platform_device *pdev)
+static int exynos_drm_hdmi_remove(struct platform_device *pdev)
 {
        struct drm_hdmi_context *ctx = platform_get_drvdata(pdev);
 
@@ -426,7 +426,7 @@ static int __devexit exynos_drm_hdmi_remove(struct platform_device *pdev)
 
 struct platform_driver exynos_drm_common_hdmi_driver = {
        .probe          = exynos_drm_hdmi_probe,
-       .remove         = __devexit_p(exynos_drm_hdmi_remove),
+       .remove         = exynos_drm_hdmi_remove,
        .driver         = {
                .name   = "exynos-drm-hdmi",
                .owner  = THIS_MODULE,
index fcc3093ec8fe3f488379e8880e194037784c56b3..784a7e9a766c4a178e2f73e628e63adce5f6c364 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
  * Authoer: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_HDMI_H_
index 2482b7f96341ac196c98e10eeed359dcdc0d70ea..3799d5c2b5df746590b2952ed1a93fce2910e085 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  * Author: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #include <drmP.h>
index 18a0ca190b98426e7922777fecc1ab6c270ef51a..53b7deea8ab768e5b351124bf9b5968eef1e09ec 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  * Authoer: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_IOMMU_H_
index 49eebe948ed2d3f2c4759e23bfc897257dfd57c7..0bda96454a02fe6e8cf31ced93c37249355a5f99 100644 (file)
@@ -27,7 +27,7 @@
 #include "exynos_drm_iommu.h"
 
 /*
- * IPP is stand for Image Post Processing and
+ * IPP stands for Image Post Processing and
  * supports image scaler/rotator and input/output DMA operations.
  * using FIMC, GSC, Rotator, so on.
  * IPP is integration device driver of same attribute h/w
@@ -1292,7 +1292,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv,
        DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id);
 
        /* store command info in ippdrv */
-       ippdrv->cmd = c_node;
+       ippdrv->c_node = c_node;
 
        if (!ipp_check_mem_list(c_node)) {
                DRM_DEBUG_KMS("%s:empty memory.\n", __func__);
@@ -1303,7 +1303,7 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv,
        ret = ipp_set_property(ippdrv, property);
        if (ret) {
                DRM_ERROR("failed to set property.\n");
-               ippdrv->cmd = NULL;
+               ippdrv->c_node = NULL;
                return ret;
        }
 
@@ -1487,11 +1487,6 @@ void ipp_sched_cmd(struct work_struct *work)
        mutex_lock(&c_node->cmd_lock);
 
        property = &c_node->property;
-       if (!property) {
-               DRM_ERROR("failed to get property:prop_id[%d]\n",
-                       c_node->property.prop_id);
-               goto err_unlock;
-       }
 
        switch (cmd_work->ctrl) {
        case IPP_CTRL_PLAY:
@@ -1704,7 +1699,7 @@ void ipp_sched_event(struct work_struct *work)
                return;
        }
 
-       c_node = ippdrv->cmd;
+       c_node = ippdrv->c_node;
        if (!c_node) {
                DRM_ERROR("failed to get command node.\n");
                return;
@@ -1888,14 +1883,14 @@ err_clear:
        return;
 }
 
-static int __devinit ipp_probe(struct platform_device *pdev)
+static int ipp_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct ipp_context *ctx;
        struct exynos_drm_subdrv *subdrv;
        int ret;
 
-       ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+       ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
        if (!ctx)
                return -ENOMEM;
 
@@ -1916,8 +1911,7 @@ static int __devinit ipp_probe(struct platform_device *pdev)
        ctx->event_workq = create_singlethread_workqueue("ipp_event");
        if (!ctx->event_workq) {
                dev_err(dev, "failed to create event workqueue\n");
-               ret = -EINVAL;
-               goto err_clear;
+               return -EINVAL;
        }
 
        /*
@@ -1958,12 +1952,10 @@ err_cmd_workq:
        destroy_workqueue(ctx->cmd_workq);
 err_event_workq:
        destroy_workqueue(ctx->event_workq);
-err_clear:
-       kfree(ctx);
        return ret;
 }
 
-static int __devexit ipp_remove(struct platform_device *pdev)
+static int ipp_remove(struct platform_device *pdev)
 {
        struct ipp_context *ctx = platform_get_drvdata(pdev);
 
@@ -1985,8 +1977,6 @@ static int __devexit ipp_remove(struct platform_device *pdev)
        destroy_workqueue(ctx->cmd_workq);
        destroy_workqueue(ctx->event_workq);
 
-       kfree(ctx);
-
        return 0;
 }
 
@@ -2050,7 +2040,7 @@ static const struct dev_pm_ops ipp_pm_ops = {
 
 struct platform_driver ipp_driver = {
        .probe          = ipp_probe,
-       .remove         = __devexit_p(ipp_remove),
+       .remove         = ipp_remove,
        .driver         = {
                .name   = "exynos-drm-ipp",
                .owner  = THIS_MODULE,
index 28ffac95386cf0f8624987d57f99943232e4d335..4cadbea7dbde9d71b2011ae012b0e4c9b0b11ce3 100644 (file)
@@ -6,24 +6,10 @@
  *     Jinyoung Jeon <jy0.jeon@samsung.com>
  *     Sangmin Lee <lsmin.lee@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_IPP_H_
@@ -160,7 +146,7 @@ struct exynos_drm_ipp_ops {
  * @dedicated: dedicated ipp device.
  * @ops: source, destination operations.
  * @event_workq: event work queue.
- * @cmd: current command information.
+ * @c_node: current command information.
  * @cmd_list: list head for command information.
  * @prop_list: property informations of current ipp driver.
  * @check_property: check property about format, size, buffer.
@@ -178,7 +164,7 @@ struct exynos_drm_ippdrv {
        bool    dedicated;
        struct exynos_drm_ipp_ops       *ops[EXYNOS_DRM_OPS_MAX];
        struct workqueue_struct *event_workq;
-       struct drm_exynos_ipp_cmd_node *cmd;
+       struct drm_exynos_ipp_cmd_node *c_node;
        struct list_head        cmd_list;
        struct drm_exynos_ipp_prop_list *prop_list;
 
index 1c2366083c70e738a95b9ef0bd4369f2d4148fda..e9e83ef688f0c3a4ccf0253154975eebddb1d378 100644 (file)
@@ -139,7 +139,7 @@ static irqreturn_t rotator_irq_handler(int irq, void *arg)
 {
        struct rot_context *rot = arg;
        struct exynos_drm_ippdrv *ippdrv = &rot->ippdrv;
-       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->cmd;
+       struct drm_exynos_ipp_cmd_node *c_node = ippdrv->c_node;
        struct drm_exynos_ipp_event_work *event_work = c_node->event_work;
        enum rot_irq_status irq_status;
        u32 val;
@@ -513,6 +513,7 @@ static inline bool rotator_check_drm_flip(enum drm_exynos_flip flip)
        case EXYNOS_DRM_FLIP_NONE:
        case EXYNOS_DRM_FLIP_VERTICAL:
        case EXYNOS_DRM_FLIP_HORIZONTAL:
+       case EXYNOS_DRM_FLIP_BOTH:
                return true;
        default:
                DRM_DEBUG_KMS("%s:invalid flip\n", __func__);
@@ -638,7 +639,7 @@ static int rotator_ippdrv_start(struct device *dev, enum drm_exynos_ipp_cmd cmd)
        return 0;
 }
 
-static int __devinit rotator_probe(struct platform_device *pdev)
+static int rotator_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct rot_context *rot;
@@ -655,34 +656,26 @@ static int __devinit rotator_probe(struct platform_device *pdev)
                                platform_get_device_id(pdev)->driver_data;
 
        rot->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!rot->regs_res) {
-               dev_err(dev, "failed to find registers\n");
-               ret = -ENOENT;
-               goto err_get_resource;
-       }
-
        rot->regs = devm_request_and_ioremap(dev, rot->regs_res);
        if (!rot->regs) {
                dev_err(dev, "failed to map register\n");
-               ret = -ENXIO;
-               goto err_get_resource;
+               return -ENXIO;
        }
 
        rot->irq = platform_get_irq(pdev, 0);
        if (rot->irq < 0) {
                dev_err(dev, "failed to get irq\n");
-               ret = rot->irq;
-               goto err_get_irq;
+               return rot->irq;
        }
 
        ret = request_threaded_irq(rot->irq, NULL, rotator_irq_handler,
                        IRQF_ONESHOT, "drm_rotator", rot);
        if (ret < 0) {
                dev_err(dev, "failed to request irq\n");
-               goto err_get_irq;
+               return ret;
        }
 
-       rot->clock = clk_get(dev, "rotator");
+       rot->clock = devm_clk_get(dev, "rotator");
        if (IS_ERR_OR_NULL(rot->clock)) {
                dev_err(dev, "failed to get clock\n");
                ret = PTR_ERR(rot->clock);
@@ -720,17 +713,12 @@ static int __devinit rotator_probe(struct platform_device *pdev)
 err_ippdrv_register:
        devm_kfree(dev, ippdrv->prop_list);
        pm_runtime_disable(dev);
-       clk_put(rot->clock);
 err_clk_get:
        free_irq(rot->irq, rot);
-err_get_irq:
-       devm_iounmap(dev, rot->regs);
-err_get_resource:
-       devm_kfree(dev, rot);
        return ret;
 }
 
-static int __devexit rotator_remove(struct platform_device *pdev)
+static int rotator_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct rot_context *rot = dev_get_drvdata(dev);
@@ -740,12 +728,8 @@ static int __devexit rotator_remove(struct platform_device *pdev)
        exynos_drm_ippdrv_unregister(ippdrv);
 
        pm_runtime_disable(dev);
-       clk_put(rot->clock);
 
        free_irq(rot->irq, rot);
-       devm_iounmap(dev, rot->regs);
-
-       devm_kfree(dev, rot);
 
        return 0;
 }
@@ -845,7 +829,7 @@ static const struct dev_pm_ops rotator_pm_ops = {
 
 struct platform_driver rotator_driver = {
        .probe          = rotator_probe,
-       .remove         = __devexit_p(rotator_remove),
+       .remove         = rotator_remove,
        .id_table       = rotator_driver_ids,
        .driver         = {
                .name   = "exynos-rot",
index a2d7a14a52b60dd96f4210e98346d402e00d9460..71a0b4c0c1e897ea1191a4ee06caef787f175eb1 100644 (file)
@@ -5,24 +5,10 @@
  *     YoungJun Cho <yj44.cho@samsung.com>
  *     Eunchul Kim <chulspro.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef        _EXYNOS_DRM_ROTATOR_H_
index 99bfc38dfaa2944b849517f24463d6340ae1d9e5..d0ca3c4e06c60bbeca05e87b783d1e7e4b690f16 100644 (file)
@@ -372,34 +372,6 @@ static struct exynos_drm_manager vidi_manager = {
        .display_ops    = &vidi_display_ops,
 };
 
-static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc)
-{
-       struct exynos_drm_private *dev_priv = drm_dev->dev_private;
-       struct drm_pending_vblank_event *e, *t;
-       struct timeval now;
-       unsigned long flags;
-
-       spin_lock_irqsave(&drm_dev->event_lock, flags);
-
-       list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
-                       base.link) {
-               /* if event's pipe isn't same as crtc then ignore it. */
-               if (crtc != e->pipe)
-                       continue;
-
-               do_gettimeofday(&now);
-               e->event.sequence = 0;
-               e->event.tv_sec = now.tv_sec;
-               e->event.tv_usec = now.tv_usec;
-
-               list_move_tail(&e->base.link, &e->base.file_priv->event_list);
-               wake_up_interruptible(&e->base.file_priv->event_wait);
-               drm_vblank_put(drm_dev, crtc);
-       }
-
-       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
-}
-
 static void vidi_fake_vblank_handler(struct work_struct *work)
 {
        struct vidi_context *ctx = container_of(work, struct vidi_context,
@@ -424,7 +396,7 @@ static void vidi_fake_vblank_handler(struct work_struct *work)
 
        mutex_unlock(&ctx->lock);
 
-       vidi_finish_pageflip(subdrv->drm_dev, manager->pipe);
+       exynos_drm_crtc_finish_pageflip(subdrv->drm_dev, manager->pipe);
 }
 
 static int vidi_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
@@ -609,7 +581,7 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
        return 0;
 }
 
-static int __devinit vidi_probe(struct platform_device *pdev)
+static int vidi_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct vidi_context *ctx;
@@ -645,7 +617,7 @@ static int __devinit vidi_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit vidi_remove(struct platform_device *pdev)
+static int vidi_remove(struct platform_device *pdev)
 {
        struct vidi_context *ctx = platform_get_drvdata(pdev);
 
@@ -683,7 +655,7 @@ static const struct dev_pm_ops vidi_pm_ops = {
 
 struct platform_driver vidi_driver = {
        .probe          = vidi_probe,
-       .remove         = __devexit_p(vidi_remove),
+       .remove         = vidi_remove,
        .driver         = {
                .name   = "exynos-drm-vidi",
                .owner  = THIS_MODULE,
index a4babe4e65d701f8dab8b71a2562b6bbdb6fe104..1e5fdaa36ccc203e4b91daa588895283ea1468bb 100644 (file)
@@ -3,24 +3,10 @@
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  * Author: Inki Dae <inki.dae@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_DRM_VIDI_H_
index 2c46b6c0b82cf991e1a489c98389566ea5ae6f8a..41ff79d8ac8ec27db3f4b5cd3edadb0d86dde241 100644 (file)
@@ -2305,7 +2305,7 @@ static irqreturn_t hdmi_internal_irq_thread(int irq, void *arg)
        return IRQ_HANDLED;
 }
 
-static int __devinit hdmi_resources_init(struct hdmi_context *hdata)
+static int hdmi_resources_init(struct hdmi_context *hdata)
 {
        struct device *dev = hdata->dev;
        struct hdmi_resources *res = &hdata->res;
@@ -2451,7 +2451,7 @@ static struct of_device_id hdmi_match_types[] = {
 };
 #endif
 
-static int __devinit hdmi_probe(struct platform_device *pdev)
+static int hdmi_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct exynos_drm_hdmi_context *drm_hdmi_ctx;
@@ -2607,7 +2607,7 @@ err_ddc:
        return ret;
 }
 
-static int __devexit hdmi_remove(struct platform_device *pdev)
+static int hdmi_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct exynos_drm_hdmi_context *ctx = platform_get_drvdata(pdev);
@@ -2708,7 +2708,7 @@ static const struct dev_pm_ops hdmi_pm_ops = {
 
 struct platform_driver hdmi_driver = {
        .probe          = hdmi_probe,
-       .remove         = __devexit_p(hdmi_remove),
+       .remove         = hdmi_remove,
        .id_table = hdmi_driver_types,
        .driver         = {
                .name   = "exynos-hdmi",
index 1c3b6d8f1fe796fac9d9b37bd341f703e740861f..0ddf3957de15943855b8bc4b2fa56c415f22520a 100644 (file)
@@ -5,24 +5,10 @@
  *     Inki Dae <inki.dae@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _EXYNOS_HDMI_H_
index 6206056f4a3328b7b4e5e58b78e64140a0b32bcc..ea49d132ecf66f2696d3673f3df1dfa09d2cfbaa 100644 (file)
@@ -64,7 +64,7 @@ struct i2c_driver hdmiphy_driver = {
        },
        .id_table = hdmiphy_id,
        .probe          = hdmiphy_probe,
-       .remove         = __devexit_p(hdmiphy_remove),
+       .remove         = hdmiphy_remove,
        .command                = NULL,
 };
 EXPORT_SYMBOL(hdmiphy_driver);
index 21db89530fc77b603ed45fe6109b6b67059f3430..c187ea33b748c031b91d10e45479d98368b297f6 100644 (file)
@@ -35,6 +35,7 @@
 #include <drm/exynos_drm.h>
 
 #include "exynos_drm_drv.h"
+#include "exynos_drm_crtc.h"
 #include "exynos_drm_hdmi.h"
 #include "exynos_drm_iommu.h"
 
@@ -949,35 +950,6 @@ static struct exynos_mixer_ops mixer_ops = {
        .win_disable            = mixer_win_disable,
 };
 
-/* for pageflip event */
-static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc)
-{
-       struct exynos_drm_private *dev_priv = drm_dev->dev_private;
-       struct drm_pending_vblank_event *e, *t;
-       struct timeval now;
-       unsigned long flags;
-
-       spin_lock_irqsave(&drm_dev->event_lock, flags);
-
-       list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list,
-                       base.link) {
-               /* if event's pipe isn't same as crtc then ignore it. */
-               if (crtc != e->pipe)
-                       continue;
-
-               do_gettimeofday(&now);
-               e->event.sequence = 0;
-               e->event.tv_sec = now.tv_sec;
-               e->event.tv_usec = now.tv_usec;
-
-               list_move_tail(&e->base.link, &e->base.file_priv->event_list);
-               wake_up_interruptible(&e->base.file_priv->event_wait);
-               drm_vblank_put(drm_dev, crtc);
-       }
-
-       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
-}
-
 static irqreturn_t mixer_irq_handler(int irq, void *arg)
 {
        struct exynos_drm_hdmi_context *drm_hdmi_ctx = arg;
@@ -1006,7 +978,8 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg)
                }
 
                drm_handle_vblank(drm_hdmi_ctx->drm_dev, ctx->pipe);
-               mixer_finish_pageflip(drm_hdmi_ctx->drm_dev, ctx->pipe);
+               exynos_drm_crtc_finish_pageflip(drm_hdmi_ctx->drm_dev,
+                               ctx->pipe);
 
                /* set wait vsync event to zero and wake up queue. */
                if (atomic_read(&ctx->wait_vsync_event)) {
@@ -1029,8 +1002,8 @@ out:
        return IRQ_HANDLED;
 }
 
-static int __devinit mixer_resources_init(struct exynos_drm_hdmi_context *ctx,
-                                struct platform_device *pdev)
+static int mixer_resources_init(struct exynos_drm_hdmi_context *ctx,
+                               struct platform_device *pdev)
 {
        struct mixer_context *mixer_ctx = ctx->ctx;
        struct device *dev = &pdev->dev;
@@ -1081,8 +1054,8 @@ static int __devinit mixer_resources_init(struct exynos_drm_hdmi_context *ctx,
        return 0;
 }
 
-static int __devinit vp_resources_init(struct exynos_drm_hdmi_context *ctx,
-                                struct platform_device *pdev)
+static int vp_resources_init(struct exynos_drm_hdmi_context *ctx,
+                            struct platform_device *pdev)
 {
        struct mixer_context *mixer_ctx = ctx->ctx;
        struct device *dev = &pdev->dev;
@@ -1155,7 +1128,7 @@ static struct of_device_id mixer_match_types[] = {
        }
 };
 
-static int __devinit mixer_probe(struct platform_device *pdev)
+static int mixer_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct exynos_drm_hdmi_context *drm_hdmi_ctx;
@@ -1316,6 +1289,6 @@ struct platform_driver mixer_driver = {
                .of_match_table = mixer_match_types,
        },
        .probe = mixer_probe,
-       .remove = __devexit_p(mixer_remove),
+       .remove = mixer_remove,
        .id_table       = mixer_driver_types,
 };
index 4a07ab5961745f1af3bd7d2cfd8c1f70a1d7d4f0..771ff66711af78efd79f8b41c2e2a28be2f26cdf 100644 (file)
@@ -700,7 +700,7 @@ static struct i2c_driver tc35876x_bridge_i2c_driver = {
        },
        .id_table = tc35876x_bridge_id,
        .probe = tc35876x_bridge_probe,
-       .remove = __devexit_p(tc35876x_bridge_remove),
+       .remove = tc35876x_bridge_remove,
 };
 
 /* LCD panel I2C */
@@ -741,7 +741,7 @@ static struct i2c_driver cmi_lcd_i2c_driver = {
        },
        .id_table = cmi_lcd_i2c_id,
        .probe = cmi_lcd_i2c_probe,
-       .remove = __devexit_p(cmi_lcd_i2c_remove),
+       .remove = cmi_lcd_i2c_remove,
 };
 
 /* HACK to create I2C device while it's not created by platform code */
index 8f63cd5de4b445cd247dddf078af7dc8686d49a5..99daa896105d0b221d084ab1ed4b0c839983dcdd 100644 (file)
@@ -989,6 +989,9 @@ static int i915_getparam(struct drm_device *dev, void *data,
        case I915_PARAM_HAS_SECURE_BATCHES:
                value = capable(CAP_SYS_ADMIN);
                break;
+       case I915_PARAM_HAS_PINNED_BATCHES:
+               value = 1;
+               break;
        default:
                DRM_DEBUG_DRIVER("Unknown parameter %d\n",
                                 param->param);
index 530db83ef32018ac3807dcb89fa88bfe1fac665f..117265840b1ff2fcbd845c618acf8d3b592cd4a5 100644 (file)
@@ -877,8 +877,7 @@ int i915_reset(struct drm_device *dev)
        return 0;
 }
 
-static int __devinit
-i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct intel_device_info *intel_info =
                (struct intel_device_info *) ent->driver_data;
index 557843dd4b2eeedcf1225999b40917a7011fb20a..ed3059575576c4ea869c462e15e61463b4237f0f 100644 (file)
@@ -780,6 +780,7 @@ typedef struct drm_i915_private {
                struct i915_hw_ppgtt *aliasing_ppgtt;
 
                struct shrinker inactive_shrinker;
+               bool shrinker_no_lock_stealing;
 
                /**
                 * List of objects currently involved in rendering.
@@ -1100,6 +1101,7 @@ struct drm_i915_gem_object {
         */
        atomic_t pending_flip;
 };
+#define to_gem_object(obj) (&((struct drm_i915_gem_object *)(obj))->base)
 
 #define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base)
 
@@ -1166,6 +1168,9 @@ struct drm_i915_file_private {
 #define IS_IVB_GT1(dev)                ((dev)->pci_device == 0x0156 || \
                                 (dev)->pci_device == 0x0152 || \
                                 (dev)->pci_device == 0x015a)
+#define IS_SNB_GT1(dev)                ((dev)->pci_device == 0x0102 || \
+                                (dev)->pci_device == 0x0106 || \
+                                (dev)->pci_device == 0x010A)
 #define IS_VALLEYVIEW(dev)     (INTEL_INFO(dev)->is_valleyview)
 #define IS_HASWELL(dev)        (INTEL_INFO(dev)->is_haswell)
 #define IS_MOBILE(dev)         (INTEL_INFO(dev)->is_mobile)
@@ -1196,6 +1201,9 @@ struct drm_i915_file_private {
 #define HAS_OVERLAY(dev)               (INTEL_INFO(dev)->has_overlay)
 #define OVERLAY_NEEDS_PHYSICAL(dev)    (INTEL_INFO(dev)->overlay_needs_physical)
 
+/* Early gen2 have a totally busted CS tlb and require pinned batches. */
+#define HAS_BROKEN_CS_TLB(dev)         (IS_I830(dev) || IS_845G(dev))
+
 /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte
  * rows, which changed the alignment requirements and fence programming.
  */
index 742206e45103c508bd9c2d9ebac2281e704d5ff2..8febea6daa0840b08f8aae13418b859204b7bc2d 100644 (file)
@@ -1517,9 +1517,11 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
        if (obj->base.map_list.map)
                return 0;
 
+       dev_priv->mm.shrinker_no_lock_stealing = true;
+
        ret = drm_gem_create_mmap_offset(&obj->base);
        if (ret != -ENOSPC)
-               return ret;
+               goto out;
 
        /* Badly fragmented mmap space? The only way we can recover
         * space is by destroying unwanted objects. We can't randomly release
@@ -1531,10 +1533,14 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
        i915_gem_purge(dev_priv, obj->base.size >> PAGE_SHIFT);
        ret = drm_gem_create_mmap_offset(&obj->base);
        if (ret != -ENOSPC)
-               return ret;
+               goto out;
 
        i915_gem_shrink_all(dev_priv);
-       return drm_gem_create_mmap_offset(&obj->base);
+       ret = drm_gem_create_mmap_offset(&obj->base);
+out:
+       dev_priv->mm.shrinker_no_lock_stealing = false;
+
+       return ret;
 }
 
 static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj)
@@ -1711,7 +1717,8 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
 }
 
 static long
-i915_gem_purge(struct drm_i915_private *dev_priv, long target)
+__i915_gem_shrink(struct drm_i915_private *dev_priv, long target,
+                 bool purgeable_only)
 {
        struct drm_i915_gem_object *obj, *next;
        long count = 0;
@@ -1719,7 +1726,7 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target)
        list_for_each_entry_safe(obj, next,
                                 &dev_priv->mm.unbound_list,
                                 gtt_list) {
-               if (i915_gem_object_is_purgeable(obj) &&
+               if ((i915_gem_object_is_purgeable(obj) || !purgeable_only) &&
                    i915_gem_object_put_pages(obj) == 0) {
                        count += obj->base.size >> PAGE_SHIFT;
                        if (count >= target)
@@ -1730,7 +1737,7 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target)
        list_for_each_entry_safe(obj, next,
                                 &dev_priv->mm.inactive_list,
                                 mm_list) {
-               if (i915_gem_object_is_purgeable(obj) &&
+               if ((i915_gem_object_is_purgeable(obj) || !purgeable_only) &&
                    i915_gem_object_unbind(obj) == 0 &&
                    i915_gem_object_put_pages(obj) == 0) {
                        count += obj->base.size >> PAGE_SHIFT;
@@ -1742,6 +1749,12 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target)
        return count;
 }
 
+static long
+i915_gem_purge(struct drm_i915_private *dev_priv, long target)
+{
+       return __i915_gem_shrink(dev_priv, target, true);
+}
+
 static void
 i915_gem_shrink_all(struct drm_i915_private *dev_priv)
 {
@@ -2890,7 +2903,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
 {
        struct drm_device *dev = obj->base.dev;
        drm_i915_private_t *dev_priv = dev->dev_private;
-       struct drm_mm_node *free_space;
+       struct drm_mm_node *node;
        u32 size, fence_size, fence_alignment, unfenced_alignment;
        bool mappable, fenceable;
        int ret;
@@ -2936,66 +2949,54 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
 
        i915_gem_object_pin_pages(obj);
 
+       node = kzalloc(sizeof(*node), GFP_KERNEL);
+       if (node == NULL) {
+               i915_gem_object_unpin_pages(obj);
+               return -ENOMEM;
+       }
+
  search_free:
        if (map_and_fenceable)
-               free_space = drm_mm_search_free_in_range_color(&dev_priv->mm.gtt_space,
-                                                              size, alignment, obj->cache_level,
-                                                              0, dev_priv->mm.gtt_mappable_end,
-                                                              false);
+               ret = drm_mm_insert_node_in_range_generic(&dev_priv->mm.gtt_space, node,
+                                                         size, alignment, obj->cache_level,
+                                                         0, dev_priv->mm.gtt_mappable_end);
        else
-               free_space = drm_mm_search_free_color(&dev_priv->mm.gtt_space,
-                                                     size, alignment, obj->cache_level,
-                                                     false);
-
-       if (free_space != NULL) {
-               if (map_and_fenceable)
-                       free_space =
-                               drm_mm_get_block_range_generic(free_space,
-                                                              size, alignment, obj->cache_level,
-                                                              0, dev_priv->mm.gtt_mappable_end,
-                                                              false);
-               else
-                       free_space =
-                               drm_mm_get_block_generic(free_space,
-                                                        size, alignment, obj->cache_level,
-                                                        false);
-       }
-       if (free_space == NULL) {
+               ret = drm_mm_insert_node_generic(&dev_priv->mm.gtt_space, node,
+                                                size, alignment, obj->cache_level);
+       if (ret) {
                ret = i915_gem_evict_something(dev, size, alignment,
                                               obj->cache_level,
                                               map_and_fenceable,
                                               nonblocking);
-               if (ret) {
-                       i915_gem_object_unpin_pages(obj);
-                       return ret;
-               }
+               if (ret == 0)
+                       goto search_free;
 
-               goto search_free;
+               i915_gem_object_unpin_pages(obj);
+               kfree(node);
+               return ret;
        }
-       if (WARN_ON(!i915_gem_valid_gtt_space(dev,
-                                             free_space,
-                                             obj->cache_level))) {
+       if (WARN_ON(!i915_gem_valid_gtt_space(dev, node, obj->cache_level))) {
                i915_gem_object_unpin_pages(obj);
-               drm_mm_put_block(free_space);
+               drm_mm_put_block(node);
                return -EINVAL;
        }
 
        ret = i915_gem_gtt_prepare_object(obj);
        if (ret) {
                i915_gem_object_unpin_pages(obj);
-               drm_mm_put_block(free_space);
+               drm_mm_put_block(node);
                return ret;
        }
 
        list_move_tail(&obj->gtt_list, &dev_priv->mm.bound_list);
        list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
 
-       obj->gtt_space = free_space;
-       obj->gtt_offset = free_space->start;
+       obj->gtt_space = node;
+       obj->gtt_offset = node->start;
 
        fenceable =
-               free_space->size == fence_size &&
-               (free_space->start & (fence_alignment - 1)) == 0;
+               node->size == fence_size &&
+               (node->start & (fence_alignment - 1)) == 0;
 
        mappable =
                obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end;
@@ -3528,14 +3529,15 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data,
                goto out;
        }
 
-       obj->user_pin_count++;
-       obj->pin_filp = file;
-       if (obj->user_pin_count == 1) {
+       if (obj->user_pin_count == 0) {
                ret = i915_gem_object_pin(obj, args->alignment, true, false);
                if (ret)
                        goto out;
        }
 
+       obj->user_pin_count++;
+       obj->pin_filp = file;
+
        /* XXX - flush the CPU caches for pinned objects
         * as the X server doesn't manage domains yet
         */
@@ -4392,11 +4394,17 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)
                if (!mutex_is_locked_by(&dev->struct_mutex, current))
                        return 0;
 
+               if (dev_priv->mm.shrinker_no_lock_stealing)
+                       return 0;
+
                unlock = false;
        }
 
        if (nr_to_scan) {
                nr_to_scan -= i915_gem_purge(dev_priv, nr_to_scan);
+               if (nr_to_scan > 0)
+                       nr_to_scan -= __i915_gem_shrink(dev_priv, nr_to_scan,
+                                                       false);
                if (nr_to_scan > 0)
                        i915_gem_shrink_all(dev_priv);
        }
@@ -4405,7 +4413,7 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)
        list_for_each_entry(obj, &dev_priv->mm.unbound_list, gtt_list)
                if (obj->pages_pin_count == 0)
                        cnt += obj->base.size >> PAGE_SHIFT;
-       list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list)
+       list_for_each_entry(obj, &dev_priv->mm.inactive_list, gtt_list)
                if (obj->pin_count == 0 && obj->pages_pin_count == 0)
                        cnt += obj->base.size >> PAGE_SHIFT;
 
index 773ef77b6c22cc047af54ba70dd491039d7473c0..abeaafef6d7ef9986313be7ab8e0c2c5a992c065 100644 (file)
@@ -226,7 +226,7 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
 {
        struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
 
-       return dma_buf_export(obj, &i915_dmabuf_ops, obj->base.size, 0600);
+       return dma_buf_export(obj, &i915_dmabuf_ops, obj->base.size, flags);
 }
 
 static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
@@ -266,7 +266,12 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
                obj = dma_buf->priv;
                /* is it from our device? */
                if (obj->base.dev == dev) {
+                       /*
+                        * Importing dmabuf exported from out own gem increases
+                        * refcount on gem itself instead of f_count of dmabuf.
+                        */
                        drm_gem_object_reference(&obj->base);
+                       dma_buf_put(dma_buf);
                        return &obj->base;
                }
        }
index ee8f97f0539ec6fb8a8392378219ebaa1f91d3bb..d6a994a07393677fb5b4fd6edb868cf7bd460cbe 100644 (file)
@@ -808,6 +808,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
 
                flags |= I915_DISPATCH_SECURE;
        }
+       if (args->flags & I915_EXEC_IS_PINNED)
+               flags |= I915_DISPATCH_PINNED;
 
        switch (args->flags & I915_EXEC_RING_MASK) {
        case I915_EXEC_DEFAULT:
index a4dc97f8b9f0f7d08fd0c2525e039d9893d76735..2220dec3e5d983eb9f730d95011e7eb2ebd82adc 100644 (file)
@@ -1087,6 +1087,18 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
        if (!ring->get_seqno)
                return NULL;
 
+       if (HAS_BROKEN_CS_TLB(dev_priv->dev)) {
+               u32 acthd = I915_READ(ACTHD);
+
+               if (WARN_ON(ring->id != RCS))
+                       return NULL;
+
+               obj = ring->private;
+               if (acthd >= obj->gtt_offset &&
+                   acthd < obj->gtt_offset + obj->base.size)
+                       return i915_error_object_create(dev_priv, obj);
+       }
+
        seqno = ring->get_seqno(ring, false);
        list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
                if (obj->ring != ring)
index 3f75cfaf1c3f2df48e9955e95445fb8b4ab78f62..186ee5c85b516592d2c83c8cac8cb2142121e993 100644 (file)
  * the enables for writing to the corresponding low bit.
  */
 #define _3D_CHICKEN    0x02084
+#define  _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB     (1 << 10)
 #define _3D_CHICKEN2   0x0208c
 /* Disables pipelining of read flushes past the SF-WIZ interface.
  * Required on all Ironlake steppings according to the B-Spec, but the
 # define MI_FLUSH_ENABLE                               (1 << 12)
 
 #define GEN6_GT_MODE   0x20d0
-#define   GEN6_GT_MODE_HI      (1 << 9)
+#define   GEN6_GT_MODE_HI                              (1 << 9)
+#define   GEN6_TD_FOUR_ROW_DISPATCH_DISABLE            (1 << 5)
 
 #define GFX_MODE       0x02520
 #define GFX_MODE_GEN7  0x0229c
index 5d127e0689501e225316424a242b726c20ca6376..da1ad9c80bb53722e7afd423b27a819f31ff6927 100644 (file)
@@ -8144,10 +8144,6 @@ intel_modeset_stage_output_state(struct drm_device *dev,
                        DRM_DEBUG_KMS("encoder changed, full mode switch\n");
                        config->mode_changed = true;
                }
-
-               /* Disable all disconnected encoders. */
-               if (connector->base.status == connector_status_disconnected)
-                       connector->new_encoder = NULL;
        }
        /* connector->new_encoder is now updated for all connectors. */
 
@@ -8602,19 +8598,30 @@ int intel_framebuffer_init(struct drm_device *dev,
 {
        int ret;
 
-       if (obj->tiling_mode == I915_TILING_Y)
+       if (obj->tiling_mode == I915_TILING_Y) {
+               DRM_DEBUG("hardware does not support tiling Y\n");
                return -EINVAL;
+       }
 
-       if (mode_cmd->pitches[0] & 63)
+       if (mode_cmd->pitches[0] & 63) {
+               DRM_DEBUG("pitch (%d) must be at least 64 byte aligned\n",
+                         mode_cmd->pitches[0]);
                return -EINVAL;
+       }
 
        /* FIXME <= Gen4 stride limits are bit unclear */
-       if (mode_cmd->pitches[0] > 32768)
+       if (mode_cmd->pitches[0] > 32768) {
+               DRM_DEBUG("pitch (%d) must be at less than 32768\n",
+                         mode_cmd->pitches[0]);
                return -EINVAL;
+       }
 
        if (obj->tiling_mode != I915_TILING_NONE &&
-           mode_cmd->pitches[0] != obj->stride)
+           mode_cmd->pitches[0] != obj->stride) {
+               DRM_DEBUG("pitch (%d) must match tiling stride (%d)\n",
+                         mode_cmd->pitches[0], obj->stride);
                return -EINVAL;
+       }
 
        /* Reject formats not supported by any plane early. */
        switch (mode_cmd->pixel_format) {
@@ -8625,8 +8632,10 @@ int intel_framebuffer_init(struct drm_device *dev,
                break;
        case DRM_FORMAT_XRGB1555:
        case DRM_FORMAT_ARGB1555:
-               if (INTEL_INFO(dev)->gen > 3)
+               if (INTEL_INFO(dev)->gen > 3) {
+                       DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);
                        return -EINVAL;
+               }
                break;
        case DRM_FORMAT_XBGR8888:
        case DRM_FORMAT_ABGR8888:
@@ -8634,18 +8643,22 @@ int intel_framebuffer_init(struct drm_device *dev,
        case DRM_FORMAT_ARGB2101010:
        case DRM_FORMAT_XBGR2101010:
        case DRM_FORMAT_ABGR2101010:
-               if (INTEL_INFO(dev)->gen < 4)
+               if (INTEL_INFO(dev)->gen < 4) {
+                       DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);
                        return -EINVAL;
+               }
                break;
        case DRM_FORMAT_YUYV:
        case DRM_FORMAT_UYVY:
        case DRM_FORMAT_YVYU:
        case DRM_FORMAT_VYUY:
-               if (INTEL_INFO(dev)->gen < 6)
+               if (INTEL_INFO(dev)->gen < 5) {
+                       DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);
                        return -EINVAL;
+               }
                break;
        default:
-               DRM_DEBUG_KMS("unsupported pixel format 0x%08x\n", mode_cmd->pixel_format);
+               DRM_DEBUG("unsupported pixel format 0x%08x\n", mode_cmd->pixel_format);
                return -EINVAL;
        }
 
@@ -9167,6 +9180,23 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
         * the crtc fixup. */
 }
 
+static void i915_redisable_vga(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       u32 vga_reg;
+
+       if (HAS_PCH_SPLIT(dev))
+               vga_reg = CPU_VGACNTRL;
+       else
+               vga_reg = VGACNTRL;
+
+       if (I915_READ(vga_reg) != VGA_DISP_DISABLE) {
+               DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
+               I915_WRITE(vga_reg, VGA_DISP_DISABLE);
+               POSTING_READ(vga_reg);
+       }
+}
+
 /* Scan out the current hw modeset state, sanitizes it and maps it into the drm
  * and i915 state tracking structures. */
 void intel_modeset_setup_hw_state(struct drm_device *dev,
@@ -9275,6 +9305,8 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
                        intel_set_mode(&crtc->base, &crtc->base.mode,
                                       crtc->base.x, crtc->base.y, crtc->base.fb);
                }
+
+               i915_redisable_vga(dev);
        } else {
                intel_modeset_update_staged_output_state(dev);
        }
index b9a660a536772fd6728255b6173c047d8607222e..17aee74258ad4dfa43083e431fc3f0b224aa4ec4 100644 (file)
@@ -774,14 +774,6 @@ static const struct dmi_system_id intel_no_lvds[] = {
                        DMI_MATCH(DMI_BOARD_NAME, "MS-7469"),
                },
        },
-       {
-               .callback = intel_no_lvds_dmi_callback,
-               .ident = "ZOTAC ZBOXSD-ID12/ID13",
-               .matches = {
-                       DMI_MATCH(DMI_BOARD_VENDOR, "ZOTAC"),
-                       DMI_MATCH(DMI_BOARD_NAME, "ZBOXSD-ID12/ID13"),
-               },
-       },
        {
                .callback = intel_no_lvds_dmi_callback,
                .ident = "Gigabyte GA-D525TUD",
index 496caa73eb705ed0c99415c1d42a5bf6aa17b3dc..e83a117941720483b1c27f46aafe5c7576c1d39d 100644 (file)
  * i915.i915_enable_fbc parameter
  */
 
+static bool intel_crtc_active(struct drm_crtc *crtc)
+{
+       /* Be paranoid as we can arrive here with only partial
+        * state retrieved from the hardware during setup.
+        */
+       return to_intel_crtc(crtc)->active && crtc->fb && crtc->mode.clock;
+}
+
 static void i8xx_disable_fbc(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -405,9 +413,8 @@ void intel_update_fbc(struct drm_device *dev)
         *   - going to an unsupported config (interlace, pixel multiply, etc.)
         */
        list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) {
-               if (tmp_crtc->enabled &&
-                   !to_intel_crtc(tmp_crtc)->primary_disabled &&
-                   tmp_crtc->fb) {
+               if (intel_crtc_active(tmp_crtc) &&
+                   !to_intel_crtc(tmp_crtc)->primary_disabled) {
                        if (crtc) {
                                DRM_DEBUG_KMS("more than one pipe active, disabling compression\n");
                                dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES;
@@ -992,7 +999,7 @@ static struct drm_crtc *single_enabled_crtc(struct drm_device *dev)
        struct drm_crtc *crtc, *enabled = NULL;
 
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
-               if (crtc->enabled && crtc->fb) {
+               if (intel_crtc_active(crtc)) {
                        if (enabled)
                                return NULL;
                        enabled = crtc;
@@ -1086,7 +1093,7 @@ static bool g4x_compute_wm0(struct drm_device *dev,
        int entries, tlb_miss;
 
        crtc = intel_get_crtc_for_plane(dev, plane);
-       if (crtc->fb == NULL || !crtc->enabled) {
+       if (!intel_crtc_active(crtc)) {
                *cursor_wm = cursor->guard_size;
                *plane_wm = display->guard_size;
                return false;
@@ -1215,7 +1222,7 @@ static bool vlv_compute_drain_latency(struct drm_device *dev,
        int entries;
 
        crtc = intel_get_crtc_for_plane(dev, plane);
-       if (crtc->fb == NULL || !crtc->enabled)
+       if (!intel_crtc_active(crtc))
                return false;
 
        clock = crtc->mode.clock;       /* VESA DOT Clock */
@@ -1286,6 +1293,7 @@ static void valleyview_update_wm(struct drm_device *dev)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int planea_wm, planeb_wm, cursora_wm, cursorb_wm;
        int plane_sr, cursor_sr;
+       int ignore_plane_sr, ignore_cursor_sr;
        unsigned int enabled = 0;
 
        vlv_update_drain_latency(dev);
@@ -1302,17 +1310,23 @@ static void valleyview_update_wm(struct drm_device *dev)
                            &planeb_wm, &cursorb_wm))
                enabled |= 2;
 
-       plane_sr = cursor_sr = 0;
        if (single_plane_enabled(enabled) &&
            g4x_compute_srwm(dev, ffs(enabled) - 1,
                             sr_latency_ns,
                             &valleyview_wm_info,
                             &valleyview_cursor_wm_info,
-                            &plane_sr, &cursor_sr))
+                            &plane_sr, &ignore_cursor_sr) &&
+           g4x_compute_srwm(dev, ffs(enabled) - 1,
+                            2*sr_latency_ns,
+                            &valleyview_wm_info,
+                            &valleyview_cursor_wm_info,
+                            &ignore_plane_sr, &cursor_sr)) {
                I915_WRITE(FW_BLC_SELF_VLV, FW_CSPWRDWNEN);
-       else
+       } else {
                I915_WRITE(FW_BLC_SELF_VLV,
                           I915_READ(FW_BLC_SELF_VLV) & ~FW_CSPWRDWNEN);
+               plane_sr = cursor_sr = 0;
+       }
 
        DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n",
                      planea_wm, cursora_wm,
@@ -1352,17 +1366,18 @@ static void g4x_update_wm(struct drm_device *dev)
                            &planeb_wm, &cursorb_wm))
                enabled |= 2;
 
-       plane_sr = cursor_sr = 0;
        if (single_plane_enabled(enabled) &&
            g4x_compute_srwm(dev, ffs(enabled) - 1,
                             sr_latency_ns,
                             &g4x_wm_info,
                             &g4x_cursor_wm_info,
-                            &plane_sr, &cursor_sr))
+                            &plane_sr, &cursor_sr)) {
                I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
-       else
+       } else {
                I915_WRITE(FW_BLC_SELF,
                           I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN);
+               plane_sr = cursor_sr = 0;
+       }
 
        DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n",
                      planea_wm, cursora_wm,
@@ -1468,7 +1483,7 @@ static void i9xx_update_wm(struct drm_device *dev)
 
        fifo_size = dev_priv->display.get_fifo_size(dev, 0);
        crtc = intel_get_crtc_for_plane(dev, 0);
-       if (crtc->enabled && crtc->fb) {
+       if (intel_crtc_active(crtc)) {
                int cpp = crtc->fb->bits_per_pixel / 8;
                if (IS_GEN2(dev))
                        cpp = 4;
@@ -1482,7 +1497,7 @@ static void i9xx_update_wm(struct drm_device *dev)
 
        fifo_size = dev_priv->display.get_fifo_size(dev, 1);
        crtc = intel_get_crtc_for_plane(dev, 1);
-       if (crtc->enabled && crtc->fb) {
+       if (intel_crtc_active(crtc)) {
                int cpp = crtc->fb->bits_per_pixel / 8;
                if (IS_GEN2(dev))
                        cpp = 4;
@@ -1811,8 +1826,110 @@ static void sandybridge_update_wm(struct drm_device *dev)
                enabled |= 2;
        }
 
-       if ((dev_priv->num_pipe == 3) &&
-           g4x_compute_wm0(dev, 2,
+       /*
+        * Calculate and update the self-refresh watermark only when one
+        * display plane is used.
+        *
+        * SNB support 3 levels of watermark.
+        *
+        * WM1/WM2/WM2 watermarks have to be enabled in the ascending order,
+        * and disabled in the descending order
+        *
+        */
+       I915_WRITE(WM3_LP_ILK, 0);
+       I915_WRITE(WM2_LP_ILK, 0);
+       I915_WRITE(WM1_LP_ILK, 0);
+
+       if (!single_plane_enabled(enabled) ||
+           dev_priv->sprite_scaling_enabled)
+               return;
+       enabled = ffs(enabled) - 1;
+
+       /* WM1 */
+       if (!ironlake_compute_srwm(dev, 1, enabled,
+                                  SNB_READ_WM1_LATENCY() * 500,
+                                  &sandybridge_display_srwm_info,
+                                  &sandybridge_cursor_srwm_info,
+                                  &fbc_wm, &plane_wm, &cursor_wm))
+               return;
+
+       I915_WRITE(WM1_LP_ILK,
+                  WM1_LP_SR_EN |
+                  (SNB_READ_WM1_LATENCY() << WM1_LP_LATENCY_SHIFT) |
+                  (fbc_wm << WM1_LP_FBC_SHIFT) |
+                  (plane_wm << WM1_LP_SR_SHIFT) |
+                  cursor_wm);
+
+       /* WM2 */
+       if (!ironlake_compute_srwm(dev, 2, enabled,
+                                  SNB_READ_WM2_LATENCY() * 500,
+                                  &sandybridge_display_srwm_info,
+                                  &sandybridge_cursor_srwm_info,
+                                  &fbc_wm, &plane_wm, &cursor_wm))
+               return;
+
+       I915_WRITE(WM2_LP_ILK,
+                  WM2_LP_EN |
+                  (SNB_READ_WM2_LATENCY() << WM1_LP_LATENCY_SHIFT) |
+                  (fbc_wm << WM1_LP_FBC_SHIFT) |
+                  (plane_wm << WM1_LP_SR_SHIFT) |
+                  cursor_wm);
+
+       /* WM3 */
+       if (!ironlake_compute_srwm(dev, 3, enabled,
+                                  SNB_READ_WM3_LATENCY() * 500,
+                                  &sandybridge_display_srwm_info,
+                                  &sandybridge_cursor_srwm_info,
+                                  &fbc_wm, &plane_wm, &cursor_wm))
+               return;
+
+       I915_WRITE(WM3_LP_ILK,
+                  WM3_LP_EN |
+                  (SNB_READ_WM3_LATENCY() << WM1_LP_LATENCY_SHIFT) |
+                  (fbc_wm << WM1_LP_FBC_SHIFT) |
+                  (plane_wm << WM1_LP_SR_SHIFT) |
+                  cursor_wm);
+}
+
+static void ivybridge_update_wm(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       int latency = SNB_READ_WM0_LATENCY() * 100;     /* In unit 0.1us */
+       u32 val;
+       int fbc_wm, plane_wm, cursor_wm;
+       int ignore_fbc_wm, ignore_plane_wm, ignore_cursor_wm;
+       unsigned int enabled;
+
+       enabled = 0;
+       if (g4x_compute_wm0(dev, 0,
+                           &sandybridge_display_wm_info, latency,
+                           &sandybridge_cursor_wm_info, latency,
+                           &plane_wm, &cursor_wm)) {
+               val = I915_READ(WM0_PIPEA_ILK);
+               val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK);
+               I915_WRITE(WM0_PIPEA_ILK, val |
+                          ((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm));
+               DRM_DEBUG_KMS("FIFO watermarks For pipe A -"
+                             " plane %d, " "cursor: %d\n",
+                             plane_wm, cursor_wm);
+               enabled |= 1;
+       }
+
+       if (g4x_compute_wm0(dev, 1,
+                           &sandybridge_display_wm_info, latency,
+                           &sandybridge_cursor_wm_info, latency,
+                           &plane_wm, &cursor_wm)) {
+               val = I915_READ(WM0_PIPEB_ILK);
+               val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK);
+               I915_WRITE(WM0_PIPEB_ILK, val |
+                          ((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm));
+               DRM_DEBUG_KMS("FIFO watermarks For pipe B -"
+                             " plane %d, cursor: %d\n",
+                             plane_wm, cursor_wm);
+               enabled |= 2;
+       }
+
+       if (g4x_compute_wm0(dev, 2,
                            &sandybridge_display_wm_info, latency,
                            &sandybridge_cursor_wm_info, latency,
                            &plane_wm, &cursor_wm)) {
@@ -1875,12 +1992,17 @@ static void sandybridge_update_wm(struct drm_device *dev)
                   (plane_wm << WM1_LP_SR_SHIFT) |
                   cursor_wm);
 
-       /* WM3 */
+       /* WM3, note we have to correct the cursor latency */
        if (!ironlake_compute_srwm(dev, 3, enabled,
                                   SNB_READ_WM3_LATENCY() * 500,
                                   &sandybridge_display_srwm_info,
                                   &sandybridge_cursor_srwm_info,
-                                  &fbc_wm, &plane_wm, &cursor_wm))
+                                  &fbc_wm, &plane_wm, &ignore_cursor_wm) ||
+           !ironlake_compute_srwm(dev, 3, enabled,
+                                  2 * SNB_READ_WM3_LATENCY() * 500,
+                                  &sandybridge_display_srwm_info,
+                                  &sandybridge_cursor_srwm_info,
+                                  &ignore_fbc_wm, &ignore_plane_wm, &cursor_wm))
                return;
 
        I915_WRITE(WM3_LP_ILK,
@@ -1929,7 +2051,7 @@ sandybridge_compute_sprite_wm(struct drm_device *dev, int plane,
        int entries, tlb_miss;
 
        crtc = intel_get_crtc_for_plane(dev, plane);
-       if (crtc->fb == NULL || !crtc->enabled) {
+       if (!intel_crtc_active(crtc)) {
                *sprite_wm = display->guard_size;
                return false;
        }
@@ -3471,6 +3593,15 @@ static void gen6_init_clock_gating(struct drm_device *dev)
                   I915_READ(ILK_DISPLAY_CHICKEN2) |
                   ILK_ELPIN_409_SELECT);
 
+       /* WaDisableHiZPlanesWhenMSAAEnabled */
+       I915_WRITE(_3D_CHICKEN,
+                  _MASKED_BIT_ENABLE(_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB));
+
+       /* WaSetupGtModeTdRowDispatch */
+       if (IS_SNB_GT1(dev))
+               I915_WRITE(GEN6_GT_MODE,
+                          _MASKED_BIT_ENABLE(GEN6_TD_FOUR_ROW_DISPATCH_DISABLE));
+
        I915_WRITE(WM3_LP_ILK, 0);
        I915_WRITE(WM2_LP_ILK, 0);
        I915_WRITE(WM1_LP_ILK, 0);
@@ -3999,7 +4130,7 @@ void intel_init_pm(struct drm_device *dev)
                } else if (IS_IVYBRIDGE(dev)) {
                        /* FIXME: detect B0+ stepping and use auto training */
                        if (SNB_READ_WM0_LATENCY()) {
-                               dev_priv->display.update_wm = sandybridge_update_wm;
+                               dev_priv->display.update_wm = ivybridge_update_wm;
                                dev_priv->display.update_sprite_wm = sandybridge_update_sprite_wm;
                        } else {
                                DRM_DEBUG_KMS("Failed to read display plane latency. "
index 2346b920bd86ef96c70d7632ba13c254b21302a4..ae253e04c39105502fa1b82e05889970139f123f 100644 (file)
@@ -547,9 +547,14 @@ static int init_render_ring(struct intel_ring_buffer *ring)
 
 static void render_ring_cleanup(struct intel_ring_buffer *ring)
 {
+       struct drm_device *dev = ring->dev;
+
        if (!ring->private)
                return;
 
+       if (HAS_BROKEN_CS_TLB(dev))
+               drm_gem_object_unreference(to_gem_object(ring->private));
+
        cleanup_pipe_control(ring);
 }
 
@@ -969,6 +974,8 @@ i965_dispatch_execbuffer(struct intel_ring_buffer *ring,
        return 0;
 }
 
+/* Just userspace ABI convention to limit the wa batch bo to a resonable size */
+#define I830_BATCH_LIMIT (256*1024)
 static int
 i830_dispatch_execbuffer(struct intel_ring_buffer *ring,
                                u32 offset, u32 len,
@@ -976,15 +983,47 @@ i830_dispatch_execbuffer(struct intel_ring_buffer *ring,
 {
        int ret;
 
-       ret = intel_ring_begin(ring, 4);
-       if (ret)
-               return ret;
+       if (flags & I915_DISPATCH_PINNED) {
+               ret = intel_ring_begin(ring, 4);
+               if (ret)
+                       return ret;
 
-       intel_ring_emit(ring, MI_BATCH_BUFFER);
-       intel_ring_emit(ring, offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE));
-       intel_ring_emit(ring, offset + len - 8);
-       intel_ring_emit(ring, 0);
-       intel_ring_advance(ring);
+               intel_ring_emit(ring, MI_BATCH_BUFFER);
+               intel_ring_emit(ring, offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE));
+               intel_ring_emit(ring, offset + len - 8);
+               intel_ring_emit(ring, MI_NOOP);
+               intel_ring_advance(ring);
+       } else {
+               struct drm_i915_gem_object *obj = ring->private;
+               u32 cs_offset = obj->gtt_offset;
+
+               if (len > I830_BATCH_LIMIT)
+                       return -ENOSPC;
+
+               ret = intel_ring_begin(ring, 9+3);
+               if (ret)
+                       return ret;
+               /* Blit the batch (which has now all relocs applied) to the stable batch
+                * scratch bo area (so that the CS never stumbles over its tlb
+                * invalidation bug) ... */
+               intel_ring_emit(ring, XY_SRC_COPY_BLT_CMD |
+                               XY_SRC_COPY_BLT_WRITE_ALPHA |
+                               XY_SRC_COPY_BLT_WRITE_RGB);
+               intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_GXCOPY | 4096);
+               intel_ring_emit(ring, 0);
+               intel_ring_emit(ring, (DIV_ROUND_UP(len, 4096) << 16) | 1024);
+               intel_ring_emit(ring, cs_offset);
+               intel_ring_emit(ring, 0);
+               intel_ring_emit(ring, 4096);
+               intel_ring_emit(ring, offset);
+               intel_ring_emit(ring, MI_FLUSH);
+
+               /* ... and execute it. */
+               intel_ring_emit(ring, MI_BATCH_BUFFER);
+               intel_ring_emit(ring, cs_offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE));
+               intel_ring_emit(ring, cs_offset + len - 8);
+               intel_ring_advance(ring);
+       }
 
        return 0;
 }
@@ -1596,6 +1635,27 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
        ring->init = init_render_ring;
        ring->cleanup = render_ring_cleanup;
 
+       /* Workaround batchbuffer to combat CS tlb bug. */
+       if (HAS_BROKEN_CS_TLB(dev)) {
+               struct drm_i915_gem_object *obj;
+               int ret;
+
+               obj = i915_gem_alloc_object(dev, I830_BATCH_LIMIT);
+               if (obj == NULL) {
+                       DRM_ERROR("Failed to allocate batch bo\n");
+                       return -ENOMEM;
+               }
+
+               ret = i915_gem_object_pin(obj, 0, true, false);
+               if (ret != 0) {
+                       drm_gem_object_unreference(&obj->base);
+                       DRM_ERROR("Failed to ping batch bo\n");
+                       return ret;
+               }
+
+               ring->private = obj;
+       }
+
        return intel_init_ring_buffer(dev, ring);
 }
 
index 526182ed0c6d78b83bf35265f2d98987fab1652a..6af87cd0572501fb8621f34732627b37d89a83ac 100644 (file)
@@ -94,6 +94,7 @@ struct  intel_ring_buffer {
                                               u32 offset, u32 length,
                                               unsigned flags);
 #define I915_DISPATCH_SECURE 0x1
+#define I915_DISPATCH_PINNED 0x2
        void            (*cleanup)(struct intel_ring_buffer *ring);
        int             (*sync_to)(struct intel_ring_buffer *ring,
                                   struct intel_ring_buffer *to,
index 827dcd4edf1c31eff9018c7c9bec37139e93602f..d7b060e0a23199b064c21d30366dd5ff78566e13 100644 (file)
@@ -120,11 +120,10 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
        I915_WRITE(SPRSTRIDE(pipe), fb->pitches[0]);
        I915_WRITE(SPRPOS(pipe), (crtc_y << 16) | crtc_x);
 
-       linear_offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8);
+       linear_offset = y * fb->pitches[0] + x * pixel_size;
        sprsurf_offset =
                intel_gen4_compute_offset_xtiled(&x, &y,
-                                                fb->bits_per_pixel / 8,
-                                                fb->pitches[0]);
+                                                pixel_size, fb->pitches[0]);
        linear_offset -= sprsurf_offset;
 
        /* HSW consolidates SPRTILEOFF and SPRLINOFF into a single SPROFFSET
@@ -286,11 +285,10 @@ ilk_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
        I915_WRITE(DVSSTRIDE(pipe), fb->pitches[0]);
        I915_WRITE(DVSPOS(pipe), (crtc_y << 16) | crtc_x);
 
-       linear_offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8);
+       linear_offset = y * fb->pitches[0] + x * pixel_size;
        dvssurf_offset =
                intel_gen4_compute_offset_xtiled(&x, &y,
-                                                fb->bits_per_pixel / 8,
-                                                fb->pitches[0]);
+                                                pixel_size, fb->pitches[0]);
        linear_offset -= dvssurf_offset;
 
        if (obj->tiling_mode != I915_TILING_NONE)
index 1e910117b0a2e808da6d1529656a7fdfa93166de..122b571ccc7ce7a940f267ab002821952a535c08 100644 (file)
@@ -60,8 +60,7 @@ static void mgag200_kick_out_firmware_fb(struct pci_dev *pdev)
 }
 
 
-static int __devinit
-mga_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int mga_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        mgag200_kick_out_firmware_fb(pdev);
 
index c617f0480071ae4c07e9d524513149cfb1ac0452..8bbb58f94a193da85a769a5a387bc57b51ef5530 100644 (file)
@@ -66,10 +66,8 @@ nouveau_client_create_(const char *name, u64 devname, const char *cfg,
 
        ret = nouveau_handle_create(nv_object(client), ~0, ~0,
                                    nv_object(client), &client->root);
-       if (ret) {
-               nouveau_namedb_destroy(&client->base);
+       if (ret)
                return ret;
-       }
 
        /* prevent init/fini being called, os in in charge of this */
        atomic_set(&nv_object(client)->usecount, 2);
index b8d2cbf8a7a7bb9b0f5a2c8fabfb65de9e93142a..264c2b338ac3a23fc82e1f6594d58dffcf8547d8 100644 (file)
@@ -109,7 +109,7 @@ nouveau_handle_create(struct nouveau_object *parent, u32 _parent, u32 _handle,
        while (!nv_iclass(namedb, NV_NAMEDB_CLASS))
                namedb = namedb->parent;
 
-       handle = *phandle = kzalloc(sizeof(*handle), GFP_KERNEL);
+       handle = kzalloc(sizeof(*handle), GFP_KERNEL);
        if (!handle)
                return -ENOMEM;
 
@@ -146,6 +146,9 @@ nouveau_handle_create(struct nouveau_object *parent, u32 _parent, u32 _handle,
        }
 
        hprintk(handle, TRACE, "created\n");
+
+       *phandle = handle;
+
        return 0;
 }
 
index 0f09af135415582ec7428d14af33351197d8f8e3..ca1a7d76a95b50d87864e95954b20aebd7906f76 100644 (file)
@@ -851,20 +851,23 @@ exec_script(struct nv50_disp_priv *priv, int head, int id)
        for (i = 0; !(ctrl & (1 << head)) && i < 3; i++)
                ctrl = nv_rd32(priv, 0x610b5c + (i * 8));
 
-       if (nv_device(priv)->chipset  < 0x90 ||
-           nv_device(priv)->chipset == 0x92 ||
-           nv_device(priv)->chipset == 0xa0) {
-               for (i = 0; !(ctrl & (1 << head)) && i < 2; i++)
-                       ctrl = nv_rd32(priv, 0x610b74 + (i * 8));
-               i += 3;
-       } else {
-               for (i = 0; !(ctrl & (1 << head)) && i < 4; i++)
-                       ctrl = nv_rd32(priv, 0x610798 + (i * 8));
-               i += 3;
+       if (!(ctrl & (1 << head))) {
+               if (nv_device(priv)->chipset  < 0x90 ||
+                   nv_device(priv)->chipset == 0x92 ||
+                   nv_device(priv)->chipset == 0xa0) {
+                       for (i = 0; !(ctrl & (1 << head)) && i < 2; i++)
+                               ctrl = nv_rd32(priv, 0x610b74 + (i * 8));
+                       i += 4;
+               } else {
+                       for (i = 0; !(ctrl & (1 << head)) && i < 4; i++)
+                               ctrl = nv_rd32(priv, 0x610798 + (i * 8));
+                       i += 4;
+               }
        }
 
        if (!(ctrl & (1 << head)))
                return false;
+       i--;
 
        data = exec_lookup(priv, head, i, ctrl, &dcb, &ver, &hdr, &cnt, &len, &info);
        if (data) {
@@ -898,20 +901,23 @@ exec_clkcmp(struct nv50_disp_priv *priv, int head, int id, u32 pclk,
        for (i = 0; !(ctrl & (1 << head)) && i < 3; i++)
                ctrl = nv_rd32(priv, 0x610b58 + (i * 8));
 
-       if (nv_device(priv)->chipset  < 0x90 ||
-           nv_device(priv)->chipset == 0x92 ||
-           nv_device(priv)->chipset == 0xa0) {
-               for (i = 0; !(ctrl & (1 << head)) && i < 2; i++)
-                       ctrl = nv_rd32(priv, 0x610b70 + (i * 8));
-               i += 3;
-       } else {
-               for (i = 0; !(ctrl & (1 << head)) && i < 4; i++)
-                       ctrl = nv_rd32(priv, 0x610794 + (i * 8));
-               i += 3;
+       if (!(ctrl & (1 << head))) {
+               if (nv_device(priv)->chipset  < 0x90 ||
+                   nv_device(priv)->chipset == 0x92 ||
+                   nv_device(priv)->chipset == 0xa0) {
+                       for (i = 0; !(ctrl & (1 << head)) && i < 2; i++)
+                               ctrl = nv_rd32(priv, 0x610b70 + (i * 8));
+                       i += 4;
+               } else {
+                       for (i = 0; !(ctrl & (1 << head)) && i < 4; i++)
+                               ctrl = nv_rd32(priv, 0x610794 + (i * 8));
+                       i += 4;
+               }
        }
 
        if (!(ctrl & (1 << head)))
                return 0x0000;
+       i--;
 
        data = exec_lookup(priv, head, i, ctrl, outp, &ver, &hdr, &cnt, &len, &info1);
        if (!data)
index 7b715fda276356849647c50793da6db4ede26937..62ab231cd6b65cd52449f1bdba2338e391e7ba82 100644 (file)
@@ -57,6 +57,11 @@ chipsets:
 .b16 #nve4_gpc_mmio_tail
 .b16 #nve4_tpc_mmio_head
 .b16 #nve4_tpc_mmio_tail
+.b8  0xe6 0 0 0
+.b16 #nve4_gpc_mmio_head
+.b16 #nve4_gpc_mmio_tail
+.b16 #nve4_tpc_mmio_head
+.b16 #nve4_tpc_mmio_tail
 .b8  0 0 0 0
 
 // GPC mmio lists
index 26c2165bad0fc75b6ab5667be24ce2bdb2bba9c1..09ee4702c8b29ff587be71e6908040ab9d35d98d 100644 (file)
@@ -34,13 +34,16 @@ uint32_t nve0_grgpc_data[] = {
        0x00000000,
 /* 0x0064: chipsets */
        0x000000e4,
-       0x01040080,
-       0x014c0104,
+       0x0110008c,
+       0x01580110,
        0x000000e7,
-       0x01040080,
-       0x014c0104,
+       0x0110008c,
+       0x01580110,
+       0x000000e6,
+       0x0110008c,
+       0x01580110,
        0x00000000,
-/* 0x0080: nve4_gpc_mmio_head */
+/* 0x008c: nve4_gpc_mmio_head */
        0x00000380,
        0x04000400,
        0x0800040c,
@@ -74,8 +77,8 @@ uint32_t nve0_grgpc_data[] = {
        0x14003100,
        0x000031d0,
        0x040031e0,
-/* 0x0104: nve4_gpc_mmio_tail */
-/* 0x0104: nve4_tpc_mmio_head */
+/* 0x0110: nve4_gpc_mmio_tail */
+/* 0x0110: nve4_tpc_mmio_head */
        0x00000048,
        0x00000064,
        0x00000088,
index acfc457654bdcffb0bc15ac22e36c1c4c4fa7e9c..0bcfa4d447e569f5506a40a30988b6e81903b04c 100644 (file)
@@ -754,6 +754,16 @@ ctx_mmio_exec:
 //             on load it means: "a save preceeded this load"
 //
 ctx_xfer:
+       // according to mwk, some kind of wait for idle
+       mov $r15 0xc00
+       shl b32 $r15 6
+       mov $r14 4
+       iowr I[$r15 + 0x200] $r14
+       ctx_xfer_idle:
+               iord $r14 I[$r15 + 0x000]
+               and $r14 0x2000
+               bra ne #ctx_xfer_idle
+
        bra not $p1 #ctx_xfer_pre
        bra $p2 #ctx_xfer_pre_load
        ctx_xfer_pre:
index 85a8d556f484d3984ec9350ed7c1f1980c7d315c..bb03d2a1d57b51a8469447c562a08448ccf499ef 100644 (file)
@@ -799,79 +799,80 @@ uint32_t nvc0_grhub_code[] = {
        0x01fa0613,
        0xf803f806,
 /* 0x0829: ctx_xfer */
-       0x0611f400,
-/* 0x082f: ctx_xfer_pre */
-       0xf01102f4,
-       0x21f510f7,
-       0x21f50698,
-       0x11f40631,
-/* 0x083d: ctx_xfer_pre_load */
-       0x02f7f01c,
-       0x065721f5,
-       0x066621f5,
-       0x067821f5,
-       0x21f5f4bd,
-       0x21f50657,
-/* 0x0856: ctx_xfer_exec */
-       0x019806b8,
-       0x1427f116,
-       0x0624b604,
-       0xf10020d0,
-       0xf0a500e7,
-       0x1fb941e3,
-       0x8d21f402,
-       0xf004e0b6,
-       0x2cf001fc,
-       0x0124b602,
-       0xf405f2fd,
-       0x17f18d21,
-       0x13f04afc,
-       0x0c27f002,
-       0xf50012d0,
-       0xf1020721,
-       0xf047fc27,
-       0x20d00223,
-       0x012cf000,
-       0xd00320b6,
-       0xacf00012,
-       0x06a5f001,
-       0x9800b7f0,
-       0x0d98140c,
-       0x00e7f015,
-       0x015c21f5,
-       0xf508a7f0,
-       0xf5010321,
-       0xf4020721,
-       0xa7f02201,
-       0xc921f40c,
-       0x0a1017f1,
-       0xf00614b6,
-       0x12d00527,
-/* 0x08dd: ctx_xfer_post_save_wait */
-       0x0012cf00,
-       0xf40522fd,
-       0x02f4fa1b,
-/* 0x08e9: ctx_xfer_post */
-       0x02f7f032,
-       0x065721f5,
-       0x21f5f4bd,
-       0x21f50698,
-       0x21f50226,
-       0xf4bd0666,
-       0x065721f5,
-       0x981011f4,
-       0x11fd8001,
-       0x070bf405,
-       0x07df21f5,
-/* 0x0914: ctx_xfer_no_post_mmio */
-       0x064921f5,
-/* 0x0918: ctx_xfer_done */
-       0x000000f8,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
+       0x00f7f100,
+       0x06f4b60c,
+       0xd004e7f0,
+/* 0x0836: ctx_xfer_idle */
+       0xfecf80fe,
+       0x00e4f100,
+       0xf91bf420,
+       0xf40611f4,
+/* 0x0846: ctx_xfer_pre */
+       0xf7f01102,
+       0x9821f510,
+       0x3121f506,
+       0x1c11f406,
+/* 0x0854: ctx_xfer_pre_load */
+       0xf502f7f0,
+       0xf5065721,
+       0xf5066621,
+       0xbd067821,
+       0x5721f5f4,
+       0xb821f506,
+/* 0x086d: ctx_xfer_exec */
+       0x16019806,
+       0x041427f1,
+       0xd00624b6,
+       0xe7f10020,
+       0xe3f0a500,
+       0x021fb941,
+       0xb68d21f4,
+       0xfcf004e0,
+       0x022cf001,
+       0xfd0124b6,
+       0x21f405f2,
+       0xfc17f18d,
+       0x0213f04a,
+       0xd00c27f0,
+       0x21f50012,
+       0x27f10207,
+       0x23f047fc,
+       0x0020d002,
+       0xb6012cf0,
+       0x12d00320,
+       0x01acf000,
+       0xf006a5f0,
+       0x0c9800b7,
+       0x150d9814,
+       0xf500e7f0,
+       0xf0015c21,
+       0x21f508a7,
+       0x21f50103,
+       0x01f40207,
+       0x0ca7f022,
+       0xf1c921f4,
+       0xb60a1017,
+       0x27f00614,
+       0x0012d005,
+/* 0x08f4: ctx_xfer_post_save_wait */
+       0xfd0012cf,
+       0x1bf40522,
+       0x3202f4fa,
+/* 0x0900: ctx_xfer_post */
+       0xf502f7f0,
+       0xbd065721,
+       0x9821f5f4,
+       0x2621f506,
+       0x6621f502,
+       0xf5f4bd06,
+       0xf4065721,
+       0x01981011,
+       0x0511fd80,
+       0xf5070bf4,
+/* 0x092b: ctx_xfer_no_post_mmio */
+       0xf507df21,
+/* 0x092f: ctx_xfer_done */
+       0xf8064921,
        0x00000000,
        0x00000000,
        0x00000000,
index 138eeaa286650998797b11eba246d6d2e72ecc0c..7fe9d7cf486b8ff81a879b7339f703e5b88a3c33 100644 (file)
@@ -44,6 +44,9 @@ chipsets:
 .b8  0xe7 0 0 0
 .b16 #nve4_hub_mmio_head
 .b16 #nve4_hub_mmio_tail
+.b8  0xe6 0 0 0
+.b16 #nve4_hub_mmio_head
+.b16 #nve4_hub_mmio_tail
 .b8  0 0 0 0
 
 nve4_hub_mmio_head:
@@ -680,6 +683,16 @@ ctx_mmio_exec:
 //             on load it means: "a save preceeded this load"
 //
 ctx_xfer:
+       // according to mwk, some kind of wait for idle
+       mov $r15 0xc00
+       shl b32 $r15 6
+       mov $r14 4
+       iowr I[$r15 + 0x200] $r14
+       ctx_xfer_idle:
+               iord $r14 I[$r15 + 0x000]
+               and $r14 0x2000
+               bra ne #ctx_xfer_idle
+
        bra not $p1 #ctx_xfer_pre
        bra $p2 #ctx_xfer_pre_load
        ctx_xfer_pre:
index decf0c60ca3bf079d5f0ad2e3a94a887737a026d..e3421af68ab9504467e1e976eeefdb08b16288e0 100644 (file)
@@ -30,11 +30,13 @@ uint32_t nve0_grhub_data[] = {
        0x00000000,
 /* 0x005c: chipsets */
        0x000000e4,
-       0x013c0070,
+       0x01440078,
        0x000000e7,
-       0x013c0070,
+       0x01440078,
+       0x000000e6,
+       0x01440078,
        0x00000000,
-/* 0x0070: nve4_hub_mmio_head */
+/* 0x0078: nve4_hub_mmio_head */
        0x0417e91c,
        0x04400204,
        0x18404010,
@@ -86,9 +88,7 @@ uint32_t nve0_grhub_data[] = {
        0x00408840,
        0x08408900,
        0x00408980,
-/* 0x013c: nve4_hub_mmio_tail */
-       0x00000000,
-       0x00000000,
+/* 0x0144: nve4_hub_mmio_tail */
        0x00000000,
        0x00000000,
        0x00000000,
@@ -781,77 +781,78 @@ uint32_t nve0_grhub_code[] = {
        0x0613f002,
        0xf80601fa,
 /* 0x07fb: ctx_xfer */
-       0xf400f803,
-       0x02f40611,
-/* 0x0801: ctx_xfer_pre */
-       0x10f7f00d,
-       0x067221f5,
-/* 0x080b: ctx_xfer_pre_load */
-       0xf01c11f4,
-       0x21f502f7,
-       0x21f50631,
-       0x21f50640,
-       0xf4bd0652,
-       0x063121f5,
-       0x069221f5,
-/* 0x0824: ctx_xfer_exec */
-       0xf1160198,
-       0xb6041427,
-       0x20d00624,
-       0x00e7f100,
-       0x41e3f0a5,
-       0xf4021fb9,
-       0xe0b68d21,
-       0x01fcf004,
-       0xb6022cf0,
-       0xf2fd0124,
-       0x8d21f405,
-       0x4afc17f1,
-       0xf00213f0,
-       0x12d00c27,
-       0x0721f500,
-       0xfc27f102,
-       0x0223f047,
-       0xf00020d0,
-       0x20b6012c,
-       0x0012d003,
-       0xf001acf0,
-       0xb7f006a5,
-       0x140c9800,
-       0xf0150d98,
-       0x21f500e7,
-       0xa7f0015c,
-       0x0321f508,
-       0x0721f501,
-       0x2201f402,
-       0xf40ca7f0,
-       0x17f1c921,
-       0x14b60a10,
-       0x0527f006,
-/* 0x08ab: ctx_xfer_post_save_wait */
-       0xcf0012d0,
-       0x22fd0012,
-       0xfa1bf405,
-/* 0x08b7: ctx_xfer_post */
-       0xf02e02f4,
-       0x21f502f7,
-       0xf4bd0631,
-       0x067221f5,
-       0x022621f5,
-       0x064021f5,
-       0x21f5f4bd,
-       0x11f40631,
-       0x80019810,
-       0xf40511fd,
-       0x21f5070b,
-/* 0x08e2: ctx_xfer_no_post_mmio */
-/* 0x08e2: ctx_xfer_done */
-       0x00f807b1,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
+       0xf100f803,
+       0xb60c00f7,
+       0xe7f006f4,
+       0x80fed004,
+/* 0x0808: ctx_xfer_idle */
+       0xf100fecf,
+       0xf42000e4,
+       0x11f4f91b,
+       0x0d02f406,
+/* 0x0818: ctx_xfer_pre */
+       0xf510f7f0,
+       0xf4067221,
+/* 0x0822: ctx_xfer_pre_load */
+       0xf7f01c11,
+       0x3121f502,
+       0x4021f506,
+       0x5221f506,
+       0xf5f4bd06,
+       0xf5063121,
+/* 0x083b: ctx_xfer_exec */
+       0x98069221,
+       0x27f11601,
+       0x24b60414,
+       0x0020d006,
+       0xa500e7f1,
+       0xb941e3f0,
+       0x21f4021f,
+       0x04e0b68d,
+       0xf001fcf0,
+       0x24b6022c,
+       0x05f2fd01,
+       0xf18d21f4,
+       0xf04afc17,
+       0x27f00213,
+       0x0012d00c,
+       0x020721f5,
+       0x47fc27f1,
+       0xd00223f0,
+       0x2cf00020,
+       0x0320b601,
+       0xf00012d0,
+       0xa5f001ac,
+       0x00b7f006,
+       0x98140c98,
+       0xe7f0150d,
+       0x5c21f500,
+       0x08a7f001,
+       0x010321f5,
+       0x020721f5,
+       0xf02201f4,
+       0x21f40ca7,
+       0x1017f1c9,
+       0x0614b60a,
+       0xd00527f0,
+/* 0x08c2: ctx_xfer_post_save_wait */
+       0x12cf0012,
+       0x0522fd00,
+       0xf4fa1bf4,
+/* 0x08ce: ctx_xfer_post */
+       0xf7f02e02,
+       0x3121f502,
+       0xf5f4bd06,
+       0xf5067221,
+       0xf5022621,
+       0xbd064021,
+       0x3121f5f4,
+       0x1011f406,
+       0xfd800198,
+       0x0bf40511,
+       0xb121f507,
+/* 0x08f9: ctx_xfer_no_post_mmio */
+/* 0x08f9: ctx_xfer_done */
+       0x0000f807,
        0x00000000,
 };
index 47a02081d70836efe11d77e54839fcd483c04e31..45aff5f5085aa83d8837309cb8117f620950d0bd 100644 (file)
@@ -516,18 +516,9 @@ nvc0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
 {
        struct nouveau_device *device = nv_device(parent);
        struct nvc0_graph_priv *priv;
-       bool enable = true;
        int ret, i;
 
-       switch (device->chipset) {
-       case 0xd9: /* known broken without binary driver firmware */
-               enable = false;
-               break;
-       default:
-               break;
-       }
-
-       ret = nouveau_graph_create(parent, engine, oclass, enable, &priv);
+       ret = nouveau_graph_create(parent, engine, oclass, true, &priv);
        *pobject = nv_object(priv);
        if (ret)
                return ret;
index 18d2210e12eb2acab56cf35fc3b06c8ca705f804..a1e78de46456b446e0a0261bf92e3f474c949ad6 100644 (file)
@@ -121,6 +121,7 @@ nvc0_graph_class(void *obj)
                return 0x9297;
        case 0xe4:
        case 0xe7:
+       case 0xe6:
                return 0xa097;
        default:
                return 0;
index 539d4c72f192eb6bda3ff3385c4895854b8d95a8..9f82e9702b4661208cf1f021ee246fcb721a986e 100644 (file)
@@ -203,7 +203,7 @@ nve0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
        struct nvc0_graph_priv *priv;
        int ret, i;
 
-       ret = nouveau_graph_create(parent, engine, oclass, false, &priv);
+       ret = nouveau_graph_create(parent, engine, oclass, true, &priv);
        *pobject = nv_object(priv);
        if (ret)
                return ret;
@@ -252,6 +252,7 @@ nve0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
                        priv->magic_not_rop_nr = 1;
                break;
        case 0xe7:
+       case 0xe6:
                priv->magic_not_rop_nr = 1;
                break;
        default:
index 0193532ceac97c71cdfc544039eb530ce1806963..63acc0346ff2c437cda76e06df68c709d51bc46e 100644 (file)
@@ -36,6 +36,9 @@ nouveau_client(void *obj)
 
 int  nouveau_client_create_(const char *name, u64 device, const char *cfg,
                            const char *dbg, int, void **);
+#define nouveau_client_destroy(p)                                              \
+       nouveau_namedb_destroy(&(p)->base)
+
 int  nouveau_client_init(struct nouveau_client *);
 int  nouveau_client_fini(struct nouveau_client *, bool suspend);
 
index d145b25e6be40f483ddd23fbaf4c69d4208d9365..5bd1ca8cd20dbe03bee67fa3e0fddd4faf1410cb 100644 (file)
@@ -17,6 +17,7 @@ struct nouveau_bios {
                u8 chip;
                u8 minor;
                u8 micro;
+               u8 patch;
        } version;
 };
 
index 2bf178082a36dd5a9fa866b20d278b595ea674bb..e6563b5cb08edb7c48ac4811627fa6007fe7b3d4 100644 (file)
@@ -25,9 +25,11 @@ struct dcb_gpio_func {
        u8 param;
 };
 
-u16 dcb_gpio_table(struct nouveau_bios *);
-u16 dcb_gpio_entry(struct nouveau_bios *, int idx, int ent, u8 *ver);
-int dcb_gpio_parse(struct nouveau_bios *, int idx, u8 func, u8 line,
+u16 dcb_gpio_table(struct nouveau_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
+u16 dcb_gpio_entry(struct nouveau_bios *, int idx, int ent, u8 *ver, u8 *len);
+u16 dcb_gpio_parse(struct nouveau_bios *, int idx, int ent, u8 *ver, u8 *len,
                   struct dcb_gpio_func *);
+u16 dcb_gpio_match(struct nouveau_bios *, int idx, u8 func, u8 line,
+                  u8 *ver, u8 *len, struct dcb_gpio_func *);
 
 #endif
index e69a8bdc6e97371072476b28c682a9d8f0427612..ca2f6bf37f46228d5e0b4f496c4ad78110adaf2d 100644 (file)
@@ -13,6 +13,7 @@ struct nvbios_init {
        u32 nested;
        u16 repeat;
        u16 repend;
+       u32 ramcfg;
 };
 
 int nvbios_exec(struct nvbios_init *);
index c345097592f20bcf191f1d71db11beddfb044053..b2f3d4d0aa49fab5883234af8be8e3c44fa6c9ee 100644 (file)
@@ -38,6 +38,8 @@ enum nvbios_pll_type {
        PLL_UNK42  = 0x42,
        PLL_VPLL0  = 0x80,
        PLL_VPLL1  = 0x81,
+       PLL_VPLL2  = 0x82,
+       PLL_VPLL3  = 0x83,
        PLL_MAX    = 0xff
 };
 
index 9ea2b12cc15d02707eec26b72ad05ad719cc3731..b75e8f18e52c8432a2506e4eb9924f31afc56989 100644 (file)
@@ -11,7 +11,7 @@ struct nouveau_gpio {
        struct nouveau_subdev base;
 
        /* hardware interfaces */
-       void (*reset)(struct nouveau_gpio *);
+       void (*reset)(struct nouveau_gpio *, u8 func);
        int  (*drive)(struct nouveau_gpio *, int line, int dir, int out);
        int  (*sense)(struct nouveau_gpio *, int line);
        void (*irq_enable)(struct nouveau_gpio *, int line, bool);
index dd111947eb8654a022bae8b65f787075c0d318ad..f621f69fa1a245a1f5d633b493d7542b71c21d38 100644 (file)
@@ -447,6 +447,7 @@ nouveau_bios_ctor(struct nouveau_object *parent,
                bios->version.chip  = nv_ro08(bios, bit_i.offset + 2);
                bios->version.minor = nv_ro08(bios, bit_i.offset + 1);
                bios->version.micro = nv_ro08(bios, bit_i.offset + 0);
+               bios->version.patch = nv_ro08(bios, bit_i.offset + 4);
        } else
        if (bmp_version(bios)) {
                bios->version.major = nv_ro08(bios, bios->bmp_offset + 13);
@@ -455,9 +456,9 @@ nouveau_bios_ctor(struct nouveau_object *parent,
                bios->version.micro = nv_ro08(bios, bios->bmp_offset + 10);
        }
 
-       nv_info(bios, "version %02x.%02x.%02x.%02x\n",
+       nv_info(bios, "version %02x.%02x.%02x.%02x.%02x\n",
                bios->version.major, bios->version.chip,
-               bios->version.minor, bios->version.micro);
+               bios->version.minor, bios->version.micro, bios->version.patch);
 
        return 0;
 }
index c90d4aa3ae4f6334ffa6f73cd51c76ebd4246925..c84e93fa6d9550cf258a23096967a8b6846f440f 100644 (file)
 #include <subdev/bios/gpio.h>
 
 u16
-dcb_gpio_table(struct nouveau_bios *bios)
+dcb_gpio_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
 {
-       u8  ver, hdr, cnt, len;
-       u16 dcb = dcb_table(bios, &ver, &hdr, &cnt, &len);
+       u16 data = 0x0000;
+       u16 dcb = dcb_table(bios, ver, hdr, cnt, len);
        if (dcb) {
-               if (ver >= 0x30 && hdr >= 0x0c)
-                       return nv_ro16(bios, dcb + 0x0a);
-               if (ver >= 0x22 && nv_ro08(bios, dcb - 1) >= 0x13)
-                       return nv_ro16(bios, dcb - 0x0f);
+               if (*ver >= 0x30 && *hdr >= 0x0c)
+                       data = nv_ro16(bios, dcb + 0x0a);
+               else
+               if (*ver >= 0x22 && nv_ro08(bios, dcb - 1) >= 0x13)
+                       data = nv_ro16(bios, dcb - 0x0f);
+
+               if (data) {
+                       *ver = nv_ro08(bios, data + 0x00);
+                       if (*ver < 0x30) {
+                               *hdr = 3;
+                               *cnt = nv_ro08(bios, data + 0x02);
+                               *len = nv_ro08(bios, data + 0x01);
+                       } else
+                       if (*ver <= 0x41) {
+                               *hdr = nv_ro08(bios, data + 0x01);
+                               *cnt = nv_ro08(bios, data + 0x02);
+                               *len = nv_ro08(bios, data + 0x03);
+                       } else {
+                               data = 0x0000;
+                       }
+               }
        }
-       return 0x0000;
+       return data;
 }
 
 u16
-dcb_gpio_entry(struct nouveau_bios *bios, int idx, int ent, u8 *ver)
+dcb_gpio_entry(struct nouveau_bios *bios, int idx, int ent, u8 *ver, u8 *len)
 {
-       u16 gpio = dcb_gpio_table(bios);
-       if (gpio) {
-               *ver = nv_ro08(bios, gpio);
-               if (*ver < 0x30 && ent < nv_ro08(bios, gpio + 2))
-                       return gpio + 3 + (ent * nv_ro08(bios, gpio + 1));
-               else if (ent < nv_ro08(bios, gpio + 2))
-                       return gpio + nv_ro08(bios, gpio + 1) +
-                              (ent * nv_ro08(bios, gpio + 3));
-       }
+       u8  hdr, cnt;
+       u16 gpio = !idx ? dcb_gpio_table(bios, ver, &hdr, &cnt, len) : 0x0000;
+       if (gpio && ent < cnt)
+               return gpio + hdr + (ent * *len);
        return 0x0000;
 }
 
-int
-dcb_gpio_parse(struct nouveau_bios *bios, int idx, u8 func, u8 line,
+u16
+dcb_gpio_parse(struct nouveau_bios *bios, int idx, int ent, u8 *ver, u8 *len,
               struct dcb_gpio_func *gpio)
 {
-       u8  ver, hdr, cnt, len;
-       u16 entry;
-       int i = -1;
-
-       while ((entry = dcb_gpio_entry(bios, idx, ++i, &ver))) {
-               if (ver < 0x40) {
-                       u16 data = nv_ro16(bios, entry);
+       u16 data = dcb_gpio_entry(bios, idx, ent, ver, len);
+       if (data) {
+               if (*ver < 0x40) {
+                       u16 info = nv_ro16(bios, data);
                        *gpio = (struct dcb_gpio_func) {
-                               .line = (data & 0x001f) >> 0,
-                               .func = (data & 0x07e0) >> 5,
-                               .log[0] = (data & 0x1800) >> 11,
-                               .log[1] = (data & 0x6000) >> 13,
-                               .param = !!(data & 0x8000),
+                               .line = (info & 0x001f) >> 0,
+                               .func = (info & 0x07e0) >> 5,
+                               .log[0] = (info & 0x1800) >> 11,
+                               .log[1] = (info & 0x6000) >> 13,
+                               .param = !!(info & 0x8000),
                        };
                } else
-               if (ver < 0x41) {
-                       u32 data = nv_ro32(bios, entry);
+               if (*ver < 0x41) {
+                       u32 info = nv_ro32(bios, data);
                        *gpio = (struct dcb_gpio_func) {
-                               .line = (data & 0x0000001f) >> 0,
-                               .func = (data & 0x0000ff00) >> 8,
-                               .log[0] = (data & 0x18000000) >> 27,
-                               .log[1] = (data & 0x60000000) >> 29,
-                               .param = !!(data & 0x80000000),
+                               .line = (info & 0x0000001f) >> 0,
+                               .func = (info & 0x0000ff00) >> 8,
+                               .log[0] = (info & 0x18000000) >> 27,
+                               .log[1] = (info & 0x60000000) >> 29,
+                               .param = !!(info & 0x80000000),
                        };
                } else {
-                       u32 data = nv_ro32(bios, entry + 0);
-                       u8 data1 = nv_ro32(bios, entry + 4);
+                       u32 info = nv_ro32(bios, data + 0);
+                       u8 info1 = nv_ro32(bios, data + 4);
                        *gpio = (struct dcb_gpio_func) {
-                               .line = (data & 0x0000003f) >> 0,
-                               .func = (data & 0x0000ff00) >> 8,
-                               .log[0] = (data1 & 0x30) >> 4,
-                               .log[1] = (data1 & 0xc0) >> 6,
-                               .param = !!(data & 0x80000000),
+                               .line = (info & 0x0000003f) >> 0,
+                               .func = (info & 0x0000ff00) >> 8,
+                               .log[0] = (info1 & 0x30) >> 4,
+                               .log[1] = (info1 & 0xc0) >> 6,
+                               .param = !!(info & 0x80000000),
                        };
                }
+       }
+
+       return data;
+}
 
+u16
+dcb_gpio_match(struct nouveau_bios *bios, int idx, u8 func, u8 line,
+              u8 *ver, u8 *len, struct dcb_gpio_func *gpio)
+{
+       u8  hdr, cnt, i = 0;
+       u16 data;
+
+       while ((data = dcb_gpio_parse(bios, idx, i++, ver, len, gpio))) {
                if ((line == 0xff || line == gpio->line) &&
                    (func == 0xff || func == gpio->func))
-                       return 0;
+                       return data;
        }
 
        /* DCB 2.2, fixed TVDAC GPIO data */
-       if ((entry = dcb_table(bios, &ver, &hdr, &cnt, &len))) {
-               if (ver >= 0x22 && ver < 0x30 && func == DCB_GPIO_TVDAC0) {
-                       u8 conf = nv_ro08(bios, entry - 5);
-                       u8 addr = nv_ro08(bios, entry - 4);
+       if ((data = dcb_table(bios, ver, &hdr, &cnt, len))) {
+               if (*ver >= 0x22 && *ver < 0x30 && func == DCB_GPIO_TVDAC0) {
+                       u8 conf = nv_ro08(bios, data - 5);
+                       u8 addr = nv_ro08(bios, data - 4);
                        if (conf & 0x01) {
                                *gpio = (struct dcb_gpio_func) {
                                        .func = DCB_GPIO_TVDAC0,
@@ -112,10 +133,11 @@ dcb_gpio_parse(struct nouveau_bios *bios, int idx, u8 func, u8 line,
                                        .log[0] = !!(conf & 0x02),
                                        .log[1] =  !(conf & 0x02),
                                };
-                               return 0;
+                               *ver = 0x00;
+                               return data;
                        }
                }
        }
 
-       return -EINVAL;
+       return 0x0000;
 }
index ae168bbb86d851a0bd1a81a532106281bae91a83..690ed438b2adbcf6c3263d5962e84054a62fef5d 100644 (file)
@@ -2,11 +2,12 @@
 #include <core/device.h>
 
 #include <subdev/bios.h>
-#include <subdev/bios/conn.h>
 #include <subdev/bios/bmp.h>
 #include <subdev/bios/bit.h>
+#include <subdev/bios/conn.h>
 #include <subdev/bios/dcb.h>
 #include <subdev/bios/dp.h>
+#include <subdev/bios/gpio.h>
 #include <subdev/bios/init.h>
 #include <subdev/devinit.h>
 #include <subdev/clock.h>
@@ -409,10 +410,26 @@ init_ram_restrict_group_count(struct nvbios_init *init)
        return 0x00;
 }
 
+static u8
+init_ram_restrict_strap(struct nvbios_init *init)
+{
+       /* This appears to be the behaviour of the VBIOS parser, and *is*
+        * important to cache the NV_PEXTDEV_BOOT0 on later chipsets to
+        * avoid fucking up the memory controller (somehow) by reading it
+        * on every INIT_RAM_RESTRICT_ZM_GROUP opcode.
+        *
+        * Preserving the non-caching behaviour on earlier chipsets just
+        * in case *not* re-reading the strap causes similar breakage.
+        */
+       if (!init->ramcfg || init->bios->version.major < 0x70)
+               init->ramcfg = init_rd32(init, 0x101000);
+       return (init->ramcfg & 0x00000003c) >> 2;
+}
+
 static u8
 init_ram_restrict(struct nvbios_init *init)
 {
-       u32 strap = (init_rd32(init, 0x101000) & 0x0000003c) >> 2;
+       u8  strap = init_ram_restrict_strap(init);
        u16 table = init_ram_restrict_table(init);
        if (table)
                return nv_ro08(init->bios, table + strap);
@@ -1517,7 +1534,6 @@ init_io(struct nvbios_init *init)
                mdelay(10);
                init_wr32(init, 0x614100, 0x10000018);
                init_wr32(init, 0x614900, 0x10000018);
-               return;
        }
 
        value = init_rdport(init, port) & mask;
@@ -1781,7 +1797,7 @@ init_gpio(struct nvbios_init *init)
        init->offset += 1;
 
        if (init_exec(init) && gpio && gpio->reset)
-               gpio->reset(gpio);
+               gpio->reset(gpio, DCB_GPIO_UNUSED);
 }
 
 /**
@@ -1995,6 +2011,47 @@ init_i2c_long_if(struct nvbios_init *init)
        init_exec_set(init, false);
 }
 
+/**
+ * INIT_GPIO_NE - opcode 0xa9
+ *
+ */
+static void
+init_gpio_ne(struct nvbios_init *init)
+{
+       struct nouveau_bios *bios = init->bios;
+       struct nouveau_gpio *gpio = nouveau_gpio(bios);
+       struct dcb_gpio_func func;
+       u8 count = nv_ro08(bios, init->offset + 1);
+       u8 idx = 0, ver, len;
+       u16 data, i;
+
+       trace("GPIO_NE\t");
+       init->offset += 2;
+
+       for (i = init->offset; i < init->offset + count; i++)
+               cont("0x%02x ", nv_ro08(bios, i));
+       cont("\n");
+
+       while ((data = dcb_gpio_parse(bios, 0, idx++, &ver, &len, &func))) {
+               if (func.func != DCB_GPIO_UNUSED) {
+                       for (i = init->offset; i < init->offset + count; i++) {
+                               if (func.func == nv_ro08(bios, i))
+                                       break;
+                       }
+
+                       trace("\tFUNC[0x%02x]", func.func);
+                       if (i == (init->offset + count)) {
+                               cont(" *");
+                               if (init_exec(init) && gpio && gpio->reset)
+                                       gpio->reset(gpio, func.func);
+                       }
+                       cont("\n");
+               }
+       }
+
+       init->offset += count;
+}
+
 static struct nvbios_init_opcode {
        void (*exec)(struct nvbios_init *);
 } init_opcode[] = {
@@ -2059,6 +2116,7 @@ static struct nvbios_init_opcode {
        [0x98] = { init_auxch },
        [0x99] = { init_zm_auxch },
        [0x9a] = { init_i2c_long_if },
+       [0xa9] = { init_gpio_ne },
 };
 
 #define init_opcode_nr (sizeof(init_opcode) / sizeof(init_opcode[0]))
index f6962c9b6c36b6f00db2715287dedf1c3adb9f4e..7c9626258a467029cf3bc7b63b37429dfa0e4fa8 100644 (file)
@@ -52,6 +52,8 @@ nvc0_clock_pll_set(struct nouveau_clock *clk, u32 type, u32 freq)
        switch (info.type) {
        case PLL_VPLL0:
        case PLL_VPLL1:
+       case PLL_VPLL2:
+       case PLL_VPLL3:
                nv_mask(priv, info.reg + 0x0c, 0x00000000, 0x00000100);
                nv_wr32(priv, info.reg + 0x04, (P << 16) | (N << 8) | M);
                nv_wr32(priv, info.reg + 0x10, fN << 16);
index 9b7881e76634c934335545e76f250c314d0758db..03a652876e731d4e1428b984adb8825223bad053 100644 (file)
@@ -109,6 +109,34 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_ENGINE_VP     ] = &nve0_vp_oclass;
                device->oclass[NVDEV_ENGINE_PPP    ] = &nvc0_ppp_oclass;
                break;
+       case 0xe6:
+               device->cname = "GK106";
+               device->oclass[NVDEV_SUBDEV_VBIOS  ] = &nouveau_bios_oclass;
+               device->oclass[NVDEV_SUBDEV_GPIO   ] = &nvd0_gpio_oclass;
+               device->oclass[NVDEV_SUBDEV_I2C    ] = &nouveau_i2c_oclass;
+               device->oclass[NVDEV_SUBDEV_CLOCK  ] = &nvc0_clock_oclass;
+               device->oclass[NVDEV_SUBDEV_THERM  ] = &nv50_therm_oclass;
+               device->oclass[NVDEV_SUBDEV_MXM    ] = &nv50_mxm_oclass;
+               device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv50_devinit_oclass;
+               device->oclass[NVDEV_SUBDEV_MC     ] = &nvc0_mc_oclass;
+               device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
+               device->oclass[NVDEV_SUBDEV_FB     ] = &nvc0_fb_oclass;
+               device->oclass[NVDEV_SUBDEV_LTCG   ] = &nvc0_ltcg_oclass;
+               device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
+               device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
+               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
+               device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
+               device->oclass[NVDEV_ENGINE_FIFO   ] = &nve0_fifo_oclass;
+               device->oclass[NVDEV_ENGINE_SW     ] = &nvc0_software_oclass;
+               device->oclass[NVDEV_ENGINE_GR     ] = &nve0_graph_oclass;
+               device->oclass[NVDEV_ENGINE_DISP   ] = &nve0_disp_oclass;
+               device->oclass[NVDEV_ENGINE_COPY0  ] = &nve0_copy0_oclass;
+               device->oclass[NVDEV_ENGINE_COPY1  ] = &nve0_copy1_oclass;
+               device->oclass[NVDEV_ENGINE_BSP    ] = &nve0_bsp_oclass;
+               device->oclass[NVDEV_ENGINE_VP     ] = &nve0_vp_oclass;
+               device->oclass[NVDEV_ENGINE_PPP    ] = &nvc0_ppp_oclass;
+               break;
        default:
                nv_fatal(device, "unknown Kepler chipset\n");
                return -EINVAL;
index 306bdf121452e6e9da8d6ddeb7ba6210ddeb0bde..7606ed15b6faf55ea531e6637cc86976b24012c2 100644 (file)
@@ -145,14 +145,14 @@ nvc0_fb_vram_new(struct nouveau_fb *pfb, u64 size, u32 align, u32 ncmin,
        mem->memtype = type;
        mem->size = size;
 
-       mutex_lock(&mm->mutex);
+       mutex_lock(&pfb->base.mutex);
        do {
                if (back)
                        ret = nouveau_mm_tail(mm, 1, size, ncmin, align, &r);
                else
                        ret = nouveau_mm_head(mm, 1, size, ncmin, align, &r);
                if (ret) {
-                       mutex_unlock(&mm->mutex);
+                       mutex_unlock(&pfb->base.mutex);
                        pfb->ram.put(pfb, &mem);
                        return ret;
                }
@@ -160,7 +160,7 @@ nvc0_fb_vram_new(struct nouveau_fb *pfb, u64 size, u32 align, u32 ncmin,
                list_add_tail(&r->rl_entry, &mem->regions);
                size -= r->length;
        } while (size);
-       mutex_unlock(&mm->mutex);
+       mutex_unlock(&pfb->base.mutex);
 
        r = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry);
        mem->offset = (u64)r->offset << 12;
index acf818c58bf0b2428873e26602834fc56ccc16a8..9fb0f9b92d49efacf84ae5826b61b4662d59699c 100644 (file)
@@ -43,10 +43,15 @@ static int
 nouveau_gpio_find(struct nouveau_gpio *gpio, int idx, u8 tag, u8 line,
                  struct dcb_gpio_func *func)
 {
+       struct nouveau_bios *bios = nouveau_bios(gpio);
+       u8  ver, len;
+       u16 data;
+
        if (line == 0xff && tag == 0xff)
                return -EINVAL;
 
-       if (!dcb_gpio_parse(nouveau_bios(gpio), idx, tag, line, func))
+       data = dcb_gpio_match(bios, idx, tag, line, &ver, &len, func);
+       if (data)
                return 0;
 
        /* Apple iMac G4 NV18 */
@@ -265,7 +270,7 @@ nouveau_gpio_init(struct nouveau_gpio *gpio)
        int ret = nouveau_subdev_init(&gpio->base);
        if (ret == 0 && gpio->reset) {
                if (dmi_check_system(gpio_reset_ids))
-                       gpio->reset(gpio);
+                       gpio->reset(gpio, DCB_GPIO_UNUSED);
        }
        return ret;
 }
index f3502c961cd93ea3be50b367f6eaeb62d8c720f9..bf13a1200f26188935d22dd8183855129a51e187 100644 (file)
@@ -29,15 +29,15 @@ struct nv50_gpio_priv {
 };
 
 static void
-nv50_gpio_reset(struct nouveau_gpio *gpio)
+nv50_gpio_reset(struct nouveau_gpio *gpio, u8 match)
 {
        struct nouveau_bios *bios = nouveau_bios(gpio);
        struct nv50_gpio_priv *priv = (void *)gpio;
+       u8 ver, len;
        u16 entry;
-       u8 ver;
        int ent = -1;
 
-       while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver))) {
+       while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver, &len))) {
                static const u32 regs[] = { 0xe100, 0xe28c };
                u32 data = nv_ro32(bios, entry);
                u8  line =   (data & 0x0000001f);
@@ -48,7 +48,8 @@ nv50_gpio_reset(struct nouveau_gpio *gpio)
                u32 val = (unk1 << 16) | unk0;
                u32 reg = regs[line >> 4]; line &= 0x0f;
 
-               if (func == 0xff)
+               if ( func  == DCB_GPIO_UNUSED ||
+                   (match != DCB_GPIO_UNUSED && match != func))
                        continue;
 
                gpio->set(gpio, 0, func, line, defs);
index 8d18fcad26e09843899583fce69b271a42fbfa67..83e8b8f16e6ad1f3ad4a3ba5e8676ff078107c69 100644 (file)
@@ -29,15 +29,15 @@ struct nvd0_gpio_priv {
 };
 
 static void
-nvd0_gpio_reset(struct nouveau_gpio *gpio)
+nvd0_gpio_reset(struct nouveau_gpio *gpio, u8 match)
 {
        struct nouveau_bios *bios = nouveau_bios(gpio);
        struct nvd0_gpio_priv *priv = (void *)gpio;
+       u8 ver, len;
        u16 entry;
-       u8 ver;
        int ent = -1;
 
-       while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver))) {
+       while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver, &len))) {
                u32 data = nv_ro32(bios, entry);
                u8  line =   (data & 0x0000003f);
                u8  defs = !!(data & 0x00000080);
@@ -45,7 +45,8 @@ nvd0_gpio_reset(struct nouveau_gpio *gpio)
                u8  unk0 =   (data & 0x00ff0000) >> 16;
                u8  unk1 =   (data & 0x1f000000) >> 24;
 
-               if (func == 0xff)
+               if ( func  == DCB_GPIO_UNUSED ||
+                   (match != DCB_GPIO_UNUSED && match != func))
                        continue;
 
                gpio->set(gpio, 0, func, line, defs);
index 1188227ca6aa909b88f4912608c97d1b3aa2d186..6565f3dbbe04e7e04c0721ad49f3523688f8b729 100644 (file)
@@ -40,15 +40,21 @@ nouveau_instobj_create_(struct nouveau_object *parent,
        if (ret)
                return ret;
 
+       mutex_lock(&imem->base.mutex);
        list_add(&iobj->head, &imem->list);
+       mutex_unlock(&imem->base.mutex);
        return 0;
 }
 
 void
 nouveau_instobj_destroy(struct nouveau_instobj *iobj)
 {
-       if (iobj->head.prev)
-               list_del(&iobj->head);
+       struct nouveau_subdev *subdev = nv_subdev(iobj->base.engine);
+
+       mutex_lock(&subdev->mutex);
+       list_del(&iobj->head);
+       mutex_unlock(&subdev->mutex);
+
        return nouveau_object_destroy(&iobj->base);
 }
 
@@ -88,6 +94,8 @@ nouveau_instmem_init(struct nouveau_instmem *imem)
        if (ret)
                return ret;
 
+       mutex_lock(&imem->base.mutex);
+
        list_for_each_entry(iobj, &imem->list, head) {
                if (iobj->suspend) {
                        for (i = 0; i < iobj->size; i += 4)
@@ -97,6 +105,8 @@ nouveau_instmem_init(struct nouveau_instmem *imem)
                }
        }
 
+       mutex_unlock(&imem->base.mutex);
+
        return 0;
 }
 
@@ -104,17 +114,26 @@ int
 nouveau_instmem_fini(struct nouveau_instmem *imem, bool suspend)
 {
        struct nouveau_instobj *iobj;
-       int i;
+       int i, ret = 0;
 
        if (suspend) {
+               mutex_lock(&imem->base.mutex);
+
                list_for_each_entry(iobj, &imem->list, head) {
                        iobj->suspend = vmalloc(iobj->size);
-                       if (iobj->suspend) {
-                               for (i = 0; i < iobj->size; i += 4)
-                                       iobj->suspend[i / 4] = nv_ro32(iobj, i);
-                       } else
-                               return -ENOMEM;
+                       if (!iobj->suspend) {
+                               ret = -ENOMEM;
+                               break;
+                       }
+
+                       for (i = 0; i < iobj->size; i += 4)
+                               iobj->suspend[i / 4] = nv_ro32(iobj, i);
                }
+
+               mutex_unlock(&imem->base.mutex);
+
+               if (ret)
+                       return ret;
        }
 
        return nouveau_subdev_fini(&imem->base, suspend);
index 93e3ddf7303a17efec9e70d95303f5906e847bad..e286e132c7e7d744d88d99522cf2ce733b4899a6 100644 (file)
@@ -260,7 +260,7 @@ nouveau_mxm_create_(struct nouveau_object *parent,
 
        data = mxm_table(bios, &ver, &len);
        if (!data || !(ver = nv_ro08(bios, data))) {
-               nv_info(mxm, "no VBIOS data, nothing to do\n");
+               nv_debug(mxm, "no VBIOS data, nothing to do\n");
                return 0;
        }
 
index 082c11b75acb8a23a6559ae7a5840b882aa67fbe..77c67fc970e64f187d0b37d533fd3bef3cc8139c 100644 (file)
@@ -352,7 +352,7 @@ nouveau_vm_create(struct nouveau_vmmgr *vmm, u64 offset, u64 length,
        u64 mm_length = (offset + length) - mm_offset;
        int ret;
 
-       vm = *pvm = kzalloc(sizeof(*vm), GFP_KERNEL);
+       vm = kzalloc(sizeof(*vm), GFP_KERNEL);
        if (!vm)
                return -ENOMEM;
 
@@ -376,6 +376,8 @@ nouveau_vm_create(struct nouveau_vmmgr *vmm, u64 offset, u64 length,
                return ret;
        }
 
+       *pvm = vm;
+
        return 0;
 }
 
index 5614c89148cbc4cc4c9ce1b586611015588e6cde..69d7b1d0b9d69e2b24f27be89cc7f869669bd4a3 100644 (file)
@@ -1276,7 +1276,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
                if (drm->agp.stat == ENABLED) {
                        mem->bus.offset = mem->start << PAGE_SHIFT;
                        mem->bus.base = drm->agp.base;
-                       mem->bus.is_iomem = true;
+                       mem->bus.is_iomem = !dev->agp->cant_use_aperture;
                }
 #endif
                break;
index ac340ba32017402e4fc19e26c0189961e9b96927..e620ba8271b4bc4e5d71edbd8f787a2c14eecf0b 100644 (file)
@@ -127,12 +127,26 @@ nouveau_connector_ddc_detect(struct drm_connector *connector,
                             struct nouveau_encoder **pnv_encoder)
 {
        struct drm_device *dev = connector->dev;
+       struct nouveau_connector *nv_connector = nouveau_connector(connector);
        struct nouveau_drm *drm = nouveau_drm(dev);
+       struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
        struct nouveau_i2c *i2c = nouveau_i2c(drm->device);
-       int i;
+       struct nouveau_i2c_port *port = NULL;
+       int i, panel = -ENODEV;
+
+       /* eDP panels need powering on by us (if the VBIOS doesn't default it
+        * to on) before doing any AUX channel transactions.  LVDS panel power
+        * is handled by the SOR itself, and not required for LVDS DDC.
+        */
+       if (nv_connector->type == DCB_CONNECTOR_eDP) {
+               panel = gpio->get(gpio, 0, DCB_GPIO_PANEL_POWER, 0xff);
+               if (panel == 0) {
+                       gpio->set(gpio, 0, DCB_GPIO_PANEL_POWER, 0xff, 1);
+                       msleep(300);
+               }
+       }
 
        for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-               struct nouveau_i2c_port *port = NULL;
                struct nouveau_encoder *nv_encoder;
                struct drm_mode_object *obj;
                int id;
@@ -150,11 +164,19 @@ nouveau_connector_ddc_detect(struct drm_connector *connector,
                        port = i2c->find(i2c, nv_encoder->dcb->i2c_index);
                if (port && nv_probe_i2c(port, 0x50)) {
                        *pnv_encoder = nv_encoder;
-                       return port;
+                       break;
                }
+
+               port = NULL;
        }
 
-       return NULL;
+       /* eDP panel not detected, restore panel power GPIO to previous
+        * state to avoid confusing the SOR for other output types.
+        */
+       if (!port && panel == 0)
+               gpio->set(gpio, 0, DCB_GPIO_PANEL_POWER, 0xff, panel);
+
+       return port;
 }
 
 static struct nouveau_encoder *
index e4188f24fc758a457f26cd447d5b1d62fc763e17..508b00a2ce0de6d48b80e33d1ef1bc515598b3d2 100644 (file)
@@ -225,15 +225,6 @@ nouveau_display_init(struct drm_device *dev)
        if (ret)
                return ret;
 
-       /* power on internal panel if it's not already.  the init tables of
-        * some vbios default this to off for some reason, causing the
-        * panel to not work after resume
-        */
-       if (gpio && gpio->get(gpio, 0, DCB_GPIO_PANEL_POWER, 0xff) == 0) {
-               gpio->set(gpio, 0, DCB_GPIO_PANEL_POWER, 0xff, 1);
-               msleep(300);
-       }
-
        /* enable polling for external displays */
        drm_kms_helper_poll_enable(dev);
 
index 01c403ddb99b75893594deb571f0b6e8ef27a1a3..8b090f1eb51d7f3ebf284814709ef1f0c472a774 100644 (file)
@@ -84,11 +84,16 @@ nouveau_cli_create(struct pci_dev *pdev, const char *name,
        struct nouveau_cli *cli;
        int ret;
 
+       *pcli = NULL;
        ret = nouveau_client_create_(name, nouveau_name(pdev), nouveau_config,
                                     nouveau_debug, size, pcli);
        cli = *pcli;
-       if (ret)
+       if (ret) {
+               if (cli)
+                       nouveau_client_destroy(&cli->base);
+               *pcli = NULL;
                return ret;
+       }
 
        mutex_init(&cli->mutex);
        return 0;
@@ -189,8 +194,8 @@ nouveau_accel_init(struct nouveau_drm *drm)
        nouveau_bo_move_init(drm);
 }
 
-static int __devinit
-nouveau_drm_probe(struct pci_dev *pdev, const struct pci_device_id *pent)
+static int nouveau_drm_probe(struct pci_dev *pdev,
+                            const struct pci_device_id *pent)
 {
        struct nouveau_device *device;
        struct apertures_struct *aper;
index bedafd1c9539f5ae0f659c29e1c034dbd36de855..cdb83acdffe264b2144e615f96bc55d346384116 100644 (file)
@@ -60,6 +60,7 @@ u32  nv10_fence_read(struct nouveau_channel *);
 void nv10_fence_context_del(struct nouveau_channel *);
 void nv10_fence_destroy(struct nouveau_drm *);
 int  nv10_fence_create(struct nouveau_drm *);
+void nv17_fence_resume(struct nouveau_drm *drm);
 
 int nv50_fence_create(struct nouveau_drm *);
 int nv84_fence_create(struct nouveau_drm *);
index 5566172774df4b2ff891db4745483b8655754a5b..a701ff5ffa5b8fdb63497eac6782523814a2cdf7 100644 (file)
@@ -698,10 +698,10 @@ static int
 nouveau_hwmon_init(struct drm_device *dev)
 {
        struct nouveau_pm *pm = nouveau_pm(dev);
-       struct nouveau_drm *drm = nouveau_drm(dev);
-       struct nouveau_therm *therm = nouveau_therm(drm->device);
 
 #if defined(CONFIG_HWMON) || (defined(MODULE) && defined(CONFIG_HWMON_MODULE))
+       struct nouveau_drm *drm = nouveau_drm(dev);
+       struct nouveau_therm *therm = nouveau_therm(drm->device);
        struct device *hwmon_dev;
        int ret = 0;
 
index 3543fec2355e52804dc69fcf8fd695632308a7a4..b8e05ae38212db2b8912f874dc4fe5fb627e7102 100644 (file)
@@ -193,6 +193,7 @@ struct drm_gem_object *nouveau_gem_prime_import(struct drm_device *dev,
                if (nvbo->gem) {
                        if (nvbo->gem->dev == dev) {
                                drm_gem_object_reference(nvbo->gem);
+                               dma_buf_put(dma_buf);
                                return nvbo->gem;
                        }
                }
index 184cdf806761c0bc0cefb52af00a8799ae8e6393..39ffc07f906b8f57fcaf2427e3a5be3bbfd76bb5 100644 (file)
@@ -505,7 +505,7 @@ static void nv04_dfp_update_backlight(struct drm_encoder *encoder, int mode)
 
 static inline bool is_powersaving_dpms(int mode)
 {
-       return (mode != DRM_MODE_DPMS_ON);
+       return mode != DRM_MODE_DPMS_ON && mode != NV_DPMS_CLEARED;
 }
 
 static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode)
index 7ae7f97a6d4d84c273853d31bae664f16b7ca453..03017f24d593fa84b569a6c3f370b310b7ab09c2 100644 (file)
@@ -162,6 +162,13 @@ nv10_fence_destroy(struct nouveau_drm *drm)
        kfree(priv);
 }
 
+void nv17_fence_resume(struct nouveau_drm *drm)
+{
+       struct nv10_fence_priv *priv = drm->fence;
+
+       nouveau_bo_wr32(priv->bo, 0, priv->sequence);
+}
+
 int
 nv10_fence_create(struct nouveau_drm *drm)
 {
@@ -197,6 +204,7 @@ nv10_fence_create(struct nouveau_drm *drm)
                if (ret == 0) {
                        nouveau_bo_wr32(priv->bo, 0x000, 0x00000000);
                        priv->base.sync = nv17_fence_sync;
+                       priv->base.resume = nv17_fence_resume;
                }
        }
 
index c20f2727ea0ba2d114699aaf2df56416e9794729..d889f3ac0d412d4affac8c1a17428270b6f0a448 100644 (file)
@@ -122,6 +122,7 @@ nv50_fence_create(struct nouveau_drm *drm)
        if (ret == 0) {
                nouveau_bo_wr32(priv->bo, 0x000, 0x00000000);
                priv->base.sync = nv17_fence_sync;
+               priv->base.resume = nv17_fence_resume;
        }
 
        if (ret)
index f95d7fc1f5e0f8bc2446f216ca0717b4d5af14f4..061fa0a28900612506e8af0b8c44e9d633fdb2d5 100644 (file)
@@ -2306,22 +2306,20 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
        return radeon_ring_test_lockup(rdev, ring);
 }
 
-static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
+static void evergreen_gpu_soft_reset_gfx(struct radeon_device *rdev)
 {
-       struct evergreen_mc_save save;
        u32 grbm_reset = 0;
 
        if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
-               return 0;
+               return;
 
-       dev_info(rdev->dev, "GPU softreset \n");
-       dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS               = 0x%08X\n",
                RREG32(GRBM_STATUS));
-       dev_info(rdev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS_SE0           = 0x%08X\n",
                RREG32(GRBM_STATUS_SE0));
-       dev_info(rdev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS_SE1           = 0x%08X\n",
                RREG32(GRBM_STATUS_SE1));
-       dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  SRBM_STATUS               = 0x%08X\n",
                RREG32(SRBM_STATUS));
        dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
                RREG32(CP_STALLED_STAT1));
@@ -2331,10 +2329,7 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
                RREG32(CP_BUSY_STAT));
        dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
                RREG32(CP_STAT));
-       evergreen_mc_stop(rdev, &save);
-       if (evergreen_mc_wait_for_idle(rdev)) {
-               dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
-       }
+
        /* Disable CP parsing/prefetching */
        WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
 
@@ -2358,15 +2353,14 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
        udelay(50);
        WREG32(GRBM_SOFT_RESET, 0);
        (void)RREG32(GRBM_SOFT_RESET);
-       /* Wait a little for things to settle down */
-       udelay(50);
-       dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
+
+       dev_info(rdev->dev, "  GRBM_STATUS               = 0x%08X\n",
                RREG32(GRBM_STATUS));
-       dev_info(rdev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS_SE0           = 0x%08X\n",
                RREG32(GRBM_STATUS_SE0));
-       dev_info(rdev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS_SE1           = 0x%08X\n",
                RREG32(GRBM_STATUS_SE1));
-       dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  SRBM_STATUS               = 0x%08X\n",
                RREG32(SRBM_STATUS));
        dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
                RREG32(CP_STALLED_STAT1));
@@ -2376,13 +2370,65 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
                RREG32(CP_BUSY_STAT));
        dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
                RREG32(CP_STAT));
+}
+
+static void evergreen_gpu_soft_reset_dma(struct radeon_device *rdev)
+{
+       u32 tmp;
+
+       if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
+               return;
+
+       dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
+               RREG32(DMA_STATUS_REG));
+
+       /* Disable DMA */
+       tmp = RREG32(DMA_RB_CNTL);
+       tmp &= ~DMA_RB_ENABLE;
+       WREG32(DMA_RB_CNTL, tmp);
+
+       /* Reset dma */
+       WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA);
+       RREG32(SRBM_SOFT_RESET);
+       udelay(50);
+       WREG32(SRBM_SOFT_RESET, 0);
+
+       dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
+               RREG32(DMA_STATUS_REG));
+}
+
+static int evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
+{
+       struct evergreen_mc_save save;
+
+       if (reset_mask == 0)
+               return 0;
+
+       dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
+
+       evergreen_mc_stop(rdev, &save);
+       if (evergreen_mc_wait_for_idle(rdev)) {
+               dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
+       }
+
+       if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE))
+               evergreen_gpu_soft_reset_gfx(rdev);
+
+       if (reset_mask & RADEON_RESET_DMA)
+               evergreen_gpu_soft_reset_dma(rdev);
+
+       /* Wait a little for things to settle down */
+       udelay(50);
+
        evergreen_mc_resume(rdev, &save);
        return 0;
 }
 
 int evergreen_asic_reset(struct radeon_device *rdev)
 {
-       return evergreen_gpu_soft_reset(rdev);
+       return evergreen_gpu_soft_reset(rdev, (RADEON_RESET_GFX |
+                                              RADEON_RESET_COMPUTE |
+                                              RADEON_RESET_DMA));
 }
 
 /* Interrupts */
@@ -3215,7 +3261,7 @@ void evergreen_dma_fence_ring_emit(struct radeon_device *rdev,
        radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0, 0));
        /* flush HDP */
        radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
-       radeon_ring_write(ring, (0xf << 16) | HDP_MEM_COHERENCY_FLUSH_CNTL);
+       radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
        radeon_ring_write(ring, 1);
 }
 
index 74c6b42d259788fab5f35fd3d10343b16b38f8f2..7a445666e71f1221ca92cd07bcdea61b29867ded 100644 (file)
@@ -2654,6 +2654,35 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
                        ib[idx+4] = upper_32_bits(offset) & 0xff;
                }
                break;
+       case PACKET3_MEM_WRITE:
+       {
+               u64 offset;
+
+               if (pkt->count != 3) {
+                       DRM_ERROR("bad MEM_WRITE (invalid count)\n");
+                       return -EINVAL;
+               }
+               r = evergreen_cs_packet_next_reloc(p, &reloc);
+               if (r) {
+                       DRM_ERROR("bad MEM_WRITE (missing reloc)\n");
+                       return -EINVAL;
+               }
+               offset = radeon_get_ib_value(p, idx+0);
+               offset += ((u64)(radeon_get_ib_value(p, idx+1) & 0xff)) << 32UL;
+               if (offset & 0x7) {
+                       DRM_ERROR("bad MEM_WRITE (address not qwords aligned)\n");
+                       return -EINVAL;
+               }
+               if ((offset + 8) > radeon_bo_size(reloc->robj)) {
+                       DRM_ERROR("bad MEM_WRITE bo too small: 0x%llx, 0x%lx\n",
+                                 offset + 8, radeon_bo_size(reloc->robj));
+                       return -EINVAL;
+               }
+               offset += reloc->lobj.gpu_offset;
+               ib[idx+0] = offset;
+               ib[idx+1] = upper_32_bits(offset) & 0xff;
+               break;
+       }
        case PACKET3_COPY_DW:
                if (pkt->count != 4) {
                        DRM_ERROR("bad COPY_DW (invalid count)\n");
@@ -3287,6 +3316,7 @@ static bool evergreen_vm_reg_valid(u32 reg)
 
        /* check config regs */
        switch (reg) {
+       case WAIT_UNTIL:
        case GRBM_GFX_INDEX:
        case CP_STRMOUT_CNTL:
        case CP_COHER_CNTL:
index cb9baaac9e85102505347cac84c1dd717709d2e4..0bfd0e9e469b57ca395049ce1dfae500b67b3936 100644 (file)
 #define                SOFT_RESET_ROM                          (1 << 14)
 #define                SOFT_RESET_SEM                          (1 << 15)
 #define                SOFT_RESET_VMC                          (1 << 17)
+#define                SOFT_RESET_DMA                          (1 << 20)
 #define                SOFT_RESET_TST                          (1 << 21)
-#define                SOFT_RESET_REGBB                        (1 << 22)
+#define                SOFT_RESET_REGBB                        (1 << 22)
 #define                SOFT_RESET_ORB                          (1 << 23)
 
 /* display watermarks */
 /* cayman packet3 addition */
 #define        CAYMAN_PACKET3_DEALLOC_STATE                    0x14
 
+/* DMA regs common on r6xx/r7xx/evergreen/ni */
+#define DMA_RB_CNTL                                       0xd000
+#       define DMA_RB_ENABLE                              (1 << 0)
+#       define DMA_RB_SIZE(x)                             ((x) << 1) /* log2 */
+#       define DMA_RB_SWAP_ENABLE                         (1 << 9) /* 8IN32 */
+#       define DMA_RPTR_WRITEBACK_ENABLE                  (1 << 12)
+#       define DMA_RPTR_WRITEBACK_SWAP_ENABLE             (1 << 13)  /* 8IN32 */
+#       define DMA_RPTR_WRITEBACK_TIMER(x)                ((x) << 16) /* log2 */
+#define DMA_STATUS_REG                                    0xd034
+#       define DMA_IDLE                                   (1 << 0)
+
 #endif
index 7bdbcb00aaf267df84a7c0c02f39541d6f61abeb..896f1cbc58a5454d1b4fa421e7ed6a6c32d56a52 100644 (file)
@@ -1306,22 +1306,20 @@ void cayman_dma_fini(struct radeon_device *rdev)
        radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]);
 }
 
-static int cayman_gpu_soft_reset(struct radeon_device *rdev)
+static void cayman_gpu_soft_reset_gfx(struct radeon_device *rdev)
 {
-       struct evergreen_mc_save save;
        u32 grbm_reset = 0;
 
        if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
-               return 0;
+               return;
 
-       dev_info(rdev->dev, "GPU softreset \n");
-       dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS               = 0x%08X\n",
                RREG32(GRBM_STATUS));
-       dev_info(rdev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS_SE0           = 0x%08X\n",
                RREG32(GRBM_STATUS_SE0));
-       dev_info(rdev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS_SE1           = 0x%08X\n",
                RREG32(GRBM_STATUS_SE1));
-       dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  SRBM_STATUS               = 0x%08X\n",
                RREG32(SRBM_STATUS));
        dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
                RREG32(CP_STALLED_STAT1));
@@ -1331,19 +1329,7 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev)
                RREG32(CP_BUSY_STAT));
        dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
                RREG32(CP_STAT));
-       dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_ADDR   0x%08X\n",
-                RREG32(0x14F8));
-       dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
-                RREG32(0x14D8));
-       dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
-                RREG32(0x14FC));
-       dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
-                RREG32(0x14DC));
 
-       evergreen_mc_stop(rdev, &save);
-       if (evergreen_mc_wait_for_idle(rdev)) {
-               dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
-       }
        /* Disable CP parsing/prefetching */
        WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
 
@@ -1368,16 +1354,14 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev)
        udelay(50);
        WREG32(GRBM_SOFT_RESET, 0);
        (void)RREG32(GRBM_SOFT_RESET);
-       /* Wait a little for things to settle down */
-       udelay(50);
 
-       dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS               = 0x%08X\n",
                RREG32(GRBM_STATUS));
-       dev_info(rdev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS_SE0           = 0x%08X\n",
                RREG32(GRBM_STATUS_SE0));
-       dev_info(rdev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
+       dev_info(rdev->dev, "  GRBM_STATUS_SE1           = 0x%08X\n",
                RREG32(GRBM_STATUS_SE1));
-       dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  SRBM_STATUS               = 0x%08X\n",
                RREG32(SRBM_STATUS));
        dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
                RREG32(CP_STALLED_STAT1));
@@ -1387,13 +1371,81 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev)
                RREG32(CP_BUSY_STAT));
        dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
                RREG32(CP_STAT));
+
+}
+
+static void cayman_gpu_soft_reset_dma(struct radeon_device *rdev)
+{
+       u32 tmp;
+
+       if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
+               return;
+
+       dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
+               RREG32(DMA_STATUS_REG));
+
+       /* dma0 */
+       tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
+       tmp &= ~DMA_RB_ENABLE;
+       WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
+
+       /* dma1 */
+       tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
+       tmp &= ~DMA_RB_ENABLE;
+       WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
+
+       /* Reset dma */
+       WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1);
+       RREG32(SRBM_SOFT_RESET);
+       udelay(50);
+       WREG32(SRBM_SOFT_RESET, 0);
+
+       dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
+               RREG32(DMA_STATUS_REG));
+
+}
+
+static int cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
+{
+       struct evergreen_mc_save save;
+
+       if (reset_mask == 0)
+               return 0;
+
+       dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
+
+       dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_ADDR   0x%08X\n",
+                RREG32(0x14F8));
+       dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
+                RREG32(0x14D8));
+       dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
+                RREG32(0x14FC));
+       dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
+                RREG32(0x14DC));
+
+       evergreen_mc_stop(rdev, &save);
+       if (evergreen_mc_wait_for_idle(rdev)) {
+               dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
+       }
+
+       if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE))
+               cayman_gpu_soft_reset_gfx(rdev);
+
+       if (reset_mask & RADEON_RESET_DMA)
+               cayman_gpu_soft_reset_dma(rdev);
+
+       /* Wait a little for things to settle down */
+       udelay(50);
+
        evergreen_mc_resume(rdev, &save);
        return 0;
 }
 
 int cayman_asic_reset(struct radeon_device *rdev)
 {
-       return cayman_gpu_soft_reset(rdev);
+       return cayman_gpu_soft_reset(rdev, (RADEON_RESET_GFX |
+                                           RADEON_RESET_COMPUTE |
+                                           RADEON_RESET_DMA));
 }
 
 /**
index b93186b8ee4ba951189c1ca2b45d381c07ed51c4..48e5022ee921d33081f86de17d8ab6b0520ea037 100644 (file)
@@ -65,7 +65,7 @@
 #define                SOFT_RESET_VMC                          (1 << 17)
 #define                SOFT_RESET_DMA                          (1 << 20)
 #define                SOFT_RESET_TST                          (1 << 21)
-#define                SOFT_RESET_REGBB                        (1 << 22)
+#define                SOFT_RESET_REGBB                        (1 << 22)
 #define                SOFT_RESET_ORB                          (1 << 23)
 
 #define VM_CONTEXT0_REQUEST_RESPONSE                   0x1470
 #define        DMA_PACKET_NOP                                    0xf
 
 #endif
-
index 2aaf147969bd8ef80522af9e38900e5987002d4c..537e259b383720d97bbd0b452e74a1c2688eec49 100644 (file)
@@ -1258,9 +1258,8 @@ void r600_vram_scratch_fini(struct radeon_device *rdev)
  * reset, it's up to the caller to determine if the GPU needs one. We
  * might add an helper function to check that.
  */
-static int r600_gpu_soft_reset(struct radeon_device *rdev)
+static void r600_gpu_soft_reset_gfx(struct radeon_device *rdev)
 {
-       struct rv515_mc_save save;
        u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) |
                                S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) |
                                S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) |
@@ -1280,14 +1279,13 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev)
        u32 tmp;
 
        if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
-               return 0;
+               return;
 
-       dev_info(rdev->dev, "GPU softreset \n");
-       dev_info(rdev->dev, "  R_008010_GRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  R_008010_GRBM_STATUS      = 0x%08X\n",
                RREG32(R_008010_GRBM_STATUS));
-       dev_info(rdev->dev, "  R_008014_GRBM_STATUS2=0x%08X\n",
+       dev_info(rdev->dev, "  R_008014_GRBM_STATUS2     = 0x%08X\n",
                RREG32(R_008014_GRBM_STATUS2));
-       dev_info(rdev->dev, "  R_000E50_SRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  R_000E50_SRBM_STATUS      = 0x%08X\n",
                RREG32(R_000E50_SRBM_STATUS));
        dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
                RREG32(CP_STALLED_STAT1));
@@ -1297,12 +1295,10 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev)
                RREG32(CP_BUSY_STAT));
        dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
                RREG32(CP_STAT));
-       rv515_mc_stop(rdev, &save);
-       if (r600_mc_wait_for_idle(rdev)) {
-               dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
-       }
+
        /* Disable CP parsing/prefetching */
        WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
+
        /* Check if any of the rendering block is busy and reset it */
        if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) ||
            (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) {
@@ -1332,13 +1328,12 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev)
        RREG32(R_008020_GRBM_SOFT_RESET);
        mdelay(15);
        WREG32(R_008020_GRBM_SOFT_RESET, 0);
-       /* Wait a little for things to settle down */
-       mdelay(1);
-       dev_info(rdev->dev, "  R_008010_GRBM_STATUS=0x%08X\n",
+
+       dev_info(rdev->dev, "  R_008010_GRBM_STATUS      = 0x%08X\n",
                RREG32(R_008010_GRBM_STATUS));
-       dev_info(rdev->dev, "  R_008014_GRBM_STATUS2=0x%08X\n",
+       dev_info(rdev->dev, "  R_008014_GRBM_STATUS2     = 0x%08X\n",
                RREG32(R_008014_GRBM_STATUS2));
-       dev_info(rdev->dev, "  R_000E50_SRBM_STATUS=0x%08X\n",
+       dev_info(rdev->dev, "  R_000E50_SRBM_STATUS      = 0x%08X\n",
                RREG32(R_000E50_SRBM_STATUS));
        dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
                RREG32(CP_STALLED_STAT1));
@@ -1348,6 +1343,60 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev)
                RREG32(CP_BUSY_STAT));
        dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
                RREG32(CP_STAT));
+
+}
+
+static void r600_gpu_soft_reset_dma(struct radeon_device *rdev)
+{
+       u32 tmp;
+
+       if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
+               return;
+
+       dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
+               RREG32(DMA_STATUS_REG));
+
+       /* Disable DMA */
+       tmp = RREG32(DMA_RB_CNTL);
+       tmp &= ~DMA_RB_ENABLE;
+       WREG32(DMA_RB_CNTL, tmp);
+
+       /* Reset dma */
+       if (rdev->family >= CHIP_RV770)
+               WREG32(SRBM_SOFT_RESET, RV770_SOFT_RESET_DMA);
+       else
+               WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA);
+       RREG32(SRBM_SOFT_RESET);
+       udelay(50);
+       WREG32(SRBM_SOFT_RESET, 0);
+
+       dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
+               RREG32(DMA_STATUS_REG));
+}
+
+static int r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
+{
+       struct rv515_mc_save save;
+
+       if (reset_mask == 0)
+               return 0;
+
+       dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
+
+       rv515_mc_stop(rdev, &save);
+       if (r600_mc_wait_for_idle(rdev)) {
+               dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
+       }
+
+       if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE))
+               r600_gpu_soft_reset_gfx(rdev);
+
+       if (reset_mask & RADEON_RESET_DMA)
+               r600_gpu_soft_reset_dma(rdev);
+
+       /* Wait a little for things to settle down */
+       mdelay(1);
+
        rv515_mc_resume(rdev, &save);
        return 0;
 }
@@ -1395,7 +1444,9 @@ bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
 
 int r600_asic_reset(struct radeon_device *rdev)
 {
-       return r600_gpu_soft_reset(rdev);
+       return r600_gpu_soft_reset(rdev, (RADEON_RESET_GFX |
+                                         RADEON_RESET_COMPUTE |
+                                         RADEON_RESET_DMA));
 }
 
 u32 r6xx_remap_render_backend(struct radeon_device *rdev,
@@ -2595,7 +2646,7 @@ int r600_copy_blit(struct radeon_device *rdev,
  * @num_gpu_pages: number of GPU pages to xfer
  * @fence: radeon fence object
  *
- * Copy GPU paging using the DMA engine (r6xx-r7xx).
+ * Copy GPU paging using the DMA engine (r6xx).
  * Used by the radeon ttm implementation to move pages if
  * registered as the asic copy callback.
  */
@@ -2618,8 +2669,8 @@ int r600_copy_dma(struct radeon_device *rdev,
        }
 
        size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
-       num_loops = DIV_ROUND_UP(size_in_dw, 0xffff);
-       r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8);
+       num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFE);
+       r = radeon_ring_lock(rdev, ring, num_loops * 4 + 8);
        if (r) {
                DRM_ERROR("radeon: moving bo (%d).\n", r);
                radeon_semaphore_free(rdev, &sem, NULL);
@@ -2636,14 +2687,14 @@ int r600_copy_dma(struct radeon_device *rdev,
 
        for (i = 0; i < num_loops; i++) {
                cur_size_in_dw = size_in_dw;
-               if (cur_size_in_dw > 0xFFFF)
-                       cur_size_in_dw = 0xFFFF;
+               if (cur_size_in_dw > 0xFFFE)
+                       cur_size_in_dw = 0xFFFE;
                size_in_dw -= cur_size_in_dw;
                radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
                radeon_ring_write(ring, dst_offset & 0xfffffffc);
                radeon_ring_write(ring, src_offset & 0xfffffffc);
-               radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
-               radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
+               radeon_ring_write(ring, (((upper_32_bits(dst_offset) & 0xff) << 16) |
+                                        (upper_32_bits(src_offset) & 0xff)));
                src_offset += cur_size_in_dw * 4;
                dst_offset += cur_size_in_dw * 4;
        }
index 0be768be530c7ceea8e0b4125a3932ed4e696c35..69ec24ab8d636453dfa7e2ab313588786341c977 100644 (file)
@@ -2294,6 +2294,35 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
                        ib[idx+4] = upper_32_bits(offset) & 0xff;
                }
                break;
+       case PACKET3_MEM_WRITE:
+       {
+               u64 offset;
+
+               if (pkt->count != 3) {
+                       DRM_ERROR("bad MEM_WRITE (invalid count)\n");
+                       return -EINVAL;
+               }
+               r = r600_cs_packet_next_reloc(p, &reloc);
+               if (r) {
+                       DRM_ERROR("bad MEM_WRITE (missing reloc)\n");
+                       return -EINVAL;
+               }
+               offset = radeon_get_ib_value(p, idx+0);
+               offset += ((u64)(radeon_get_ib_value(p, idx+1) & 0xff)) << 32UL;
+               if (offset & 0x7) {
+                       DRM_ERROR("bad MEM_WRITE (address not qwords aligned)\n");
+                       return -EINVAL;
+               }
+               if ((offset + 8) > radeon_bo_size(reloc->robj)) {
+                       DRM_ERROR("bad MEM_WRITE bo too small: 0x%llx, 0x%lx\n",
+                                 offset + 8, radeon_bo_size(reloc->robj));
+                       return -EINVAL;
+               }
+               offset += reloc->lobj.gpu_offset;
+               ib[idx+0] = offset;
+               ib[idx+1] = upper_32_bits(offset) & 0xff;
+               break;
+       }
        case PACKET3_COPY_DW:
                if (pkt->count != 4) {
                        DRM_ERROR("bad COPY_DW (invalid count)\n");
@@ -2447,8 +2476,10 @@ static void r600_cs_parser_fini(struct radeon_cs_parser *parser, int error)
        kfree(parser->relocs);
        for (i = 0; i < parser->nchunks; i++) {
                kfree(parser->chunks[i].kdata);
-               kfree(parser->chunks[i].kpage[0]);
-               kfree(parser->chunks[i].kpage[1]);
+               if (parser->rdev && (parser->rdev->flags & RADEON_IS_AGP)) {
+                       kfree(parser->chunks[i].kpage[0]);
+                       kfree(parser->chunks[i].kpage[1]);
+               }
        }
        kfree(parser->chunks);
        kfree(parser->chunks_array);
@@ -2532,16 +2563,16 @@ int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
        struct radeon_cs_chunk *relocs_chunk;
        unsigned idx;
 
+       *cs_reloc = NULL;
        if (p->chunk_relocs_idx == -1) {
                DRM_ERROR("No relocation chunk !\n");
                return -EINVAL;
        }
-       *cs_reloc = NULL;
        relocs_chunk = &p->chunks[p->chunk_relocs_idx];
        idx = p->dma_reloc_idx;
-       if (idx >= relocs_chunk->length_dw) {
+       if (idx >= p->nrelocs) {
                DRM_ERROR("Relocs at %d after relocations chunk end %d !\n",
-                         idx, relocs_chunk->length_dw);
+                         idx, p->nrelocs);
                return -EINVAL;
        }
        *cs_reloc = p->relocs_ptr[idx];
@@ -2648,16 +2679,29 @@ int r600_dma_cs_parse(struct radeon_cs_parser *p)
                                }
                                p->idx += 7;
                        } else {
-                               src_offset = ib[idx+2];
-                               src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32;
-                               dst_offset = ib[idx+1];
-                               dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
+                               if (p->family >= CHIP_RV770) {
+                                       src_offset = ib[idx+2];
+                                       src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32;
+                                       dst_offset = ib[idx+1];
+                                       dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
 
-                               ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
-                               ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
-                               ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
-                               ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
-                               p->idx += 5;
+                                       ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
+                                       ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
+                                       ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
+                                       ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
+                                       p->idx += 5;
+                               } else {
+                                       src_offset = ib[idx+2];
+                                       src_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
+                                       dst_offset = ib[idx+1];
+                                       dst_offset |= ((u64)(ib[idx+3] & 0xff0000)) << 16;
+
+                                       ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
+                                       ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
+                                       ib[idx+3] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
+                                       ib[idx+3] += (upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff) << 16;
+                                       p->idx += 4;
+                               }
                        }
                        if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) {
                                dev_warn(p->dev, "DMA copy src buffer too small (%llu %lu)\n",
index 5dc744d43d128a537078153a5cf94803a4906101..34e52304a525001de8bba62d71278ae939edfda9 100644 (file)
@@ -132,6 +132,11 @@ extern int radeon_lockup_timeout;
 #define RADEON_VA_RESERVED_SIZE                        (8 << 20)
 #define RADEON_IB_VM_MAX_SIZE                  (64 << 10)
 
+/* reset flags */
+#define RADEON_RESET_GFX                       (1 << 0)
+#define RADEON_RESET_COMPUTE                   (1 << 1)
+#define RADEON_RESET_DMA                       (1 << 2)
+
 /*
  * Errata workarounds.
  */
@@ -225,12 +230,13 @@ struct radeon_fence {
 int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring);
 int radeon_fence_driver_init(struct radeon_device *rdev);
 void radeon_fence_driver_fini(struct radeon_device *rdev);
+void radeon_fence_driver_force_completion(struct radeon_device *rdev);
 int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
 void radeon_fence_process(struct radeon_device *rdev, int ring);
 bool radeon_fence_signaled(struct radeon_fence *fence);
 int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
 int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring);
-void radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring);
+int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring);
 int radeon_fence_wait_any(struct radeon_device *rdev,
                          struct radeon_fence **fences,
                          bool intr);
index 596bcbe80ed06d5a8e50c271ded50d0a9003afaf..9056fafb00ea35eda70d2a576726abf677808750 100644 (file)
@@ -1140,9 +1140,9 @@ static struct radeon_asic rv770_asic = {
        .copy = {
                .blit = &r600_copy_blit,
                .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
-               .dma = &r600_copy_dma,
+               .dma = &rv770_copy_dma,
                .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
-               .copy = &r600_copy_dma,
+               .copy = &rv770_copy_dma,
                .copy_ring_index = R600_RING_TYPE_DMA_INDEX,
        },
        .surface = {
index 5f4882cc2152eda52e3bf25bf3bd9573bf4e610a..15d70e613076d48e89aff920becbd7e18419a7d8 100644 (file)
@@ -403,6 +403,10 @@ u32 rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
 void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
 void r700_cp_stop(struct radeon_device *rdev);
 void r700_cp_fini(struct radeon_device *rdev);
+int rv770_copy_dma(struct radeon_device *rdev,
+                 uint64_t src_offset, uint64_t dst_offset,
+                 unsigned num_gpu_pages,
+                  struct radeon_fence **fence);
 
 /*
  * evergreen
index 4af89126e223c4fd2b8dc85c86ef377544b30ee9..33a56a09ff10da2feea83f33388c15fad5041574 100644 (file)
@@ -1548,6 +1548,9 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                           of_machine_is_compatible("PowerBook6,7")) {
                        /* ibook */
                        rdev->mode_info.connector_table = CT_IBOOK;
+               } else if (of_machine_is_compatible("PowerMac3,5")) {
+                       /* PowerMac G4 Silver radeon 7500 */
+                       rdev->mode_info.connector_table = CT_MAC_G4_SILVER;
                } else if (of_machine_is_compatible("PowerMac4,4")) {
                        /* emac */
                        rdev->mode_info.connector_table = CT_EMAC;
@@ -2212,6 +2215,54 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                            CONNECTOR_OBJECT_ID_SVIDEO,
                                            &hpd);
                break;
+       case CT_MAC_G4_SILVER:
+               DRM_INFO("Connector Table: %d (mac g4 silver)\n",
+                        rdev->mode_info.connector_table);
+               /* DVI-I - tv dac, int tmds */
+               ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
+               hpd.hpd = RADEON_HPD_1; /* ??? */
+               radeon_add_legacy_encoder(dev,
+                                         radeon_get_encoder_enum(dev,
+                                                               ATOM_DEVICE_DFP1_SUPPORT,
+                                                               0),
+                                         ATOM_DEVICE_DFP1_SUPPORT);
+               radeon_add_legacy_encoder(dev,
+                                         radeon_get_encoder_enum(dev,
+                                                               ATOM_DEVICE_CRT2_SUPPORT,
+                                                               2),
+                                         ATOM_DEVICE_CRT2_SUPPORT);
+               radeon_add_legacy_connector(dev, 0,
+                                           ATOM_DEVICE_DFP1_SUPPORT |
+                                           ATOM_DEVICE_CRT2_SUPPORT,
+                                           DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
+                                           CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
+                                           &hpd);
+               /* VGA - primary dac */
+               ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
+               hpd.hpd = RADEON_HPD_NONE;
+               radeon_add_legacy_encoder(dev,
+                                         radeon_get_encoder_enum(dev,
+                                                               ATOM_DEVICE_CRT1_SUPPORT,
+                                                               1),
+                                         ATOM_DEVICE_CRT1_SUPPORT);
+               radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT1_SUPPORT,
+                                           DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
+                                           CONNECTOR_OBJECT_ID_VGA,
+                                           &hpd);
+               /* TV - TV DAC */
+               ddc_i2c.valid = false;
+               hpd.hpd = RADEON_HPD_NONE;
+               radeon_add_legacy_encoder(dev,
+                                         radeon_get_encoder_enum(dev,
+                                                               ATOM_DEVICE_TV1_SUPPORT,
+                                                               2),
+                                         ATOM_DEVICE_TV1_SUPPORT);
+               radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
+                                           DRM_MODE_CONNECTOR_SVIDEO,
+                                           &ddc_i2c,
+                                           CONNECTOR_OBJECT_ID_SVIDEO,
+                                           &hpd);
+               break;
        default:
                DRM_INFO("Connector table: %d (invalid)\n",
                         rdev->mode_info.connector_table);
index 47bf162ab9c672825d80a803e14d8aa652a98f04..2399f25ec0370cfba03b256174de69e407e01353 100644 (file)
@@ -741,7 +741,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
                ret = connector_status_disconnected;
 
        if (radeon_connector->ddc_bus)
-               dret = radeon_ddc_probe(radeon_connector);
+               dret = radeon_ddc_probe(radeon_connector, false);
        if (dret) {
                radeon_connector->detected_by_load = false;
                if (radeon_connector->edid) {
@@ -947,7 +947,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
                return connector->status;
 
        if (radeon_connector->ddc_bus)
-               dret = radeon_ddc_probe(radeon_connector);
+               dret = radeon_ddc_probe(radeon_connector, false);
        if (dret) {
                radeon_connector->detected_by_load = false;
                if (radeon_connector->edid) {
@@ -1401,7 +1401,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
                if (encoder) {
                        /* setup ddc on the bridge */
                        radeon_atom_ext_encoder_setup_ddc(encoder);
-                       if (radeon_ddc_probe(radeon_connector)) /* try DDC */
+                       /* bridge chips are always aux */
+                       if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */
                                ret = connector_status_connected;
                        else if (radeon_connector->dac_load_detect) { /* try load detection */
                                struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
@@ -1419,7 +1420,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
                                if (radeon_dp_getdpcd(radeon_connector))
                                        ret = connector_status_connected;
                        } else {
-                               if (radeon_ddc_probe(radeon_connector))
+                               /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */
+                               if (radeon_ddc_probe(radeon_connector, false))
                                        ret = connector_status_connected;
                        }
                }
index 396baba0141a9c2abefbd5e8782a83e5634c4c96..469661fd190331f53230a6d1a524bbaebb040012 100644 (file)
@@ -279,13 +279,13 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
                                  p->chunks[p->chunk_ib_idx].length_dw);
                        return -EINVAL;
                }
-               if ((p->rdev->flags & RADEON_IS_AGP)) {
+               if (p->rdev && (p->rdev->flags & RADEON_IS_AGP)) {
                        p->chunks[p->chunk_ib_idx].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL);
                        p->chunks[p->chunk_ib_idx].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL);
                        if (p->chunks[p->chunk_ib_idx].kpage[0] == NULL ||
                            p->chunks[p->chunk_ib_idx].kpage[1] == NULL) {
-                               kfree(p->chunks[i].kpage[0]);
-                               kfree(p->chunks[i].kpage[1]);
+                               kfree(p->chunks[p->chunk_ib_idx].kpage[0]);
+                               kfree(p->chunks[p->chunk_ib_idx].kpage[1]);
                                return -ENOMEM;
                        }
                }
@@ -583,7 +583,8 @@ static int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx)
        struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx];
        int i;
        int size = PAGE_SIZE;
-       bool copy1 = (p->rdev->flags & RADEON_IS_AGP) ? false : true;
+       bool copy1 = (p->rdev && (p->rdev->flags & RADEON_IS_AGP)) ?
+               false : true;
 
        for (i = ibc->last_copied_page + 1; i < pg_idx; i++) {
                if (DRM_COPY_FROM_USER(p->ib.ptr + (i * (PAGE_SIZE/4)),
index 49b06590001e1a30ca65761cfab2e20d901bc215..edfc54e41842248f4dad035c1ece973ca08837b5 100644 (file)
@@ -896,6 +896,25 @@ static void radeon_check_arguments(struct radeon_device *rdev)
        }
 }
 
+/**
+ * radeon_switcheroo_quirk_long_wakeup - return true if longer d3 delay is
+ * needed for waking up.
+ *
+ * @pdev: pci dev pointer
+ */
+static bool radeon_switcheroo_quirk_long_wakeup(struct pci_dev *pdev)
+{
+
+       /* 6600m in a macbook pro */
+       if (pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE &&
+           pdev->subsystem_device == 0x00e2) {
+               printk(KERN_INFO "radeon: quirking longer d3 wakeup delay\n");
+               return true;
+       }
+
+       return false;
+}
+
 /**
  * radeon_switcheroo_set_state - set switcheroo state
  *
@@ -910,10 +929,19 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero
        struct drm_device *dev = pci_get_drvdata(pdev);
        pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
        if (state == VGA_SWITCHEROO_ON) {
+               unsigned d3_delay = dev->pdev->d3_delay;
+
                printk(KERN_INFO "radeon: switched on\n");
                /* don't suspend or resume card normally */
                dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
+
+               if (d3_delay < 20 && radeon_switcheroo_quirk_long_wakeup(pdev))
+                       dev->pdev->d3_delay = 20;
+
                radeon_resume_kms(dev);
+
+               dev->pdev->d3_delay = d3_delay;
+
                dev->switch_power_state = DRM_SWITCH_POWER_ON;
                drm_kms_helper_poll_enable(dev);
        } else {
@@ -1164,6 +1192,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
        struct drm_crtc *crtc;
        struct drm_connector *connector;
        int i, r;
+       bool force_completion = false;
 
        if (dev == NULL || dev->dev_private == NULL) {
                return -ENODEV;
@@ -1206,8 +1235,16 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
 
        mutex_lock(&rdev->ring_lock);
        /* wait for gpu to finish processing current batch */
-       for (i = 0; i < RADEON_NUM_RINGS; i++)
-               radeon_fence_wait_empty_locked(rdev, i);
+       for (i = 0; i < RADEON_NUM_RINGS; i++) {
+               r = radeon_fence_wait_empty_locked(rdev, i);
+               if (r) {
+                       /* delay GPU reset to resume */
+                       force_completion = true;
+               }
+       }
+       if (force_completion) {
+               radeon_fence_driver_force_completion(rdev);
+       }
        mutex_unlock(&rdev->ring_lock);
 
        radeon_save_bios_scratch_regs(rdev);
@@ -1338,7 +1375,6 @@ retry:
        }
 
        radeon_restore_bios_scratch_regs(rdev);
-       drm_helper_resume_force_mode(rdev->ddev);
 
        if (!r) {
                for (i = 0; i < RADEON_NUM_RINGS; ++i) {
@@ -1358,11 +1394,14 @@ retry:
                        }
                }
        } else {
+               radeon_fence_driver_force_completion(rdev);
                for (i = 0; i < RADEON_NUM_RINGS; ++i) {
                        kfree(ring_data[i]);
                }
        }
 
+       drm_helper_resume_force_mode(rdev->ddev);
+
        ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
        if (r) {
                /* bad news, how to tell it to userspace ? */
index 310c0e5254babc770ec620b9f1735390ffb8ce78..1da2386d7cf74a9eac82674a53ac2cee3e8e52a5 100644 (file)
@@ -699,10 +699,15 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
        if (radeon_connector->router.ddc_valid)
                radeon_router_select_ddc_port(radeon_connector);
 
-       if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
-           (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) ||
-           (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) !=
-            ENCODER_OBJECT_ID_NONE)) {
+       if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) !=
+           ENCODER_OBJECT_ID_NONE) {
+               struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
+
+               if (dig->dp_i2c_bus)
+                       radeon_connector->edid = drm_get_edid(&radeon_connector->base,
+                                                             &dig->dp_i2c_bus->adapter);
+       } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
+                  (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) {
                struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
 
                if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
index 9b1a727d3c9e450b926cae872735fd7c05d3456a..dff6cf77f9532266b7fe587500bab82b53024a6d 100644 (file)
  *   2.25.0 - eg+: new info request for num SE and num SH
  *   2.26.0 - r600-eg: fix htile size computation
  *   2.27.0 - r600-SI: Add CS ioctl support for async DMA
+ *   2.28.0 - r600-eg: Add MEM_WRITE packet support
  */
 #define KMS_DRIVER_MAJOR       2
-#define KMS_DRIVER_MINOR       27
+#define KMS_DRIVER_MINOR       28
 #define KMS_DRIVER_PATCHLEVEL  0
 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
 int radeon_driver_unload_kms(struct drm_device *dev);
@@ -305,8 +306,8 @@ static int radeon_kick_out_firmware_fb(struct pci_dev *pdev)
        return 0;
 }
 
-static int __devinit
-radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int radeon_pci_probe(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        int ret;
 
index 410a975a8eec8f7e042a608cfcea0d7c274f1932..34356252567ad23291d9a60c6df1a06ed211c149 100644 (file)
@@ -609,26 +609,20 @@ int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring)
  * Returns 0 if the fences have passed, error for all other cases.
  * Caller must hold ring lock.
  */
-void radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring)
+int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring)
 {
        uint64_t seq = rdev->fence_drv[ring].sync_seq[ring];
+       int r;
 
-       while(1) {
-               int r;
-               r = radeon_fence_wait_seq(rdev, seq, ring, false, false);
+       r = radeon_fence_wait_seq(rdev, seq, ring, false, false);
+       if (r) {
                if (r == -EDEADLK) {
-                       mutex_unlock(&rdev->ring_lock);
-                       r = radeon_gpu_reset(rdev);
-                       mutex_lock(&rdev->ring_lock);
-                       if (!r)
-                               continue;
-               }
-               if (r) {
-                       dev_err(rdev->dev, "error waiting for ring to become"
-                               " idle (%d)\n", r);
+                       return -EDEADLK;
                }
-               return;
+               dev_err(rdev->dev, "error waiting for ring[%d] to become idle (%d)\n",
+                       ring, r);
        }
+       return 0;
 }
 
 /**
@@ -854,13 +848,17 @@ int radeon_fence_driver_init(struct radeon_device *rdev)
  */
 void radeon_fence_driver_fini(struct radeon_device *rdev)
 {
-       int ring;
+       int ring, r;
 
        mutex_lock(&rdev->ring_lock);
        for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
                if (!rdev->fence_drv[ring].initialized)
                        continue;
-               radeon_fence_wait_empty_locked(rdev, ring);
+               r = radeon_fence_wait_empty_locked(rdev, ring);
+               if (r) {
+                       /* no need to trigger GPU reset as we are unloading */
+                       radeon_fence_driver_force_completion(rdev);
+               }
                wake_up_all(&rdev->fence_queue);
                radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
                rdev->fence_drv[ring].initialized = false;
@@ -868,6 +866,25 @@ void radeon_fence_driver_fini(struct radeon_device *rdev)
        mutex_unlock(&rdev->ring_lock);
 }
 
+/**
+ * radeon_fence_driver_force_completion - force all fence waiter to complete
+ *
+ * @rdev: radeon device pointer
+ *
+ * In case of GPU reset failure make sure no process keep waiting on fence
+ * that will never complete.
+ */
+void radeon_fence_driver_force_completion(struct radeon_device *rdev)
+{
+       int ring;
+
+       for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
+               if (!rdev->fence_drv[ring].initialized)
+                       continue;
+               radeon_fence_write(rdev, rdev->fence_drv[ring].sync_seq[ring], ring);
+       }
+}
+
 
 /*
  * Fence debugfs
index c5bddd630eb94e088f6f90a1c7cf93f8659a8cc1..fc60b74ee304dd779d98db03b3ec60c58767ed9a 100644 (file)
@@ -39,7 +39,7 @@ extern u32 radeon_atom_hw_i2c_func(struct i2c_adapter *adap);
  * radeon_ddc_probe
  *
  */
-bool radeon_ddc_probe(struct radeon_connector *radeon_connector)
+bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux)
 {
        u8 out = 0x0;
        u8 buf[8];
@@ -63,7 +63,13 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector)
        if (radeon_connector->router.ddc_valid)
                radeon_router_select_ddc_port(radeon_connector);
 
-       ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2);
+       if (use_aux) {
+               struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
+               ret = i2c_transfer(&dig->dp_i2c_bus->adapter, msgs, 2);
+       } else {
+               ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2);
+       }
+
        if (ret != 2)
                /* Couldn't find an accessible DDC on this connector */
                return false;
index f5ba2241dacc6cfd2bb6b55fead51a7ae2c395e8..62cd512f5c8d4161ff3708204fe32f560566402e 100644 (file)
@@ -640,6 +640,14 @@ static enum drm_connector_status radeon_legacy_primary_dac_detect(struct drm_enc
        enum drm_connector_status found = connector_status_disconnected;
        bool color = true;
 
+       /* just don't bother on RN50 those chip are often connected to remoting
+        * console hw and often we get failure to load detect those. So to make
+        * everyone happy report the encoder as always connected.
+        */
+       if (ASIC_IS_RN50(rdev)) {
+               return connector_status_connected;
+       }
+
        /* save the regs we need */
        vclk_ecp_cntl = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
        crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
index d818b503b42f545e8fff7d2287d6129d20a14de1..4003f5a68c098a06458cf7d0d18cd894412c3fe3 100644 (file)
@@ -209,7 +209,8 @@ enum radeon_connector_table {
        CT_RN50_POWER,
        CT_MAC_X800,
        CT_MAC_G5_9600,
-       CT_SAM440EP
+       CT_SAM440EP,
+       CT_MAC_G4_SILVER
 };
 
 enum radeon_dvo_chip {
@@ -558,7 +559,7 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c,
                                u8 val);
 extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector);
 extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector);
-extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector);
+extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux);
 extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector);
 
 extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector);
index aa14dbb7e4fbac2a81070f3d14abb28a24c3db30..0bfa656aa87d482fead90b86c73aac94e94849de 100644 (file)
@@ -234,7 +234,7 @@ static void radeon_set_power_state(struct radeon_device *rdev)
 
 static void radeon_pm_set_clocks(struct radeon_device *rdev)
 {
-       int i;
+       int i, r;
 
        /* no need to take locks, etc. if nothing's going to change */
        if ((rdev->pm.requested_clock_mode_index == rdev->pm.current_clock_mode_index) &&
@@ -248,8 +248,17 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)
        /* wait for the rings to drain */
        for (i = 0; i < RADEON_NUM_RINGS; i++) {
                struct radeon_ring *ring = &rdev->ring[i];
-               if (ring->ready)
-                       radeon_fence_wait_empty_locked(rdev, i);
+               if (!ring->ready) {
+                       continue;
+               }
+               r = radeon_fence_wait_empty_locked(rdev, i);
+               if (r) {
+                       /* needs a GPU reset dont reset here */
+                       mutex_unlock(&rdev->ring_lock);
+                       up_write(&rdev->pm.mclk_lock);
+                       mutex_unlock(&rdev->ddev->struct_mutex);
+                       return;
+               }
        }
 
        radeon_unmap_vram_bos(rdev);
index e09521858f64469cf51b7c8700576d5b6744998e..26c23bb651c6b53835a2061096bdecd4f9d47492 100644 (file)
@@ -194,6 +194,7 @@ struct drm_gem_object *radeon_gem_prime_import(struct drm_device *dev,
                bo = dma_buf->priv;
                if (bo->gem_base.dev == dev) {
                        drm_gem_object_reference(&bo->gem_base);
+                       dma_buf_put(dma_buf);
                        return &bo->gem_base;
                }
        }
index ebd69562ef6c802af7956dd168de29bf27f6f19f..141f2b6a9cf2ab920ecaac2e1cbae85f57d1b904 100644 (file)
@@ -770,22 +770,28 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)
        int ridx = *(int*)node->info_ent->data;
        struct radeon_ring *ring = &rdev->ring[ridx];
        unsigned count, i, j;
+       u32 tmp;
 
        radeon_ring_free_size(rdev, ring);
        count = (ring->ring_size / 4) - ring->ring_free_dw;
-       seq_printf(m, "wptr(0x%04x): 0x%08x\n", ring->wptr_reg, RREG32(ring->wptr_reg));
-       seq_printf(m, "rptr(0x%04x): 0x%08x\n", ring->rptr_reg, RREG32(ring->rptr_reg));
+       tmp = RREG32(ring->wptr_reg) >> ring->ptr_reg_shift;
+       seq_printf(m, "wptr(0x%04x): 0x%08x [%5d]\n", ring->wptr_reg, tmp, tmp);
+       tmp = RREG32(ring->rptr_reg) >> ring->ptr_reg_shift;
+       seq_printf(m, "rptr(0x%04x): 0x%08x [%5d]\n", ring->rptr_reg, tmp, tmp);
        if (ring->rptr_save_reg) {
                seq_printf(m, "rptr next(0x%04x): 0x%08x\n", ring->rptr_save_reg,
                           RREG32(ring->rptr_save_reg));
        }
-       seq_printf(m, "driver's copy of the wptr: 0x%08x\n", ring->wptr);
-       seq_printf(m, "driver's copy of the rptr: 0x%08x\n", ring->rptr);
+       seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", ring->wptr, ring->wptr);
+       seq_printf(m, "driver's copy of the rptr: 0x%08x [%5d]\n", ring->rptr, ring->rptr);
        seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);
        seq_printf(m, "%u dwords in ring\n", count);
-       i = ring->rptr;
-       for (j = 0; j <= count; j++) {
-               seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]);
+       /* print 8 dw before current rptr as often it's the last executed
+        * packet that is the root issue
+        */
+       i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask;
+       for (j = 0; j <= (count + 32); j++) {
+               seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]);
                i = (i + 1) & ring->ptr_mask;
        }
        return 0;
@@ -794,11 +800,15 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)
 static int radeon_ring_type_gfx_index = RADEON_RING_TYPE_GFX_INDEX;
 static int cayman_ring_type_cp1_index = CAYMAN_RING_TYPE_CP1_INDEX;
 static int cayman_ring_type_cp2_index = CAYMAN_RING_TYPE_CP2_INDEX;
+static int radeon_ring_type_dma1_index = R600_RING_TYPE_DMA_INDEX;
+static int radeon_ring_type_dma2_index = CAYMAN_RING_TYPE_DMA1_INDEX;
 
 static struct drm_info_list radeon_debugfs_ring_info_list[] = {
        {"radeon_ring_gfx", radeon_debugfs_ring_info, 0, &radeon_ring_type_gfx_index},
        {"radeon_ring_cp1", radeon_debugfs_ring_info, 0, &cayman_ring_type_cp1_index},
        {"radeon_ring_cp2", radeon_debugfs_ring_info, 0, &cayman_ring_type_cp2_index},
+       {"radeon_ring_dma1", radeon_debugfs_ring_info, 0, &radeon_ring_type_dma1_index},
+       {"radeon_ring_dma2", radeon_debugfs_ring_info, 0, &radeon_ring_type_dma2_index},
 };
 
 static int radeon_debugfs_sa_info(struct seq_file *m, void *data)
index 87c979c4f721c7e3c5a6ab757a29ef07bb6e9788..1b2444f4d8f4ffa7327fd24093704a594389b151 100644 (file)
@@ -887,6 +887,80 @@ static int rv770_mc_init(struct radeon_device *rdev)
        return 0;
 }
 
+/**
+ * rv770_copy_dma - copy pages using the DMA engine
+ *
+ * @rdev: radeon_device pointer
+ * @src_offset: src GPU address
+ * @dst_offset: dst GPU address
+ * @num_gpu_pages: number of GPU pages to xfer
+ * @fence: radeon fence object
+ *
+ * Copy GPU paging using the DMA engine (r7xx).
+ * Used by the radeon ttm implementation to move pages if
+ * registered as the asic copy callback.
+ */
+int rv770_copy_dma(struct radeon_device *rdev,
+                 uint64_t src_offset, uint64_t dst_offset,
+                 unsigned num_gpu_pages,
+                 struct radeon_fence **fence)
+{
+       struct radeon_semaphore *sem = NULL;
+       int ring_index = rdev->asic->copy.dma_ring_index;
+       struct radeon_ring *ring = &rdev->ring[ring_index];
+       u32 size_in_dw, cur_size_in_dw;
+       int i, num_loops;
+       int r = 0;
+
+       r = radeon_semaphore_create(rdev, &sem);
+       if (r) {
+               DRM_ERROR("radeon: moving bo (%d).\n", r);
+               return r;
+       }
+
+       size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
+       num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFF);
+       r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8);
+       if (r) {
+               DRM_ERROR("radeon: moving bo (%d).\n", r);
+               radeon_semaphore_free(rdev, &sem, NULL);
+               return r;
+       }
+
+       if (radeon_fence_need_sync(*fence, ring->idx)) {
+               radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
+                                           ring->idx);
+               radeon_fence_note_sync(*fence, ring->idx);
+       } else {
+               radeon_semaphore_free(rdev, &sem, NULL);
+       }
+
+       for (i = 0; i < num_loops; i++) {
+               cur_size_in_dw = size_in_dw;
+               if (cur_size_in_dw > 0xFFFF)
+                       cur_size_in_dw = 0xFFFF;
+               size_in_dw -= cur_size_in_dw;
+               radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
+               radeon_ring_write(ring, dst_offset & 0xfffffffc);
+               radeon_ring_write(ring, src_offset & 0xfffffffc);
+               radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
+               radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
+               src_offset += cur_size_in_dw * 4;
+               dst_offset += cur_size_in_dw * 4;
+       }
+
+       r = radeon_fence_emit(rdev, fence, ring->idx);
+       if (r) {
+               radeon_ring_unlock_undo(rdev, ring);
+               return r;
+       }
+
+       radeon_ring_unlock_commit(rdev, ring);
+       radeon_semaphore_free(rdev, &sem, *fence);
+
+       return r;
+}
+
 static int rv770_startup(struct radeon_device *rdev)
 {
        struct radeon_ring *ring;
index ef683653f0b71be1be31cf0eb027c743eed707d8..3240a3d64f3066d610b623c1e5d48269faf419ab 100644 (file)
@@ -2126,15 +2126,13 @@ bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
        return radeon_ring_test_lockup(rdev, ring);
 }
 
-static int si_gpu_soft_reset(struct radeon_device *rdev)
+static void si_gpu_soft_reset_gfx(struct radeon_device *rdev)
 {
-       struct evergreen_mc_save save;
        u32 grbm_reset = 0;
 
        if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
-               return 0;
+               return;
 
-       dev_info(rdev->dev, "GPU softreset \n");
        dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
                RREG32(GRBM_STATUS));
        dev_info(rdev->dev, "  GRBM_STATUS2=0x%08X\n",
@@ -2145,10 +2143,7 @@ static int si_gpu_soft_reset(struct radeon_device *rdev)
                RREG32(GRBM_STATUS_SE1));
        dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
                RREG32(SRBM_STATUS));
-       evergreen_mc_stop(rdev, &save);
-       if (radeon_mc_wait_for_idle(rdev)) {
-               dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
-       }
+
        /* Disable CP parsing/prefetching */
        WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT);
 
@@ -2173,8 +2168,7 @@ static int si_gpu_soft_reset(struct radeon_device *rdev)
        udelay(50);
        WREG32(GRBM_SOFT_RESET, 0);
        (void)RREG32(GRBM_SOFT_RESET);
-       /* Wait a little for things to settle down */
-       udelay(50);
+
        dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
                RREG32(GRBM_STATUS));
        dev_info(rdev->dev, "  GRBM_STATUS2=0x%08X\n",
@@ -2185,13 +2179,75 @@ static int si_gpu_soft_reset(struct radeon_device *rdev)
                RREG32(GRBM_STATUS_SE1));
        dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
                RREG32(SRBM_STATUS));
+}
+
+static void si_gpu_soft_reset_dma(struct radeon_device *rdev)
+{
+       u32 tmp;
+
+       if (RREG32(DMA_STATUS_REG) & DMA_IDLE)
+               return;
+
+       dev_info(rdev->dev, "  DMA_STATUS_REG   = 0x%08X\n",
+               RREG32(DMA_STATUS_REG));
+
+       /* dma0 */
+       tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
+       tmp &= ~DMA_RB_ENABLE;
+       WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
+
+       /* dma1 */
+       tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
+       tmp &= ~DMA_RB_ENABLE;
+       WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
+
+       /* Reset dma */
+       WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1);
+       RREG32(SRBM_SOFT_RESET);
+       udelay(50);
+       WREG32(SRBM_SOFT_RESET, 0);
+
+       dev_info(rdev->dev, "  DMA_STATUS_REG   = 0x%08X\n",
+               RREG32(DMA_STATUS_REG));
+}
+
+static int si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
+{
+       struct evergreen_mc_save save;
+
+       if (reset_mask == 0)
+               return 0;
+
+       dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
+
+       dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
+                RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
+       dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
+                RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
+
+       evergreen_mc_stop(rdev, &save);
+       if (radeon_mc_wait_for_idle(rdev)) {
+               dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
+       }
+
+       if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE))
+               si_gpu_soft_reset_gfx(rdev);
+
+       if (reset_mask & RADEON_RESET_DMA)
+               si_gpu_soft_reset_dma(rdev);
+
+       /* Wait a little for things to settle down */
+       udelay(50);
+
        evergreen_mc_resume(rdev, &save);
        return 0;
 }
 
 int si_asic_reset(struct radeon_device *rdev)
 {
-       return si_gpu_soft_reset(rdev);
+       return si_gpu_soft_reset(rdev, (RADEON_RESET_GFX |
+                                       RADEON_RESET_COMPUTE |
+                                       RADEON_RESET_DMA));
 }
 
 /* MC */
index 62b46215d423a785ca481aa00da188217450f9da..c056aae814f090693a4eb445d83d3ca2be30efd7 100644 (file)
 
 #define        SRBM_STATUS                                     0xE50
 
+#define        SRBM_SOFT_RESET                                 0x0E60
+#define                SOFT_RESET_BIF                          (1 << 1)
+#define                SOFT_RESET_DC                           (1 << 5)
+#define                SOFT_RESET_DMA1                         (1 << 6)
+#define                SOFT_RESET_GRBM                         (1 << 8)
+#define                SOFT_RESET_HDP                          (1 << 9)
+#define                SOFT_RESET_IH                           (1 << 10)
+#define                SOFT_RESET_MC                           (1 << 11)
+#define                SOFT_RESET_ROM                          (1 << 14)
+#define                SOFT_RESET_SEM                          (1 << 15)
+#define                SOFT_RESET_VMC                          (1 << 17)
+#define                SOFT_RESET_DMA                          (1 << 20)
+#define                SOFT_RESET_TST                          (1 << 21)
+#define                SOFT_RESET_REGBB                        (1 << 22)
+#define                SOFT_RESET_ORB                          (1 << 23)
+
 #define        CC_SYS_RB_BACKEND_DISABLE                       0xe80
 #define        GC_USER_SYS_RB_BACKEND_DISABLE                  0xe84
 
 #       define DATA_SWAP_ENABLE                           (1 << 3)
 #       define FENCE_SWAP_ENABLE                          (1 << 4)
 #       define CTXEMPTY_INT_ENABLE                        (1 << 28)
+#define DMA_STATUS_REG                                    0xd034
+#       define DMA_IDLE                                   (1 << 0)
 #define DMA_TILING_CONFIG                                0xd0b8
 
 #define DMA_PACKET(cmd, b, t, s, n)    ((((cmd) & 0xF) << 28) |        \
index 1c350fc4e449715edd5ef997e6eb791722d0f604..d1d5306ebf24a6a6f563cdc7a7c3e0af375b72e4 100644 (file)
@@ -33,7 +33,7 @@
  * Hardware initialization
  */
 
-static int __devinit shmob_drm_init_interface(struct shmob_drm_device *sdev)
+static int shmob_drm_init_interface(struct shmob_drm_device *sdev)
 {
        static const u32 ldmt1r[] = {
                [SHMOB_DRM_IFACE_RGB8] = LDMT1R_MIFTYP_RGB8,
@@ -67,7 +67,7 @@ static int __devinit shmob_drm_init_interface(struct shmob_drm_device *sdev)
        return 0;
 }
 
-static int __devinit shmob_drm_setup_clocks(struct shmob_drm_device *sdev,
+static int shmob_drm_setup_clocks(struct shmob_drm_device *sdev,
                                            enum shmob_drm_clk_source clksrc)
 {
        struct clk *clk;
@@ -330,12 +330,12 @@ static const struct dev_pm_ops shmob_drm_pm_ops = {
  * Platform driver
  */
 
-static int __devinit shmob_drm_probe(struct platform_device *pdev)
+static int shmob_drm_probe(struct platform_device *pdev)
 {
        return drm_platform_init(&shmob_drm_driver, pdev);
 }
 
-static int __devexit shmob_drm_remove(struct platform_device *pdev)
+static int shmob_drm_remove(struct platform_device *pdev)
 {
        drm_platform_exit(&shmob_drm_driver, pdev);
 
@@ -344,7 +344,7 @@ static int __devexit shmob_drm_remove(struct platform_device *pdev)
 
 static struct platform_driver shmob_drm_platform_driver = {
        .probe          = shmob_drm_probe,
-       .remove         = __devexit_p(shmob_drm_remove),
+       .remove         = shmob_drm_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "shmob-drm",
index 074410371e2a40e4af77ce196069473a53b8860f..656b2e3334a621109426806043032ae3422d9631 100644 (file)
@@ -102,12 +102,12 @@ static int tegra_dc_set_timings(struct tegra_dc *dc,
                ((mode->hsync_end - mode->hsync_start) <<  0);
        tegra_dc_writel(dc, value, DC_DISP_SYNC_WIDTH);
 
-       value = ((mode->vsync_start - mode->vdisplay) << 16) |
-               ((mode->hsync_start - mode->hdisplay) <<  0);
-       tegra_dc_writel(dc, value, DC_DISP_BACK_PORCH);
-
        value = ((mode->vtotal - mode->vsync_end) << 16) |
                ((mode->htotal - mode->hsync_end) <<  0);
+       tegra_dc_writel(dc, value, DC_DISP_BACK_PORCH);
+
+       value = ((mode->vsync_start - mode->vdisplay) << 16) |
+               ((mode->hsync_start - mode->hdisplay) <<  0);
        tegra_dc_writel(dc, value, DC_DISP_FRONT_PORCH);
 
        value = (mode->vdisplay << 16) | mode->hdisplay;
@@ -221,8 +221,7 @@ static int tegra_crtc_mode_set(struct drm_crtc *crtc,
        win.stride = crtc->fb->pitches[0];
 
        /* program window registers */
-       value = tegra_dc_readl(dc, DC_CMD_DISPLAY_WINDOW_HEADER);
-       value |= WINDOW_A_SELECT;
+       value = WINDOW_A_SELECT;
        tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER);
 
        tegra_dc_writel(dc, win.fmt, DC_WIN_COLOR_DEPTH);
index 3a843a77ddc7cfeeeb556011c0f5049d6cfd7bfa..741b5dc2742cc7498fb3f763c273da81885222ba 100644 (file)
@@ -204,24 +204,6 @@ extern int tegra_output_parse_dt(struct tegra_output *output);
 extern int tegra_output_init(struct drm_device *drm, struct tegra_output *output);
 extern int tegra_output_exit(struct tegra_output *output);
 
-/* from gem.c */
-extern struct tegra_gem_object *tegra_gem_alloc(struct drm_device *drm,
-                                               size_t size);
-extern int tegra_gem_handle_create(struct drm_device *drm,
-                                  struct drm_file *file, size_t size,
-                                  unsigned long flags, uint32_t *handle);
-extern int tegra_gem_dumb_create(struct drm_file *file, struct drm_device *drm,
-                                struct drm_mode_create_dumb *args);
-extern int tegra_gem_dumb_map_offset(struct drm_file *file,
-                                    struct drm_device *drm, uint32_t handle,
-                                    uint64_t *offset);
-extern int tegra_gem_dumb_destroy(struct drm_file *file,
-                                 struct drm_device *drm, uint32_t handle);
-extern int tegra_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
-extern int tegra_gem_init_object(struct drm_gem_object *obj);
-extern void tegra_gem_free_object(struct drm_gem_object *obj);
-extern struct vm_operations_struct tegra_gem_vm_ops;
-
 /* from fb.c */
 extern int tegra_drm_fb_init(struct drm_device *drm);
 extern void tegra_drm_fb_exit(struct drm_device *drm);
index ab4016412bbfea48079ca0d197fd4a85c3fbaf3b..e060c7e6434dba886e8698782cbfb0c3ce4b9cf7 100644 (file)
@@ -149,7 +149,7 @@ struct tmds_config {
 };
 
 static const struct tmds_config tegra2_tmds_config[] = {
-       { /* 480p modes */
+       { /* slow pixel clock modes */
                .pclk = 27000000,
                .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
                        SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(0) |
@@ -163,21 +163,8 @@ static const struct tmds_config tegra2_tmds_config[] = {
                        DRIVE_CURRENT_LANE1(DRIVE_CURRENT_7_125_mA) |
                        DRIVE_CURRENT_LANE2(DRIVE_CURRENT_7_125_mA) |
                        DRIVE_CURRENT_LANE3(DRIVE_CURRENT_7_125_mA),
-       }, { /* 720p modes */
-               .pclk = 74250000,
-               .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
-                       SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(1) |
-                       SOR_PLL_TX_REG_LOAD(3),
-               .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
-               .pe_current = PE_CURRENT0(PE_CURRENT_6_0_mA) |
-                       PE_CURRENT1(PE_CURRENT_6_0_mA) |
-                       PE_CURRENT2(PE_CURRENT_6_0_mA) |
-                       PE_CURRENT3(PE_CURRENT_6_0_mA),
-               .drive_current = DRIVE_CURRENT_LANE0(DRIVE_CURRENT_7_125_mA) |
-                       DRIVE_CURRENT_LANE1(DRIVE_CURRENT_7_125_mA) |
-                       DRIVE_CURRENT_LANE2(DRIVE_CURRENT_7_125_mA) |
-                       DRIVE_CURRENT_LANE3(DRIVE_CURRENT_7_125_mA),
-       }, { /* 1080p modes */
+       },
+       { /* high pixel clock modes */
                .pclk = UINT_MAX,
                .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
                        SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(1) |
@@ -479,7 +466,7 @@ static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi,
                return;
        }
 
-       h_front_porch = mode->htotal - mode->hsync_end;
+       h_front_porch = mode->hsync_start - mode->hdisplay;
        memset(&frame, 0, sizeof(frame));
        frame.r = HDMI_AVI_R_SAME;
 
@@ -634,8 +621,8 @@ static int tegra_output_hdmi_enable(struct tegra_output *output)
 
        pclk = mode->clock * 1000;
        h_sync_width = mode->hsync_end - mode->hsync_start;
-       h_front_porch = mode->htotal - mode->hsync_end;
-       h_back_porch = mode->hsync_start - mode->hdisplay;
+       h_back_porch = mode->htotal - mode->hsync_end;
+       h_front_porch = mode->hsync_start - mode->hdisplay;
 
        err = regulator_enable(hdmi->vdd);
        if (err < 0) {
index bdb97a564d8201fd6dc367eb15dd65551fef3cdd..5d17b113a6fc7d2618e409c735c4273d3ade6c8a 100644 (file)
@@ -239,6 +239,8 @@ int host1x_register_client(struct host1x *host1x, struct host1x_client *client)
                }
        }
 
+       client->host1x = host1x;
+
        return 0;
 }
 
index 9e9c5d2a5c748a910fcd29a856c128d25a4f8ae0..d73d6e3e17b2927c6215213e872e155a3badbfab 100644 (file)
@@ -654,11 +654,13 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
                 */
 
                set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
+
+               /* ttm_buffer_object_transfer accesses bo->sync_obj */
+               ret = ttm_buffer_object_transfer(bo, &ghost_obj);
                spin_unlock(&bdev->fence_lock);
                if (tmp_obj)
                        driver->sync_obj_unref(&tmp_obj);
 
-               ret = ttm_buffer_object_transfer(bo, &ghost_obj);
                if (ret)
                        return ret;
 
index 512f44add89f41fae6706114c5ce497279a4f107..fe5cdbcf263605b7b5ec853b4d5f354f7c754b13 100644 (file)
 static u8 *udl_get_edid(struct udl_device *udl)
 {
        u8 *block;
-       char rbuf[3];
+       char *rbuf;
        int ret, i;
 
        block = kmalloc(EDID_LENGTH, GFP_KERNEL);
        if (block == NULL)
                return NULL;
 
+       rbuf = kmalloc(2, GFP_KERNEL);
+       if (rbuf == NULL)
+               goto error;
+
        for (i = 0; i < EDID_LENGTH; i++) {
                ret = usb_control_msg(udl->ddev->usbdev,
                                      usb_rcvctrlpipe(udl->ddev->usbdev, 0), (0x02),
@@ -36,16 +40,17 @@ static u8 *udl_get_edid(struct udl_device *udl)
                                      HZ);
                if (ret < 1) {
                        DRM_ERROR("Read EDID byte %d failed err %x\n", i, ret);
-                       i--;
                        goto error;
                }
                block[i] = rbuf[1];
        }
 
+       kfree(rbuf);
        return block;
 
 error:
        kfree(block);
+       kfree(rbuf);
        return NULL;
 }
 
@@ -57,6 +62,14 @@ static int udl_get_modes(struct drm_connector *connector)
 
        edid = (struct edid *)udl_get_edid(udl);
 
+       /*
+        * We only read the main block, but if the monitor reports extension
+        * blocks then the drm edid code expects them to be present, so patch
+        * the extension count to 0.
+        */
+       edid->checksum += edid->extensions;
+       edid->extensions = 0;
+
        drm_mode_connector_update_edid_property(connector, edid);
        ret = drm_add_edid_modes(connector, edid);
        kfree(edid);
index 9ef222442ca0e989438ec3695ab473fc427339f3..12e4fdc810bf22c0c3334cb1939b6de1e73ee2d3 100644 (file)
@@ -731,7 +731,7 @@ static struct hid_ll_driver i2c_hid_ll_driver = {
        .hidinput_input_event = i2c_hid_hidinput_input_event,
 };
 
-static int __devinit i2c_hid_init_irq(struct i2c_client *client)
+static int i2c_hid_init_irq(struct i2c_client *client)
 {
        struct i2c_hid *ihid = i2c_get_clientdata(client);
        int ret;
@@ -753,7 +753,7 @@ static int __devinit i2c_hid_init_irq(struct i2c_client *client)
        return 0;
 }
 
-static int __devinit i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
+static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
 {
        struct i2c_client *client = ihid->client;
        struct i2c_hid_desc *hdesc = &ihid->hdesc;
@@ -810,8 +810,8 @@ static int __devinit i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid)
        return 0;
 }
 
-static int __devinit i2c_hid_probe(struct i2c_client *client,
-               const struct i2c_device_id *dev_id)
+static int i2c_hid_probe(struct i2c_client *client,
+                        const struct i2c_device_id *dev_id)
 {
        int ret;
        struct i2c_hid *ihid;
@@ -902,7 +902,7 @@ err:
        return ret;
 }
 
-static int __devexit i2c_hid_remove(struct i2c_client *client)
+static int i2c_hid_remove(struct i2c_client *client)
 {
        struct i2c_hid *ihid = i2c_get_clientdata(client);
        struct hid_device *hid;
@@ -967,7 +967,7 @@ static struct i2c_driver i2c_hid_driver = {
        },
 
        .probe          = i2c_hid_probe,
-       .remove         = __devexit_p(i2c_hid_remove),
+       .remove         = i2c_hid_remove,
 
        .id_table       = i2c_hid_id_table,
 };
index 3ad91f6447d8eee319e570f4098a2fb75f9be49e..e61e5f991aa538831644c5c1d1f13e5f71a69334 100644 (file)
@@ -675,7 +675,7 @@ static const struct file_operations hsc_fops = {
        .release        = hsc_release,
 };
 
-static void __devinit hsc_channel_init(struct hsc_channel *channel)
+static void hsc_channel_init(struct hsc_channel *channel)
 {
        init_waitqueue_head(&channel->rx_wait);
        init_waitqueue_head(&channel->tx_wait);
@@ -685,7 +685,7 @@ static void __devinit hsc_channel_init(struct hsc_channel *channel)
        INIT_LIST_HEAD(&channel->tx_msgs_queue);
 }
 
-static int __devinit hsc_probe(struct device *dev)
+static int hsc_probe(struct device *dev)
 {
        const char devname[] = "hsi_char";
        struct hsc_client_data *cl_data;
@@ -744,7 +744,7 @@ out1:
        return ret;
 }
 
-static int __devexit hsc_remove(struct device *dev)
+static int hsc_remove(struct device *dev)
 {
        struct hsi_client *cl = to_hsi_client(dev);
        struct hsc_client_data *cl_data = hsi_client_drvdata(cl);
@@ -763,7 +763,7 @@ static struct hsi_client_driver hsc_driver = {
                .name   = "hsi_char",
                .owner  = THIS_MODULE,
                .probe  = hsc_probe,
-               .remove = __devexit_p(hsc_remove),
+               .remove = hsc_remove,
        },
 };
 
index 59fd1268e58ae6703e3bd372f5d510dcd1344f18..d867e6bb2be1f7e1b1ebb41788c27f568bd7c579 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
 #include <linux/module.h>
+#include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/vexpress.h>
@@ -196,7 +197,7 @@ error:
        return err;
 }
 
-static int __devexit vexpress_hwmon_remove(struct platform_device *pdev)
+static int vexpress_hwmon_remove(struct platform_device *pdev)
 {
        struct vexpress_hwmon_data *data = platform_get_drvdata(pdev);
        const struct of_device_id *match;
@@ -213,7 +214,7 @@ static int __devexit vexpress_hwmon_remove(struct platform_device *pdev)
 
 static struct platform_driver vexpress_hwmon_driver = {
        .probe = vexpress_hwmon_probe,
-       .remove = __devexit_p(vexpress_hwmon_remove),
+       .remove = vexpress_hwmon_remove,
        .driver = {
                .name = DRVNAME,
                .owner = THIS_MODULE,
index 01451940393b9b95dd9a228cdb1283884c781aa3..c7eaf20af9266d7f325ab3cb8430955c1f213cf0 100644 (file)
@@ -181,7 +181,7 @@ static const struct ide_port_ops atp86x_port_ops = {
        .cable_detect           = atp86x_cable_detect,
 };
 
-static const struct ide_port_info aec62xx_chipsets[] __devinitconst = {
+static const struct ide_port_info aec62xx_chipsets[] = {
        {       /* 0: AEC6210 */
                .name           = DRV_NAME,
                .init_chipset   = init_chipset_aec62xx,
@@ -251,7 +251,7 @@ static const struct ide_port_info aec62xx_chipsets[] __devinitconst = {
  *     chips, pass a local copy of 'struct ide_port_info' down the call chain.
  */
 
-static int __devinit aec62xx_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int aec62xx_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        const struct chipset_bus_clock_list_entry *bus_clock;
        struct ide_port_info d;
@@ -287,7 +287,7 @@ static int __devinit aec62xx_init_one(struct pci_dev *dev, const struct pci_devi
        return err;
 }
 
-static void __devexit aec62xx_remove(struct pci_dev *dev)
+static void aec62xx_remove(struct pci_dev *dev)
 {
        ide_pci_remove(dev);
        pci_disable_device(dev);
@@ -307,7 +307,7 @@ static struct pci_driver aec62xx_pci_driver = {
        .name           = "AEC62xx_IDE",
        .id_table       = aec62xx_pci_tbl,
        .probe          = aec62xx_init_one,
-       .remove         = __devexit_p(aec62xx_remove),
+       .remove         = aec62xx_remove,
        .suspend        = ide_pci_suspend,
        .resume         = ide_pci_resume,
 };
index 911a27ca356b71b406d4ff0eae80e7d4d5b51abf..36f76e28a0bfa0df067046f9def48cecb12f544e 100644 (file)
@@ -415,7 +415,7 @@ static u8 ali_cable_detect(ide_hwif_t *hwif)
  *     Sparc systems.
  */
 
-static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif)
+static void init_hwif_ali15x3(ide_hwif_t *hwif)
 {
        u8 ideic, inmir;
        s8 irq_routing_table[] = { -1,  9, 3, 10, 4,  5, 7,  6,
@@ -464,8 +464,7 @@ static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif)
  *     Set up the DMA functionality on the ALi 15x3.
  */
 
-static int __devinit init_dma_ali15x3(ide_hwif_t *hwif,
-                                     const struct ide_port_info *d)
+static int init_dma_ali15x3(ide_hwif_t *hwif, const struct ide_port_info *d)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        unsigned long base = ide_pci_dma_base(hwif, d);
@@ -512,7 +511,7 @@ static const struct ide_dma_ops ali_dma_ops = {
        .dma_sff_read_status    = ide_dma_sff_read_status,
 };
 
-static const struct ide_port_info ali15x3_chipset __devinitconst = {
+static const struct ide_port_info ali15x3_chipset = {
        .name           = DRV_NAME,
        .init_chipset   = init_chipset_ali15x3,
        .init_hwif      = init_hwif_ali15x3,
@@ -532,7 +531,8 @@ static const struct ide_port_info ali15x3_chipset __devinitconst = {
  *     hot plug layer.
  */
  
-static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int alim15x3_init_one(struct pci_dev *dev,
+                            const struct pci_device_id *id)
 {
        struct ide_port_info d = ali15x3_chipset;
        u8 rev = dev->revision, idx = id->driver_data;
index 56fc99557ba28dfc24d8d5e0e06054fa8605553a..cbfe846911d19ef80764e0969889891585d88edc 100644 (file)
@@ -223,7 +223,7 @@ static const struct ide_port_ops amd_port_ops = {
                .udma_mask      = udma,                                 \
        }
 
-static const struct ide_port_info amd74xx_chipsets[] __devinitconst = {
+static const struct ide_port_info amd74xx_chipsets[] = {
        /* 0: AMD7401 */        DECLARE_AMD_DEV(0x00, ATA_UDMA2),
        /* 1: AMD7409 */        DECLARE_AMD_DEV(ATA_SWDMA2, ATA_UDMA4),
        /* 2: AMD7411/7441 */   DECLARE_AMD_DEV(ATA_SWDMA2, ATA_UDMA5),
@@ -235,7 +235,7 @@ static const struct ide_port_info amd74xx_chipsets[] __devinitconst = {
        /* 6: AMD5536 */        DECLARE_AMD_DEV(ATA_SWDMA2, ATA_UDMA5),
 };
 
-static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct ide_port_info d;
        u8 idx = id->driver_data;
index cb43480b1bd5eb34f0a345eb57e1502618e09dbb..dbd0f242ec1877ccdd3c8cde1d7c7fcebc76574d 100644 (file)
@@ -139,7 +139,7 @@ static const struct ide_port_ops atiixp_port_ops = {
        .cable_detect           = atiixp_cable_detect,
 };
 
-static const struct ide_port_info atiixp_pci_info[] __devinitconst = {
+static const struct ide_port_info atiixp_pci_info[] = {
        {       /* 0: IXP200/300/400/700 */
                .name           = DRV_NAME,
                .enablebits     = {{0x48,0x01,0x00}, {0x48,0x08,0x00}},
@@ -168,7 +168,7 @@ static const struct ide_port_info atiixp_pci_info[] __devinitconst = {
  *     finds a device matching our IDE device tables.
  */
 
-static int __devinit atiixp_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int atiixp_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &atiixp_pci_info[id->driver_data], NULL);
 }
index d1fc43802f5d21c9427aa1bc80cf6fc47d9302ef..b127ed60c73364f34a114a8a3033aa42c906b8ca 100644 (file)
@@ -327,7 +327,7 @@ static const struct ide_dma_ops cmd646_rev1_dma_ops = {
        .dma_sff_read_status    = ide_dma_sff_read_status,
 };
 
-static const struct ide_port_info cmd64x_chipsets[] __devinitconst = {
+static const struct ide_port_info cmd64x_chipsets[] = {
        {       /* 0: CMD643 */
                .name           = DRV_NAME,
                .init_chipset   = init_chipset_cmd64x,
@@ -373,7 +373,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitconst = {
        }
 };
 
-static int __devinit cmd64x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int cmd64x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct ide_port_info d;
        u8 idx = id->driver_data;
index 14447621e60b7072dc3cb0d5845c81d98ed6a611..6250aee30503d0b48043a2471a33206d6e04f654 100644 (file)
@@ -94,7 +94,7 @@ static const struct ide_port_ops cs5520_port_ops = {
        .set_dma_mode           = cs5520_set_dma_mode,
 };
 
-static const struct ide_port_info cyrix_chipset __devinitconst = {
+static const struct ide_port_info cyrix_chipset = {
        .name           = DRV_NAME,
        .enablebits     = { { 0x60, 0x01, 0x01 }, { 0x60, 0x02, 0x02 } },
        .port_ops       = &cs5520_port_ops,
@@ -108,7 +108,7 @@ static const struct ide_port_info cyrix_chipset __devinitconst = {
  *     work longhand.
  */
  
-static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        const struct ide_port_info *d = &cyrix_chipset;
        struct ide_hw hw[2], *hws[] = { NULL, NULL };
index 49b40ad59d1a71e5ad6e96b15a8c0e1c028e6636..65371599b97672673af822f05167e0647ae617a0 100644 (file)
@@ -226,7 +226,7 @@ out:
  *     performs channel-specific pre-initialization before drive probing.
  */
 
-static void __devinit init_hwif_cs5530 (ide_hwif_t *hwif)
+static void init_hwif_cs5530 (ide_hwif_t *hwif)
 {
        unsigned long basereg;
        u32 d0_timings;
@@ -245,7 +245,7 @@ static const struct ide_port_ops cs5530_port_ops = {
        .udma_filter            = cs5530_udma_filter,
 };
 
-static const struct ide_port_info cs5530_chipset __devinitconst = {
+static const struct ide_port_info cs5530_chipset = {
        .name           = DRV_NAME,
        .init_chipset   = init_chipset_cs5530,
        .init_hwif      = init_hwif_cs5530,
@@ -257,7 +257,7 @@ static const struct ide_port_info cs5530_chipset __devinitconst = {
        .udma_mask      = ATA_UDMA2,
 };
 
-static int __devinit cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &cs5530_chipset, NULL);
 }
index 18d4c852602bfa042926d21d03dce3e231bc33eb..3bc5b9a34013b0e30ee3500961be5b2a4782b6fd 100644 (file)
@@ -170,7 +170,7 @@ static const struct ide_port_ops cs5535_port_ops = {
        .cable_detect           = cs5535_cable_detect,
 };
 
-static const struct ide_port_info cs5535_chipset __devinitconst = {
+static const struct ide_port_info cs5535_chipset = {
        .name           = DRV_NAME,
        .port_ops       = &cs5535_port_ops,
        .host_flags     = IDE_HFLAG_SINGLE | IDE_HFLAG_POST_SET_MODE,
@@ -179,8 +179,7 @@ static const struct ide_port_info cs5535_chipset __devinitconst = {
        .udma_mask      = ATA_UDMA4,
 };
 
-static int __devinit cs5535_init_one(struct pci_dev *dev,
-                                       const struct pci_device_id *id)
+static int cs5535_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &cs5535_chipset, NULL);
 }
index 3ffb49dab574e80929e764fd50b4a3e5f8c72fe5..f5820079a2860f217662cf5be326497d961575ed 100644 (file)
@@ -145,7 +145,7 @@ static void cy82c693_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive)
                pci_dev_put(dev);
 }
 
-static void __devinit init_iops_cy82c693(ide_hwif_t *hwif)
+static void init_iops_cy82c693(ide_hwif_t *hwif)
 {
        static ide_hwif_t *primary;
        struct pci_dev *dev = to_pci_dev(hwif->dev);
@@ -163,7 +163,7 @@ static const struct ide_port_ops cy82c693_port_ops = {
        .set_dma_mode           = cy82c693_set_dma_mode,
 };
 
-static const struct ide_port_info cy82c693_chipset __devinitconst = {
+static const struct ide_port_info cy82c693_chipset = {
        .name           = DRV_NAME,
        .init_iops      = init_iops_cy82c693,
        .port_ops       = &cy82c693_port_ops,
@@ -173,7 +173,8 @@ static const struct ide_port_info cy82c693_chipset __devinitconst = {
        .mwdma_mask     = ATA_MWDMA2,
 };
 
-static int __devinit cy82c693_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int cy82c693_init_one(struct pci_dev *dev,
+                            const struct pci_device_id *id)
 {
        struct pci_dev *dev2;
        int ret = -ENODEV;
@@ -190,7 +191,7 @@ static int __devinit cy82c693_init_one(struct pci_dev *dev, const struct pci_dev
        return ret;
 }
 
-static void __devexit cy82c693_remove(struct pci_dev *dev)
+static void cy82c693_remove(struct pci_dev *dev)
 {
        struct ide_host *host = pci_get_drvdata(dev);
        struct pci_dev *dev2 = host->dev[1] ? to_pci_dev(host->dev[1]) : NULL;
@@ -209,7 +210,7 @@ static struct pci_driver cy82c693_pci_driver = {
        .name           = "Cypress_IDE",
        .id_table       = cy82c693_pci_tbl,
        .probe          = cy82c693_init_one,
-       .remove         = __devexit_p(cy82c693_remove),
+       .remove         = cy82c693_remove,
        .suspend        = ide_pci_suspend,
        .resume         = ide_pci_resume,
 };
index 1e10eba62ceb7ba97568da89b24162e2b09da2d0..7e27d3295e55e06bbdbbb15ea922756bbe48b775 100644 (file)
@@ -71,8 +71,7 @@ static const struct ide_port_info delkin_cb_port_info = {
        .chipset                = ide_pci,
 };
 
-static int __devinit
-delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
+static int delkin_cb_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct ide_host *host;
        unsigned long base;
@@ -158,7 +157,7 @@ static int delkin_cb_resume(struct pci_dev *dev)
 #define delkin_cb_resume NULL
 #endif
 
-static struct pci_device_id delkin_cb_pci_tbl[] __devinitdata = {
+static struct pci_device_id delkin_cb_pci_tbl[] = {
        { 0x1145, 0xf021, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { 0x1145, 0xf024, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { 0, },
index 4aec3b87ff91aec9b1e575c9c69af1b485a60914..696b6c1ec940fce29de2dc41d5d91d6b860467bf 100644 (file)
@@ -443,7 +443,7 @@ static struct hpt_timings hpt37x_timings = {
        }
 };
 
-static const struct hpt_info hpt36x __devinitconst = {
+static const struct hpt_info hpt36x = {
        .chip_name      = "HPT36x",
        .chip_type      = HPT36x,
        .udma_mask      = HPT366_ALLOW_ATA66_3 ? (HPT366_ALLOW_ATA66_4 ? ATA_UDMA4 : ATA_UDMA3) : ATA_UDMA2,
@@ -451,7 +451,7 @@ static const struct hpt_info hpt36x __devinitconst = {
        .timings        = &hpt36x_timings
 };
 
-static const struct hpt_info hpt370 __devinitconst = {
+static const struct hpt_info hpt370 = {
        .chip_name      = "HPT370",
        .chip_type      = HPT370,
        .udma_mask      = HPT370_ALLOW_ATA100_5 ? ATA_UDMA5 : ATA_UDMA4,
@@ -459,7 +459,7 @@ static const struct hpt_info hpt370 __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt370a __devinitconst = {
+static const struct hpt_info hpt370a = {
        .chip_name      = "HPT370A",
        .chip_type      = HPT370A,
        .udma_mask      = HPT370_ALLOW_ATA100_5 ? ATA_UDMA5 : ATA_UDMA4,
@@ -467,7 +467,7 @@ static const struct hpt_info hpt370a __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt374 __devinitconst = {
+static const struct hpt_info hpt374 = {
        .chip_name      = "HPT374",
        .chip_type      = HPT374,
        .udma_mask      = ATA_UDMA5,
@@ -475,7 +475,7 @@ static const struct hpt_info hpt374 __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt372 __devinitconst = {
+static const struct hpt_info hpt372 = {
        .chip_name      = "HPT372",
        .chip_type      = HPT372,
        .udma_mask      = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
@@ -483,7 +483,7 @@ static const struct hpt_info hpt372 __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt372a __devinitconst = {
+static const struct hpt_info hpt372a = {
        .chip_name      = "HPT372A",
        .chip_type      = HPT372A,
        .udma_mask      = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
@@ -491,7 +491,7 @@ static const struct hpt_info hpt372a __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt302 __devinitconst = {
+static const struct hpt_info hpt302 = {
        .chip_name      = "HPT302",
        .chip_type      = HPT302,
        .udma_mask      = HPT302_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
@@ -499,7 +499,7 @@ static const struct hpt_info hpt302 __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt371 __devinitconst = {
+static const struct hpt_info hpt371 = {
        .chip_name      = "HPT371",
        .chip_type      = HPT371,
        .udma_mask      = HPT371_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
@@ -507,7 +507,7 @@ static const struct hpt_info hpt371 __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt372n __devinitconst = {
+static const struct hpt_info hpt372n = {
        .chip_name      = "HPT372N",
        .chip_type      = HPT372N,
        .udma_mask      = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
@@ -515,7 +515,7 @@ static const struct hpt_info hpt372n __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt302n __devinitconst = {
+static const struct hpt_info hpt302n = {
        .chip_name      = "HPT302N",
        .chip_type      = HPT302N,
        .udma_mask      = HPT302_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
@@ -523,7 +523,7 @@ static const struct hpt_info hpt302n __devinitconst = {
        .timings        = &hpt37x_timings
 };
 
-static const struct hpt_info hpt371n __devinitconst = {
+static const struct hpt_info hpt371n = {
        .chip_name      = "HPT371N",
        .chip_type      = HPT371N,
        .udma_mask      = HPT371_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
@@ -1197,7 +1197,7 @@ static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
        return (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
 }
 
-static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
+static void init_hwif_hpt366(ide_hwif_t *hwif)
 {
        struct hpt_info *info   = hpt3xx_get_info(hwif->dev);
        u8  chip_type           = info->chip_type;
@@ -1221,7 +1221,7 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
        }
 }
 
-static int __devinit init_dma_hpt366(ide_hwif_t *hwif,
+static int init_dma_hpt366(ide_hwif_t *hwif,
                                     const struct ide_port_info *d)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
@@ -1265,7 +1265,7 @@ static int __devinit init_dma_hpt366(ide_hwif_t *hwif,
        return 0;
 }
 
-static void __devinit hpt374_init(struct pci_dev *dev, struct pci_dev *dev2)
+static void hpt374_init(struct pci_dev *dev, struct pci_dev *dev2)
 {
        if (dev2->irq != dev->irq) {
                /* FIXME: we need a core pci_set_interrupt() */
@@ -1275,7 +1275,7 @@ static void __devinit hpt374_init(struct pci_dev *dev, struct pci_dev *dev2)
        }
 }
 
-static void __devinit hpt371_init(struct pci_dev *dev)
+static void hpt371_init(struct pci_dev *dev)
 {
        u8 mcr1 = 0;
 
@@ -1290,7 +1290,7 @@ static void __devinit hpt371_init(struct pci_dev *dev)
                pci_write_config_byte(dev, 0x50, mcr1 & ~0x04);
 }
 
-static int __devinit hpt36x_init(struct pci_dev *dev, struct pci_dev *dev2)
+static int hpt36x_init(struct pci_dev *dev, struct pci_dev *dev2)
 {
        u8 mcr1 = 0, pin1 = 0, pin2 = 0;
 
@@ -1361,7 +1361,7 @@ static const struct ide_dma_ops hpt36x_dma_ops = {
        .dma_sff_read_status    = ide_dma_sff_read_status,
 };
 
-static const struct ide_port_info hpt366_chipsets[] __devinitconst = {
+static const struct ide_port_info hpt366_chipsets[] = {
        {       /* 0: HPT36x */
                .name           = DRV_NAME,
                .init_chipset   = init_chipset_hpt366,
@@ -1402,7 +1402,7 @@ static const struct ide_port_info hpt366_chipsets[] __devinitconst = {
  *     Called when the PCI registration layer (or the IDE initialization)
  *     finds a device matching our IDE device tables.
  */
-static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int hpt366_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        const struct hpt_info *info = NULL;
        struct hpt_info *dyn_info;
@@ -1499,7 +1499,7 @@ static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_devic
        return ret;
 }
 
-static void __devexit hpt366_remove(struct pci_dev *dev)
+static void hpt366_remove(struct pci_dev *dev)
 {
        struct ide_host *host = pci_get_drvdata(dev);
        struct ide_info *info = host->host_priv;
@@ -1510,7 +1510,7 @@ static void __devexit hpt366_remove(struct pci_dev *dev)
        kfree(info);
 }
 
-static const struct pci_device_id hpt366_pci_tbl[] __devinitconst = {
+static const struct pci_device_id hpt366_pci_tbl[] = {
        { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT366),  0 },
        { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT372),  1 },
        { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT302),  2 },
@@ -1525,7 +1525,7 @@ static struct pci_driver hpt366_pci_driver = {
        .name           = "HPT366_IDE",
        .id_table       = hpt366_pci_tbl,
        .probe          = hpt366_init_one,
-       .remove         = __devexit_p(hpt366_remove),
+       .remove         = hpt366_remove,
        .suspend        = ide_pci_suspend,
        .resume         = ide_pci_resume,
 };
index e640d0ac3af63cad4730fc370fa58bc7e5a7ac1f..9f0a48e39b8aa73c261e75b0aa0704f9efeb7d05 100644 (file)
@@ -406,8 +406,8 @@ static const struct ide_port_info icside_v5_port_info = {
        .chipset                = ide_acorn,
 };
 
-static int __devinit
-icside_register_v5(struct icside_state *state, struct expansion_card *ec)
+static int icside_register_v5(struct icside_state *state,
+                             struct expansion_card *ec)
 {
        void __iomem *base;
        struct ide_host *host;
@@ -460,8 +460,8 @@ static const struct ide_port_info icside_v6_port_info __initconst = {
        .chipset                = ide_acorn,
 };
 
-static int __devinit
-icside_register_v6(struct icside_state *state, struct expansion_card *ec)
+static int icside_register_v6(struct icside_state *state,
+                             struct expansion_card *ec)
 {
        void __iomem *ioc_base, *easi_base;
        struct ide_host *host;
@@ -537,8 +537,7 @@ out:
        return ret;
 }
 
-static int __devinit
-icside_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int icside_probe(struct expansion_card *ec, const struct ecard_id *id)
 {
        struct icside_state *state;
        void __iomem *idmem;
@@ -604,7 +603,7 @@ icside_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit icside_remove(struct expansion_card *ec)
+static void icside_remove(struct expansion_card *ec)
 {
        struct icside_state *state = ecard_get_drvdata(ec);
 
@@ -666,7 +665,7 @@ static const struct ecard_id icside_ids[] = {
 
 static struct ecard_driver icside_driver = {
        .probe          = icside_probe,
-       .remove         = __devexit_p(icside_remove),
+       .remove         = icside_remove,
        .shutdown       = icside_shutdown,
        .id_table       = icside_ids,
        .drv = {
index dab5b670bfbff335b02346044f1380d262b569f5..673420db953f2f1f641e72fd399481e8eaf89750 100644 (file)
@@ -53,7 +53,7 @@ static const struct ide_port_ops netcell_port_ops = {
                .udma_mask      = ATA_UDMA6, \
        }
 
-static const struct ide_port_info generic_chipsets[] __devinitconst = {
+static const struct ide_port_info generic_chipsets[] = {
        /*  0: Unknown */
        DECLARE_GENERIC_PCI_DEV(0),
 
@@ -103,7 +103,7 @@ static const struct ide_port_info generic_chipsets[] __devinitconst = {
  *     finds a device matching our IDE device tables.
  */
 
-static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int generic_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        const struct ide_port_info *d = &generic_chipsets[id->driver_data];
        int ret = -ENODEV;
index 962693b10a1cfc8dc7aa71a8439329cc79f946f3..ba4bfbead24b3f3c09e5afea8da85e739537744d 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/io.h>
 
-static void __devinit plat_ide_setup_ports(struct ide_hw *hw,
-                                          void __iomem *base,
-                                          void __iomem *ctrl,
-                                          struct pata_platform_info *pdata,
-                                          int irq)
+static void plat_ide_setup_ports(struct ide_hw *hw, void __iomem *base,
+                                void __iomem *ctrl,
+                                struct pata_platform_info *pdata, int irq)
 {
        unsigned long port = (unsigned long)base;
        int i;
@@ -48,7 +46,7 @@ static const struct ide_port_info platform_ide_port_info = {
        .chipset                = ide_generic,
 };
 
-static int __devinit plat_ide_probe(struct platform_device *pdev)
+static int plat_ide_probe(struct platform_device *pdev)
 {
        struct resource *res_base, *res_alt, *res_irq;
        void __iomem *base, *alt_base;
@@ -115,7 +113,7 @@ out:
        return ret;
 }
 
-static int __devexit plat_ide_remove(struct platform_device *pdev)
+static int plat_ide_remove(struct platform_device *pdev)
 {
        struct ide_host *host = dev_get_drvdata(&pdev->dev);
 
@@ -130,7 +128,7 @@ static struct platform_driver platform_ide_driver = {
                .owner = THIS_MODULE,
        },
        .probe = plat_ide_probe,
-       .remove = __devexit_p(plat_ide_remove),
+       .remove = plat_ide_remove,
 };
 
 static int __init platform_ide_init(void)
index d5dd180c4b85766649ada84c63f2d67f93cdac2e..b6f674ab4fb7c0d4119fa580965d44cc4da272da 100644 (file)
@@ -115,7 +115,7 @@ static const struct ide_port_ops it8172_port_ops = {
        .set_dma_mode   = it8172_set_dma_mode,
 };
 
-static const struct ide_port_info it8172_port_info __devinitconst = {
+static const struct ide_port_info it8172_port_info = {
        .name           = DRV_NAME,
        .port_ops       = &it8172_port_ops,
        .enablebits     = { {0x41, 0x80, 0x80}, {0x00, 0x00, 0x00} },
@@ -125,8 +125,7 @@ static const struct ide_port_info it8172_port_info __devinitconst = {
        .udma_mask      = ATA_UDMA2,
 };
 
-static int __devinit it8172_init_one(struct pci_dev *dev,
-                                       const struct pci_device_id *id)
+static int it8172_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
                return -ENODEV; /* IT8172 is more than an IDE controller */
index 1847aeb5450aa7d698bc1308832f0562a1202997..6b92846682fc26553c6ced0d2954ffda4dad94e9 100644 (file)
@@ -156,7 +156,7 @@ static const struct ide_port_ops it8213_port_ops = {
        .cable_detect           = it8213_cable_detect,
 };
 
-static const struct ide_port_info it8213_chipset __devinitconst = {
+static const struct ide_port_info it8213_chipset = {
        .name           = DRV_NAME,
        .enablebits     = { {0x41, 0x80, 0x80} },
        .port_ops       = &it8213_port_ops,
@@ -177,7 +177,7 @@ static const struct ide_port_info it8213_chipset __devinitconst = {
  *     standard helper functions to do almost all the work for us.
  */
 
-static int __devinit it8213_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int it8213_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &it8213_chipset, NULL);
 }
index c5611dbca34241dfe2f68078c3693f44a1dd4338..f01ba4606be0eb412ea6347d9f6c14ca04801710 100644 (file)
@@ -528,7 +528,7 @@ static struct ide_dma_ops it821x_pass_through_dma_ops = {
  *     ide DMA handlers appropriately
  */
 
-static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
+static void init_hwif_it821x(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        struct ide_host *host = pci_get_drvdata(dev);
@@ -630,7 +630,7 @@ static const struct ide_port_ops it821x_port_ops = {
        .cable_detect           = it821x_cable_detect,
 };
 
-static const struct ide_port_info it821x_chipset __devinitconst = {
+static const struct ide_port_info it821x_chipset = {
        .name           = DRV_NAME,
        .init_chipset   = init_chipset_it821x,
        .init_hwif      = init_hwif_it821x,
@@ -647,7 +647,7 @@ static const struct ide_port_info it821x_chipset __devinitconst = {
  *     We then use the IDE PCI generic helper to do most of the work.
  */
 
-static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int it821x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct it821x_dev *itdevs;
        int rc;
@@ -667,7 +667,7 @@ static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_devic
        return rc;
 }
 
-static void __devexit it821x_remove(struct pci_dev *dev)
+static void it821x_remove(struct pci_dev *dev)
 {
        struct ide_host *host = pci_get_drvdata(dev);
        struct it821x_dev *itdevs = host->host_priv;
@@ -689,7 +689,7 @@ static struct pci_driver it821x_pci_driver = {
        .name           = "ITE821x IDE",
        .id_table       = it821x_pci_tbl,
        .probe          = it821x_init_one,
-       .remove         = __devexit_p(it821x_remove),
+       .remove         = it821x_remove,
        .suspend        = ide_pci_suspend,
        .resume         = ide_pci_resume,
 };
index efddd7d9f92d9b5f983bd41f4d6eac2f564eac2a..ae6480dcbadf28e92860dd140302a864d57a5583 100644 (file)
@@ -102,7 +102,7 @@ static const struct ide_port_ops jmicron_port_ops = {
        .cable_detect           = jmicron_cable_detect,
 };
 
-static const struct ide_port_info jmicron_chipset __devinitconst = {
+static const struct ide_port_info jmicron_chipset = {
        .name           = DRV_NAME,
        .enablebits     = { { 0x40, 0x01, 0x01 }, { 0x40, 0x10, 0x10 } },
        .port_ops       = &jmicron_port_ops,
@@ -120,7 +120,7 @@ static const struct ide_port_info jmicron_chipset __devinitconst = {
  *     We then use the IDE PCI generic helper to do most of the work.
  */
 
-static int __devinit jmicron_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int jmicron_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &jmicron_chipset, NULL);
 }
index 73f78d872d551cf5be82b690672daddc7be97cb8..392fd106edf1e0f504be3e6211a2a2862755f475 100644 (file)
@@ -96,7 +96,7 @@ static const struct ide_tp_ops superio_tp_ops = {
        .output_data            = ide_output_data,
 };
 
-static void __devinit superio_init_iops(struct hwif_s *hwif)
+static void superio_init_iops(struct hwif_s *hwif)
 {
        struct pci_dev *pdev = to_pci_dev(hwif->dev);
        u32 dma_stat;
@@ -201,7 +201,7 @@ static int ns87415_dma_end(ide_drive_t *drive)
        return (dma_stat & 7) != 4;
 }
 
-static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
+static void init_hwif_ns87415 (ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        unsigned int ctrl, using_inta;
@@ -293,7 +293,7 @@ static const struct ide_dma_ops ns87415_dma_ops = {
        .dma_sff_read_status    = superio_dma_sff_read_status,
 };
 
-static const struct ide_port_info ns87415_chipset __devinitconst = {
+static const struct ide_port_info ns87415_chipset = {
        .name           = DRV_NAME,
        .init_hwif      = init_hwif_ns87415,
        .tp_ops         = &ns87415_tp_ops,
@@ -302,7 +302,7 @@ static const struct ide_port_info ns87415_chipset __devinitconst = {
                          IDE_HFLAG_NO_ATAPI_DMA,
 };
 
-static int __devinit ns87415_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int ns87415_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct ide_port_info d = ns87415_chipset;
 
index 39edc66cb96cfb52b613fc481de36270b584223c..26a45007e535093a16545a2a43cb4e839a4dff68 100644 (file)
@@ -131,7 +131,7 @@ static const struct ide_port_ops opti621_port_ops = {
        .set_pio_mode           = opti621_set_pio_mode,
 };
 
-static const struct ide_port_info opti621_chipset __devinitconst = {
+static const struct ide_port_info opti621_chipset = {
        .name           = DRV_NAME,
        .enablebits     = { {0x45, 0x80, 0x00}, {0x40, 0x08, 0x00} },
        .port_ops       = &opti621_port_ops,
@@ -139,7 +139,7 @@ static const struct ide_port_info opti621_chipset __devinitconst = {
        .pio_mask       = ATA_PIO4,
 };
 
-static int __devinit opti621_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int opti621_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &opti621_chipset, NULL);
 }
index 712c7904d03e5d460854cc565bf139bf29f3290e..6107cc4ee012a16b27f1e0bb75bc328fbca89445 100644 (file)
@@ -220,7 +220,7 @@ static void palm_bk3710_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive)
        palm_bk3710_setpiomode(base, mate, is_slave, cycle_time, pio);
 }
 
-static void __devinit palm_bk3710_chipinit(void __iomem *base)
+static void palm_bk3710_chipinit(void __iomem *base)
 {
        /*
         * REVISIT:  the ATA reset signal needs to be managed through a
@@ -282,8 +282,7 @@ static u8 palm_bk3710_cable_detect(ide_hwif_t *hwif)
        return ATA_CBL_PATA80;
 }
 
-static int __devinit palm_bk3710_init_dma(ide_hwif_t *hwif,
-                                         const struct ide_port_info *d)
+static int palm_bk3710_init_dma(ide_hwif_t *hwif, const struct ide_port_info *d)
 {
        printk(KERN_INFO "    %s: MMIO-DMA\n", hwif->name);
 
@@ -301,7 +300,7 @@ static const struct ide_port_ops palm_bk3710_ports_ops = {
        .cable_detect           = palm_bk3710_cable_detect,
 };
 
-static struct ide_port_info __devinitdata palm_bk3710_port_info = {
+static struct ide_port_info palm_bk3710_port_info = {
        .init_dma               = palm_bk3710_init_dma,
        .port_ops               = &palm_bk3710_ports_ops,
        .dma_ops                = &sff_dma_ops,
index 2e5ceb62fb3b38d461f2c61fa6c534e47ade22c6..df73cbd9387e89195eca1e30438cc04ae2f33be5 100644 (file)
@@ -422,7 +422,7 @@ static int init_chipset_pdcnew(struct pci_dev *dev)
        return 0;
 }
 
-static struct pci_dev * __devinit pdc20270_get_dev2(struct pci_dev *dev)
+static struct pci_dev *pdc20270_get_dev2(struct pci_dev *dev)
 {
        struct pci_dev *dev2;
 
@@ -465,7 +465,7 @@ static const struct ide_port_ops pdcnew_port_ops = {
                .udma_mask      = udma, \
        }
 
-static const struct ide_port_info pdcnew_chipsets[] __devinitconst = {
+static const struct ide_port_info pdcnew_chipsets[] = {
        /* 0: PDC202{68,70} */          DECLARE_PDCNEW_DEV(ATA_UDMA5),
        /* 1: PDC202{69,71,75,76,77} */ DECLARE_PDCNEW_DEV(ATA_UDMA6),
 };
@@ -479,7 +479,7 @@ static const struct ide_port_info pdcnew_chipsets[] __devinitconst = {
  *     finds a device matching our IDE device tables.
  */
  
-static int __devinit pdc202new_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int pdc202new_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        const struct ide_port_info *d = &pdcnew_chipsets[id->driver_data];
        struct pci_dev *bridge = dev->bus->self;
@@ -514,7 +514,7 @@ static int __devinit pdc202new_init_one(struct pci_dev *dev, const struct pci_de
        return ide_pci_init_one(dev, d, NULL);
 }
 
-static void __devexit pdc202new_remove(struct pci_dev *dev)
+static void pdc202new_remove(struct pci_dev *dev)
 {
        struct ide_host *host = pci_get_drvdata(dev);
        struct pci_dev *dev2 = host->dev[1] ? to_pci_dev(host->dev[1]) : NULL;
@@ -539,7 +539,7 @@ static struct pci_driver pdc202new_pci_driver = {
        .name           = "Promise_IDE",
        .id_table       = pdc202new_pci_tbl,
        .probe          = pdc202new_init_one,
-       .remove         = __devexit_p(pdc202new_remove),
+       .remove         = pdc202new_remove,
        .suspend        = ide_pci_suspend,
        .resume         = ide_pci_resume,
 };
index 5634510968128f499bf136959619a444328d0e2a..224ad46d6cb22494972790fc9b37e0f6e75a2fd9 100644 (file)
@@ -211,8 +211,7 @@ out:
        return 0;
 }
 
-static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev,
-                                          const char *name)
+static void pdc202ata4_fixup_irq(struct pci_dev *dev, const char *name)
 {
        if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) {
                u8 irq = 0, irq2 = 0;
@@ -270,7 +269,7 @@ static const struct ide_dma_ops pdc2026x_dma_ops = {
                .max_sectors    = sectors, \
        }
 
-static const struct ide_port_info pdc202xx_chipsets[] __devinitconst = {
+static const struct ide_port_info pdc202xx_chipsets[] = {
        {       /* 0: PDC20246 */
                .name           = DRV_NAME,
                .init_chipset   = init_chipset_pdc202xx,
@@ -297,7 +296,8 @@ static const struct ide_port_info pdc202xx_chipsets[] __devinitconst = {
  *     finds a device matching our IDE device tables.
  */
  
-static int __devinit pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int pdc202xx_init_one(struct pci_dev *dev,
+                            const struct pci_device_id *id)
 {
        const struct ide_port_info *d;
        u8 idx = id->driver_data;
index fe0fd60cfc09040e3e47e9dadd8e455ba610f421..a671cead6ae72b7e95bbd297053e22900f6806c9 100644 (file)
@@ -297,7 +297,7 @@ static u8 piix_cable_detect(ide_hwif_t *hwif)
  *     capabilities of the hardware.
  */
 
-static void __devinit init_hwif_piix(ide_hwif_t *hwif)
+static void init_hwif_piix(ide_hwif_t *hwif)
 {
        if (!hwif->dma_base)
                return;
@@ -344,7 +344,7 @@ static const struct ide_port_ops ich_port_ops = {
                .udma_mask      = udma, \
        }
 
-static const struct ide_port_info piix_pci_info[] __devinitconst = {
+static const struct ide_port_info piix_pci_info[] = {
        /* 0: MPIIX */
        {       /*
                 * MPIIX actually has only a single IDE channel mapped to
@@ -382,7 +382,7 @@ static const struct ide_port_info piix_pci_info[] __devinitconst = {
  *     finds a device matching our IDE device tables.
  */
  
-static int __devinit piix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int piix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &piix_pci_info[id->driver_data], NULL);
 }
@@ -394,7 +394,7 @@ static int __devinit piix_init_one(struct pci_dev *dev, const struct pci_device_
  *     they are found, disable use of DMA IDE
  */
 
-static void __devinit piix_check_450nx(void)
+static void piix_check_450nx(void)
 {
        struct pci_dev *pdev = NULL;
        u16 cfg;
index e944c7f705f7803ea18dbd8707b48a95f5cff52f..bf83d7bb6bc647a5ab92fb2055afe0b34ad25f8b 100644 (file)
@@ -1025,8 +1025,7 @@ static const struct ide_port_info pmac_port_info = {
  * Setup, register & probe an IDE channel driven by this driver, this is
  * called by one of the 2 probe functions (macio or PCI).
  */
-static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif,
-                                          struct ide_hw *hw)
+static int pmac_ide_setup_device(pmac_ide_hwif_t *pmif, struct ide_hw *hw)
 {
        struct device_node *np = pmif->node;
        const int *bidp;
@@ -1126,7 +1125,7 @@ static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif,
        return rc;
 }
 
-static void __devinit pmac_ide_init_ports(struct ide_hw *hw, unsigned long base)
+static void pmac_ide_init_ports(struct ide_hw *hw, unsigned long base)
 {
        int i;
 
@@ -1139,8 +1138,8 @@ static void __devinit pmac_ide_init_ports(struct ide_hw *hw, unsigned long base)
 /*
  * Attach to a macio probed interface
  */
-static int __devinit
-pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
+static int pmac_ide_macio_attach(struct macio_dev *mdev,
+                                const struct of_device_id *match)
 {
        void __iomem *base;
        unsigned long regbase;
@@ -1262,8 +1261,8 @@ pmac_ide_macio_resume(struct macio_dev *mdev)
 /*
  * Attach to a PCI probed interface
  */
-static int __devinit
-pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id)
+static int pmac_ide_pci_attach(struct pci_dev *pdev,
+                              const struct pci_device_id *id)
 {
        struct device_node *np;
        pmac_ide_hwif_t *pmif;
@@ -1692,8 +1691,7 @@ static const struct ide_dma_ops pmac_dma_ops = {
  * Allocate the data structures needed for using DMA with an interface
  * and fill the proper list of functions pointers
  */
-static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif,
-                                      const struct ide_port_info *d)
+static int pmac_ide_init_dma(ide_hwif_t *hwif, const struct ide_port_info *d)
 {
        pmac_ide_hwif_t *pmif =
                (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent);
index 48d976aad7abaf685754ea647280c21ff4c99c38..d73c3d10087c72133d5db9bd5902ea1e94758008 100644 (file)
@@ -29,8 +29,7 @@ static void rapide_setup_ports(struct ide_hw *hw, void __iomem *base,
        hw->irq = irq;
 }
 
-static int __devinit
-rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
 {
        void __iomem *base;
        struct ide_host *host;
@@ -64,7 +63,7 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit rapide_remove(struct expansion_card *ec)
+static void rapide_remove(struct expansion_card *ec)
 {
        struct ide_host *host = ecard_get_drvdata(ec);
 
@@ -82,7 +81,7 @@ static struct ecard_id rapide_ids[] = {
 
 static struct ecard_driver rapide_driver = {
        .probe          = rapide_probe,
-       .remove         = __devexit_p(rapide_remove),
+       .remove         = rapide_remove,
        .id_table       = rapide_ids,
        .drv = {
                .name   = "rapide",
index c04173e9fc38264326536088bd7c28aeb64adeff..f4b66f7ec9fd2153c47c45e87b73e84d9c85c161 100644 (file)
@@ -22,7 +22,7 @@
 
 #define DRV_NAME "rz1000"
 
-static int __devinit rz1000_disable_readahead(struct pci_dev *dev)
+static int rz1000_disable_readahead(struct pci_dev *dev)
 {
        u16 reg;
 
@@ -38,12 +38,12 @@ static int __devinit rz1000_disable_readahead(struct pci_dev *dev)
        }
 }
 
-static const struct ide_port_info rz1000_chipset __devinitconst = {
+static const struct ide_port_info rz1000_chipset = {
        .name           = DRV_NAME,
        .host_flags     = IDE_HFLAG_NO_DMA,
 };
 
-static int __devinit rz1000_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int rz1000_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct ide_port_info d = rz1000_chipset;
        int rc;
index d4758ebe77da66586f2ff16c2b06ab3d25cd5fae..a5b701818405ba6eb9b7d8fada5462cf9d1d53cb 100644 (file)
@@ -291,7 +291,7 @@ static const struct ide_dma_ops sc1200_dma_ops = {
        .dma_sff_read_status    = ide_dma_sff_read_status,
 };
 
-static const struct ide_port_info sc1200_chipset __devinitconst = {
+static const struct ide_port_info sc1200_chipset = {
        .name           = DRV_NAME,
        .port_ops       = &sc1200_port_ops,
        .dma_ops        = &sc1200_dma_ops,
@@ -303,7 +303,7 @@ static const struct ide_port_info sc1200_chipset __devinitconst = {
        .udma_mask      = ATA_UDMA2,
 };
 
-static int __devinit sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct sc1200_saved_state *ss = NULL;
        int rc;
index 9701038100216e03d77c113b34354c193573edb4..2a2d188b5d5b45c239bcdad5ae2361774cd97c45 100644 (file)
@@ -585,8 +585,7 @@ static int scc_ide_setup_pci_device(struct pci_dev *dev,
  *     Perform the initial set up for this device.
  */
 
-static int __devinit init_setup_scc(struct pci_dev *dev,
-                                   const struct ide_port_info *d)
+static int init_setup_scc(struct pci_dev *dev, const struct ide_port_info *d)
 {
        unsigned long ctl_base;
        unsigned long dma_base;
@@ -718,7 +717,7 @@ static void scc_output_data(ide_drive_t *drive,  struct ide_cmd *cmd,
  *
  */
 
-static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif)
+static void init_mmio_iops_scc(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        struct scc_ports *ports = pci_get_drvdata(dev);
@@ -738,7 +737,7 @@ static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif)
  *     and then do the MMIO setup.
  */
 
-static void __devinit init_iops_scc(ide_hwif_t *hwif)
+static void init_iops_scc(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
 
@@ -748,8 +747,7 @@ static void __devinit init_iops_scc(ide_hwif_t *hwif)
        init_mmio_iops_scc(hwif);
 }
 
-static int __devinit scc_init_dma(ide_hwif_t *hwif,
-                                 const struct ide_port_info *d)
+static int scc_init_dma(ide_hwif_t *hwif, const struct ide_port_info *d)
 {
        return ide_allocate_dma_engine(hwif);
 }
@@ -768,7 +766,7 @@ static u8 scc_cable_detect(ide_hwif_t *hwif)
  *     ide DMA handlers appropriately.
  */
 
-static void __devinit init_hwif_scc(ide_hwif_t *hwif)
+static void init_hwif_scc(ide_hwif_t *hwif)
 {
        /* PTERADD */
        out_be32((void __iomem *)(hwif->dma_base + 0x018), hwif->dmatable_dma);
@@ -811,7 +809,7 @@ static const struct ide_dma_ops scc_dma_ops = {
        .dma_sff_read_status    = scc_dma_sff_read_status,
 };
 
-static const struct ide_port_info scc_chipset __devinitconst = {
+static const struct ide_port_info scc_chipset = {
        .name           = "sccIDE",
        .init_iops      = init_iops_scc,
        .init_dma       = scc_init_dma,
@@ -834,7 +832,7 @@ static const struct ide_port_info scc_chipset __devinitconst = {
  *     We then use the IDE PCI generic helper to do most of the work.
  */
 
-static int __devinit scc_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int scc_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return init_setup_scc(dev, &scc_chipset);
 }
@@ -846,7 +844,7 @@ static int __devinit scc_init_one(struct pci_dev *dev, const struct pci_device_i
  *     Called by the PCI code when it removes an SCC PATA controller.
  */
 
-static void __devexit scc_remove(struct pci_dev *dev)
+static void scc_remove(struct pci_dev *dev)
 {
        struct scc_ports *ports = pci_get_drvdata(dev);
        struct ide_host *host = ports->host;
@@ -869,7 +867,7 @@ static struct pci_driver scc_pci_driver = {
        .name = "SCC IDE",
        .id_table = scc_pci_tbl,
        .probe = scc_init_one,
-       .remove = __devexit_p(scc_remove),
+       .remove = scc_remove,
 };
 
 static int __init scc_ide_init(void)
index 24d72ef23df7cd550270a78e2ff04a74c37464ab..a97affca18abe153be1ba4b3285d25390171e69c 100644 (file)
@@ -337,7 +337,7 @@ static const struct ide_port_ops svwks_port_ops = {
        .cable_detect           = svwks_cable_detect,
 };
 
-static const struct ide_port_info serverworks_chipsets[] __devinitconst = {
+static const struct ide_port_info serverworks_chipsets[] = {
        {       /* 0: OSB4 */
                .name           = DRV_NAME,
                .init_chipset   = init_chipset_svwks,
@@ -391,7 +391,7 @@ static const struct ide_port_info serverworks_chipsets[] __devinitconst = {
  *     finds a device matching our IDE device tables.
  */
  
-static int __devinit svwks_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int svwks_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct ide_port_info d;
        u8 idx = id->driver_data;
index e3ea591f66d36893e7d74ccc14f297ce673f9afd..a5ca179a83b35419e3f0f8afd8b6e17629fbcda8 100644 (file)
@@ -307,8 +307,7 @@ static u8 sgiioc4_read_status(ide_hwif_t *hwif)
 }
 
 /* Creates a DMA map for the scatter-gather list entries */
-static int __devinit ide_dma_sgiioc4(ide_hwif_t *hwif,
-                                    const struct ide_port_info *d)
+static int ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        unsigned long dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET;
@@ -520,7 +519,7 @@ static const struct ide_dma_ops sgiioc4_dma_ops = {
        .dma_lost_irq           = sgiioc4_dma_lost_irq,
 };
 
-static const struct ide_port_info sgiioc4_port_info __devinitconst = {
+static const struct ide_port_info sgiioc4_port_info = {
        .name                   = DRV_NAME,
        .chipset                = ide_pci,
        .init_dma               = ide_dma_sgiioc4,
@@ -532,7 +531,7 @@ static const struct ide_port_info sgiioc4_port_info __devinitconst = {
        .mwdma_mask             = ATA_MWDMA2_ONLY,
 };
 
-static int __devinit sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
+static int sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
 {
        unsigned long cmd_base, irqport;
        unsigned long bar0, cmd_phys_base, ctl;
@@ -581,7 +580,7 @@ req_mem_rgn_err:
        return rc;
 }
 
-static unsigned int __devinit pci_init_sgiioc4(struct pci_dev *dev)
+static unsigned int pci_init_sgiioc4(struct pci_dev *dev)
 {
        int ret;
 
@@ -601,7 +600,7 @@ out:
        return ret;
 }
 
-int __devinit ioc4_ide_attach_one(struct ioc4_driver_data *idd)
+int ioc4_ide_attach_one(struct ioc4_driver_data *idd)
 {
        /*
         * PCI-RT does not bring out IDE connection.
@@ -613,7 +612,7 @@ int __devinit ioc4_ide_attach_one(struct ioc4_driver_data *idd)
        return pci_init_sgiioc4(idd->idd_pdev);
 }
 
-static struct ioc4_submodule __devinitdata ioc4_ide_submodule = {
+static struct ioc4_submodule ioc4_ide_submodule = {
        .is_name = "IOC4_ide",
        .is_owner = THIS_MODULE,
        .is_probe = ioc4_ide_attach_one,
index 46f7e30d379038bcd47575952f02f5a61996a1f4..6a1849bb476ce1ad78e438dee2f55120cf3c8924 100644 (file)
@@ -546,7 +546,7 @@ static int init_chipset_siimage(struct pci_dev *dev)
  *     extended PRD tables. For better SI3112 support use the libata driver
  */
 
-static void __devinit init_mmio_iops_siimage(ide_hwif_t *hwif)
+static void init_mmio_iops_siimage(ide_hwif_t *hwif)
 {
        struct pci_dev *dev     = to_pci_dev(hwif->dev);
        struct ide_host *host   = pci_get_drvdata(dev);
@@ -646,7 +646,7 @@ static void sil_quirkproc(ide_drive_t *drive)
  *     can get the iops right before using them.
  */
 
-static void __devinit init_iops_siimage(ide_hwif_t *hwif)
+static void init_iops_siimage(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        struct ide_host *host = pci_get_drvdata(dev);
@@ -719,7 +719,7 @@ static const struct ide_dma_ops sil_dma_ops = {
                .udma_mask      = ATA_UDMA6,            \
        }
 
-static const struct ide_port_info siimage_chipsets[] __devinitconst = {
+static const struct ide_port_info siimage_chipsets[] = {
        /* 0: SiI680 */  DECLARE_SII_DEV(&sil_pata_port_ops),
        /* 1: SiI3112 */ DECLARE_SII_DEV(&sil_sata_port_ops)
 };
@@ -733,8 +733,7 @@ static const struct ide_port_info siimage_chipsets[] __devinitconst = {
  *     We then use the IDE PCI generic helper to do most of the work.
  */
 
-static int __devinit siimage_init_one(struct pci_dev *dev,
-                                     const struct pci_device_id *id)
+static int siimage_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        void __iomem *ioaddr = NULL;
        resource_size_t bar5 = pci_resource_start(dev, 5);
@@ -790,7 +789,7 @@ static int __devinit siimage_init_one(struct pci_dev *dev,
        return rc;
 }
 
-static void __devexit siimage_remove(struct pci_dev *dev)
+static void siimage_remove(struct pci_dev *dev)
 {
        struct ide_host *host = pci_get_drvdata(dev);
        void __iomem *ioaddr = host->host_priv;
@@ -822,7 +821,7 @@ static struct pci_driver siimage_pci_driver = {
        .name           = "SiI_IDE",
        .id_table       = siimage_pci_tbl,
        .probe          = siimage_init_one,
-       .remove         = __devexit_p(siimage_remove),
+       .remove         = siimage_remove,
        .suspend        = ide_pci_suspend,
        .resume         = ide_pci_resume,
 };
index 09e61b4c5e94f5331413ae52f56ff8a93983ed85..247853ea1368b7c0a83db3e9f1094616ac7f8b5e 100644 (file)
@@ -362,7 +362,7 @@ static u8 sis_ata133_udma_filter(ide_drive_t *drive)
        return (regdw & 0x08) ? ATA_UDMA6 : ATA_UDMA5;
 }
 
-static int __devinit sis_find_family(struct pci_dev *dev)
+static int sis_find_family(struct pci_dev *dev)
 {
        struct pci_dev *host;
        int i = 0;
@@ -563,7 +563,7 @@ static const struct ide_port_ops sis_ata133_port_ops = {
        .cable_detect           = sis_cable_detect,
 };
 
-static const struct ide_port_info sis5513_chipset __devinitconst = {
+static const struct ide_port_info sis5513_chipset = {
        .name           = DRV_NAME,
        .init_chipset   = init_chipset_sis5513,
        .enablebits     = { {0x4a, 0x02, 0x02}, {0x4a, 0x04, 0x04} },
@@ -572,7 +572,7 @@ static const struct ide_port_info sis5513_chipset __devinitconst = {
        .mwdma_mask     = ATA_MWDMA2,
 };
 
-static int __devinit sis5513_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int sis5513_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct ide_port_info d = sis5513_chipset;
        u8 udma_rates[] = { 0x00, 0x00, 0x07, 0x1f, 0x3f, 0x3f, 0x7f, 0x7f };
@@ -595,7 +595,7 @@ static int __devinit sis5513_init_one(struct pci_dev *dev, const struct pci_devi
        return ide_pci_init_one(dev, &d, NULL);
 }
 
-static void __devexit sis5513_remove(struct pci_dev *dev)
+static void sis5513_remove(struct pci_dev *dev)
 {
        ide_pci_remove(dev);
        pci_disable_device(dev);
@@ -613,7 +613,7 @@ static struct pci_driver sis5513_pci_driver = {
        .name           = "SIS_IDE",
        .id_table       = sis5513_pci_tbl,
        .probe          = sis5513_init_one,
-       .remove         = __devexit_p(sis5513_remove),
+       .remove         = sis5513_remove,
        .suspend        = ide_pci_suspend,
        .resume         = ide_pci_resume,
 };
index d051cd224bdbe363a2b43fcc3d1c87e0bc4105ba..8755df3330a06d6e0dbb18823860c95304382b84 100644 (file)
@@ -299,7 +299,7 @@ static const struct ide_dma_ops sl82c105_dma_ops = {
        .dma_sff_read_status    = ide_dma_sff_read_status,
 };
 
-static const struct ide_port_info sl82c105_chipset __devinitconst = {
+static const struct ide_port_info sl82c105_chipset = {
        .name           = DRV_NAME,
        .init_chipset   = init_chipset_sl82c105,
        .enablebits     = {{0x40,0x01,0x01}, {0x40,0x10,0x10}},
@@ -313,7 +313,7 @@ static const struct ide_port_info sl82c105_chipset __devinitconst = {
        .mwdma_mask     = ATA_MWDMA2,
 };
 
-static int __devinit sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct ide_port_info d = sl82c105_chipset;
        u8 rev = sl82c105_bridge_revision(dev);
index 863a5e9283ca189895f53e3f233a0b75af0777d3..8af92bbb3dcba164b44b88fdafd2dbf465aee47c 100644 (file)
@@ -132,7 +132,7 @@ static const struct ide_port_ops slc90e66_port_ops = {
        .cable_detect           = slc90e66_cable_detect,
 };
 
-static const struct ide_port_info slc90e66_chipset __devinitconst = {
+static const struct ide_port_info slc90e66_chipset = {
        .name           = DRV_NAME,
        .enablebits     = { {0x41, 0x80, 0x80}, {0x43, 0x80, 0x80} },
        .port_ops       = &slc90e66_port_ops,
@@ -142,7 +142,8 @@ static const struct ide_port_info slc90e66_chipset __devinitconst = {
        .udma_mask      = ATA_UDMA4,
 };
 
-static int __devinit slc90e66_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int slc90e66_init_one(struct pci_dev *dev,
+                            const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &slc90e66_chipset, NULL);
 }
index 17946785ebf672c3e615b8761cb31da533e28b4e..17e6132b99bf01b4241258035a187477705e73ee 100644 (file)
@@ -144,7 +144,7 @@ static u8 tc86c001_cable_detect(ide_hwif_t *hwif)
        return (scr1 & 0x2000) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
 }
 
-static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif)
+static void init_hwif_tc86c001(ide_hwif_t *hwif)
 {
        struct pci_dev *dev     = to_pci_dev(hwif->dev);
        unsigned long sc_base   = pci_resource_start(dev, 5);
@@ -192,7 +192,7 @@ static const struct ide_dma_ops tc86c001_dma_ops = {
        .dma_sff_read_status    = ide_dma_sff_read_status,
 };
 
-static const struct ide_port_info tc86c001_chipset __devinitconst = {
+static const struct ide_port_info tc86c001_chipset = {
        .name           = DRV_NAME,
        .init_hwif      = init_hwif_tc86c001,
        .port_ops       = &tc86c001_port_ops,
@@ -203,8 +203,8 @@ static const struct ide_port_info tc86c001_chipset __devinitconst = {
        .udma_mask      = ATA_UDMA4,
 };
 
-static int __devinit tc86c001_init_one(struct pci_dev *dev,
-                                      const struct pci_device_id *id)
+static int tc86c001_init_one(struct pci_dev *dev,
+                            const struct pci_device_id *id)
 {
        int rc;
 
@@ -232,7 +232,7 @@ out:
        return rc;
 }
 
-static void __devexit tc86c001_remove(struct pci_dev *dev)
+static void tc86c001_remove(struct pci_dev *dev)
 {
        ide_pci_remove(dev);
        pci_release_region(dev, 5);
@@ -249,7 +249,7 @@ static struct pci_driver tc86c001_pci_driver = {
        .name           = "TC86C001",
        .id_table       = tc86c001_pci_tbl,
        .probe          = tc86c001_init_one,
-       .remove         = __devexit_p(tc86c001_remove),
+       .remove         = tc86c001_remove,
 };
 
 static int __init tc86c001_ide_init(void)
index 55ce1b80efcbd861161595c2d10f55439129eb0b..7f1af9493f0efbb92fc6fa06ac6a3f7d4a59b689 100644 (file)
@@ -92,7 +92,7 @@ static const struct ide_port_ops triflex_port_ops = {
        .set_dma_mode           = triflex_set_mode,
 };
 
-static const struct ide_port_info triflex_device __devinitconst = {
+static const struct ide_port_info triflex_device = {
        .name           = DRV_NAME,
        .enablebits     = {{0x80, 0x01, 0x01}, {0x80, 0x02, 0x02}},
        .port_ops       = &triflex_port_ops,
@@ -101,8 +101,7 @@ static const struct ide_port_info triflex_device __devinitconst = {
        .mwdma_mask     = ATA_MWDMA2,
 };
 
-static int __devinit triflex_init_one(struct pci_dev *dev, 
-               const struct pci_device_id *id)
+static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &triflex_device, NULL);
 }
index e494a98a43a9ba2cebd5111c5839073e8130e39b..0069f6ce74cf507071119105de916de5ead8a989 100644 (file)
@@ -231,7 +231,7 @@ static void trm290_dma_host_set(ide_drive_t *drive, int on)
 {
 }
 
-static void __devinit init_hwif_trm290(ide_hwif_t *hwif)
+static void init_hwif_trm290(ide_hwif_t *hwif)
 {
        struct pci_dev *dev     = to_pci_dev(hwif->dev);
        unsigned int  cfg_base  = pci_resource_start(dev, 4);
@@ -324,7 +324,7 @@ static struct ide_dma_ops trm290_dma_ops = {
        .dma_check              = trm290_dma_check,
 };
 
-static const struct ide_port_info trm290_chipset __devinitconst = {
+static const struct ide_port_info trm290_chipset = {
        .name           = DRV_NAME,
        .init_hwif      = init_hwif_trm290,
        .tp_ops         = &trm290_tp_ops,
@@ -338,7 +338,7 @@ static const struct ide_port_info trm290_chipset __devinitconst = {
                          IDE_HFLAG_NO_LBA48,
 };
 
-static int __devinit trm290_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int trm290_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        return ide_pci_init_one(dev, &trm290_chipset, NULL);
 }
index eb7767864d10530ce2a72485823fb615ca1436d9..01464f1e233998cbb18b72e62513f353f4653eec 100644 (file)
@@ -403,7 +403,7 @@ static const struct ide_port_ops via_port_ops = {
        .cable_detect           = via82cxxx_cable_detect,
 };
 
-static const struct ide_port_info via82cxxx_chipset __devinitconst = {
+static const struct ide_port_info via82cxxx_chipset = {
        .name           = DRV_NAME,
        .init_chipset   = init_chipset_via82cxxx,
        .enablebits     = { { 0x40, 0x02, 0x02 }, { 0x40, 0x01, 0x01 } },
@@ -416,7 +416,7 @@ static const struct ide_port_info via82cxxx_chipset __devinitconst = {
        .mwdma_mask     = ATA_MWDMA2,
 };
 
-static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+static int via_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct pci_dev *isa = NULL;
        struct via_isa_bridge *via_config;
@@ -489,7 +489,7 @@ static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_i
        return rc;
 }
 
-static void __devexit via_remove(struct pci_dev *dev)
+static void via_remove(struct pci_dev *dev)
 {
        struct ide_host *host = pci_get_drvdata(dev);
        struct via82cxxx_dev *vdev = host->host_priv;
@@ -514,7 +514,7 @@ static struct pci_driver via_pci_driver = {
        .name           = "VIA_IDE",
        .id_table       = via_pci_tbl,
        .probe          = via_init_one,
-       .remove         = __devexit_p(via_remove),
+       .remove         = via_remove,
        .suspend        = ide_pci_suspend,
        .resume         = ide_pci_resume,
 };
index c49c04d9c2b07b7cdb1a2372e4f383885339bcbc..4ba384f1ab544976621e6dc48c46dd0453687fef 100644 (file)
@@ -506,7 +506,7 @@ static int intel_idle_cpuidle_driver_init(void)
                        if (*cpuidle_state_table[cstate].name == '\0')
                                pr_debug(PREFIX "unaware of model 0x%x"
                                        " MWAIT %d please"
-                                       " contact lenb@kernel.org",
+                                       " contact lenb@kernel.org\n",
                                boot_cpu_data.x86_model, cstate);
                        continue;
                }
index fe4bcd7c5b12ea9ef5e4f23b56c25169038ad570..05e996fafc9d42a8dd76031dedbfd6b1d8520d0a 100644 (file)
@@ -8,6 +8,7 @@ config HID_SENSOR_ACCEL_3D
        select IIO_BUFFER
        select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
+       select HID_SENSOR_IIO_TRIGGER
        tristate "HID Accelerometers 3D"
        help
          Say yes here to build support for the HID SENSOR
index e67bb912bd197b90de0cfccfda2a50041325c52f..0b0c3c66f6c07f8778c96ec76b513db80a16cf7a 100644 (file)
@@ -278,7 +278,7 @@ static int accel_3d_parse_report(struct platform_device *pdev,
 }
 
 /* Function to initialize the processing for usage id */
-static int __devinit hid_accel_3d_probe(struct platform_device *pdev)
+static int hid_accel_3d_probe(struct platform_device *pdev)
 {
        int ret = 0;
        static const char *name = "accel_3d";
@@ -375,7 +375,7 @@ error_ret:
 }
 
 /* Function to deinitialize the processing for usage id */
-static int __devinit hid_accel_3d_remove(struct platform_device *pdev)
+static int hid_accel_3d_remove(struct platform_device *pdev)
 {
        struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
index a6f4fc5f8201a414f653d86db92b7ef03a9c1705..bbad9b94cd75770b136499728497ff73ce4067d9 100644 (file)
@@ -367,7 +367,7 @@ static const struct ad7266_chan_info ad7266_chan_infos[] = {
        },
 };
 
-static void __devinit ad7266_init_channels(struct iio_dev *indio_dev)
+static void ad7266_init_channels(struct iio_dev *indio_dev)
 {
        struct ad7266_state *st = iio_priv(indio_dev);
        bool is_differential, is_signed;
@@ -391,7 +391,7 @@ static const char * const ad7266_gpio_labels[] = {
        "AD0", "AD1", "AD2",
 };
 
-static int __devinit ad7266_probe(struct spi_device *spi)
+static int ad7266_probe(struct spi_device *spi)
 {
        struct ad7266_platform_data *pdata = spi->dev.platform_data;
        struct iio_dev *indio_dev;
@@ -411,7 +411,11 @@ static int __devinit ad7266_probe(struct spi_device *spi)
                if (ret)
                        goto error_put_reg;
 
-               st->vref_uv = regulator_get_voltage(st->reg);
+               ret = regulator_get_voltage(st->reg);
+               if (ret < 0)
+                       goto error_disable_reg;
+
+               st->vref_uv = ret;
        } else {
                /* Use internal reference */
                st->vref_uv = 2500000;
@@ -494,7 +498,7 @@ error_put_reg:
        return ret;
 }
 
-static int __devexit ad7266_remove(struct spi_device *spi)
+static int ad7266_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7266_state *st = iio_priv(indio_dev);
@@ -525,7 +529,7 @@ static struct spi_driver ad7266_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ad7266_probe,
-       .remove         = __devexit_p(ad7266_remove),
+       .remove         = ad7266_remove,
        .id_table       = ad7266_id,
 };
 module_spi_driver(ad7266_driver);
index 2364807a5d6c47e358b9706a0d5d524eed161021..b34d754994d50d53f60fee694440658ba0b137dd 100644 (file)
@@ -292,7 +292,7 @@ static const struct iio_info ad7298_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit ad7298_probe(struct spi_device *spi)
+static int ad7298_probe(struct spi_device *spi)
 {
        struct ad7298_platform_data *pdata = spi->dev.platform_data;
        struct ad7298_state *st;
@@ -370,7 +370,7 @@ error_free:
        return ret;
 }
 
-static int __devexit ad7298_remove(struct spi_device *spi)
+static int ad7298_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7298_state *st = iio_priv(indio_dev);
@@ -398,7 +398,7 @@ static struct spi_driver ad7298_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ad7298_probe,
-       .remove         = __devexit_p(ad7298_remove),
+       .remove         = ad7298_remove,
        .id_table       = ad7298_id,
 };
 module_spi_driver(ad7298_driver);
index 330248bfebaecffdf8b042738f64ff134a8a73f8..1491fa6debb2c5e2cc8be063fbf3409e7b5d0b40 100644 (file)
@@ -207,7 +207,7 @@ static const struct iio_info ad7476_info = {
        .read_raw = &ad7476_read_raw,
 };
 
-static int __devinit ad7476_probe(struct spi_device *spi)
+static int ad7476_probe(struct spi_device *spi)
 {
        struct ad7476_state *st;
        struct iio_dev *indio_dev;
@@ -277,7 +277,7 @@ error_ret:
        return ret;
 }
 
-static int __devexit ad7476_remove(struct spi_device *spi)
+static int ad7476_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7476_state *st = iio_priv(indio_dev);
@@ -322,7 +322,7 @@ static struct spi_driver ad7476_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ad7476_probe,
-       .remove         = __devexit_p(ad7476_remove),
+       .remove         = ad7476_remove,
        .id_table       = ad7476_id,
 };
 module_spi_driver(ad7476_driver);
index e93740843b2b899de66b81b40834f1b607de8837..5e8d1da6887fb0de7d995f00daf6b7304f3f8860 100644 (file)
@@ -325,8 +325,8 @@ static const struct iio_info ad7791_no_filter_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit ad7791_setup(struct ad7791_state *st,
-       struct ad7791_platform_data *pdata)
+static int ad7791_setup(struct ad7791_state *st,
+                       struct ad7791_platform_data *pdata)
 {
        /* Set to poweron-reset default values */
        st->mode = AD7791_MODE_BUFFER;
@@ -349,7 +349,7 @@ static int __devinit ad7791_setup(struct ad7791_state *st,
                st->mode);
 }
 
-static int __devinit ad7791_probe(struct spi_device *spi)
+static int ad7791_probe(struct spi_device *spi)
 {
        struct ad7791_platform_data *pdata = spi->dev.platform_data;
        struct iio_dev *indio_dev;
@@ -418,7 +418,7 @@ err_iio_free:
        return ret;
 }
 
-static int __devexit ad7791_remove(struct spi_device *spi)
+static int ad7791_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7791_state *st = iio_priv(indio_dev);
@@ -450,7 +450,7 @@ static struct spi_driver ad7791_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ad7791_probe,
-       .remove         = __devexit_p(ad7791_remove),
+       .remove         = ad7791_remove,
        .id_table       = ad7791_spi_ids,
 };
 module_spi_driver(ad7791_driver);
index 81153fafac7a928fa4f15cff0ba8dee55da026ec..a33d5cd1a53696062596f53f8a6216c61a0c7661 100644 (file)
@@ -233,7 +233,7 @@ static const struct iio_info ad7887_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit ad7887_probe(struct spi_device *spi)
+static int ad7887_probe(struct spi_device *spi)
 {
        struct ad7887_platform_data *pdata = spi->dev.platform_data;
        struct ad7887_state *st;
@@ -340,7 +340,7 @@ error_free:
        return ret;
 }
 
-static int __devexit ad7887_remove(struct spi_device *spi)
+static int ad7887_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7887_state *st = iio_priv(indio_dev);
@@ -368,7 +368,7 @@ static struct spi_driver ad7887_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ad7887_probe,
-       .remove         = __devexit_p(ad7887_remove),
+       .remove         = ad7887_remove,
        .id_table       = ad7887_id,
 };
 module_spi_driver(ad7887_driver);
index 03b85940f4ba373ac9f2e907418e513d9374b264..a526c0e3aaa84be092d25789d3ccaffd0d056204 100644 (file)
@@ -80,7 +80,7 @@ static irqreturn_t at91_adc_trigger_handler(int irq, void *p)
                *timestamp = pf->timestamp;
        }
 
-       iio_push_to_buffers(indio_dev, (u8 *)st->buffer);
+       iio_push_to_buffers(idev, (u8 *)st->buffer);
 
        iio_trigger_notify_done(idev->trig);
 
@@ -514,7 +514,7 @@ static const struct iio_info at91_adc_info = {
        .read_raw = &at91_adc_read_raw,
 };
 
-static int __devinit at91_adc_probe(struct platform_device *pdev)
+static int at91_adc_probe(struct platform_device *pdev)
 {
        unsigned int prsc, mstrclk, ticks, adc_clk;
        int ret;
@@ -678,7 +678,7 @@ error_ret:
        return ret;
 }
 
-static int __devexit at91_adc_remove(struct platform_device *pdev)
+static int at91_adc_remove(struct platform_device *pdev)
 {
        struct iio_dev *idev = platform_get_drvdata(pdev);
        struct at91_adc_state *st = iio_priv(idev);
@@ -702,7 +702,7 @@ MODULE_DEVICE_TABLE(of, at91_adc_dt_ids);
 
 static struct platform_driver at91_adc_driver = {
        .probe = at91_adc_probe,
-       .remove = __devexit_p(at91_adc_remove),
+       .remove = at91_adc_remove,
        .driver = {
                   .name = "at91_adc",
                   .of_match_table = of_match_ptr(at91_adc_dt_ids),
index a93aaf0bb8415e1c6e2030269e79923d7eafdc99..72955e45e9e043bf96bd4d177abefe4d8b1e5e95 100644 (file)
@@ -193,7 +193,7 @@ static inline void lp8788_iio_map_unregister(struct iio_dev *indio_dev,
        iio_map_array_unregister(indio_dev, adc->map);
 }
 
-static int __devinit lp8788_adc_probe(struct platform_device *pdev)
+static int lp8788_adc_probe(struct platform_device *pdev)
 {
        struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
        struct iio_dev *indio_dev;
@@ -236,7 +236,7 @@ err_iio_map:
        return ret;
 }
 
-static int __devexit lp8788_adc_remove(struct platform_device *pdev)
+static int lp8788_adc_remove(struct platform_device *pdev)
 {
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
        struct lp8788_adc *adc = iio_priv(indio_dev);
@@ -250,7 +250,7 @@ static int __devexit lp8788_adc_remove(struct platform_device *pdev)
 
 static struct platform_driver lp8788_adc_driver = {
        .probe = lp8788_adc_probe,
-       .remove = __devexit_p(lp8788_adc_remove),
+       .remove = lp8788_adc_remove,
        .driver = {
                .name = LP8788_DEV_ADC,
                .owner = THIS_MODULE,
index 1e84b5b55093540435ef5a36e48f87e794dfb140..03b25b3dc71eb95703d2131230e2f11cb2dae03c 100644 (file)
@@ -1402,7 +1402,7 @@ static int max1363_initial_setup(struct max1363_state *st)
        return max1363_set_scan_mode(st);
 }
 
-static int __devinit max1363_alloc_scan_masks(struct iio_dev *indio_dev)
+static int max1363_alloc_scan_masks(struct iio_dev *indio_dev)
 {
        struct max1363_state *st = iio_priv(indio_dev);
        unsigned long *masks;
@@ -1525,8 +1525,8 @@ static void max1363_buffer_cleanup(struct iio_dev *indio_dev)
        iio_kfifo_free(indio_dev->buffer);
 }
 
-static int __devinit max1363_probe(struct i2c_client *client,
-                                  const struct i2c_device_id *id)
+static int max1363_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        int ret;
        struct max1363_state *st;
@@ -1605,26 +1605,27 @@ static int __devinit max1363_probe(struct i2c_client *client,
 
        return 0;
 error_free_irq:
-       free_irq(st->client->irq, indio_dev);
+       if (client->irq)
+               free_irq(st->client->irq, indio_dev);
 error_uninit_buffer:
        iio_buffer_unregister(indio_dev);
 error_cleanup_buffer:
        max1363_buffer_cleanup(indio_dev);
 error_free_available_scan_masks:
        kfree(indio_dev->available_scan_masks);
-error_unregister_map:
-       iio_map_array_unregister(indio_dev, client->dev.platform_data);
 error_disable_reg:
        regulator_disable(st->reg);
 error_put_reg:
        regulator_put(st->reg);
+error_unregister_map:
+       iio_map_array_unregister(indio_dev, client->dev.platform_data);
 error_free_device:
        iio_device_free(indio_dev);
 error_out:
        return ret;
 }
 
-static int __devexit max1363_remove(struct i2c_client *client)
+static int max1363_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
        struct max1363_state *st = iio_priv(indio_dev);
@@ -1635,10 +1636,8 @@ static int __devexit max1363_remove(struct i2c_client *client)
        iio_buffer_unregister(indio_dev);
        max1363_buffer_cleanup(indio_dev);
        kfree(indio_dev->available_scan_masks);
-       if (!IS_ERR(st->reg)) {
-               regulator_disable(st->reg);
-               regulator_put(st->reg);
-       }
+       regulator_disable(st->reg);
+       regulator_put(st->reg);
        iio_map_array_unregister(indio_dev, client->dev.platform_data);
        iio_device_free(indio_dev);
 
@@ -1690,7 +1689,7 @@ static struct i2c_driver max1363_driver = {
                .name = "max1363",
        },
        .probe = max1363_probe,
-       .remove = __devexit_p(max1363_remove),
+       .remove = max1363_remove,
        .id_table = max1363_id,
 };
 module_i2c_driver(max1363_driver);
index 02a43c87a8a37d7e8f8f485a030e3578cf71e4ea..cd030e100c395416e4043ad6659f7030266b9b7e 100644 (file)
@@ -136,7 +136,7 @@ static const struct iio_info tiadc_info = {
        .read_raw = &tiadc_read_raw,
 };
 
-static int __devinit tiadc_probe(struct platform_device *pdev)
+static int tiadc_probe(struct platform_device *pdev)
 {
        struct iio_dev          *indio_dev;
        struct tiadc_device     *adc_dev;
@@ -188,7 +188,7 @@ err_ret:
        return err;
 }
 
-static int __devexit tiadc_remove(struct platform_device *pdev)
+static int tiadc_remove(struct platform_device *pdev)
 {
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
 
@@ -250,7 +250,7 @@ static struct platform_driver tiadc_driver = {
                .pm     = TIADC_PM_OPS,
        },
        .probe  = tiadc_probe,
-       .remove = __devexit_p(tiadc_remove),
+       .remove = tiadc_remove,
 };
 
 module_platform_driver(tiadc_driver);
index 10136a8b20d4a545787ca84ac3cf1787a42bc1fd..ad0261533deeded96c55bdf6ba8b7a60129c21ee 100644 (file)
@@ -116,7 +116,7 @@ static const struct iio_info vprbrd_adc_iio_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit vprbrd_adc_probe(struct platform_device *pdev)
+static int vprbrd_adc_probe(struct platform_device *pdev)
 {
        struct vprbrd *vb = dev_get_drvdata(pdev->dev.parent);
        struct vprbrd_adc *adc;
@@ -154,7 +154,7 @@ error:
        return ret;
 }
 
-static int __devexit vprbrd_adc_remove(struct platform_device *pdev)
+static int vprbrd_adc_remove(struct platform_device *pdev)
 {
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
 
@@ -170,7 +170,7 @@ static struct platform_driver vprbrd_adc_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = vprbrd_adc_probe,
-       .remove         = __devexit_p(vprbrd_adc_remove),
+       .remove         = vprbrd_adc_remove,
 };
 
 module_platform_driver(vprbrd_adc_driver);
index d8281cdbfc4a0aa2520c27963797e87fa35ab43d..d6c0af23a2a74a8dae8260e88d3bd87f84ab1c27 100644 (file)
@@ -133,7 +133,7 @@ static const struct iio_chan_spec ad8366_channels[] = {
        AD8366_CHAN(1),
 };
 
-static int __devinit ad8366_probe(struct spi_device *spi)
+static int ad8366_probe(struct spi_device *spi)
 {
        struct iio_dev *indio_dev;
        struct ad8366_state *st;
@@ -182,7 +182,7 @@ error_put_reg:
        return ret;
 }
 
-static int __devexit ad8366_remove(struct spi_device *spi)
+static int ad8366_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad8366_state *st = iio_priv(indio_dev);
@@ -211,7 +211,7 @@ static struct spi_driver ad8366_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ad8366_probe,
-       .remove         = __devexit_p(ad8366_remove),
+       .remove         = ad8366_remove,
        .id_table       = ad8366_id,
 };
 
index ae10778da7aa1e7b1c11b558a562e998e78cfdcb..1178121b55b032989257e3167c6724815458ec26 100644 (file)
@@ -6,7 +6,7 @@ menu "Hid Sensor IIO Common"
 config HID_SENSOR_IIO_COMMON
        tristate "Common modules for all HID Sensor IIO drivers"
        depends on HID_SENSOR_HUB
-       select IIO_TRIGGER if IIO_BUFFER
+       select HID_SENSOR_IIO_TRIGGER if IIO_BUFFER
        help
          Say yes here to build support for HID sensor to use
          HID sensor common processing for attributes and IIO triggers.
@@ -14,6 +14,17 @@ config HID_SENSOR_IIO_COMMON
          HID sensor drivers, this module contains processing for those
          attributes.
 
+config HID_SENSOR_IIO_TRIGGER
+       tristate "Common module (trigger) for all HID Sensor IIO drivers"
+       depends on HID_SENSOR_HUB && HID_SENSOR_IIO_COMMON
+       select IIO_TRIGGER
+       help
+         Say yes here to build trigger support for HID sensors.
+         Triggers will be send if all requested attributes were read.
+
+         If this driver is compiled as a module, it will be named
+         hid-sensor-trigger.
+
 config HID_SENSOR_ENUM_BASE_QUIRKS
        bool "ENUM base quirks for HID Sensor IIO drivers"
        depends on HID_SENSOR_IIO_COMMON
index 1f463e00c2426b706223827afc7363614d80691f..22e7c5a82325e13c3cfbded83dc41f0de45385ae 100644 (file)
@@ -3,4 +3,5 @@
 #
 
 obj-$(CONFIG_HID_SENSOR_IIO_COMMON) += hid-sensor-iio-common.o
-hid-sensor-iio-common-y := hid-sensor-attributes.o hid-sensor-trigger.o
+obj-$(CONFIG_HID_SENSOR_IIO_TRIGGER) += hid-sensor-trigger.o
+hid-sensor-iio-common-y := hid-sensor-attributes.o
index eb281a2c295b52e709585b859a9a1f3e0981ec56..2fe1d4edcb2f2b93fdc21b30fdb777d9d4bc923b 100644 (file)
@@ -424,8 +424,8 @@ static const char * const ad5064_vref_name(struct ad5064_state *st,
        return st->chip_info->shared_vref ? "vref" : ad5064_vref_names[vref];
 }
 
-static int __devinit ad5064_probe(struct device *dev, enum ad5064_type type,
-       const char *name, ad5064_write_func write)
+static int ad5064_probe(struct device *dev, enum ad5064_type type,
+                       const char *name, ad5064_write_func write)
 {
        struct iio_dev *indio_dev;
        struct ad5064_state *st;
@@ -495,7 +495,7 @@ error_free:
        return ret;
 }
 
-static int __devexit ad5064_remove(struct device *dev)
+static int ad5064_remove(struct device *dev)
 {
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct ad5064_state *st = iio_priv(indio_dev);
@@ -523,7 +523,7 @@ static int ad5064_spi_write(struct ad5064_state *st, unsigned int cmd,
        return spi_write(spi, &st->data.spi, sizeof(st->data.spi));
 }
 
-static int __devinit ad5064_spi_probe(struct spi_device *spi)
+static int ad5064_spi_probe(struct spi_device *spi)
 {
        const struct spi_device_id *id = spi_get_device_id(spi);
 
@@ -531,7 +531,7 @@ static int __devinit ad5064_spi_probe(struct spi_device *spi)
                                ad5064_spi_write);
 }
 
-static int __devexit ad5064_spi_remove(struct spi_device *spi)
+static int ad5064_spi_remove(struct spi_device *spi)
 {
        return ad5064_remove(&spi->dev);
 }
@@ -563,7 +563,7 @@ static struct spi_driver ad5064_spi_driver = {
                   .owner = THIS_MODULE,
        },
        .probe = ad5064_spi_probe,
-       .remove = __devexit_p(ad5064_spi_remove),
+       .remove = ad5064_spi_remove,
        .id_table = ad5064_spi_ids,
 };
 
@@ -596,14 +596,14 @@ static int ad5064_i2c_write(struct ad5064_state *st, unsigned int cmd,
        return i2c_master_send(i2c, st->data.i2c, 3);
 }
 
-static int __devinit ad5064_i2c_probe(struct i2c_client *i2c,
+static int ad5064_i2c_probe(struct i2c_client *i2c,
        const struct i2c_device_id *id)
 {
        return ad5064_probe(&i2c->dev, id->driver_data, id->name,
                                                ad5064_i2c_write);
 }
 
-static int __devexit ad5064_i2c_remove(struct i2c_client *i2c)
+static int ad5064_i2c_remove(struct i2c_client *i2c)
 {
        return ad5064_remove(&i2c->dev);
 }
@@ -625,7 +625,7 @@ static struct i2c_driver ad5064_i2c_driver = {
                   .owner = THIS_MODULE,
        },
        .probe = ad5064_i2c_probe,
-       .remove = __devexit_p(ad5064_i2c_remove),
+       .remove = ad5064_i2c_remove,
        .id_table = ad5064_i2c_ids,
 };
 
index 8fce84fe70b1ee98a7ccc2b9c9e5882ca03a6c8b..54b46fd3aedec8295bc4a1f182ffe01d2dc657b5 100644 (file)
@@ -433,7 +433,7 @@ static const char * const ad5360_vref_name[] = {
         "vref0", "vref1", "vref2"
 };
 
-static int __devinit ad5360_alloc_channels(struct iio_dev *indio_dev)
+static int ad5360_alloc_channels(struct iio_dev *indio_dev)
 {
        struct ad5360_state *st = iio_priv(indio_dev);
        struct iio_chan_spec *channels;
@@ -456,7 +456,7 @@ static int __devinit ad5360_alloc_channels(struct iio_dev *indio_dev)
        return 0;
 }
 
-static int __devinit ad5360_probe(struct spi_device *spi)
+static int ad5360_probe(struct spi_device *spi)
 {
        enum ad5360_type type = spi_get_device_id(spi)->driver_data;
        struct iio_dev *indio_dev;
@@ -524,7 +524,7 @@ error_free:
        return ret;
 }
 
-static int __devexit ad5360_remove(struct spi_device *spi)
+static int ad5360_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5360_state *st = iio_priv(indio_dev);
@@ -560,7 +560,7 @@ static struct spi_driver ad5360_driver = {
                   .owner = THIS_MODULE,
        },
        .probe = ad5360_probe,
-       .remove = __devexit_p(ad5360_remove),
+       .remove = ad5360_remove,
        .id_table = ad5360_ids,
 };
 module_spi_driver(ad5360_driver);
index 14991ac55f2680ded5543eb76d436ef61cc87832..483fc379a2da9ca64a29fb13313b16f3d76d8b43 100644 (file)
@@ -338,7 +338,7 @@ static const struct ad5380_chip_info ad5380_chip_info_tbl[] = {
        },
 };
 
-static int __devinit ad5380_alloc_channels(struct iio_dev *indio_dev)
+static int ad5380_alloc_channels(struct iio_dev *indio_dev)
 {
        struct ad5380_state *st = iio_priv(indio_dev);
        struct iio_chan_spec *channels;
@@ -361,8 +361,8 @@ static int __devinit ad5380_alloc_channels(struct iio_dev *indio_dev)
        return 0;
 }
 
-static int __devinit ad5380_probe(struct device *dev, struct regmap *regmap,
-       enum ad5380_type type, const char *name)
+static int ad5380_probe(struct device *dev, struct regmap *regmap,
+                       enum ad5380_type type, const char *name)
 {
        struct iio_dev *indio_dev;
        struct ad5380_state *st;
@@ -406,7 +406,11 @@ static int __devinit ad5380_probe(struct device *dev, struct regmap *regmap,
                        goto error_free_reg;
                }
 
-               st->vref = regulator_get_voltage(st->vref_reg);
+               ret = regulator_get_voltage(st->vref_reg);
+               if (ret < 0)
+                       goto error_disable_reg;
+
+               st->vref = ret;
        } else {
                st->vref = st->chip_info->int_vref;
                ctrl |= AD5380_CTRL_INT_VREF_EN;
@@ -441,7 +445,7 @@ error_out:
        return ret;
 }
 
-static int __devexit ad5380_remove(struct device *dev)
+static int ad5380_remove(struct device *dev)
 {
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct ad5380_state *st = iio_priv(indio_dev);
@@ -478,7 +482,7 @@ static const struct regmap_config ad5380_regmap_config = {
 
 #if IS_ENABLED(CONFIG_SPI_MASTER)
 
-static int __devinit ad5380_spi_probe(struct spi_device *spi)
+static int ad5380_spi_probe(struct spi_device *spi)
 {
        const struct spi_device_id *id = spi_get_device_id(spi);
        struct regmap *regmap;
@@ -491,7 +495,7 @@ static int __devinit ad5380_spi_probe(struct spi_device *spi)
        return ad5380_probe(&spi->dev, regmap, id->driver_data, id->name);
 }
 
-static int __devexit ad5380_spi_remove(struct spi_device *spi)
+static int ad5380_spi_remove(struct spi_device *spi)
 {
        return ad5380_remove(&spi->dev);
 }
@@ -523,7 +527,7 @@ static struct spi_driver ad5380_spi_driver = {
                   .owner = THIS_MODULE,
        },
        .probe = ad5380_spi_probe,
-       .remove = __devexit_p(ad5380_spi_remove),
+       .remove = ad5380_spi_remove,
        .id_table = ad5380_spi_ids,
 };
 
@@ -552,8 +556,8 @@ static inline void ad5380_spi_unregister_driver(void)
 
 #if IS_ENABLED(CONFIG_I2C)
 
-static int __devinit ad5380_i2c_probe(struct i2c_client *i2c,
-       const struct i2c_device_id *id)
+static int ad5380_i2c_probe(struct i2c_client *i2c,
+                           const struct i2c_device_id *id)
 {
        struct regmap *regmap;
 
@@ -565,7 +569,7 @@ static int __devinit ad5380_i2c_probe(struct i2c_client *i2c,
        return ad5380_probe(&i2c->dev, regmap, id->driver_data, id->name);
 }
 
-static int __devexit ad5380_i2c_remove(struct i2c_client *i2c)
+static int ad5380_i2c_remove(struct i2c_client *i2c)
 {
        return ad5380_remove(&i2c->dev);
 }
@@ -597,7 +601,7 @@ static struct i2c_driver ad5380_i2c_driver = {
                   .owner = THIS_MODULE,
        },
        .probe = ad5380_i2c_probe,
-       .remove = __devexit_p(ad5380_i2c_remove),
+       .remove = ad5380_i2c_remove,
        .id_table = ad5380_i2c_ids,
 };
 
index cdbc5bf25c31f28f4dbc8c2f0a6b00151f194e20..43be948db83eca9eeef414050f3af8c20a5a66e9 100644 (file)
@@ -449,7 +449,7 @@ static const struct iio_info ad5421_info = {
        .driver_module =        THIS_MODULE,
 };
 
-static int __devinit ad5421_probe(struct spi_device *spi)
+static int ad5421_probe(struct spi_device *spi)
 {
        struct ad5421_platform_data *pdata = dev_get_platdata(&spi->dev);
        struct iio_dev *indio_dev;
@@ -516,7 +516,7 @@ error_free:
        return ret;
 }
 
-static int __devexit ad5421_remove(struct spi_device *spi)
+static int ad5421_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
@@ -534,7 +534,7 @@ static struct spi_driver ad5421_driver = {
                   .owner = THIS_MODULE,
        },
        .probe = ad5421_probe,
-       .remove = __devexit_p(ad5421_remove),
+       .remove = ad5421_remove,
 };
 module_spi_driver(ad5421_driver);
 
index 3310cbbd41e772287526cb8278aba8a41b96e7b2..f5583aedfb597cf927e3e39969b80e5e0184085e 100644 (file)
@@ -212,8 +212,8 @@ static const struct iio_info ad5446_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit ad5446_probe(struct device *dev, const char *name,
-       const struct ad5446_chip_info *chip_info)
+static int ad5446_probe(struct device *dev, const char *name,
+                       const struct ad5446_chip_info *chip_info)
 {
        struct ad5446_state *st;
        struct iio_dev *indio_dev;
@@ -226,7 +226,11 @@ static int __devinit ad5446_probe(struct device *dev, const char *name,
                if (ret)
                        goto error_put_reg;
 
-               voltage_uv = regulator_get_voltage(reg);
+               ret = regulator_get_voltage(reg);
+               if (ret < 0)
+                       goto error_disable_reg;
+
+               voltage_uv = ret;
        }
 
        indio_dev = iio_device_alloc(sizeof(*st));
@@ -461,7 +465,7 @@ static const struct spi_device_id ad5446_spi_ids[] = {
 };
 MODULE_DEVICE_TABLE(spi, ad5446_spi_ids);
 
-static int __devinit ad5446_spi_probe(struct spi_device *spi)
+static int ad5446_spi_probe(struct spi_device *spi)
 {
        const struct spi_device_id *id = spi_get_device_id(spi);
 
@@ -469,7 +473,7 @@ static int __devinit ad5446_spi_probe(struct spi_device *spi)
                &ad5446_spi_chip_info[id->driver_data]);
 }
 
-static int __devexit ad5446_spi_remove(struct spi_device *spi)
+static int ad5446_spi_remove(struct spi_device *spi)
 {
        return ad5446_remove(&spi->dev);
 }
@@ -480,7 +484,7 @@ static struct spi_driver ad5446_spi_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ad5446_spi_probe,
-       .remove         = __devexit_p(ad5446_spi_remove),
+       .remove         = ad5446_spi_remove,
        .id_table       = ad5446_spi_ids,
 };
 
@@ -539,14 +543,14 @@ static const struct ad5446_chip_info ad5446_i2c_chip_info[] = {
        },
 };
 
-static int __devinit ad5446_i2c_probe(struct i2c_client *i2c,
-       const struct i2c_device_id *id)
+static int ad5446_i2c_probe(struct i2c_client *i2c,
+                           const struct i2c_device_id *id)
 {
        return ad5446_probe(&i2c->dev, id->name,
                &ad5446_i2c_chip_info[id->driver_data]);
 }
 
-static int __devexit ad5446_i2c_remove(struct i2c_client *i2c)
+static int ad5446_i2c_remove(struct i2c_client *i2c)
 {
        return ad5446_remove(&i2c->dev);
 }
@@ -568,7 +572,7 @@ static struct i2c_driver ad5446_i2c_driver = {
                   .owner = THIS_MODULE,
        },
        .probe = ad5446_i2c_probe,
-       .remove = __devexit_p(ad5446_i2c_remove),
+       .remove = ad5446_i2c_remove,
        .id_table = ad5446_i2c_ids,
 };
 
index 0ee6f8eeba8d4b09e1ea75d04309ad981631acbb..c4731b7b577b0670eda5d1f08ccce300f21e6f2f 100644 (file)
@@ -266,7 +266,7 @@ static const char *ad5449_vref_name(struct ad5449 *st, int n)
                return "VREFB";
 }
 
-static int __devinit ad5449_spi_probe(struct spi_device *spi)
+static int ad5449_spi_probe(struct spi_device *spi)
 {
        struct ad5449_platform_data *pdata = spi->dev.platform_data;
        const struct spi_device_id *id = spi_get_device_id(spi);
@@ -333,7 +333,7 @@ error_free:
        return ret;
 }
 
-static int __devexit ad5449_spi_remove(struct spi_device *spi)
+static int ad5449_spi_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5449 *st = iio_priv(indio_dev);
@@ -366,7 +366,7 @@ static struct spi_driver ad5449_spi_driver = {
                .owner = THIS_MODULE,
        },
        .probe = ad5449_spi_probe,
-       .remove = __devexit_p(ad5449_spi_remove),
+       .remove = ad5449_spi_remove,
        .id_table = ad5449_spi_ids,
 };
 module_spi_driver(ad5449_spi_driver);
index 242bdc7d004492616e20cff52c98702ec5b928d0..0661829f27737ed4f70e1a29137c6c8a18169457 100644 (file)
@@ -277,7 +277,7 @@ static const struct iio_chan_spec ad5504_channels[] = {
        AD5504_CHANNEL(3),
 };
 
-static int __devinit ad5504_probe(struct spi_device *spi)
+static int ad5504_probe(struct spi_device *spi)
 {
        struct ad5504_platform_data *pdata = spi->dev.platform_data;
        struct iio_dev *indio_dev;
@@ -296,7 +296,11 @@ static int __devinit ad5504_probe(struct spi_device *spi)
                if (ret)
                        goto error_put_reg;
 
-               voltage_uv = regulator_get_voltage(reg);
+               ret = regulator_get_voltage(reg);
+               if (ret < 0)
+                       goto error_disable_reg;
+
+               voltage_uv = ret;
        }
 
        spi_set_drvdata(spi, indio_dev);
@@ -352,7 +356,7 @@ error_ret:
        return ret;
 }
 
-static int __devexit ad5504_remove(struct spi_device *spi)
+static int ad5504_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5504_state *st = iio_priv(indio_dev);
@@ -383,7 +387,7 @@ static struct spi_driver ad5504_driver = {
                   .owner = THIS_MODULE,
                   },
        .probe = ad5504_probe,
-       .remove = __devexit_p(ad5504_remove),
+       .remove = ad5504_remove,
        .id_table = ad5504_id,
 };
 module_spi_driver(ad5504_driver);
index 6a7d6a48cc6ddf0d57969822a1bab28e9c8b8400..f6e116627b714e044569c1ef5e85fff59dfc5c20 100644 (file)
@@ -220,7 +220,7 @@ static const struct ad5624r_chip_info ad5624r_chip_info_tbl[] = {
        },
 };
 
-static int __devinit ad5624r_probe(struct spi_device *spi)
+static int ad5624r_probe(struct spi_device *spi)
 {
        struct ad5624r_state *st;
        struct iio_dev *indio_dev;
@@ -238,7 +238,11 @@ static int __devinit ad5624r_probe(struct spi_device *spi)
                if (ret)
                        goto error_put_reg;
 
-               voltage_uv = regulator_get_voltage(st->reg);
+               ret = regulator_get_voltage(st->reg);
+               if (ret < 0)
+                       goto error_disable_reg;
+
+               voltage_uv = ret;
        }
 
        spi_set_drvdata(spi, indio_dev);
@@ -282,7 +286,7 @@ error_ret:
        return ret;
 }
 
-static int __devexit ad5624r_remove(struct spi_device *spi)
+static int ad5624r_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5624r_state *st = iio_priv(indio_dev);
@@ -314,7 +318,7 @@ static struct spi_driver ad5624r_driver = {
                   .owner = THIS_MODULE,
                   },
        .probe = ad5624r_probe,
-       .remove = __devexit_p(ad5624r_remove),
+       .remove = ad5624r_remove,
        .id_table = ad5624r_id,
 };
 module_spi_driver(ad5624r_driver);
index bc92ff9309c2b6012c0cfd25ac36bb8f54898690..ca9609d7a15c256a78b058a26c9191542e06a8f3 100644 (file)
@@ -313,7 +313,7 @@ static const struct ad5686_chip_info ad5686_chip_info_tbl[] = {
 };
 
 
-static int __devinit ad5686_probe(struct spi_device *spi)
+static int ad5686_probe(struct spi_device *spi)
 {
        struct ad5686_state *st;
        struct iio_dev *indio_dev;
@@ -332,7 +332,11 @@ static int __devinit ad5686_probe(struct spi_device *spi)
                if (ret)
                        goto error_put_reg;
 
-               voltage_uv = regulator_get_voltage(st->reg);
+               ret = regulator_get_voltage(st->reg);
+               if (ret < 0)
+                       goto error_disable_reg;
+
+               voltage_uv = ret;
        }
 
        st->chip_info =
@@ -379,7 +383,7 @@ error_put_reg:
        return ret;
 }
 
-static int __devexit ad5686_remove(struct spi_device *spi)
+static int ad5686_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5686_state *st = iio_priv(indio_dev);
@@ -408,7 +412,7 @@ static struct spi_driver ad5686_driver = {
                   .owner = THIS_MODULE,
                   },
        .probe = ad5686_probe,
-       .remove = __devexit_p(ad5686_remove),
+       .remove = ad5686_remove,
        .id_table = ad5686_id,
 };
 module_spi_driver(ad5686_driver);
index 5db3506034c50a7a07dad98d0634d9ab498a8bdd..0869bbd27d30e67d724621ee95d7cdf315286caa 100644 (file)
@@ -447,8 +447,8 @@ static bool ad5755_is_valid_mode(struct ad5755_state *st, enum ad5755_mode mode)
        }
 }
 
-static int __devinit ad5755_setup_pdata(struct iio_dev *indio_dev,
-       const struct ad5755_platform_data *pdata)
+static int ad5755_setup_pdata(struct iio_dev *indio_dev,
+                             const struct ad5755_platform_data *pdata)
 {
        struct ad5755_state *st = iio_priv(indio_dev);
        unsigned int val;
@@ -503,7 +503,7 @@ static int __devinit ad5755_setup_pdata(struct iio_dev *indio_dev,
        return 0;
 }
 
-static bool __devinit ad5755_is_voltage_mode(enum ad5755_mode mode)
+static bool ad5755_is_voltage_mode(enum ad5755_mode mode)
 {
        switch (mode) {
        case AD5755_MODE_VOLTAGE_0V_5V:
@@ -516,8 +516,8 @@ static bool __devinit ad5755_is_voltage_mode(enum ad5755_mode mode)
        }
 }
 
-static int __devinit ad5755_init_channels(struct iio_dev *indio_dev,
-       const struct ad5755_platform_data *pdata)
+static int ad5755_init_channels(struct iio_dev *indio_dev,
+                               const struct ad5755_platform_data *pdata)
 {
        struct ad5755_state *st = iio_priv(indio_dev);
        struct iio_chan_spec *channels = st->channels;
@@ -562,7 +562,7 @@ static const struct ad5755_platform_data ad5755_default_pdata = {
        },
 };
 
-static int __devinit ad5755_probe(struct spi_device *spi)
+static int ad5755_probe(struct spi_device *spi)
 {
        enum ad5755_type type = spi_get_device_id(spi)->driver_data;
        const struct ad5755_platform_data *pdata = dev_get_platdata(&spi->dev);
@@ -614,7 +614,7 @@ error_free:
        return ret;
 }
 
-static int __devexit ad5755_remove(struct spi_device *spi)
+static int ad5755_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
@@ -640,7 +640,7 @@ static struct spi_driver ad5755_driver = {
                .owner = THIS_MODULE,
        },
        .probe = ad5755_probe,
-       .remove = __devexit_p(ad5755_remove),
+       .remove = ad5755_remove,
        .id_table = ad5755_id,
 };
 module_spi_driver(ad5755_driver);
index ffce30447445d50f14079f5d47ec46805bf92581..7f9045e6daa4c863bf6075a85319b1bdd12a1fe1 100644 (file)
@@ -273,7 +273,7 @@ static const struct iio_info ad5764_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit ad5764_probe(struct spi_device *spi)
+static int ad5764_probe(struct spi_device *spi)
 {
        enum ad5764_type type = spi_get_device_id(spi)->driver_data;
        struct iio_dev *indio_dev;
@@ -340,7 +340,7 @@ error_free:
        return ret;
 }
 
-static int __devexit ad5764_remove(struct spi_device *spi)
+static int ad5764_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5764_state *st = iio_priv(indio_dev);
@@ -372,7 +372,7 @@ static struct spi_driver ad5764_driver = {
                .owner = THIS_MODULE,
        },
        .probe = ad5764_probe,
-       .remove = __devexit_p(ad5764_remove),
+       .remove = ad5764_remove,
        .id_table = ad5764_ids,
 };
 module_spi_driver(ad5764_driver);
index 2bd2e37280ff87b54151aa0edd0454f8db52924d..6407b5407dddec57fe53ca20f9cba3e5bf90358e 100644 (file)
@@ -346,7 +346,7 @@ static const struct iio_info ad5791_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit ad5791_probe(struct spi_device *spi)
+static int ad5791_probe(struct spi_device *spi)
 {
        struct ad5791_platform_data *pdata = spi->dev.platform_data;
        struct iio_dev *indio_dev;
@@ -365,7 +365,11 @@ static int __devinit ad5791_probe(struct spi_device *spi)
                if (ret)
                        goto error_put_reg_pos;
 
-               pos_voltage_uv = regulator_get_voltage(st->reg_vdd);
+               ret = regulator_get_voltage(st->reg_vdd);
+               if (ret < 0)
+                       goto error_disable_reg_pos;
+
+               pos_voltage_uv = ret;
        }
 
        st->reg_vss = regulator_get(&spi->dev, "vss");
@@ -374,7 +378,11 @@ static int __devinit ad5791_probe(struct spi_device *spi)
                if (ret)
                        goto error_put_reg_neg;
 
-               neg_voltage_uv = regulator_get_voltage(st->reg_vss);
+               ret = regulator_get_voltage(st->reg_vss);
+               if (ret < 0)
+                       goto error_disable_reg_neg;
+
+               neg_voltage_uv = ret;
        }
 
        st->pwr_down = true;
@@ -428,6 +436,7 @@ error_put_reg_neg:
        if (!IS_ERR(st->reg_vss))
                regulator_put(st->reg_vss);
 
+error_disable_reg_pos:
        if (!IS_ERR(st->reg_vdd))
                regulator_disable(st->reg_vdd);
 error_put_reg_pos:
@@ -439,7 +448,7 @@ error_ret:
        return ret;
 }
 
-static int __devexit ad5791_remove(struct spi_device *spi)
+static int ad5791_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5791_state *st = iio_priv(indio_dev);
@@ -475,7 +484,7 @@ static struct spi_driver ad5791_driver = {
                   .owner = THIS_MODULE,
                   },
        .probe = ad5791_probe,
-       .remove = __devexit_p(ad5791_remove),
+       .remove = ad5791_remove,
        .id_table = ad5791_id,
 };
 module_spi_driver(ad5791_driver);
index c3d748c25939ca834ce44a6670e32cbb4d5e8eaa..352abe2004a4cd46a4542439c40659feb9b61f9f 100644 (file)
@@ -156,7 +156,7 @@ static const struct iio_chan_spec max517_channels[] = {
        MAX517_CHANNEL(1)
 };
 
-static int __devinit max517_probe(struct i2c_client *client,
+static int max517_probe(struct i2c_client *client,
                        const struct i2c_device_id *id)
 {
        struct max517_data *data;
@@ -210,7 +210,7 @@ exit:
        return err;
 }
 
-static int __devexit max517_remove(struct i2c_client *client)
+static int max517_remove(struct i2c_client *client)
 {
        iio_device_unregister(i2c_get_clientdata(client));
        iio_device_free(i2c_get_clientdata(client));
@@ -232,7 +232,7 @@ static struct i2c_driver max517_driver = {
                .pm             = MAX517_PM_OPS,
        },
        .probe          = max517_probe,
-       .remove         =  __devexit_p(max517_remove),
+       .remove         = max517_remove,
        .id_table       = max517_id,
 };
 module_i2c_driver(max517_driver);
index e0e168bd5b459a3dad00064335054447e62af6b8..8f88cc4059a2a95620681edc30116db75dd06f8b 100644 (file)
@@ -141,8 +141,8 @@ static const struct iio_info mcp4725_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit mcp4725_probe(struct i2c_client *client,
-                       const struct i2c_device_id *id)
+static int mcp4725_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct mcp4725_data *data;
        struct iio_dev *indio_dev;
@@ -195,7 +195,7 @@ exit:
        return err;
 }
 
-static int __devexit mcp4725_remove(struct i2c_client *client)
+static int mcp4725_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
@@ -217,7 +217,7 @@ static struct i2c_driver mcp4725_driver = {
                .pm     = MCP4725_PM_OPS,
        },
        .probe          = mcp4725_probe,
-       .remove         = __devexit_p(mcp4725_remove),
+       .remove         = mcp4725_remove,
        .id_table       = mcp4725_id,
 };
 module_i2c_driver(mcp4725_driver);
index b737c64a402dab345c7f0c1d6f254d4877198bf1..80307473e3a99b387750decac19272ecb1844db1 100644 (file)
@@ -959,7 +959,7 @@ static int ad9523_setup(struct iio_dev *indio_dev)
        return 0;
 }
 
-static int __devinit ad9523_probe(struct spi_device *spi)
+static int ad9523_probe(struct spi_device *spi)
 {
        struct ad9523_platform_data *pdata = spi->dev.platform_data;
        struct iio_dev *indio_dev;
@@ -1020,7 +1020,7 @@ error_put_reg:
        return ret;
 }
 
-static int __devexit ad9523_remove(struct spi_device *spi)
+static int ad9523_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad9523_state *st = iio_priv(indio_dev);
@@ -1049,7 +1049,7 @@ static struct spi_driver ad9523_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ad9523_probe,
-       .remove         = __devexit_p(ad9523_remove),
+       .remove         = ad9523_remove,
        .id_table       = ad9523_id,
 };
 module_spi_driver(ad9523_driver);
index e35bb8f6fe7597e8823527772b119cd3b579377d..a884252ac66b477db3a0fce966b40fb76ae456b2 100644 (file)
@@ -173,7 +173,7 @@ static int adf4350_set_freq(struct adf4350_state *st, unsigned long long freq)
                        } while ((st->r1_mod > ADF4350_MAX_MODULUS) && r_cnt);
                } while (r_cnt == 0);
 
-               tmp = freq * (u64)st->r1_mod + (st->fpfd > 1);
+               tmp = freq * (u64)st->r1_mod + (st->fpfd >> 1);
                do_div(tmp, st->fpfd); /* Div round closest (n + d/2)/d */
                st->r0_fract = do_div(tmp, st->r1_mod);
                st->r0_int = tmp;
@@ -355,7 +355,7 @@ static const struct iio_info adf4350_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit adf4350_probe(struct spi_device *spi)
+static int adf4350_probe(struct spi_device *spi)
 {
        struct adf4350_platform_data *pdata = spi->dev.platform_data;
        struct iio_dev *indio_dev;
@@ -440,7 +440,7 @@ error_put_reg:
        return ret;
 }
 
-static int __devexit adf4350_remove(struct spi_device *spi)
+static int adf4350_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct adf4350_state *st = iio_priv(indio_dev);
@@ -476,7 +476,7 @@ static struct spi_driver adf4350_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = adf4350_probe,
-       .remove         = __devexit_p(adf4350_remove),
+       .remove         = adf4350_remove,
        .id_table       = adf4350_id,
 };
 module_spi_driver(adf4350_driver);
index 48ed1483ff27260e8ac24634cc670acf32f33172..96b68f63a902580c6a45c7265641397ffdda9d52 100644 (file)
@@ -17,6 +17,7 @@ config HID_SENSOR_GYRO_3D
        select IIO_BUFFER
        select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
+       select HID_SENSOR_IIO_TRIGGER
        tristate "HID Gyroscope 3D"
        help
          Say yes here to build support for the HID SENSOR
index 4c8b158e40e18d508d4dfd53d7108249e2f2a455..06e7cc35450c633a9e08e55450907f6e00241518 100644 (file)
@@ -278,7 +278,7 @@ static int gyro_3d_parse_report(struct platform_device *pdev,
 }
 
 /* Function to initialize the processing for usage id */
-static int __devinit hid_gyro_3d_probe(struct platform_device *pdev)
+static int hid_gyro_3d_probe(struct platform_device *pdev)
 {
        int ret = 0;
        static const char *name = "gyro_3d";
@@ -375,7 +375,7 @@ error_ret:
 }
 
 /* Function to deinitialize the processing for usage id */
-static int __devinit hid_gyro_3d_remove(struct platform_device *pdev)
+static int hid_gyro_3d_remove(struct platform_device *pdev)
 {
        struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
index 1763c9bcb98ae19817086c4713a6067552d9e74c..dbf80abc834fd3f848a7945b9ddbf38da5a968d7 100644 (file)
@@ -47,6 +47,7 @@ config HID_SENSOR_ALS
        select IIO_BUFFER
        select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
+       select HID_SENSOR_IIO_TRIGGER
        tristate "HID ALS"
        help
          Say yes here to build support for the HID SENSOR
index 36d210a06b28feb3284e67031ee60455b23b394b..d5b9d39d95b2aeecfbe07d28edf88b30494d648a 100644 (file)
@@ -286,8 +286,8 @@ static const struct iio_info adjd_s311_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit adjd_s311_probe(struct i2c_client *client,
-                       const struct i2c_device_id *id)
+static int adjd_s311_probe(struct i2c_client *client,
+                          const struct i2c_device_id *id)
 {
        struct adjd_s311_data *data;
        struct iio_dev *indio_dev;
@@ -330,7 +330,7 @@ exit:
        return err;
 }
 
-static int __devexit adjd_s311_remove(struct i2c_client *client)
+static int adjd_s311_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
        struct adjd_s311_data *data = iio_priv(indio_dev);
@@ -354,7 +354,7 @@ static struct i2c_driver adjd_s311_driver = {
                .name   = ADJD_S311_DRV_NAME,
        },
        .probe          = adjd_s311_probe,
-       .remove         = __devexit_p(adjd_s311_remove),
+       .remove         = adjd_s311_remove,
        .id_table       = adjd_s311_id,
 };
 module_i2c_driver(adjd_s311_driver);
index 23eeeef64e84b93e656ccb07a21dfd57c90a8190..e2d042f2a544b0b55bcdbee9bf84e6ed5430a252 100644 (file)
@@ -245,7 +245,7 @@ static int als_parse_report(struct platform_device *pdev,
 }
 
 /* Function to initialize the processing for usage id */
-static int __devinit hid_als_probe(struct platform_device *pdev)
+static int hid_als_probe(struct platform_device *pdev)
 {
        int ret = 0;
        static const char *name = "als";
@@ -341,7 +341,7 @@ error_ret:
 }
 
 /* Function to deinitialize the processing for usage id */
-static int __devinit hid_als_remove(struct platform_device *pdev)
+static int hid_als_remove(struct platform_device *pdev)
 {
        struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
index e45712a921ce600cee7c10aa2d8a4dcbc46fccba..7503012ce9333ddc98ecbd8f25eecaf11345c379 100644 (file)
@@ -718,8 +718,7 @@ static struct attribute_group lm3533_als_attribute_group = {
        .attrs = lm3533_als_attributes
 };
 
-static int __devinit lm3533_als_set_input_mode(struct lm3533_als *als,
-                                                               bool pwm_mode)
+static int lm3533_als_set_input_mode(struct lm3533_als *als, bool pwm_mode)
 {
        u8 mask = LM3533_ALS_INPUT_MODE_MASK;
        u8 val;
@@ -740,7 +739,7 @@ static int __devinit lm3533_als_set_input_mode(struct lm3533_als *als,
        return 0;
 }
 
-static int __devinit lm3533_als_set_resistor(struct lm3533_als *als, u8 val)
+static int lm3533_als_set_resistor(struct lm3533_als *als, u8 val)
 {
        int ret;
 
@@ -756,8 +755,8 @@ static int __devinit lm3533_als_set_resistor(struct lm3533_als *als, u8 val)
        return 0;
 }
 
-static int __devinit lm3533_als_setup(struct lm3533_als *als,
-                                       struct lm3533_als_platform_data *pdata)
+static int lm3533_als_setup(struct lm3533_als *als,
+                           struct lm3533_als_platform_data *pdata)
 {
        int ret;
 
@@ -775,7 +774,7 @@ static int __devinit lm3533_als_setup(struct lm3533_als *als,
        return 0;
 }
 
-static int __devinit lm3533_als_setup_irq(struct lm3533_als *als, void *dev)
+static int lm3533_als_setup_irq(struct lm3533_als *als, void *dev)
 {
        u8 mask = LM3533_ALS_INT_ENABLE_MASK;
        int ret;
@@ -799,7 +798,7 @@ static int __devinit lm3533_als_setup_irq(struct lm3533_als *als, void *dev)
        return 0;
 }
 
-static int __devinit lm3533_als_enable(struct lm3533_als *als)
+static int lm3533_als_enable(struct lm3533_als *als)
 {
        u8 mask = LM3533_ALS_ENABLE_MASK;
        int ret;
@@ -830,7 +829,7 @@ static const struct iio_info lm3533_als_info = {
        .read_raw       = &lm3533_als_read_raw,
 };
 
-static int __devinit lm3533_als_probe(struct platform_device *pdev)
+static int lm3533_als_probe(struct platform_device *pdev)
 {
        struct lm3533 *lm3533;
        struct lm3533_als_platform_data *pdata;
@@ -901,7 +900,7 @@ err_free_dev:
        return ret;
 }
 
-static int __devexit lm3533_als_remove(struct platform_device *pdev)
+static int lm3533_als_remove(struct platform_device *pdev)
 {
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
        struct lm3533_als *als = iio_priv(indio_dev);
@@ -922,7 +921,7 @@ static struct platform_driver lm3533_als_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = lm3533_als_probe,
-       .remove         = __devexit_p(lm3533_als_remove),
+       .remove         = lm3533_als_remove,
 };
 module_platform_driver(lm3533_als_driver);
 
index e49cb9784a6ff26060fd6617a08ad5e1c17688b8..2aa748fbdc0ed4fc5b9d230cb28e648a5a6c46cf 100644 (file)
@@ -150,8 +150,8 @@ static const struct iio_info vcnl4000_info = {
        .driver_module = THIS_MODULE,
 };
 
-static int __devinit vcnl4000_probe(struct i2c_client *client,
-                                       const struct i2c_device_id *id)
+static int vcnl4000_probe(struct i2c_client *client,
+                         const struct i2c_device_id *id)
 {
        struct vcnl4000_data *data;
        struct iio_dev *indio_dev;
@@ -190,7 +190,7 @@ error_free_dev:
        return ret;
 }
 
-static int __devexit vcnl4000_remove(struct i2c_client *client)
+static int vcnl4000_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
@@ -206,7 +206,7 @@ static struct i2c_driver vcnl4000_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = vcnl4000_probe,
-       .remove = __devexit_p(vcnl4000_remove),
+       .remove = vcnl4000_remove,
        .id_table = vcnl4000_id,
 };
 
index c1f0cdd57037ee863e0ba12d639c4bc536a80a5d..ff11d68225cfb6d2e8f819345eb15907857601d4 100644 (file)
@@ -8,6 +8,7 @@ config HID_SENSOR_MAGNETOMETER_3D
        select IIO_BUFFER
        select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
+       select HID_SENSOR_IIO_TRIGGER
        tristate "HID Magenetometer 3D"
        help
          Say yes here to build support for the HID SENSOR
index 8e75eb76ccd992729785c340e7eaea801026ec89..7ac2c7483ba8ae51f95243311929cc028110aea2 100644 (file)
@@ -279,7 +279,7 @@ static int magn_3d_parse_report(struct platform_device *pdev,
 }
 
 /* Function to initialize the processing for usage id */
-static int __devinit hid_magn_3d_probe(struct platform_device *pdev)
+static int hid_magn_3d_probe(struct platform_device *pdev)
 {
        int ret = 0;
        static char *name = "magn_3d";
@@ -376,7 +376,7 @@ error_ret:
 }
 
 /* Function to deinitialize the processing for usage id */
-static int __devinit hid_magn_3d_remove(struct platform_device *pdev)
+static int hid_magn_3d_remove(struct platform_device *pdev)
 {
        struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data;
        struct iio_dev *indio_dev = platform_get_drvdata(pdev);
index 5ce7b9e8bff64cce52c6e3c111fff35f457d9dbf..7275e727e0f56e49f8a4671cd3935d44e40b9fe8 100644 (file)
@@ -920,8 +920,7 @@ static struct net_device *c2_devinit(struct c2_dev *c2dev,
        return netdev;
 }
 
-static int __devinit c2_probe(struct pci_dev *pcidev,
-                             const struct pci_device_id *ent)
+static int c2_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
 {
        int ret = 0, i;
        unsigned long reg0_start, reg0_flags, reg0_len;
@@ -1191,7 +1190,7 @@ static int __devinit c2_probe(struct pci_dev *pcidev,
        return ret;
 }
 
-static void __devexit c2_remove(struct pci_dev *pcidev)
+static void c2_remove(struct pci_dev *pcidev)
 {
        struct c2_dev *c2dev = pci_get_drvdata(pcidev);
        struct net_device *netdev = c2dev->netdev;
@@ -1236,7 +1235,7 @@ static struct pci_driver c2_pci_driver = {
        .name = DRV_NAME,
        .id_table = c2_pci_table,
        .probe = c2_probe,
-       .remove = __devexit_p(c2_remove),
+       .remove = c2_remove,
 };
 
 static int __init c2_init_module(void)
index 6ae698e68775c984992d01fffec0d4bfe1ea31a8..ba7a1208ff9e708c25c59e09aeed4219f93da506 100644 (file)
@@ -498,16 +498,16 @@ extern int c2_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
                        struct ib_send_wr **bad_wr);
 extern int c2_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr,
                           struct ib_recv_wr **bad_wr);
-extern void __devinit c2_init_qp_table(struct c2_dev *c2dev);
-extern void __devexit c2_cleanup_qp_table(struct c2_dev *c2dev);
+extern void c2_init_qp_table(struct c2_dev *c2dev);
+extern void c2_cleanup_qp_table(struct c2_dev *c2dev);
 extern void c2_set_qp_state(struct c2_qp *, int);
 extern struct c2_qp *c2_find_qpn(struct c2_dev *c2dev, int qpn);
 
 /* PDs */
 extern int c2_pd_alloc(struct c2_dev *c2dev, int privileged, struct c2_pd *pd);
 extern void c2_pd_free(struct c2_dev *c2dev, struct c2_pd *pd);
-extern int __devinit c2_init_pd_table(struct c2_dev *c2dev);
-extern void __devexit c2_cleanup_pd_table(struct c2_dev *c2dev);
+extern int c2_init_pd_table(struct c2_dev *c2dev);
+extern void c2_cleanup_pd_table(struct c2_dev *c2dev);
 
 /* CQs */
 extern int c2_init_cq(struct c2_dev *c2dev, int entries,
index 161f2a285351a7c41ad5352318d63a91ec775197..f3e81dc357bb0edce790c1cce0e4b9ca3bb38bd1 100644 (file)
@@ -70,7 +70,7 @@ void c2_pd_free(struct c2_dev *c2dev, struct c2_pd *pd)
        spin_unlock(&c2dev->pd_table.lock);
 }
 
-int __devinit c2_init_pd_table(struct c2_dev *c2dev)
+int c2_init_pd_table(struct c2_dev *c2dev)
 {
 
        c2dev->pd_table.last = 0;
@@ -84,7 +84,7 @@ int __devinit c2_init_pd_table(struct c2_dev *c2dev)
        return 0;
 }
 
-void __devexit c2_cleanup_pd_table(struct c2_dev *c2dev)
+void c2_cleanup_pd_table(struct c2_dev *c2dev)
 {
        kfree(c2dev->pd_table.table);
 }
index 0d7b6f23caffdc7857da68b23fd2f12fd2a58aec..28cd5cb51859629edb9cffcb1f162832fee91ea6 100644 (file)
@@ -1010,13 +1010,13 @@ out:
        return err;
 }
 
-void __devinit c2_init_qp_table(struct c2_dev *c2dev)
+void c2_init_qp_table(struct c2_dev *c2dev)
 {
        spin_lock_init(&c2dev->qp_table.lock);
        idr_init(&c2dev->qp_table.idr);
 }
 
-void __devexit c2_cleanup_qp_table(struct c2_dev *c2dev)
+void c2_cleanup_qp_table(struct c2_dev *c2dev)
 {
        idr_destroy(&c2dev->qp_table.idr);
 }
index e4a73158fc7fc0392d9308146f2c695936b80532..b7c986990053da3f379bd013e7ed9a3bf1d893db 100644 (file)
@@ -442,7 +442,7 @@ static int c2_rnic_close(struct c2_dev *c2dev)
  * involves initializing the various limits and resource pools that
  * comprise the RNIC instance.
  */
-int __devinit c2_rnic_init(struct c2_dev *c2dev)
+int c2_rnic_init(struct c2_dev *c2dev)
 {
        int err;
        u32 qsize, msgsize;
@@ -611,7 +611,7 @@ int __devinit c2_rnic_init(struct c2_dev *c2dev)
 /*
  * Called by c2_remove to cleanup the RNIC resources.
  */
-void __devexit c2_rnic_term(struct c2_dev *c2dev)
+void c2_rnic_term(struct c2_dev *c2dev)
 {
 
        /* Close the open adapter instance */
index 832e7a7d0aeeaaf1d4b213120532de26d6465065..f8a62918a88d58ef8609899ce06629175c0775bd 100644 (file)
@@ -713,8 +713,8 @@ static struct attribute_group ehca_dev_attr_grp = {
        .attrs = ehca_dev_attrs
 };
 
-static int __devinit ehca_probe(struct platform_device *dev,
-                               const struct of_device_id *id)
+static int ehca_probe(struct platform_device *dev,
+                     const struct of_device_id *id)
 {
        struct ehca_shca *shca;
        const u64 *handle;
@@ -879,7 +879,7 @@ probe1:
        return -EINVAL;
 }
 
-static int __devexit ehca_remove(struct platform_device *dev)
+static int ehca_remove(struct platform_device *dev)
 {
        struct ehca_shca *shca = dev_get_drvdata(&dev->dev);
        unsigned long flags;
index bfca37b2432f44fa3fa5d577aafd352759c68547..7b371f545ece7b6d817c44ea1486a124e798d6c3 100644 (file)
@@ -127,9 +127,8 @@ const char *ipath_ibcstatus_str[] = {
        "LTState1C", "LTState1D", "LTState1E", "LTState1F"
 };
 
-static void __devexit ipath_remove_one(struct pci_dev *);
-static int __devinit ipath_init_one(struct pci_dev *,
-                                   const struct pci_device_id *);
+static void ipath_remove_one(struct pci_dev *);
+static int ipath_init_one(struct pci_dev *, const struct pci_device_id *);
 
 /* Only needed for registration, nothing else needs this info */
 #define PCI_VENDOR_ID_PATHSCALE 0x1fc1
@@ -148,7 +147,7 @@ MODULE_DEVICE_TABLE(pci, ipath_pci_tbl);
 static struct pci_driver ipath_driver = {
        .name = IPATH_DRV_NAME,
        .probe = ipath_init_one,
-       .remove = __devexit_p(ipath_remove_one),
+       .remove = ipath_remove_one,
        .id_table = ipath_pci_tbl,
        .driver = {
                .groups = ipath_driver_attr_groups,
@@ -392,8 +391,7 @@ done:
 
 static void cleanup_device(struct ipath_devdata *dd);
 
-static int __devinit ipath_init_one(struct pci_dev *pdev,
-                                   const struct pci_device_id *ent)
+static int ipath_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int ret, len, j;
        struct ipath_devdata *dd;
@@ -737,7 +735,7 @@ static void cleanup_device(struct ipath_devdata *dd)
        kfree(tmp);
 }
 
-static void __devexit ipath_remove_one(struct pci_dev *pdev)
+static void ipath_remove_one(struct pci_dev *pdev)
 {
        struct ipath_devdata *dd = pci_get_drvdata(pdev);
 
index aa12a533ae9e426c4d4dc66d5ca255a0d2e2e6a4..87897b95666d2216cb49f9387f8942d5e4142eb9 100644 (file)
@@ -130,7 +130,7 @@ static int log_mtts_per_seg = ilog2(MTHCA_MTT_SEG_SIZE / 8);
 module_param_named(log_mtts_per_seg, log_mtts_per_seg, int, 0444);
 MODULE_PARM_DESC(log_mtts_per_seg, "Log2 number of MTT entries per segment (1-5)");
 
-static char mthca_version[] __devinitdata =
+static char mthca_version[] =
        DRV_NAME ": Mellanox InfiniBand HCA driver v"
        DRV_VERSION " (" DRV_RELDATE ")\n";
 
@@ -1139,8 +1139,7 @@ int __mthca_restart_one(struct pci_dev *pdev)
        return __mthca_init_one(pdev, hca_type);
 }
 
-static int __devinit mthca_init_one(struct pci_dev *pdev,
-                                   const struct pci_device_id *id)
+static int mthca_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int ret;
 
@@ -1162,7 +1161,7 @@ static int __devinit mthca_init_one(struct pci_dev *pdev,
        return ret;
 }
 
-static void __devexit mthca_remove_one(struct pci_dev *pdev)
+static void mthca_remove_one(struct pci_dev *pdev)
 {
        mutex_lock(&mthca_device_mutex);
        __mthca_remove_one(pdev);
@@ -1199,7 +1198,7 @@ static struct pci_driver mthca_driver = {
        .name           = DRV_NAME,
        .id_table       = mthca_pci_table,
        .probe          = mthca_init_one,
-       .remove         = __devexit_p(mthca_remove_one)
+       .remove         = mthca_remove_one,
 };
 
 static void __init __mthca_check_profile_val(const char *name, int *pval,
index d129c367ec161ed37161f931c3e61f82b0245033..429141078eec632d2409b75f267193f4fb242f96 100644 (file)
@@ -446,7 +446,7 @@ static irqreturn_t nes_interrupt(int irq, void *dev_id)
 /**
  * nes_probe - Device initialization
  */
-static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
+static int nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
 {
        struct net_device *netdev = NULL;
        struct nes_device *nesdev = NULL;
@@ -751,7 +751,7 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i
 /**
  * nes_remove - unload from kernel
  */
-static void __devexit nes_remove(struct pci_dev *pcidev)
+static void nes_remove(struct pci_dev *pcidev)
 {
        struct nes_device *nesdev = pci_get_drvdata(pcidev);
        struct net_device *netdev;
@@ -812,7 +812,7 @@ static struct pci_driver nes_pci_driver = {
        .name = DRV_NAME,
        .id_table = nes_pci_table,
        .probe = nes_probe,
-       .remove = __devexit_p(nes_remove),
+       .remove = nes_remove,
 };
 
 static ssize_t nes_show_adapter(struct device_driver *ddp, char *buf)
index 177cf76647268a0d527a6f4cc2c1a62d1b2ec135..85cf4d1ac4429898e039fb7c58ca805bb9fe9403 100644 (file)
@@ -1705,7 +1705,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
        netdev->dev_addr[3] = (u8)(u64temp>>16);
        netdev->dev_addr[4] = (u8)(u64temp>>8);
        netdev->dev_addr[5] = (u8)u64temp;
-       memcpy(netdev->perm_addr, netdev->dev_addr, 6);
 
        netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX;
        if ((nesvnic->logical_port < 2) || (nesdev->nesadapter->hw_rev != NE020_REV))
index 4443adfcd9eed58a4a3917e20a020f5866e8f32b..ddf066d9abb6018ef167fbe4e1e25b4c487d7ab2 100644 (file)
@@ -1134,9 +1134,8 @@ void qib_disable_after_error(struct qib_devdata *dd)
                *dd->devstatusp |= QIB_STATUS_HWERROR;
 }
 
-static void __devexit qib_remove_one(struct pci_dev *);
-static int __devinit qib_init_one(struct pci_dev *,
-                                 const struct pci_device_id *);
+static void qib_remove_one(struct pci_dev *);
+static int qib_init_one(struct pci_dev *, const struct pci_device_id *);
 
 #define DRIVER_LOAD_MSG "QLogic " QIB_DRV_NAME " loaded: "
 #define PFX QIB_DRV_NAME ": "
@@ -1153,7 +1152,7 @@ MODULE_DEVICE_TABLE(pci, qib_pci_tbl);
 struct pci_driver qib_driver = {
        .name = QIB_DRV_NAME,
        .probe = qib_init_one,
-       .remove = __devexit_p(qib_remove_one),
+       .remove = qib_remove_one,
        .id_table = qib_pci_tbl,
        .err_handler = &qib_pci_err_handler,
 };
@@ -1342,8 +1341,7 @@ static void qib_postinit_cleanup(struct qib_devdata *dd)
        qib_free_devdata(dd);
 }
 
-static int __devinit qib_init_one(struct pci_dev *pdev,
-                                 const struct pci_device_id *ent)
+static int qib_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int ret, j, pidx, initfail;
        struct qib_devdata *dd = NULL;
@@ -1448,7 +1446,7 @@ bail:
        return ret;
 }
 
-static void __devexit qib_remove_one(struct pci_dev *pdev)
+static void qib_remove_one(struct pci_dev *pdev)
 {
        struct qib_devdata *dd = pci_get_drvdata(pdev);
        int ret;
index d327f5a2bb0eadb3884c9dc42ce518cd29be2ebd..b29ca651a3951e568527e4c7a041f101bba06c3a 100644 (file)
@@ -602,6 +602,7 @@ gpio_keys_get_devtree_pdata(struct device *dev)
 
        i = 0;
        for_each_child_of_node(node, pp) {
+               int gpio;
                enum of_gpio_flags flags;
 
                if (!of_find_property(pp, "gpios", NULL)) {
@@ -610,9 +611,19 @@ gpio_keys_get_devtree_pdata(struct device *dev)
                        continue;
                }
 
+               gpio = of_get_gpio_flags(pp, 0, &flags);
+               if (gpio < 0) {
+                       error = gpio;
+                       if (error != -EPROBE_DEFER)
+                               dev_err(dev,
+                                       "Failed to get gpio flags, error: %d\n",
+                                       error);
+                       goto err_free_pdata;
+               }
+
                button = &pdata->buttons[i++];
 
-               button->gpio = of_get_gpio_flags(pp, 0, &flags);
+               button->gpio = gpio;
                button->active_low = flags & OF_GPIO_ACTIVE_LOW;
 
                if (of_property_read_u32(pp, "linux,code", &button->code)) {
index f686fd970553afb12b7d829fa6756c60c5598ee4..21147164874d8592227d92a96a5c97f59e217ca5 100644 (file)
@@ -135,6 +135,7 @@ static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct
 
        i = 0;
        for_each_child_of_node(node, pp) {
+               int gpio;
                enum of_gpio_flags flags;
 
                if (!of_find_property(pp, "gpios", NULL)) {
@@ -143,9 +144,19 @@ static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct
                        continue;
                }
 
+               gpio = of_get_gpio_flags(pp, 0, &flags);
+               if (gpio < 0) {
+                       error = gpio;
+                       if (error != -EPROBE_DEFER)
+                               dev_err(dev,
+                                       "Failed to get gpio flags, error: %d\n",
+                                       error);
+                       goto err_free_pdata;
+               }
+
                button = &pdata->buttons[i++];
 
-               button->gpio = of_get_gpio_flags(pp, 0, &flags);
+               button->gpio = gpio;
                button->active_low = flags & OF_GPIO_ACTIVE_LOW;
 
                if (of_property_read_u32(pp, "linux,code", &button->code)) {
index 50e9c5e195e110e2f287568841cc5d9b4ff606ed..a34cc6714e5bc765315039bf3d3bb43a60820766 100644 (file)
@@ -384,7 +384,7 @@ static const struct i2c_device_id tca8418_id[] = {
 MODULE_DEVICE_TABLE(i2c, tca8418_id);
 
 #ifdef CONFIG_OF
-static const struct of_device_id tca8418_dt_ids[] __devinitconst = {
+static const struct of_device_id tca8418_dt_ids[] = {
        { .compatible = "ti,tca8418", },
        { }
 };
index e582922bacf7d5715cf0f70216c3dd8a4d299eeb..cc7e0d4a8f93a1e5e32031478d87643d396f9a18 100644 (file)
@@ -791,7 +791,7 @@ static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse)
                        fsp_set_slot(dev, 0, fgrs > 0, abs_x, abs_y);
                        fsp_set_slot(dev, 1, false, 0, 0);
                }
-               if (fgrs > 0) {
+               if (fgrs == 1 || (fgrs == 2 && !(packet[0] & FSP_PB0_MFMC_FGR2))) {
                        input_report_abs(dev, ABS_X, abs_x);
                        input_report_abs(dev, ABS_Y, abs_y);
                }
index c2c07a4a7f21c5f57d9eca2884933dd99088b60a..b9d091157884570f636492be2e49e2e346697664 100644 (file)
@@ -4234,7 +4234,7 @@ static struct iommu_ops intel_iommu_ops = {
        .pgsize_bitmap  = INTEL_IOMMU_PGSIZES,
 };
 
-static void __devinit quirk_iommu_rwbf(struct pci_dev *dev)
+static void quirk_iommu_rwbf(struct pci_dev *dev)
 {
        /*
         * Mobile 4 Series Chipset neglects to set RWBF capability,
@@ -4262,7 +4262,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
 #define GGC_MEMORY_SIZE_3M_VT  (0xa << 8)
 #define GGC_MEMORY_SIZE_4M_VT  (0xb << 8)
 
-static void __devinit quirk_calpella_no_shadow_gtt(struct pci_dev *dev)
+static void quirk_calpella_no_shadow_gtt(struct pci_dev *dev)
 {
        unsigned short ggc;
 
index 18108c1405e2ae433646f1f1de6d3878e30fcb29..d33c980e9c205a3158dec5993ab9b80327690325 100644 (file)
@@ -934,7 +934,7 @@ static void omap_iommu_detach(struct omap_iommu *obj)
 /*
  *     OMAP Device MMU(IOMMU) detection
  */
-static int __devinit omap_iommu_probe(struct platform_device *pdev)
+static int omap_iommu_probe(struct platform_device *pdev)
 {
        int err = -ENODEV;
        int irq;
@@ -1003,7 +1003,7 @@ err_mem:
        return err;
 }
 
-static int __devexit omap_iommu_remove(struct platform_device *pdev)
+static int omap_iommu_remove(struct platform_device *pdev)
 {
        int irq;
        struct resource *res;
@@ -1028,7 +1028,7 @@ static int __devexit omap_iommu_remove(struct platform_device *pdev)
 
 static struct platform_driver omap_iommu_driver = {
        .probe  = omap_iommu_probe,
-       .remove = __devexit_p(omap_iommu_remove),
+       .remove = omap_iommu_remove,
        .driver = {
                .name   = "omap-iommu",
        },
index 4c9db62814ffde1c2f3cc513eda788490cb000f4..8219f1d596ee8d339562f6d4122b47f20545ab46 100644 (file)
@@ -431,7 +431,7 @@ const struct dev_pm_ops tegra_gart_pm_ops = {
 };
 
 #ifdef CONFIG_OF
-static struct of_device_id tegra_gart_of_match[] __devinitdata = {
+static struct of_device_id tegra_gart_of_match[] = {
        { .compatible = "nvidia,tegra20-gart", },
        { },
 };
@@ -449,7 +449,7 @@ static struct platform_driver tegra_gart_driver = {
        },
 };
 
-static int __devinit tegra_gart_init(void)
+static int tegra_gart_init(void)
 {
        return platform_driver_register(&tegra_gart_driver);
 }
index 25c1210c0832b05fc36033969573af27c39e25cc..fc178893789a444ee9ac0267c4993fc3ba152e49 100644 (file)
@@ -1255,7 +1255,7 @@ const struct dev_pm_ops tegra_smmu_pm_ops = {
 };
 
 #ifdef CONFIG_OF
-static struct of_device_id tegra_smmu_of_match[] __devinitdata = {
+static struct of_device_id tegra_smmu_of_match[] = {
        { .compatible = "nvidia,tegra30-smmu", },
        { },
 };
@@ -1273,7 +1273,7 @@ static struct platform_driver tegra_smmu_driver = {
        },
 };
 
-static int __devinit tegra_smmu_init(void)
+static int tegra_smmu_init(void)
 {
        return platform_driver_register(&tegra_smmu_driver);
 }
index 5374c25f036cffa72b181a9286031696dbce4d0e..267dede13bfd458bac22310f28d1eb8e63575694 100644 (file)
@@ -22,13 +22,13 @@ MODULE_LICENSE("GPL");
 /****************************************/
 /* structure containing interface to hl */
 /****************************************/
-isdn_divert_if divert_if =
-{ DIVERT_IF_MAGIC,  /* magic value */
-  DIVERT_CMD_REG,   /* register cmd */
-  ll_callback,      /* callback routine from ll */
-  NULL,             /* command still not specified */
-  NULL,             /* drv_to_name */
-  NULL,             /* name_to_drv */
+isdn_divert_if divert_if = {
+       DIVERT_IF_MAGIC,        /* magic value */
+       DIVERT_CMD_REG,         /* register cmd */
+       ll_callback,            /* callback routine from ll */
+       NULL,                   /* command still not specified */
+       NULL,                   /* drv_to_name */
+       NULL,                   /* name_to_drv */
 };
 
 /*************************/
@@ -36,14 +36,15 @@ isdn_divert_if divert_if =
 /* no cmd line parms     */
 /*************************/
 static int __init divert_init(void)
-{ int i;
+{
+       int i;
 
-       if (divert_dev_init())
-       { printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n");
+       if (divert_dev_init()) {
+               printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n");
                return (-EIO);
        }
-       if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR)
-       { divert_dev_deinit();
+       if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) {
+               divert_dev_deinit();
                printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n", i);
                return (-EIO);
        }
@@ -61,13 +62,13 @@ static void __exit divert_exit(void)
 
        spin_lock_irqsave(&divert_lock, flags);
        divert_if.cmd = DIVERT_CMD_REL; /* release */
-       if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR)
-       { printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i);
+       if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) {
+               printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i);
                spin_unlock_irqrestore(&divert_lock, flags);
                return;
        }
-       if (divert_dev_deinit())
-       { printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n");
+       if (divert_dev_deinit()) {
+               printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n");
                spin_unlock_irqrestore(&divert_lock, flags);
                return;
        }
index e61e55f1f193fb54209c3e727caa8d4c0c541e4c..db432e635496d1b206f731832900eb17cad304d9 100644 (file)
@@ -19,8 +19,8 @@
 /**********************************/
 /* structure keeping calling info */
 /**********************************/
-struct call_struc
-{ isdn_ctrl ics; /* delivered setup + driver parameters */
+struct call_struc {
+       isdn_ctrl ics; /* delivered setup + driver parameters */
        ulong divert_id; /* Id delivered to user */
        unsigned char akt_state; /* actual state */
        char deflect_dest[35]; /* deflection destination */
@@ -34,8 +34,8 @@ struct call_struc
 /********************************************/
 /* structure keeping deflection table entry */
 /********************************************/
-struct deflect_struc
-{ struct deflect_struc *next, *prev;
+struct deflect_struc {
+       struct deflect_struc *next, *prev;
        divert_rule rule; /* used rule */
 };
 
@@ -64,16 +64,16 @@ static void deflect_timer_expire(ulong arg)
        del_timer(&cs->timer); /* delete active timer */
        spin_unlock_irqrestore(&divert_lock, flags);
 
-       switch (cs->akt_state)
-       case DEFLECT_PROCEED:
-                       cs->ics.command = ISDN_CMD_HANGUP; /* cancel action */
-                       divert_if.ll_cmd(&cs->ics);
-                       spin_lock_irqsave(&divert_lock, flags);
-                       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
-                       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
-                       add_timer(&cs->timer);
-                       spin_unlock_irqrestore(&divert_lock, flags);
-                       break;
+       switch (cs->akt_state) {
+       case DEFLECT_PROCEED:
+               cs->ics.command = ISDN_CMD_HANGUP; /* cancel action */
+               divert_if.ll_cmd(&cs->ics);
+               spin_lock_irqsave(&divert_lock, flags);
+               cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
+               cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
+               add_timer(&cs->timer);
+               spin_unlock_irqrestore(&divert_lock, flags);
+               break;
 
        case DEFLECT_ALERT:
                cs->ics.command = ISDN_CMD_REDIR; /* protocol */
@@ -111,7 +111,8 @@ static void deflect_timer_expire(ulong arg)
 int cf_command(int drvid, int mode,
               u_char proc, char *msn,
               u_char service, char *fwd_nr, ulong *procid)
-{ unsigned long flags;
+{
+       unsigned long flags;
        int retval, msnlen;
        int fwd_len;
        char *p, *ielenp, tmp[60];
@@ -130,8 +131,8 @@ int cf_command(int drvid, int mode,
        *p++ = 1;   /* length */
        *p++ = service; /* service to handle */
 
-       if (mode == 1)
-       { if (!*fwd_nr) return (-EINVAL); /* destination missing */
+       if (mode == 1) {
+               if (!*fwd_nr) return (-EINVAL); /* destination missing */
                if (strchr(fwd_nr, '.')) return (-EINVAL); /* subaddress not allowed */
                fwd_len = strlen(fwd_nr);
                *p++ = 0x30; /* number enumeration */
@@ -144,12 +145,12 @@ int cf_command(int drvid, int mode,
 
        msnlen = strlen(msn);
        *p++ = 0x80; /* msn number */
-       if (msnlen > 1)
-       { *p++ = msnlen; /* length */
+       if (msnlen > 1) {
+               *p++ = msnlen; /* length */
                strcpy(p, msn);
                p += msnlen;
-       }
-       else *p++ = 0;
+       } else
+               *p++ = 0;
 
        *ielenp = p - ielenp - 1; /* set total IE length */
 
@@ -186,14 +187,13 @@ int cf_command(int drvid, int mode,
 
        retval = divert_if.ll_cmd(&cs->ics); /* execute command */
 
-       if (!retval)
-       { cs->prev = NULL;
+       if (!retval) {
+               cs->prev = NULL;
                spin_lock_irqsave(&divert_lock, flags);
                cs->next = divert_head;
                divert_head = cs;
                spin_unlock_irqrestore(&divert_lock, flags);
-       }
-       else
+       } else
                kfree(cs);
        return (retval);
 } /* cf_command */
@@ -203,15 +203,16 @@ int cf_command(int drvid, int mode,
 /* handle a external deflection command */
 /****************************************/
 int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
-{ struct call_struc *cs;
+{
+       struct call_struc *cs;
        isdn_ctrl ic;
        unsigned long flags;
        int i;
 
        if ((cmd & 0x7F) > 2) return (-EINVAL); /* invalid command */
        cs = divert_head; /* start of parameter list */
-       while (cs)
-       { if (cs->divert_id == callid) break; /* found */
+       while (cs) {
+               if (cs->divert_id == callid) break; /* found */
                cs = cs->next;
        } /* search entry */
        if (!cs) return (-EINVAL); /* invalid callid */
@@ -220,32 +221,30 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
        ic.arg = cs->ics.arg;
        i = -EINVAL;
        if (cs->akt_state == DEFLECT_AUTODEL) return (i); /* no valid call */
-       switch (cmd & 0x7F)
-       case 0: /* hangup */
-                       del_timer(&cs->timer);
-                       ic.command = ISDN_CMD_HANGUP;
-                       i = divert_if.ll_cmd(&ic);
-                       spin_lock_irqsave(&divert_lock, flags);
-                       cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
-                       cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
-                       add_timer(&cs->timer);
-                       spin_unlock_irqrestore(&divert_lock, flags);
-                       break;
+       switch (cmd & 0x7F) {
+       case 0: /* hangup */
+               del_timer(&cs->timer);
+               ic.command = ISDN_CMD_HANGUP;
+               i = divert_if.ll_cmd(&ic);
+               spin_lock_irqsave(&divert_lock, flags);
+               cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
+               cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
+               add_timer(&cs->timer);
+               spin_unlock_irqrestore(&divert_lock, flags);
+               break;
 
        case 1: /* alert */
                if (cs->akt_state == DEFLECT_ALERT) return (0);
                cmd &= 0x7F; /* never wait */
                del_timer(&cs->timer);
                ic.command = ISDN_CMD_ALERT;
-               if ((i = divert_if.ll_cmd(&ic)))
-               {
+               if ((i = divert_if.ll_cmd(&ic))) {
                        spin_lock_irqsave(&divert_lock, flags);
                        cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
                        cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
                        add_timer(&cs->timer);
                        spin_unlock_irqrestore(&divert_lock, flags);
-               }
-               else
+               } else
                        cs->akt_state = DEFLECT_ALERT;
                break;
 
@@ -254,15 +253,13 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
                strlcpy(cs->ics.parm.setup.phone, to_nr, sizeof(cs->ics.parm.setup.phone));
                strcpy(cs->ics.parm.setup.eazmsn, "Testtext manual");
                ic.command = ISDN_CMD_REDIR;
-               if ((i = divert_if.ll_cmd(&ic)))
-               {
+               if ((i = divert_if.ll_cmd(&ic))) {
                        spin_lock_irqsave(&divert_lock, flags);
                        cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
                        cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
                        add_timer(&cs->timer);
                        spin_unlock_irqrestore(&divert_lock, flags);
-               }
-               else
+               } else
                        cs->akt_state = DEFLECT_ALERT;
                break;
 
@@ -274,19 +271,19 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
 /* insert a new rule before idx */
 /********************************/
 int insertrule(int idx, divert_rule *newrule)
-{ struct deflect_struc *ds, *ds1 = NULL;
+{
+       struct deflect_struc *ds, *ds1 = NULL;
        unsigned long flags;
 
-       if (!(ds = kmalloc(sizeof(struct deflect_struc),
-                          GFP_KERNEL)))
+       if (!(ds = kmalloc(sizeof(struct deflect_struc), GFP_KERNEL)))
                return (-ENOMEM); /* no memory */
 
        ds->rule = *newrule; /* set rule */
 
        spin_lock_irqsave(&divert_lock, flags);
 
-       if (idx >= 0)
-       { ds1 = table_head;
+       if (idx >= 0) {
+               ds1 = table_head;
                while ((ds1) && (idx > 0))
                { idx--;
                        ds1 = ds1->next;
@@ -294,17 +291,16 @@ int insertrule(int idx, divert_rule *newrule)
                if (!ds1) idx = -1;
        }
 
-       if (idx < 0)
-       { ds->prev = table_tail; /* previous entry */
+       if (idx < 0) {
+               ds->prev = table_tail; /* previous entry */
                ds->next = NULL; /* end of chain */
                if (ds->prev)
                        ds->prev->next = ds; /* last forward */
                else
                        table_head = ds; /* is first entry */
                table_tail = ds; /* end of queue */
-       }
-       else
-       { ds->next = ds1; /* next entry */
+       } else {
+               ds->next = ds1; /* next entry */
                ds->prev = ds1->prev; /* prev entry */
                ds1->prev = ds; /* backward chain old element */
                if (!ds->prev)
@@ -319,17 +315,18 @@ int insertrule(int idx, divert_rule *newrule)
 /* delete the rule at position idx */
 /***********************************/
 int deleterule(int idx)
-{ struct deflect_struc *ds, *ds1;
+{
+       struct deflect_struc *ds, *ds1;
        unsigned long flags;
 
-       if (idx < 0)
-       { spin_lock_irqsave(&divert_lock, flags);
+       if (idx < 0) {
+               spin_lock_irqsave(&divert_lock, flags);
                ds = table_head;
                table_head = NULL;
                table_tail = NULL;
                spin_unlock_irqrestore(&divert_lock, flags);
-               while (ds)
-               { ds1 = ds;
+               while (ds) {
+                       ds1 = ds;
                        ds = ds->next;
                        kfree(ds1);
                }
@@ -339,13 +336,12 @@ int deleterule(int idx)
        spin_lock_irqsave(&divert_lock, flags);
        ds = table_head;
 
-       while ((ds) && (idx > 0))
-       { idx--;
+       while ((ds) && (idx > 0)) {
+               idx--;
                ds = ds->next;
        }
 
-       if (!ds)
-       {
+       if (!ds) {
                spin_unlock_irqrestore(&divert_lock, flags);
                return (-EINVAL);
        }
@@ -369,12 +365,13 @@ int deleterule(int idx)
 /* get a pointer to a specific rule number */
 /*******************************************/
 divert_rule *getruleptr(int idx)
-{ struct deflect_struc *ds = table_head;
+{
+       struct deflect_struc *ds = table_head;
 
        if (idx < 0) return (NULL);
-       while ((ds) && (idx >= 0))
-       { if (!(idx--))
-               { return (&ds->rule);
+       while ((ds) && (idx >= 0)) {
+               if (!(idx--)) {
+                       return (&ds->rule);
                        break;
                }
                ds = ds->next;
@@ -386,7 +383,8 @@ divert_rule *getruleptr(int idx)
 /* called from common module on an incoming call */
 /*************************************************/
 static int isdn_divert_icall(isdn_ctrl *ic)
-{ int retval = 0;
+{
+       int retval = 0;
        unsigned long flags;
        struct call_struc *cs = NULL;
        struct deflect_struc *dv;
@@ -394,8 +392,8 @@ static int isdn_divert_icall(isdn_ctrl *ic)
        u_char accept;
 
        /* first check the internal deflection table */
-       for (dv = table_head; dv; dv = dv->next)
-       { /* scan table */
+       for (dv = table_head; dv; dv = dv->next) {
+               /* scan table */
                if (((dv->rule.callopt == 1) && (ic->command == ISDN_STAT_ICALLW)) ||
                    ((dv->rule.callopt == 2) && (ic->command == ISDN_STAT_ICALL)))
                        continue; /* call option check */
@@ -409,10 +407,10 @@ static int isdn_divert_icall(isdn_ctrl *ic)
                p = dv->rule.my_msn;
                p1 = ic->parm.setup.eazmsn;
                accept = 0;
-               while (*p)
-               { /* complete compare */
-                       if (*p == '-')
-                       { accept = 1; /* call accepted */
+               while (*p) {
+                       /* complete compare */
+                       if (*p == '-') {
+                               accept = 1; /* call accepted */
                                break;
                        }
                        if (*p++ != *p1++)
@@ -422,14 +420,15 @@ static int isdn_divert_icall(isdn_ctrl *ic)
                } /* complete compare */
                if (!accept) continue; /* not accepted */
 
-               if ((strcmp(dv->rule.caller, "0")) || (ic->parm.setup.phone[0]))
-               { p = dv->rule.caller;
+               if ((strcmp(dv->rule.caller, "0")) ||
+                   (ic->parm.setup.phone[0])) {
+                       p = dv->rule.caller;
                        p1 = ic->parm.setup.phone;
                        accept = 0;
-                       while (*p)
-                       { /* complete compare */
-                               if (*p == '-')
-                               { accept = 1; /* call accepted */
+                       while (*p) {
+                               /* complete compare */
+                               if (*p == '-') {
+                                       accept = 1; /* call accepted */
                                        break;
                                }
                                if (*p++ != *p1++)
@@ -440,10 +439,10 @@ static int isdn_divert_icall(isdn_ctrl *ic)
                        if (!accept) continue; /* not accepted */
                }
 
-               switch (dv->rule.action)
-               case DEFLECT_IGNORE:
-                               return (0);
-                               break;
+               switch (dv->rule.action) {
+               case DEFLECT_IGNORE:
+                       return (0);
+                       break;
 
                case DEFLECT_ALERT:
                case DEFLECT_PROCEED:
@@ -465,31 +464,29 @@ static int isdn_divert_icall(isdn_ctrl *ic)
                        cs->ics.parm.setup.screen = dv->rule.screen;
                        if (dv->rule.waittime)
                                cs->timer.expires = jiffies + (HZ * dv->rule.waittime);
+                       else if (dv->rule.action == DEFLECT_PROCEED)
+                               cs->timer.expires = jiffies + (HZ * extern_wait_max);
                        else
-                               if (dv->rule.action == DEFLECT_PROCEED)
-                                       cs->timer.expires = jiffies + (HZ * extern_wait_max);
-                               else
-                                       cs->timer.expires = 0;
+                               cs->timer.expires = 0;
                        cs->akt_state = dv->rule.action;
                        spin_lock_irqsave(&divert_lock, flags);
                        cs->divert_id = next_id++; /* new sequence number */
                        spin_unlock_irqrestore(&divert_lock, flags);
                        cs->prev = NULL;
-                       if (cs->akt_state == DEFLECT_ALERT)
-                       { strcpy(cs->deflect_dest, dv->rule.to_nr);
-                               if (!cs->timer.expires)
-                               { strcpy(ic->parm.setup.eazmsn, "Testtext direct");
+                       if (cs->akt_state == DEFLECT_ALERT) {
+                               strcpy(cs->deflect_dest, dv->rule.to_nr);
+                               if (!cs->timer.expires) {
+                                       strcpy(ic->parm.setup.eazmsn,
+                                              "Testtext direct");
                                        ic->parm.setup.screen = dv->rule.screen;
                                        strlcpy(ic->parm.setup.phone, dv->rule.to_nr, sizeof(ic->parm.setup.phone));
                                        cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
                                        cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
                                        retval = 5;
-                               }
-                               else
+                               } else
                                        retval = 1; /* alerting */
-                       }
-                       else
-                       { cs->deflect_dest[0] = '\0';
+                       } else {
+                               cs->deflect_dest[0] = '\0';
                                retval = 4; /* only proceed */
                        }
                        sprintf(cs->info, "%d 0x%lx %s %s %s %s 0x%x 0x%x %d %d %s\n",
@@ -505,8 +502,8 @@ static int isdn_divert_icall(isdn_ctrl *ic)
                                dv->rule.waittime,
                                cs->deflect_dest);
                        if ((dv->rule.action == DEFLECT_REPORT) ||
-                           (dv->rule.action == DEFLECT_REJECT))
-                       { put_info_buffer(cs->info);
+                           (dv->rule.action == DEFLECT_REJECT)) {
+                               put_info_buffer(cs->info);
                                kfree(cs); /* remove */
                                return ((dv->rule.action == DEFLECT_REPORT) ? 0 : 2); /* nothing to do */
                        }
@@ -519,8 +516,8 @@ static int isdn_divert_icall(isdn_ctrl *ic)
                break;
        } /* scan_table */
 
-       if (cs)
-       { cs->prev = NULL;
+       if (cs) {
+               cs->prev = NULL;
                spin_lock_irqsave(&divert_lock, flags);
                cs->next = divert_head;
                divert_head = cs;
@@ -529,21 +526,21 @@ static int isdn_divert_icall(isdn_ctrl *ic)
 
                put_info_buffer(cs->info);
                return (retval);
-       }
-       else
+       } else
                return (0);
 } /* isdn_divert_icall */
 
 
 void deleteprocs(void)
-{ struct call_struc *cs, *cs1;
+{
+       struct call_struc *cs, *cs1;
        unsigned long flags;
 
        spin_lock_irqsave(&divert_lock, flags);
        cs = divert_head;
        divert_head = NULL;
-       while (cs)
-       { del_timer(&cs->timer);
+       while (cs) {
+               del_timer(&cs->timer);
                cs1 = cs;
                cs = cs->next;
                kfree(cs1);
@@ -555,12 +552,13 @@ void deleteprocs(void)
 /* put a address including address type into buffer */
 /****************************************************/
 static int put_address(char *st, u_char *p, int len)
-{ u_char retval = 0;
+{
+       u_char retval = 0;
        u_char adr_typ = 0; /* network standard */
 
        if (len < 2) return (retval);
-       if (*p == 0xA1)
-       { retval = *(++p) + 2; /* total length */
+       if (*p == 0xA1) {
+               retval = *(++p) + 2; /* total length */
                if (retval > len) return (0); /* too short */
                len = retval - 2; /* remaining length */
                if (len < 3) return (0);
@@ -572,16 +570,13 @@ static int put_address(char *st, u_char *p, int len)
                if (*p++ != 0x12) return (0);
                if (*p > len) return (0); /* check number length */
                len = *p++;
-       }
-       else
-               if (*p == 0x80)
-               { retval = *(++p) + 2; /* total length */
-                       if (retval > len) return (0);
-                       len = retval - 2;
-                       p++;
-               }
-               else
-                       return (0); /* invalid address information */
+       } else if (*p == 0x80) {
+               retval = *(++p) + 2; /* total length */
+               if (retval > len) return (0);
+               len = retval - 2;
+               p++;
+       } else
+               return (0); /* invalid address information */
 
        sprintf(st, "%d ", adr_typ);
        st += strlen(st);
@@ -598,7 +593,8 @@ static int put_address(char *st, u_char *p, int len)
 /* report a successful interrogation */
 /*************************************/
 static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs)
-{ char *src = ic->parm.dss1_io.data;
+{
+       char *src = ic->parm.dss1_io.data;
        int restlen = ic->parm.dss1_io.datalen;
        int cnt = 1;
        u_char n, n1;
@@ -608,50 +604,44 @@ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs)
        if (*src++ != 0x30) return (-101);
        if ((n = *src++) > 0x81) return (-102); /* invalid length field */
        restlen -= 2; /* remaining bytes */
-       if (n == 0x80)
-       { if (restlen < 2) return (-103);
+       if (n == 0x80) {
+               if (restlen < 2) return (-103);
                if ((*(src + restlen - 1)) || (*(src + restlen - 2))) return (-104);
                restlen -= 2;
-       }
+       } else if (n == 0x81) {
+               n = *src++;
+               restlen--;
+               if (n > restlen) return (-105);
+               restlen = n;
+       } else if (n > restlen)
+               return (-106);
        else
-               if (n == 0x81)
-               { n = *src++;
-                       restlen--;
-                       if (n > restlen) return (-105);
-                       restlen = n;
-               }
-               else
-                       if (n > restlen) return (-106);
-                       else
-                               restlen = n; /* standard format */
+               restlen = n; /* standard format */
        if (restlen < 3) return (-107); /* no procedure */
        if ((*src++ != 2) || (*src++ != 1) || (*src++ != 0x0B)) return (-108);
        restlen -= 3;
        if (restlen < 2) return (-109); /* list missing */
-       if (*src == 0x31)
-       { src++;
+       if (*src == 0x31) {
+               src++;
                if ((n = *src++) > 0x81) return (-110); /* invalid length field */
                restlen -= 2; /* remaining bytes */
-               if (n == 0x80)
-               { if (restlen < 2) return (-111);
+               if (n == 0x80) {
+                       if (restlen < 2) return (-111);
                        if ((*(src + restlen - 1)) || (*(src + restlen - 2))) return (-112);
                        restlen -= 2;
-               }
+               } else if (n == 0x81) {
+                       n = *src++;
+                       restlen--;
+                       if (n > restlen) return (-113);
+                       restlen = n;
+               } else if (n > restlen)
+                       return (-114);
                else
-                       if (n == 0x81)
-                       { n = *src++;
-                               restlen--;
-                               if (n > restlen) return (-113);
-                               restlen = n;
-                       }
-                       else
-                               if (n > restlen) return (-114);
-                               else
-                                       restlen = n; /* standard format */
+                       restlen = n; /* standard format */
        } /* result list header */
 
-       while (restlen >= 2)
-       { stp = st;
+       while (restlen >= 2) {
+               stp = st;
                sprintf(stp, "%d 0x%lx %d %s ", DIVERT_REPORT, ic->parm.dss1_io.ll_id,
                        cnt++, divert_if.drv_to_name(ic->driver));
                stp += strlen(stp);
@@ -674,8 +664,8 @@ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs)
                sprintf(stp, "%d ", (*p++) & 0xFF);
                stp += strlen(stp);
                n -= 6;
-               if (n > 2)
-               { if (*p++ != 0x30) continue;
+               if (n > 2) {
+                       if (*p++ != 0x30) continue;
                        if (*p > (n - 2)) continue;
                        n = *p++;
                        if (!(n1 = put_address(stp, p, n & 0xFF))) continue;
@@ -692,58 +682,58 @@ static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs)
 /* callback for protocol specific extensions */
 /*********************************************/
 static int prot_stat_callback(isdn_ctrl *ic)
-{ struct call_struc *cs, *cs1;
+{
+       struct call_struc *cs, *cs1;
        int i;
        unsigned long flags;
 
        cs = divert_head; /* start of list */
        cs1 = NULL;
-       while (cs)
-       { if (ic->driver == cs->ics.driver)
-               { switch (cs->ics.arg)
-                       { case DSS1_CMD_INVOKE:
-                                       if ((cs->ics.parm.dss1_io.ll_id == ic->parm.dss1_io.ll_id) &&
-                                           (cs->ics.parm.dss1_io.hl_id == ic->parm.dss1_io.hl_id))
-                                       { switch (ic->arg)
-                                               {  case DSS1_STAT_INVOKE_ERR:
-                                                               sprintf(cs->info, "128 0x%lx 0x%x\n",
-                                                                       ic->parm.dss1_io.ll_id,
-                                                                       ic->parm.dss1_io.timeout);
-                                                               put_info_buffer(cs->info);
-                                                               break;
-
-                                               case DSS1_STAT_INVOKE_RES:
-                                                       switch (cs->ics.parm.dss1_io.proc)
-                                                       {  case  7:
-                                                       case  8:
-                                                               put_info_buffer(cs->info);
-                                                               break;
-
-                                                       case  11:
-                                                               i = interrogate_success(ic, cs);
-                                                               if (i)
-                                                                       sprintf(cs->info, "%d 0x%lx %d\n", DIVERT_REPORT,
-                                                                               ic->parm.dss1_io.ll_id, i);
-                                                               put_info_buffer(cs->info);
-                                                               break;
-
-                                                       default:
-                                                               printk(KERN_WARNING "dss1_divert: unknown proc %d\n", cs->ics.parm.dss1_io.proc);
-                                                               break;
-                                                       }
-
+       while (cs) {
+               if (ic->driver == cs->ics.driver) {
+                       switch (cs->ics.arg) {
+                       case DSS1_CMD_INVOKE:
+                               if ((cs->ics.parm.dss1_io.ll_id == ic->parm.dss1_io.ll_id) &&
+                                   (cs->ics.parm.dss1_io.hl_id == ic->parm.dss1_io.hl_id)) {
+                                       switch (ic->arg) {
+                                       case DSS1_STAT_INVOKE_ERR:
+                                               sprintf(cs->info, "128 0x%lx 0x%x\n",
+                                                       ic->parm.dss1_io.ll_id,
+                                                       ic->parm.dss1_io.timeout);
+                                               put_info_buffer(cs->info);
+                                               break;
+
+                                       case DSS1_STAT_INVOKE_RES:
+                                               switch (cs->ics.parm.dss1_io.proc) {
+                                               case  7:
+                                               case  8:
+                                                       put_info_buffer(cs->info);
+                                                       break;
 
+                                               case  11:
+                                                       i = interrogate_success(ic, cs);
+                                                       if (i)
+                                                               sprintf(cs->info, "%d 0x%lx %d\n", DIVERT_REPORT,
+                                                                       ic->parm.dss1_io.ll_id, i);
+                                                       put_info_buffer(cs->info);
                                                        break;
 
                                                default:
-                                                       printk(KERN_WARNING "dss1_divert unknown invoke answer %lx\n", ic->arg);
+                                                       printk(KERN_WARNING "dss1_divert: unknown proc %d\n", cs->ics.parm.dss1_io.proc);
                                                        break;
                                                }
-                                               cs1 = cs; /* remember structure */
-                                               cs = NULL;
-                                               continue; /* abort search */
-                                       } /* id found */
-                                       break;
+
+                                               break;
+
+                                       default:
+                                               printk(KERN_WARNING "dss1_divert unknown invoke answer %lx\n", ic->arg);
+                                               break;
+                                       }
+                                       cs1 = cs; /* remember structure */
+                                       cs = NULL;
+                                       continue; /* abort search */
+                               } /* id found */
+                               break;
 
                        case DSS1_CMD_INVOKE_ABORT:
                                printk(KERN_WARNING "dss1_divert unhandled invoke abort\n");
@@ -757,13 +747,12 @@ static int prot_stat_callback(isdn_ctrl *ic)
                } /* driver ok */
        }
 
-       if (!cs1)
-       { printk(KERN_WARNING "dss1_divert unhandled process\n");
+       if (!cs1) {
+               printk(KERN_WARNING "dss1_divert unhandled process\n");
                return (0);
        }
 
-       if (cs1->ics.driver == -1)
-       {
+       if (cs1->ics.driver == -1) {
                spin_lock_irqsave(&divert_lock, flags);
                del_timer(&cs1->timer);
                if (cs1->prev)
@@ -784,20 +773,22 @@ static int prot_stat_callback(isdn_ctrl *ic)
 /* status callback from HL */
 /***************************/
 static int isdn_divert_stat_callback(isdn_ctrl *ic)
-{ struct call_struc *cs, *cs1;
+{
+       struct call_struc *cs, *cs1;
        unsigned long flags;
        int retval;
 
        retval = -1;
        cs = divert_head; /* start of list */
-       while (cs)
-       { if ((ic->driver == cs->ics.driver) && (ic->arg == cs->ics.arg))
-               { switch (ic->command)
-                       { case ISDN_STAT_DHUP:
-                                       sprintf(cs->info, "129 0x%lx\n", cs->divert_id);
-                                       del_timer(&cs->timer);
-                                       cs->ics.driver = -1;
-                                       break;
+       while (cs) {
+               if ((ic->driver == cs->ics.driver) &&
+                   (ic->arg == cs->ics.arg)) {
+                       switch (ic->command) {
+                       case ISDN_STAT_DHUP:
+                               sprintf(cs->info, "129 0x%lx\n", cs->divert_id);
+                               del_timer(&cs->timer);
+                               cs->ics.driver = -1;
+                               break;
 
                        case ISDN_STAT_CAUSE:
                                sprintf(cs->info, "130 0x%lx %s\n", cs->divert_id, ic->parm.num);
@@ -818,8 +809,7 @@ static int isdn_divert_stat_callback(isdn_ctrl *ic)
                }
                cs1 = cs;
                cs = cs->next;
-               if (cs1->ics.driver == -1)
-               {
+               if (cs1->ics.driver == -1) {
                        spin_lock_irqsave(&divert_lock, flags);
                        if (cs1->prev)
                                cs1->prev->next = cs1->next; /* forward link */
@@ -840,20 +830,19 @@ static int isdn_divert_stat_callback(isdn_ctrl *ic)
 /********************/
 int ll_callback(isdn_ctrl *ic)
 {
-       switch (ic->command)
-       case ISDN_STAT_ICALL:
+       switch (ic->command) {
+       case ISDN_STAT_ICALL:
        case ISDN_STAT_ICALLW:
                return (isdn_divert_icall(ic));
                break;
 
        case ISDN_STAT_PROT:
-               if ((ic->arg & 0xFF) == ISDN_PTYPE_EURO)
-               { if (ic->arg != DSS1_STAT_INVOKE_BRD)
+               if ((ic->arg & 0xFF) == ISDN_PTYPE_EURO) {
+                       if (ic->arg != DSS1_STAT_INVOKE_BRD)
                                return (prot_stat_callback(ic));
                        else
                                return (0); /* DSS1 invoke broadcast */
-               }
-               else
+               } else
                        return (-1); /* protocol not euro */
 
        default:
index 42f289320d2d2961fbd2dac1b8ac498da286fa46..55033dd872c0258b4902e3056e3563d273770793 100644 (file)
@@ -43,8 +43,8 @@
 
 #define DEFLECT_ALL_IDS   0xFFFFFFFF /* all drivers selected */
 
-typedef struct
-{ ulong drvid;     /* driver ids, bit mapped */
+typedef struct {
+       ulong drvid;     /* driver ids, bit mapped */
        char my_msn[35]; /* desired msn, subaddr allowed */
        char caller[35]; /* caller id, partial string with * + subaddr allowed */
        char to_nr[35];  /* deflected to number incl. subaddress */
@@ -65,18 +65,18 @@ typedef struct
        u_char waittime; /* maximum wait time for proceeding */
 } divert_rule;
 
-typedef union
-{ int drv_version; /* return of driver version */
-       struct
-       { int drvid;            /* id of driver */
+typedef union {
+       int drv_version; /* return of driver version */
+       struct {
+               int drvid;              /* id of driver */
                char drvnam[30];        /* name of driver */
        } getid;
-       struct
-       { int ruleidx;  /* index of rule */
+       struct {
+               int ruleidx;    /* index of rule */
                divert_rule rule;       /* rule parms */
        } getsetrule;
-       struct
-       { u_char subcmd;  /* 0 = hangup/reject,
+       struct {
+               u_char subcmd;  /* 0 = hangup/reject,
                             1 = alert,
                             2 = deflect */
                ulong callid;   /* id of call delivered by ascii output */
@@ -84,8 +84,8 @@ typedef union
                                   else uus1 string (maxlen 31),
                                   data from rule used if empty */
        } fwd_ctrl;
-       struct
-       { int drvid;      /* id of driver */
+       struct {
+               int drvid;      /* id of driver */
                u_char cfproc;  /* cfu = 0, cfb = 1, cfnr = 2 */
                ulong procid;   /* process id returned when no error */
                u_char service; /* basically coded service, 0 = all */
@@ -104,8 +104,8 @@ typedef union
 /**************************************************/
 /* structure keeping ascii info for device output */
 /**************************************************/
-struct divert_info
-{ struct divert_info *next;
+struct divert_info {
+       struct divert_info *next;
        ulong usage_cnt; /* number of files still to work */
        char info_start[2]; /* info string start */
 };
index 6849a11a1b246f5e9ab4bb876efdcf5397fc6c4c..7c7814497e3ea28587f208b98da95ece812a25a1 100644 (file)
@@ -467,11 +467,6 @@ void gigaset_freecs(struct cardstate *cs)
 
        mutex_lock(&cs->mutex);
 
-       if (!cs->bcs)
-               goto f_cs;
-       if (!cs->inbuf)
-               goto f_bcs;
-
        spin_lock_irqsave(&cs->lock, flags);
        cs->running = 0;
        spin_unlock_irqrestore(&cs->lock, flags); /* event handler and timer are
@@ -507,17 +502,16 @@ void gigaset_freecs(struct cardstate *cs)
                gig_dbg(DEBUG_INIT, "clearing at_state");
                clear_at_state(&cs->at_state);
                dealloc_temp_at_states(cs);
+               clear_events(cs);
                tty_port_destroy(&cs->port);
 
                /* fall through */
        case 0: /* error in basic setup */
-               clear_events(cs);
                gig_dbg(DEBUG_INIT, "freeing inbuf");
                kfree(cs->inbuf);
+               kfree(cs->bcs);
        }
-f_bcs: gig_dbg(DEBUG_INIT, "freeing bcs[]");
-       kfree(cs->bcs);
-f_cs:  gig_dbg(DEBUG_INIT, "freeing cs");
+
        mutex_unlock(&cs->mutex);
        free_cs(cs);
 }
@@ -687,19 +681,6 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
                return NULL;
        }
 
-       gig_dbg(DEBUG_INIT, "allocating bcs[0..%d]", channels - 1);
-       cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL);
-       if (!cs->bcs) {
-               pr_err("out of memory\n");
-               goto error;
-       }
-       gig_dbg(DEBUG_INIT, "allocating inbuf");
-       cs->inbuf = kmalloc(sizeof(struct inbuf_t), GFP_KERNEL);
-       if (!cs->inbuf) {
-               pr_err("out of memory\n");
-               goto error;
-       }
-
        cs->cs_init = 0;
        cs->channels = channels;
        cs->onechannel = onechannel;
@@ -729,6 +710,12 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
        cs->mode = M_UNKNOWN;
        cs->mstate = MS_UNINITIALIZED;
 
+       cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL);
+       cs->inbuf = kmalloc(sizeof(struct inbuf_t), GFP_KERNEL);
+       if (!cs->bcs || !cs->inbuf) {
+               pr_err("out of memory\n");
+               goto error;
+       }
        ++cs->cs_init;
 
        gig_dbg(DEBUG_INIT, "setting up at_state");
index 2e6963dc740ea340778094ed3cab25e3b1d2ddaa..7459b127ddd59fe00fd2872337c2c8eb5845f7d5 100644 (file)
@@ -351,10 +351,11 @@ struct reply_t gigaset_tab_cid[] =
 
 
 static const struct resp_type_t {
-       unsigned char   *response;
-       int             resp_code;
-       int             type;
-} resp_type[] =
+       char    *response;
+       int     resp_code;
+       int     type;
+}
+resp_type[] =
 {
        {"OK",          RSP_OK,         RT_NOTHING},
        {"ERROR",       RSP_ERROR,      RT_NOTHING},
@@ -374,11 +375,12 @@ static const struct resp_type_t {
 };
 
 static const struct zsau_resp_t {
-       unsigned char   *str;
-       int             code;
-} zsau_resp[] =
+       char    *str;
+       int     code;
+}
+zsau_resp[] =
 {
-       {"OUTGOING_CALL_PROCEEDING",    ZSAU_OUTGOING_CALL_PROCEEDING},
+       {"OUTGOING_CALL_PROCEEDING",    ZSAU_PROCEEDING},
        {"CALL_DELIVERED",              ZSAU_CALL_DELIVERED},
        {"ACTIVE",                      ZSAU_ACTIVE},
        {"DISCONNECT_IND",              ZSAU_DISCONNECT_IND},
@@ -434,7 +436,7 @@ void gigaset_handle_modem_response(struct cardstate *cs)
        len = cs->cbytes;
        if (!len) {
                /* ignore additional LFs/CRs (M10x config mode or cx100) */
-               gig_dbg(DEBUG_MCMD, "skipped EOL [%02X]", cs->respdata[len]);
+               gig_dbg(DEBUG_MCMD, "skipped EOL [%02X]", cs->respdata[0]);
                return;
        }
        cs->respdata[len] = 0;
@@ -707,27 +709,29 @@ static void schedule_init(struct cardstate *cs, int state)
        cs->commands_pending = 1;
 }
 
-/* Add "AT" to a command, add the cid, dle encode it, send the result to the
-   hardware. */
-static void send_command(struct cardstate *cs, const char *cmd, int cid,
-                        int dle, gfp_t kmallocflags)
+/* send an AT command
+ * adding the "AT" prefix, cid and DLE encapsulation as appropriate
+ */
+static void send_command(struct cardstate *cs, const char *cmd,
+                        struct at_state_t *at_state)
 {
+       int cid = at_state->cid;
        struct cmdbuf_t *cb;
        size_t buflen;
 
        buflen = strlen(cmd) + 12; /* DLE ( A T 1 2 3 4 5 <cmd> DLE ) \0 */
-       cb = kmalloc(sizeof(struct cmdbuf_t) + buflen, kmallocflags);
+       cb = kmalloc(sizeof(struct cmdbuf_t) + buflen, GFP_ATOMIC);
        if (!cb) {
                dev_err(cs->dev, "%s: out of memory\n", __func__);
                return;
        }
        if (cid > 0 && cid <= 65535)
                cb->len = snprintf(cb->buf, buflen,
-                                  dle ? "\020(AT%d%s\020)" : "AT%d%s",
+                                  cs->dle ? "\020(AT%d%s\020)" : "AT%d%s",
                                   cid, cmd);
        else
                cb->len = snprintf(cb->buf, buflen,
-                                  dle ? "\020(AT%s\020)" : "AT%s",
+                                  cs->dle ? "\020(AT%s\020)" : "AT%s",
                                   cmd);
        cb->offset = 0;
        cb->next = NULL;
@@ -886,7 +890,7 @@ static void finish_shutdown(struct cardstate *cs)
                gigaset_isdn_stop(cs);
        }
 
-       /* The rest is done by cleanup_cs () in user mode. */
+       /* The rest is done by cleanup_cs() in process context. */
 
        cs->cmd_result = -ENODEV;
        cs->waiting = 0;
@@ -976,10 +980,9 @@ exit:
 }
 
 static void handle_icall(struct cardstate *cs, struct bc_state *bcs,
-                        struct at_state_t **p_at_state)
+                        struct at_state_t *at_state)
 {
        int retval;
-       struct at_state_t *at_state = *p_at_state;
 
        retval = gigaset_isdn_icall(at_state);
        switch (retval) {
@@ -1176,7 +1179,7 @@ static void do_action(int action, struct cardstate *cs,
                spin_unlock_irqrestore(&cs->lock, flags);
                break;
        case ACT_ICALL:
-               handle_icall(cs, bcs, p_at_state);
+               handle_icall(cs, bcs, at_state);
                break;
        case ACT_FAILSDOWN:
                dev_warn(cs->dev, "Could not shut down the device.\n");
@@ -1264,7 +1267,7 @@ static void do_action(int action, struct cardstate *cs,
                        cs->commands_pending = 1;
                        break;
                }
-               /* fall through */
+               /* bad cid: fall through */
        case ACT_FAILCID:
                cs->cur_at_seq = SEQ_NONE;
                channel = cs->curchannel;
@@ -1339,7 +1342,6 @@ static void do_action(int action, struct cardstate *cs,
                        *p_resp_code = RSP_ERROR;
                        break;
                }
-               /*at_state->getstring = 1;*/
                cs->gotfwver = 0;
                break;
        case ACT_GOTVER:
@@ -1471,7 +1473,6 @@ static void process_event(struct cardstate *cs, struct event_t *ev)
        int rcode;
        int genresp = 0;
        int resp_code = RSP_ERROR;
-       int sendcid;
        struct at_state_t *at_state;
        int index;
        int curact;
@@ -1499,7 +1500,6 @@ static void process_event(struct cardstate *cs, struct event_t *ev)
                at_state->ConState, ev->type);
 
        bcs = at_state->bcs;
-       sendcid = at_state->cid;
 
        /* Setting the pointer to the dial array */
        rep = at_state->replystruct;
@@ -1510,10 +1510,12 @@ static void process_event(struct cardstate *cs, struct event_t *ev)
                    || !at_state->timer_active) {
                        ev->type = RSP_NONE; /* old timeout */
                        gig_dbg(DEBUG_EVENT, "old timeout");
-               } else if (!at_state->waiting)
-                       gig_dbg(DEBUG_EVENT, "timeout occurred");
-               else
-                       gig_dbg(DEBUG_EVENT, "stopped waiting");
+               } else {
+                       if (at_state->waiting)
+                               gig_dbg(DEBUG_EVENT, "stopped waiting");
+                       else
+                               gig_dbg(DEBUG_EVENT, "timeout occurred");
+               }
        }
        spin_unlock_irqrestore(&cs->lock, flags);
 
@@ -1561,45 +1563,40 @@ static void process_event(struct cardstate *cs, struct event_t *ev)
                do_action(rep->action[curact], cs, bcs, &at_state, &p_command,
                          &genresp, &resp_code, ev);
                if (!at_state)
-                       break; /* may be freed after disconnect */
+                       /* at_state destroyed by disconnect */
+                       return;
        }
 
-       if (at_state) {
-               /* Jump to the next con-state regarding the array */
-               if (rep->new_ConState >= 0)
-                       at_state->ConState = rep->new_ConState;
+       /* Jump to the next con-state regarding the array */
+       if (rep->new_ConState >= 0)
+               at_state->ConState = rep->new_ConState;
 
-               if (genresp) {
-                       spin_lock_irqsave(&cs->lock, flags);
+       if (genresp) {
+               spin_lock_irqsave(&cs->lock, flags);
+               at_state->timer_expires = 0;
+               at_state->timer_active = 0;
+               spin_unlock_irqrestore(&cs->lock, flags);
+               gigaset_add_event(cs, at_state, resp_code, NULL, 0, NULL);
+       } else {
+               /* Send command to modem if not NULL... */
+               if (p_command) {
+                       if (cs->connected)
+                               send_command(cs, p_command, at_state);
+                       else
+                               gigaset_add_event(cs, at_state, RSP_NODEV,
+                                                 NULL, 0, NULL);
+               }
+
+               spin_lock_irqsave(&cs->lock, flags);
+               if (!rep->timeout) {
                        at_state->timer_expires = 0;
                        at_state->timer_active = 0;
-                       spin_unlock_irqrestore(&cs->lock, flags);
-                       gigaset_add_event(cs, at_state, resp_code,
-                                         NULL, 0, NULL);
-               } else {
-                       /* Send command to modem if not NULL... */
-                       if (p_command) {
-                               if (cs->connected)
-                                       send_command(cs, p_command,
-                                                    sendcid, cs->dle,
-                                                    GFP_ATOMIC);
-                               else
-                                       gigaset_add_event(cs, at_state,
-                                                         RSP_NODEV,
-                                                         NULL, 0, NULL);
-                       }
-
-                       spin_lock_irqsave(&cs->lock, flags);
-                       if (!rep->timeout) {
-                               at_state->timer_expires = 0;
-                               at_state->timer_active = 0;
-                       } else if (rep->timeout > 0) { /* new timeout */
-                               at_state->timer_expires = rep->timeout * 10;
-                               at_state->timer_active = 1;
-                               ++at_state->timer_index;
-                       }
-                       spin_unlock_irqrestore(&cs->lock, flags);
+               } else if (rep->timeout > 0) { /* new timeout */
+                       at_state->timer_expires = rep->timeout * 10;
+                       at_state->timer_active = 1;
+                       ++at_state->timer_index;
                }
+               spin_unlock_irqrestore(&cs->lock, flags);
        }
 }
 
@@ -1693,6 +1690,11 @@ static void process_command_flags(struct cardstate *cs)
        for (i = 0; i < cs->channels; ++i) {
                bcs = cs->bcs + i;
                if (bcs->at_state.pending_commands & PC_HUP) {
+                       if (cs->dle) {
+                               cs->curchannel = bcs->channel;
+                               schedule_sequence(cs, &cs->at_state, SEQ_DLE0);
+                               return;
+                       }
                        bcs->at_state.pending_commands &= ~PC_HUP;
                        if (bcs->at_state.pending_commands & PC_CID) {
                                /* not yet dialing: PC_NOCID is sufficient */
index 8e2fc8f31d16455885177deb2c55b9a9b56c32a9..eb63a0f7a02a94191ef54c54740c778ece40a2cf 100644 (file)
@@ -111,11 +111,10 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
 
 /* connection state */
 #define ZSAU_NONE                      0
-#define ZSAU_DISCONNECT_IND            4
-#define ZSAU_OUTGOING_CALL_PROCEEDING  1
 #define ZSAU_PROCEEDING                        1
 #define ZSAU_CALL_DELIVERED            2
 #define ZSAU_ACTIVE                    3
+#define ZSAU_DISCONNECT_IND            4
 #define ZSAU_NULL                      5
 #define ZSAU_DISCONNECT_REQ            6
 #define ZSAU_UNKNOWN                   -1
@@ -183,18 +182,22 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
 #define AT_NUM         7
 
 /* variables in struct at_state_t */
+/* - numeric */
 #define VAR_ZSAU       0
 #define VAR_ZDLE       1
 #define VAR_ZCTP       2
+/* total number */
 #define VAR_NUM                3
-
+/* - string */
 #define STR_NMBR       0
 #define STR_ZCPN       1
 #define STR_ZCON       2
 #define STR_ZBC                3
 #define STR_ZHLC       4
+/* total number */
 #define STR_NUM                5
 
+/* event types */
 #define EV_TIMEOUT     -105
 #define EV_IF_VER      -106
 #define EV_PROC_CIDMODE        -107
index 67abf3ff45e812eec6ce416a917cacec5a650b39..20b7e7a1190f317bbf31d072c809ab70e919514b 100644 (file)
@@ -112,36 +112,6 @@ static int if_config(struct cardstate *cs, int *arg)
 }
 
 /*** the terminal driver ***/
-/* stolen from usbserial and some other tty drivers */
-
-static int  if_open(struct tty_struct *tty, struct file *filp);
-static void if_close(struct tty_struct *tty, struct file *filp);
-static int  if_ioctl(struct tty_struct *tty,
-                    unsigned int cmd, unsigned long arg);
-static int  if_write_room(struct tty_struct *tty);
-static int  if_chars_in_buffer(struct tty_struct *tty);
-static void if_throttle(struct tty_struct *tty);
-static void if_unthrottle(struct tty_struct *tty);
-static void if_set_termios(struct tty_struct *tty, struct ktermios *old);
-static int  if_tiocmget(struct tty_struct *tty);
-static int  if_tiocmset(struct tty_struct *tty,
-                       unsigned int set, unsigned int clear);
-static int  if_write(struct tty_struct *tty,
-                    const unsigned char *buf, int count);
-
-static const struct tty_operations if_ops = {
-       .open =                 if_open,
-       .close =                if_close,
-       .ioctl =                if_ioctl,
-       .write =                if_write,
-       .write_room =           if_write_room,
-       .chars_in_buffer =      if_chars_in_buffer,
-       .set_termios =          if_set_termios,
-       .throttle =             if_throttle,
-       .unthrottle =           if_unthrottle,
-       .tiocmget =             if_tiocmget,
-       .tiocmset =             if_tiocmset,
-};
 
 static int if_open(struct tty_struct *tty, struct file *filp)
 {
@@ -355,7 +325,7 @@ done:
 static int if_write_room(struct tty_struct *tty)
 {
        struct cardstate *cs = tty->driver_data;
-       int retval = -ENODEV;
+       int retval;
 
        gig_dbg(DEBUG_IF, "%u: %s()", cs->minor_index, __func__);
 
@@ -498,6 +468,20 @@ out:
        mutex_unlock(&cs->mutex);
 }
 
+static const struct tty_operations if_ops = {
+       .open =                 if_open,
+       .close =                if_close,
+       .ioctl =                if_ioctl,
+       .write =                if_write,
+       .write_room =           if_write_room,
+       .chars_in_buffer =      if_chars_in_buffer,
+       .set_termios =          if_set_termios,
+       .throttle =             if_throttle,
+       .unthrottle =           if_unthrottle,
+       .tiocmget =             if_tiocmget,
+       .tiocmset =             if_tiocmset,
+};
+
 
 /* wakeup tasklet for the write operation */
 static void if_wake(unsigned long data)
index b305e6b2b8ee24d5948fc0a30142b8b9f1a03a1c..ac4863c2ecbc6a18a86bf62008fcde2aa216c0a2 100644 (file)
@@ -299,8 +299,8 @@ static void b1pciv4_remove(struct pci_dev *pdev)
 
 #endif /* CONFIG_ISDN_DRV_AVMB1_B1PCIV4 */
 
-static int __devinit b1pci_pci_probe(struct pci_dev *pdev,
-                                    const struct pci_device_id *ent)
+static int b1pci_pci_probe(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        struct capicardparams param;
        int retval;
@@ -344,7 +344,7 @@ static int __devinit b1pci_pci_probe(struct pci_dev *pdev,
        return retval;
 }
 
-static void __devexit b1pci_pci_remove(struct pci_dev *pdev)
+static void b1pci_pci_remove(struct pci_dev *pdev)
 {
 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
        avmcard *card = pci_get_drvdata(pdev);
@@ -362,7 +362,7 @@ static struct pci_driver b1pci_pci_driver = {
        .name           = "b1pci",
        .id_table       = b1pci_pci_tbl,
        .probe          = b1pci_pci_probe,
-       .remove         = __devexit_p(b1pci_pci_remove),
+       .remove         = b1pci_pci_remove,
 };
 
 static struct capi_driver capi_driver_b1pci = {
index 98f18812441de3d7158e945ee583b153f4470241..1d7fc44e3eeffcbf5137592a270b31ad02de43fb 100644 (file)
@@ -1249,8 +1249,7 @@ err:
 
 /* ------------------------------------------------------------- */
 
-static int __devinit c4_probe(struct pci_dev *dev,
-                             const struct pci_device_id *ent)
+static int c4_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 {
        int nr = ent->driver_data;
        int retval = 0;
index cb9a30427bd2e2123f981c898589824f829c6547..2180b168569128dbeb264774071ab478c0aa4ca2 100644 (file)
@@ -187,8 +187,7 @@ static char *t1pci_procinfo(struct capi_ctr *ctrl)
 
 /* ------------------------------------------------------------- */
 
-static int __devinit t1pci_probe(struct pci_dev *dev,
-                                const struct pci_device_id *ent)
+static int t1pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 {
        struct capicardparams param;
        int retval;
index ca6d276bb2562ac4b481db11da7c9e35d81dc3da..52377b4bf039e0cbe19249ee3361acbd6ce85014 100644 (file)
@@ -150,12 +150,12 @@ MODULE_DEVICE_TABLE(pci, divas_pci_tbl);
 
 static int divas_init_one(struct pci_dev *pdev,
                          const struct pci_device_id *ent);
-static void __devexit divas_remove_one(struct pci_dev *pdev);
+static void divas_remove_one(struct pci_dev *pdev);
 
 static struct pci_driver diva_pci_driver = {
        .name     = "divas",
        .probe    = divas_init_one,
-       .remove   = __devexit_p(divas_remove_one),
+       .remove   = divas_remove_one,
        .id_table = divas_pci_tbl,
 };
 
@@ -688,8 +688,7 @@ static int __init divas_register_chrdev(void)
 /* --------------------------------------------------------------------------
    PCI driver section
    -------------------------------------------------------------------------- */
-static int __devinit divas_init_one(struct pci_dev *pdev,
-                                   const struct pci_device_id *ent)
+static int divas_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        void *pdiva = NULL;
        u8 pci_latency;
@@ -749,7 +748,7 @@ static int __devinit divas_init_one(struct pci_dev *pdev,
        return (0);
 }
 
-static void __devexit divas_remove_one(struct pci_dev *pdev)
+static void divas_remove_one(struct pci_dev *pdev)
 {
        void *pdiva = pci_get_drvdata(pdev);
 
index dceaec821b0e5324cbfa2d92bdb7334845bf9262..292991c90c0248948190fbebe818fd19ecc289cb 100644 (file)
@@ -1034,7 +1034,7 @@ release_card(struct fritzcard *card)
        AVM_cnt--;
 }
 
-static int __devinit
+static int
 setup_instance(struct fritzcard *card)
 {
        int i, err;
@@ -1096,7 +1096,7 @@ error:
        return err;
 }
 
-static int __devinit
+static int
 fritzpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int err = -ENOMEM;
@@ -1130,7 +1130,7 @@ fritzpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        return err;
 }
 
-static void __devexit
+static void
 fritz_remove_pci(struct pci_dev *pdev)
 {
        struct fritzcard *card = pci_get_drvdata(pdev);
@@ -1142,7 +1142,7 @@ fritz_remove_pci(struct pci_dev *pdev)
                        pr_info("%s: drvdata already removed\n", __func__);
 }
 
-static struct pci_device_id fcpci_ids[] __devinitdata = {
+static struct pci_device_id fcpci_ids[] = {
        { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_A1, PCI_ANY_ID, PCI_ANY_ID,
          0, 0, (unsigned long) "Fritz!Card PCI"},
        { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_A1_V2, PCI_ANY_ID, PCI_ANY_ID,
@@ -1154,7 +1154,7 @@ MODULE_DEVICE_TABLE(pci, fcpci_ids);
 static struct pci_driver fcpci_driver = {
        .name = "fcpci",
        .probe = fritzpci_probe,
-       .remove = __devexit_p(fritz_remove_pci),
+       .remove = fritz_remove_pci,
        .id_table = fcpci_ids,
 };
 
index f02794203bb193b41291efc3bc6d8457b2043883..28543d7951886e17026303c66e765b0077062efc 100644 (file)
@@ -5274,7 +5274,7 @@ free_card:
        return ret_err;
 }
 
-static void __devexit hfc_remove_pci(struct pci_dev *pdev)
+static void hfc_remove_pci(struct pci_dev *pdev)
 {
        struct hfc_multi        *card = pci_get_drvdata(pdev);
        u_long                  flags;
@@ -5351,7 +5351,7 @@ static const struct hm_map hfcm_map[] = {
 
 #undef H
 #define H(x)   ((unsigned long)&hfcm_map[x])
-static struct pci_device_id hfmultipci_ids[] __devinitdata = {
+static struct pci_device_id hfmultipci_ids[] = {
 
        /* Cards with HFC-4S Chip */
        { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
@@ -5472,7 +5472,7 @@ hfcmulti_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 static struct pci_driver hfcmultipci_driver = {
        .name           = "hfc_multi",
        .probe          = hfcmulti_probe,
-       .remove         = __devexit_p(hfc_remove_pci),
+       .remove         = hfc_remove_pci,
        .id_table       = hfmultipci_ids,
 };
 
index 6e99d73563b8abbe8b5c6931b741ab15a5536a33..a7e4939787c957a0f7975c4ea3d8aaaa390e6d2b 100644 (file)
@@ -2215,7 +2215,7 @@ static struct pci_device_id hfc_ids[] =
        {},
 };
 
-static int __devinit
+static int
 hfc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int             err = -ENOMEM;
@@ -2246,7 +2246,7 @@ hfc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        return err;
 }
 
-static void __devexit
+static void
 hfc_remove_pci(struct pci_dev *pdev)
 {
        struct hfc_pci  *card = pci_get_drvdata(pdev);
@@ -2263,7 +2263,7 @@ hfc_remove_pci(struct pci_dev *pdev)
 static struct pci_driver hfc_driver = {
        .name = "hfcpci",
        .probe = hfc_probe,
-       .remove = __devexit_p(hfc_remove_pci),
+       .remove = hfc_remove_pci,
        .id_table = hfc_ids,
 };
 
index 631eb3fa63cf1558d3c044a3e1d3a26f5567f2b8..c1493f4162fbca4b6c6343e19035758f13ddbc68 100644 (file)
@@ -125,7 +125,7 @@ struct inf_hw {
 #define PCI_SUBVENDOR_SEDLBAUER_PCI     0x53
 #define PCI_SUB_ID_SEDLBAUER            0x01
 
-static struct pci_device_id infineon_ids[] __devinitdata = {
+static struct pci_device_id infineon_ids[] = {
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_DIVA20), INF_DIVA20 },
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_DIVA20_U), INF_DIVA20U },
        { PCI_VDEVICE(EICON, PCI_DEVICE_ID_EICON_DIVA201), INF_DIVA201 },
@@ -603,7 +603,7 @@ inf_ctrl(struct inf_hw *hw, u32 cmd, u_long arg)
        return ret;
 }
 
-static int __devinit
+static int
 init_irq(struct inf_hw *hw)
 {
        int     ret, cnt = 3;
@@ -662,7 +662,7 @@ release_io(struct inf_hw *hw)
        }
 }
 
-static int __devinit
+static int
 setup_io(struct inf_hw *hw)
 {
        int err = 0;
@@ -896,7 +896,7 @@ release_card(struct inf_hw *card) {
        inf_cnt--;
 }
 
-static int __devinit
+static int
 setup_instance(struct inf_hw *card)
 {
        int err;
@@ -1060,7 +1060,7 @@ static const struct inf_cinfo inf_card_info[] = {
        }
 };
 
-static const struct inf_cinfo * __devinit
+static const struct inf_cinfo *
 get_card_info(enum inf_types typ)
 {
        const struct inf_cinfo *ci = inf_card_info;
@@ -1073,7 +1073,7 @@ get_card_info(enum inf_types typ)
        return NULL;
 }
 
-static int __devinit
+static int
 inf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int err = -ENOMEM;
@@ -1135,7 +1135,7 @@ inf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        return err;
 }
 
-static void __devexit
+static void
 inf_remove(struct pci_dev *pdev)
 {
        struct inf_hw   *card = pci_get_drvdata(pdev);
@@ -1149,7 +1149,7 @@ inf_remove(struct pci_dev *pdev)
 static struct pci_driver infineon_driver = {
        .name = "ISDN Infineon pci",
        .probe = inf_probe,
-       .remove = __devexit_p(inf_remove),
+       .remove = inf_remove,
        .id_table = infineon_ids,
 };
 
index 9bcade59eb73bdf24f72e8fa5a6e08e4be641f1c..8e2944784e0004e4fc933d691607c4e822c3bf66 100644 (file)
@@ -1008,7 +1008,7 @@ nj_setup(struct tiger_hw *card)
 }
 
 
-static int __devinit
+static int
 setup_instance(struct tiger_hw *card)
 {
        int i, err;
@@ -1059,7 +1059,7 @@ error:
        return err;
 }
 
-static int __devinit
+static int
 nj_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int err = -ENOMEM;
@@ -1124,7 +1124,7 @@ nj_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 }
 
 
-static void __devexit nj_remove(struct pci_dev *pdev)
+static void nj_remove(struct pci_dev *pdev)
 {
        struct tiger_hw *card = pci_get_drvdata(pdev);
 
@@ -1137,7 +1137,7 @@ static void __devexit nj_remove(struct pci_dev *pdev)
 /* We cannot select cards with PCI_SUB... IDs, since here are cards with
  * SUB IDs set to PCI_ANY_ID, so we need to match all and reject
  * known other cards which not work with this driver - see probe function */
-static struct pci_device_id nj_pci_ids[] __devinitdata = {
+static struct pci_device_id nj_pci_ids[] = {
        { PCI_VENDOR_ID_TIGERJET, PCI_DEVICE_ID_TIGERJET_300,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { }
@@ -1147,7 +1147,7 @@ MODULE_DEVICE_TABLE(pci, nj_pci_ids);
 static struct pci_driver nj_driver = {
        .name = "netjet",
        .probe = nj_probe,
-       .remove = __devexit_p(nj_remove),
+       .remove = nj_remove,
        .id_table = nj_pci_ids,
 };
 
index 93f344d74e546ea3063bb1f1b1d23d5cb6071ec8..9815bb4eec9c747a6f285377622ca004b2ea0373 100644 (file)
@@ -282,7 +282,7 @@ sfax_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
        return err;
 }
 
-static int __devinit
+static int
 init_card(struct sfax_hw *sf)
 {
        int     ret, cnt = 3;
@@ -321,7 +321,7 @@ init_card(struct sfax_hw *sf)
 }
 
 
-static int __devinit
+static int
 setup_speedfax(struct sfax_hw *sf)
 {
        u_long flags;
@@ -371,7 +371,7 @@ release_card(struct sfax_hw *card) {
        sfax_cnt--;
 }
 
-static int __devinit
+static int
 setup_instance(struct sfax_hw *card)
 {
        const struct firmware *firmware;
@@ -451,7 +451,7 @@ error_fw:
        return err;
 }
 
-static int __devinit
+static int
 sfaxpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int err = -ENOMEM;
@@ -480,7 +480,7 @@ sfaxpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        return err;
 }
 
-static void __devexit
+static void
 sfax_remove_pci(struct pci_dev *pdev)
 {
        struct sfax_hw  *card = pci_get_drvdata(pdev);
@@ -491,7 +491,7 @@ sfax_remove_pci(struct pci_dev *pdev)
                pr_debug("%s: drvdata already removed\n", __func__);
 }
 
-static struct pci_device_id sfaxpci_ids[] __devinitdata = {
+static struct pci_device_id sfaxpci_ids[] = {
        { PCI_VENDOR_ID_TIGERJET, PCI_DEVICE_ID_TIGERJET_100,
          PCI_SUBVENDOR_SPEEDFAX_PYRAMID, PCI_SUB_ID_SEDLBAUER,
          0, 0, (unsigned long) "Pyramid Speedfax + PCI"
@@ -507,7 +507,7 @@ MODULE_DEVICE_TABLE(pci, sfaxpci_ids);
 static struct pci_driver sfaxpci_driver = {
        .name = "speedfax+ pci",
        .probe = sfaxpci_probe,
-       .remove = __devexit_p(sfax_remove_pci),
+       .remove = sfax_remove_pci,
        .id_table = sfaxpci_ids,
 };
 
index 335fe6455002c708cfb0be66318b2473f4cdfcc7..de69f6828c767a402fc8a63825a8d2bac8f8a172 100644 (file)
@@ -1355,7 +1355,7 @@ error_setup:
        return err;
 }
 
-static int __devinit
+static int
 w6692_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int             err = -ENOMEM;
@@ -1387,7 +1387,7 @@ w6692_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        return err;
 }
 
-static void __devexit
+static void
 w6692_remove_pci(struct pci_dev *pdev)
 {
        struct w6692_hw *card = pci_get_drvdata(pdev);
@@ -1414,7 +1414,7 @@ MODULE_DEVICE_TABLE(pci, w6692_ids);
 static struct pci_driver w6692_driver = {
        .name =  "w6692",
        .probe = w6692_probe,
-       .remove = __devexit_p(w6692_remove_pci),
+       .remove = w6692_remove_pci,
        .id_table = w6692_ids,
 };
 
index 525471e776a76dfe468be16a9d714011ea27546b..1063babe1d3ae1ba38ab43ed5cb1ee7407a87fed 100644 (file)
@@ -786,8 +786,7 @@ void Amd7930_init(struct IsdnCardState *cs)
        }
 }
 
-void __devinit
-setup_Amd7930(struct IsdnCardState *cs)
+void setup_Amd7930(struct IsdnCardState *cs)
 {
        INIT_WORK(&cs->tqueue, Amd7930_bh);
        cs->dbusytimer.function = (void *) dbusy_timer_handler;
index 2b74a40ad2a02fb57949086d449ccac6f09f8a78..62f9c43e2377b0cfb9c3f9771d019b588033c898 100644 (file)
@@ -295,7 +295,7 @@ Asus_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 }
 
 #ifdef __ISAPNP__
-static struct isapnp_device_id asus_ids[] __devinitdata = {
+static struct isapnp_device_id asus_ids[] = {
        { ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688),
          ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688),
          (unsigned long) "Asus1688 PnP" },
@@ -311,12 +311,11 @@ static struct isapnp_device_id asus_ids[] __devinitdata = {
        { 0, }
 };
 
-static struct isapnp_device_id *ipid __devinitdata = &asus_ids[0];
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct isapnp_device_id *ipid = &asus_ids[0];
+static struct pnp_card *pnp_c = NULL;
 #endif
 
-int __devinit
-setup_asuscom(struct IsdnCard *card)
+int setup_asuscom(struct IsdnCard *card)
 {
        int bytecnt;
        struct IsdnCardState *cs = card->cs;
index 402d489cbbf144b18449f391f09357651c7845a1..7dd74087ad72a131c7245897c286251eb4ba0d17 100644 (file)
@@ -177,8 +177,7 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-int __devinit
-setup_avm_a1(struct IsdnCard *card)
+int setup_avm_a1(struct IsdnCard *card)
 {
        u_char val;
        struct IsdnCardState *cs = card->cs;
index 39347198d6430068cd85a77d4efcf00e915dd1b8..bc52d54ff5e1e3aab808748d9fb3fb157864f1aa 100644 (file)
@@ -213,7 +213,7 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return 0;
 }
 
-int __devinit setup_avm_a1_pcmcia(struct IsdnCard *card)
+int setup_avm_a1_pcmcia(struct IsdnCard *card)
 {
        u_char model, vers;
        struct IsdnCardState *cs = card->cs;
index 979492d69daee0e6cd6c18b8fb1a30f14f3d27c9..ee9b9a03cffa04d8bfe4a751cb24ce0f2824ec35 100644 (file)
@@ -718,7 +718,7 @@ AVM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-static int __devinit avm_setup_rest(struct IsdnCardState *cs)
+static int avm_setup_rest(struct IsdnCardState *cs)
 {
        u_int val, ver;
 
@@ -770,16 +770,16 @@ static int __devinit avm_setup_rest(struct IsdnCardState *cs)
 
 #ifndef __ISAPNP__
 
-static int __devinit avm_pnp_setup(struct IsdnCardState *cs)
+static int avm_pnp_setup(struct IsdnCardState *cs)
 {
        return (1);     /* no-op: success */
 }
 
 #else
 
-static struct pnp_card *pnp_avm_c __devinitdata = NULL;
+static struct pnp_card *pnp_avm_c = NULL;
 
-static int __devinit avm_pnp_setup(struct IsdnCardState *cs)
+static int avm_pnp_setup(struct IsdnCardState *cs)
 {
        struct pnp_dev *pnp_avm_d = NULL;
 
@@ -825,16 +825,16 @@ static int __devinit avm_pnp_setup(struct IsdnCardState *cs)
 
 #ifndef CONFIG_PCI
 
-static int __devinit avm_pci_setup(struct IsdnCardState *cs)
+static int avm_pci_setup(struct IsdnCardState *cs)
 {
        return (1);     /* no-op: success */
 }
 
 #else
 
-static struct pci_dev *dev_avm __devinitdata = NULL;
+static struct pci_dev *dev_avm = NULL;
 
-static int __devinit avm_pci_setup(struct IsdnCardState *cs)
+static int avm_pci_setup(struct IsdnCardState *cs)
 {
        if ((dev_avm = hisax_find_pci_device(PCI_VENDOR_ID_AVM,
                                             PCI_DEVICE_ID_AVM_A1, dev_avm))) {
@@ -867,8 +867,7 @@ static int __devinit avm_pci_setup(struct IsdnCardState *cs)
 
 #endif /* CONFIG_PCI */
 
-int __devinit
-setup_avm_pcipnp(struct IsdnCard *card)
+int setup_avm_pcipnp(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index c644557ae614d2e56d4fb35cb2c9dc55d6e8c9c8..4e676bcf85062c1049077fa6d724a6bef5e2a804 100644 (file)
@@ -38,11 +38,11 @@ module_param(isdnprot, int, 0);
 
 /*====================================================================*/
 
-static int avma1cs_config(struct pcmcia_device *link) __devinit;
+static int avma1cs_config(struct pcmcia_device *link);
 static void avma1cs_release(struct pcmcia_device *link);
-static void avma1cs_detach(struct pcmcia_device *p_dev) __devexit;
+static void avma1cs_detach(struct pcmcia_device *p_dev);
 
-static int __devinit avma1cs_probe(struct pcmcia_device *p_dev)
+static int avma1cs_probe(struct pcmcia_device *p_dev)
 {
        dev_dbg(&p_dev->dev, "avma1cs_attach()\n");
 
@@ -54,7 +54,7 @@ static int __devinit avma1cs_probe(struct pcmcia_device *p_dev)
        return avma1cs_config(p_dev);
 } /* avma1cs_attach */
 
-static void __devexit avma1cs_detach(struct pcmcia_device *link)
+static void avma1cs_detach(struct pcmcia_device *link)
 {
        dev_dbg(&link->dev, "avma1cs_detach(0x%p)\n", link);
        avma1cs_release(link);
@@ -72,7 +72,7 @@ static int avma1cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
 }
 
 
-static int __devinit avma1cs_config(struct pcmcia_device *link)
+static int avma1cs_config(struct pcmcia_device *link)
 {
        int i = -1;
        char devname[128];
@@ -156,7 +156,7 @@ static struct pcmcia_driver avma1cs_driver = {
        .owner          = THIS_MODULE,
        .name           = "avma1_cs",
        .probe          = avma1cs_probe,
-       .remove         = __devexit_p(avma1cs_detach),
+       .remove         = avma1cs_detach,
        .id_table       = avma1cs_ids,
 };
 
index f6bf9c68892ec892a8116d627a9f6b3d17e89169..c360164bde1bbcb7813fb5afa67ab945221d46a5 100644 (file)
@@ -253,10 +253,8 @@ BKM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-static int __devinit a4t_pci_probe(struct pci_dev *dev_a4t,
-                                  struct IsdnCardState *cs,
-                                  u_int *found,
-                                  u_int *pci_memaddr)
+static int a4t_pci_probe(struct pci_dev *dev_a4t, struct IsdnCardState *cs,
+                        u_int *found, u_int *pci_memaddr)
 {
        u16 sub_sys;
        u16 sub_vendor;
@@ -275,9 +273,8 @@ static int __devinit a4t_pci_probe(struct pci_dev *dev_a4t,
        return (-1);                    /* continue looping */
 }
 
-static int __devinit a4t_cs_init(struct IsdnCard *card,
-                                struct IsdnCardState *cs,
-                                u_int pci_memaddr)
+static int a4t_cs_init(struct IsdnCard *card, struct IsdnCardState *cs,
+                      u_int pci_memaddr)
 {
        I20_REGISTER_FILE *pI20_Regs;
 
@@ -323,10 +320,9 @@ static int __devinit a4t_cs_init(struct IsdnCard *card,
        return (1);
 }
 
-static struct pci_dev *dev_a4t __devinitdata = NULL;
+static struct pci_dev *dev_a4t = NULL;
 
-int __devinit
-setup_bkm_a4t(struct IsdnCard *card)
+int setup_bkm_a4t(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index c9c98f071af6cd0b7d776f378d369e80d1c9e812..dd663ea57ec6679301e9f633fa8e1792692d7458 100644 (file)
@@ -255,8 +255,7 @@ BKM_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-static int __devinit
-sct_alloc_io(u_int adr, u_int len)
+static int sct_alloc_io(u_int adr, u_int len)
 {
        if (!request_region(adr, len, "scitel")) {
                printk(KERN_WARNING
@@ -267,15 +266,14 @@ sct_alloc_io(u_int adr, u_int len)
        return (0);
 }
 
-static struct pci_dev *dev_a8 __devinitdata = NULL;
-static u16  sub_vendor_id __devinitdata = 0;
-static u16  sub_sys_id __devinitdata = 0;
-static u_char pci_bus __devinitdata = 0;
-static u_char pci_device_fn __devinitdata = 0;
-static u_char pci_irq __devinitdata = 0;
+static struct pci_dev *dev_a8 = NULL;
+static u16  sub_vendor_id = 0;
+static u16  sub_sys_id = 0;
+static u_char pci_bus = 0;
+static u_char pci_device_fn = 0;
+static u_char pci_irq = 0;
 
-int __devinit
-setup_sct_quadro(struct IsdnCard *card)
+int setup_sct_quadro(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index b5edc0eeec06face7b51ad12220db56139cec667..bf04d2a3cf4afe4614765b2b3d08d32ec77571a6 100644 (file)
@@ -338,11 +338,11 @@ static int io[HISAX_MAX_CARDS] = { 0, };
 #define IO0_IO1
 #endif
 #ifdef IO0_IO1
-static int io0[HISAX_MAX_CARDS] __devinitdata = { 0, };
-static int io1[HISAX_MAX_CARDS] __devinitdata = { 0, };
+static int io0[HISAX_MAX_CARDS] = { 0, };
+static int io1[HISAX_MAX_CARDS] = { 0, };
 #endif
-static int irq[HISAX_MAX_CARDS] __devinitdata = { 0, };
-static int mem[HISAX_MAX_CARDS] __devinitdata = { 0, };
+static int irq[HISAX_MAX_CARDS] = { 0, };
+static int mem[HISAX_MAX_CARDS] = { 0, };
 static char *id = HiSaxID;
 
 MODULE_DESCRIPTION("ISDN4Linux: Driver for passive ISDN cards");
@@ -852,7 +852,7 @@ static int init_card(struct IsdnCardState *cs)
        return 3;
 }
 
-static int __devinit hisax_cs_setup_card(struct IsdnCard *card)
+static int hisax_cs_setup_card(struct IsdnCard *card)
 {
        int ret;
 
@@ -1171,12 +1171,8 @@ outf_cs:
        return 0;
 }
 
-/* Used from an exported function but calls __devinit functions.
- * Tell modpost not to warn (__ref)
- */
-static int __ref checkcard(int cardnr, char *id, int *busy_flag,
-                          struct module *lockowner,
-                          hisax_setup_func_t card_setup)
+static int checkcard(int cardnr, char *id, int *busy_flag,
+                    struct module *lockowner, hisax_setup_func_t card_setup)
 {
        int ret;
        struct IsdnCard *card = cards + cardnr;
@@ -1547,9 +1543,7 @@ static void __exit HiSax_exit(void)
        printk(KERN_INFO "HiSax module removed\n");
 }
 
-#ifdef CONFIG_HOTPLUG
-
-int __devinit hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
+int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
 {
        u_char ids[16];
        int ret = -1;
@@ -1568,9 +1562,7 @@ int __devinit hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *
 error:
        return ret;
 }
-
 EXPORT_SYMBOL(hisax_init_pcmcia);
-#endif
 
 EXPORT_SYMBOL(HiSax_closecard);
 
@@ -1917,7 +1909,7 @@ static void EChannel_proc_rcv(struct hisax_d_if *d_if)
 #ifdef CONFIG_PCI
 #include <linux/pci.h>
 
-static struct pci_device_id hisax_pci_tbl[] __devinitdata __used = {
+static struct pci_device_id hisax_pci_tbl[] __used = {
 #ifdef CONFIG_HISAX_FRITZPCI
        {PCI_VDEVICE(AVM,      PCI_DEVICE_ID_AVM_A1)                    },
 #endif
index 62a2945fa7f2c2eaa011ab68522ec083c6030a43..8d0cf6e4dc00590a7d62f455d77bcc192de9dfa1 100644 (file)
@@ -904,7 +904,7 @@ Diva_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-static int __devinit setup_diva_common(struct IsdnCardState *cs)
+static int setup_diva_common(struct IsdnCardState *cs)
 {
        int bytecnt;
        u_char val;
@@ -997,7 +997,7 @@ static int __devinit setup_diva_common(struct IsdnCardState *cs)
 
 #ifdef CONFIG_ISA
 
-static int __devinit setup_diva_isa(struct IsdnCard *card)
+static int setup_diva_isa(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        u_char val;
@@ -1033,7 +1033,7 @@ static int __devinit setup_diva_isa(struct IsdnCard *card)
 
 #else  /* if !CONFIG_ISA */
 
-static int __devinit setup_diva_isa(struct IsdnCard *card)
+static int setup_diva_isa(struct IsdnCard *card)
 {
        return (-1);    /* card not found; continue search */
 }
@@ -1041,7 +1041,7 @@ static int __devinit setup_diva_isa(struct IsdnCard *card)
 #endif /* CONFIG_ISA */
 
 #ifdef __ISAPNP__
-static struct isapnp_device_id diva_ids[] __devinitdata = {
+static struct isapnp_device_id diva_ids[] = {
        { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
          ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
          (unsigned long) "Diva picola" },
@@ -1063,10 +1063,10 @@ static struct isapnp_device_id diva_ids[] __devinitdata = {
        { 0, }
 };
 
-static struct isapnp_device_id *ipid __devinitdata = &diva_ids[0];
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct isapnp_device_id *ipid = &diva_ids[0];
+static struct pnp_card *pnp_c = NULL;
 
-static int __devinit setup_diva_isapnp(struct IsdnCard *card)
+static int setup_diva_isapnp(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        struct pnp_dev *pnp_d;
@@ -1141,7 +1141,7 @@ static int __devinit setup_diva_isapnp(struct IsdnCard *card)
 
 #else  /* if !ISAPNP */
 
-static int __devinit setup_diva_isapnp(struct IsdnCard *card)
+static int setup_diva_isapnp(struct IsdnCard *card)
 {
        return (-1);    /* card not found; continue search */
 }
@@ -1149,12 +1149,12 @@ static int __devinit setup_diva_isapnp(struct IsdnCard *card)
 #endif /* ISAPNP */
 
 #ifdef CONFIG_PCI
-static struct pci_dev *dev_diva __devinitdata = NULL;
-static struct pci_dev *dev_diva_u __devinitdata = NULL;
-static struct pci_dev *dev_diva201 __devinitdata = NULL;
-static struct pci_dev *dev_diva202 __devinitdata = NULL;
+static struct pci_dev *dev_diva = NULL;
+static struct pci_dev *dev_diva_u = NULL;
+static struct pci_dev *dev_diva201 = NULL;
+static struct pci_dev *dev_diva202 = NULL;
 
-static int __devinit setup_diva_pci(struct IsdnCard *card)
+static int setup_diva_pci(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
 
@@ -1231,15 +1231,14 @@ static int __devinit setup_diva_pci(struct IsdnCard *card)
 
 #else  /* if !CONFIG_PCI */
 
-static int __devinit setup_diva_pci(struct IsdnCard *card)
+static int setup_diva_pci(struct IsdnCard *card)
 {
        return (-1);    /* card not found; continue search */
 }
 
 #endif /* CONFIG_PCI */
 
-int __devinit
-setup_diva(struct IsdnCard *card)
+int setup_diva(struct IsdnCard *card)
 {
        int rc, have_card = 0;
        struct IsdnCardState *cs = card->cs;
index 64ba26a4afe649818a23565fc4ae6631eaf9d9b1..1df6f9a56ca26926a9e684869e5471cfebc98e82 100644 (file)
@@ -831,8 +831,7 @@ probe_elsa(struct IsdnCardState *cs)
        return (CARD_portlist[i]);
 }
 
-static int __devinit
-setup_elsa_isa(struct IsdnCard *card)
+static int setup_elsa_isa(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        u_char val;
@@ -902,7 +901,7 @@ setup_elsa_isa(struct IsdnCard *card)
 }
 
 #ifdef __ISAPNP__
-static struct isapnp_device_id elsa_ids[] __devinitdata = {
+static struct isapnp_device_id elsa_ids[] = {
        { ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
          ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
          (unsigned long) "Elsa QS1000" },
@@ -912,12 +911,11 @@ static struct isapnp_device_id elsa_ids[] __devinitdata = {
        { 0, }
 };
 
-static struct isapnp_device_id *ipid __devinitdata = &elsa_ids[0];
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct isapnp_device_id *ipid = &elsa_ids[0];
+static struct pnp_card *pnp_c = NULL;
 #endif /* __ISAPNP__ */
 
-static int __devinit
-setup_elsa_isapnp(struct IsdnCard *card)
+static int setup_elsa_isapnp(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
 
@@ -994,8 +992,7 @@ setup_elsa_isapnp(struct IsdnCard *card)
        return (1);
 }
 
-static void __devinit
-setup_elsa_pcmcia(struct IsdnCard *card)
+static void setup_elsa_pcmcia(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        u_char val;
@@ -1027,11 +1024,10 @@ setup_elsa_pcmcia(struct IsdnCard *card)
 }
 
 #ifdef CONFIG_PCI
-static struct pci_dev *dev_qs1000 __devinitdata = NULL;
-static struct pci_dev *dev_qs3000 __devinitdata = NULL;
+static struct pci_dev *dev_qs1000 = NULL;
+static struct pci_dev *dev_qs3000 = NULL;
 
-static int __devinit
-setup_elsa_pci(struct IsdnCard *card)
+static int setup_elsa_pci(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
 
@@ -1089,15 +1085,13 @@ setup_elsa_pci(struct IsdnCard *card)
 
 #else
 
-static int __devinit
-setup_elsa_pci(struct IsdnCard *card)
+static int setup_elsa_pci(struct IsdnCard *card)
 {
        return (1);
 }
 #endif /* CONFIG_PCI */
 
-static int __devinit
-setup_elsa_common(struct IsdnCard *card)
+static int setup_elsa_common(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        u_char val;
@@ -1212,8 +1206,7 @@ setup_elsa_common(struct IsdnCard *card)
        return (1);
 }
 
-int __devinit
-setup_elsa(struct IsdnCard *card)
+int setup_elsa(struct IsdnCard *card)
 {
        int rc;
        struct IsdnCardState *cs = card->cs;
index a8c4d3fc9a6d6d8d7000ae8f6a5a6d4b02ca3d34..ebe56918f6fc5e0bbd52d2a4ca6231c41cd83fc1 100644 (file)
@@ -62,9 +62,9 @@ MODULE_LICENSE("Dual MPL/GPL");
 static int protocol = 2;        /* EURO-ISDN Default */
 module_param(protocol, int, 0);
 
-static int elsa_cs_config(struct pcmcia_device *link) __devinit;
+static int elsa_cs_config(struct pcmcia_device *link);
 static void elsa_cs_release(struct pcmcia_device *link);
-static void elsa_cs_detach(struct pcmcia_device *p_dev) __devexit;
+static void elsa_cs_detach(struct pcmcia_device *p_dev);
 
 typedef struct local_info_t {
        struct pcmcia_device    *p_dev;
@@ -72,7 +72,7 @@ typedef struct local_info_t {
        int                     cardnr;
 } local_info_t;
 
-static int __devinit elsa_cs_probe(struct pcmcia_device *link)
+static int elsa_cs_probe(struct pcmcia_device *link)
 {
        local_info_t *local;
 
@@ -90,7 +90,7 @@ static int __devinit elsa_cs_probe(struct pcmcia_device *link)
        return elsa_cs_config(link);
 } /* elsa_cs_attach */
 
-static void __devexit elsa_cs_detach(struct pcmcia_device *link)
+static void elsa_cs_detach(struct pcmcia_device *link)
 {
        local_info_t *info = link->priv;
 
@@ -126,7 +126,7 @@ static int elsa_cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
        return -ENODEV;
 }
 
-static int __devinit elsa_cs_config(struct pcmcia_device *link)
+static int elsa_cs_config(struct pcmcia_device *link)
 {
        int i;
        IsdnCard_t icard;
@@ -210,7 +210,7 @@ static struct pcmcia_driver elsa_cs_driver = {
        .owner          = THIS_MODULE,
        .name           = "elsa_cs",
        .probe          = elsa_cs_probe,
-       .remove         = __devexit_p(elsa_cs_detach),
+       .remove         = elsa_cs_detach,
        .id_table       = elsa_ids,
        .suspend        = elsa_suspend,
        .resume         = elsa_resume,
index b1e38b54ebac9dbc7d8dc60742f6b1df0ebde02b..e8d431a8302dad6048dd421eb7095e692c28c250 100644 (file)
@@ -300,8 +300,7 @@ enpci_interrupt(int intno, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit en_pci_probe(struct pci_dev *dev_netjet,
-                                 struct IsdnCardState *cs)
+static int en_pci_probe(struct pci_dev *dev_netjet, struct IsdnCardState *cs)
 {
        if (pci_enable_device(dev_netjet))
                return (0);
@@ -326,8 +325,7 @@ static int __devinit en_pci_probe(struct pci_dev *dev_netjet,
        return (1);
 }
 
-static void __devinit en_cs_init(struct IsdnCard *card,
-                                struct IsdnCardState *cs)
+static void en_cs_init(struct IsdnCard *card, struct IsdnCardState *cs)
 {
        cs->hw.njet.auxa = cs->hw.njet.base + NETJET_AUXDATA;
        cs->hw.njet.isac = cs->hw.njet.base + 0xC0; // Fenster zum AMD
@@ -350,8 +348,7 @@ static void __devinit en_cs_init(struct IsdnCard *card,
        outb(cs->hw.njet.auxd, cs->hw.njet.auxa);
 }
 
-static int __devinit en_cs_init_rest(struct IsdnCard *card,
-                                    struct IsdnCardState *cs)
+static int en_cs_init_rest(struct IsdnCard *card, struct IsdnCardState *cs)
 {
        const int bytecnt = 256;
 
@@ -384,11 +381,10 @@ static int __devinit en_cs_init_rest(struct IsdnCard *card,
        return (1);
 }
 
-static struct pci_dev *dev_netjet __devinitdata = NULL;
+static struct pci_dev *dev_netjet = NULL;
 
 /* called by config.c */
-int __devinit
-setup_enternow_pci(struct IsdnCard *card)
+int setup_enternow_pci(struct IsdnCard *card)
 {
        int ret;
        struct IsdnCardState *cs = card->cs;
index 4fef775625549824e60e61eab9a0c478cccb40fc..35c6df6534ecde8507c417a61a1c93f41fa4a293 100644 (file)
@@ -483,8 +483,7 @@ error:
        return 1;
 }
 
-static int __devinit
-setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs)
+static int setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs)
 {
        printk(KERN_INFO "Gazel: ISA PnP card automatic recognition\n");
        // we got an irq parameter, assume it is an ISA card
@@ -532,10 +531,9 @@ setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs)
 }
 
 #ifdef CONFIG_PCI
-static struct pci_dev *dev_tel __devinitdata = NULL;
+static struct pci_dev *dev_tel = NULL;
 
-static int __devinit
-setup_gazelpci(struct IsdnCardState *cs)
+static int setup_gazelpci(struct IsdnCardState *cs)
 {
        u_int pci_ioaddr0 = 0, pci_ioaddr1 = 0;
        u_char pci_irq = 0, found;
@@ -622,8 +620,7 @@ setup_gazelpci(struct IsdnCardState *cs)
 }
 #endif /* CONFIG_PCI */
 
-int __devinit
-setup_gazel(struct IsdnCard *card)
+int setup_gazel(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index dea04de8e7ca292005e4a1e1b13774977ffd8c36..c49c294fc81ef2176039421f6f0c6886d5e7167a 100644 (file)
@@ -1497,7 +1497,7 @@ enable_pci_ports(hfc4s8s_hw *hw)
 /* initialise the HFC-4s/8s hardware */
 /* return 0 on success.              */
 /*************************************/
-static int __devinit
+static int
 setup_instance(hfc4s8s_hw *hw)
 {
        int err = -EIO;
@@ -1585,7 +1585,7 @@ out:
 /*****************************************/
 /* PCI hotplug interface: probe new card */
 /*****************************************/
-static int __devinit
+static int
 hfc4s8s_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int err = -ENOMEM;
@@ -1640,7 +1640,7 @@ out:
 /**************************************/
 /* PCI hotplug interface: remove card */
 /**************************************/
-static void __devexit
+static void
 hfc4s8s_remove(struct pci_dev *pdev)
 {
        hfc4s8s_hw *hw = pci_get_drvdata(pdev);
@@ -1662,7 +1662,7 @@ hfc4s8s_remove(struct pci_dev *pdev)
 static struct pci_driver hfc4s8s_driver = {
        .name   = "hfc4s8s_l1",
        .probe  = hfc4s8s_probe,
-       .remove = __devexit_p(hfc4s8s_remove),
+       .remove = hfc4s8s_remove,
        .id_table       = hfc4s8s_ids,
 };
 
@@ -1688,14 +1688,6 @@ hfc4s8s_module_init(void)
        }
        printk(KERN_INFO "HFC-4S/8S: found %d cards\n", card_cnt);
 
-#if !defined(CONFIG_HOTPLUG)
-       if (err == 0) {
-               err = -ENODEV;
-               pci_unregister_driver(&hfc4s8s_driver);
-               goto out;
-       }
-#endif
-
        return 0;
 out:
        return (err);
index f60d4be589414149f1ca7e6f9157d37012ef2d24..3ccd724ff8c2812eb0af3fae58e6742d16970cd5 100644 (file)
@@ -1632,9 +1632,9 @@ hfcpci_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 
 
 /* this variable is used as card index when more than one cards are present */
-static struct pci_dev *dev_hfcpci __devinitdata = NULL;
+static struct pci_dev *dev_hfcpci = NULL;
 
-int __devinit
+int
 setup_hfcpci(struct IsdnCard *card)
 {
        u_long flags;
index 4ec279ce052f0fc64f2d822b46a463fb562717fa..90f34ae2b80fb340401abbe0c9941a3a95cfc736 100644 (file)
@@ -1381,19 +1381,18 @@ hfcsx_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 }
 
 #ifdef __ISAPNP__
-static struct isapnp_device_id hfc_ids[] __devinitdata = {
+static struct isapnp_device_id hfc_ids[] = {
        { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620),
          ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620),
          (unsigned long) "Teles 16.3c2" },
        { 0, }
 };
 
-static struct isapnp_device_id *ipid __devinitdata = &hfc_ids[0];
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct isapnp_device_id *ipid = &hfc_ids[0];
+static struct pnp_card *pnp_c = NULL;
 #endif
 
-int __devinit
-setup_hfcsx(struct IsdnCard *card)
+int setup_hfcsx(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index a5f048bd2bb3fcc04910e8cc27a6a6f58d561f6e..394da646e97b7316e618f054519095f83c338caa 100644 (file)
@@ -136,7 +136,7 @@ hfcs_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 }
 
 #ifdef __ISAPNP__
-static struct isapnp_device_id hfc_ids[] __devinitdata = {
+static struct isapnp_device_id hfc_ids[] = {
        { ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114),
          ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114),
          (unsigned long) "Acer P10" },
@@ -161,12 +161,11 @@ static struct isapnp_device_id hfc_ids[] __devinitdata = {
        { 0, }
 };
 
-static struct isapnp_device_id *ipid __devinitdata = &hfc_ids[0];
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct isapnp_device_id *ipid = &hfc_ids[0];
+static struct pnp_card *pnp_c = NULL;
 #endif
 
-int __devinit
-setup_hfcs(struct IsdnCard *card)
+int setup_hfcs(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index e4f47fe3f7fd00bcfb5f2be03a32dad793f640f5..5e8a5d967162e919f5db3856e3f897e71718c593 100644 (file)
@@ -70,7 +70,7 @@ static struct pci_device_id fcpci_ids[] = {
 MODULE_DEVICE_TABLE(pci, fcpci_ids);
 
 #ifdef CONFIG_PNP
-static struct pnp_device_id fcpnp_ids[] __devinitdata = {
+static struct pnp_device_id fcpnp_ids[] = {
        {
                .id             = "AVM0900",
                .driver_data    = (unsigned long) "Fritz!Card PnP",
@@ -712,7 +712,7 @@ static inline void fcpci_init(struct fritz_adapter *adapter)
 
 // ----------------------------------------------------------------------
 
-static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter)
+static int fcpcipnp_setup(struct fritz_adapter *adapter)
 {
        u32 val = 0;
        int retval;
@@ -825,7 +825,7 @@ err:
        return retval;
 }
 
-static void __devexit fcpcipnp_release(struct fritz_adapter *adapter)
+static void fcpcipnp_release(struct fritz_adapter *adapter)
 {
        DBG(1, "");
 
@@ -836,8 +836,7 @@ static void __devexit fcpcipnp_release(struct fritz_adapter *adapter)
 
 // ----------------------------------------------------------------------
 
-static struct fritz_adapter * __devinit
-new_adapter(void)
+static struct fritz_adapter *new_adapter(void)
 {
        struct fritz_adapter *adapter;
        struct hisax_b_if *b_if[2];
@@ -876,8 +875,7 @@ static void delete_adapter(struct fritz_adapter *adapter)
        kfree(adapter);
 }
 
-static int __devinit fcpci_probe(struct pci_dev *pdev,
-                                const struct pci_device_id *ent)
+static int fcpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct fritz_adapter *adapter;
        int retval;
@@ -917,7 +915,7 @@ err:
 }
 
 #ifdef CONFIG_PNP
-static int __devinit fcpnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
+static int fcpnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
 {
        struct fritz_adapter *adapter;
        int retval;
@@ -959,7 +957,7 @@ err:
        return retval;
 }
 
-static void __devexit fcpnp_remove(struct pnp_dev *pdev)
+static void fcpnp_remove(struct pnp_dev *pdev)
 {
        struct fritz_adapter *adapter = pnp_get_drvdata(pdev);
 
@@ -973,12 +971,12 @@ static void __devexit fcpnp_remove(struct pnp_dev *pdev)
 static struct pnp_driver fcpnp_driver = {
        .name           = "fcpnp",
        .probe          = fcpnp_probe,
-       .remove         = __devexit_p(fcpnp_remove),
+       .remove         = fcpnp_remove,
        .id_table       = fcpnp_ids,
 };
 #endif
 
-static void __devexit fcpci_remove(struct pci_dev *pdev)
+static void fcpci_remove(struct pci_dev *pdev)
 {
        struct fritz_adapter *adapter = pci_get_drvdata(pdev);
 
@@ -990,7 +988,7 @@ static void __devexit fcpci_remove(struct pci_dev *pdev)
 static struct pci_driver fcpci_driver = {
        .name           = "fcpci",
        .probe          = fcpci_probe,
-       .remove         = __devexit_p(fcpci_remove),
+       .remove         = fcpci_remove,
        .id_table       = fcpci_ids,
 };
 
index 7be762b17c70c5163caaee37b19dcbc718644300..db5321f6379b0a454ffba83241abf540070138f9 100644 (file)
@@ -673,8 +673,7 @@ clear_pending_icc_ints(struct IsdnCardState *cs)
        cs->writeisac(cs, ICC_MASK, 0xFF);
 }
 
-void __devinit
-setup_icc(struct IsdnCardState *cs)
+void setup_icc(struct IsdnCardState *cs)
 {
        INIT_WORK(&cs->tqueue, icc_bh);
        cs->dbusytimer.function = (void *) dbusy_timer_handler;
index bcd70a3873074974909630906afcbac98ca6ad4f..a365ccc1c99c886f94df163ab3b60280e20b9b49 100644 (file)
 #define DBUSY_TIMER_VALUE 80
 #define ARCOFI_USE 1
 
-static char *ISACVer[] __devinitdata =
+static char *ISACVer[] =
 {"2086/2186 V1.1", "2085 B1", "2085 B2",
  "2085 V2.3"};
 
-void __devinit ISACVersion(struct IsdnCardState *cs, char *s)
+void ISACVersion(struct IsdnCardState *cs, char *s)
 {
        int val;
 
@@ -669,8 +669,7 @@ void clear_pending_isac_ints(struct IsdnCardState *cs)
        cs->writeisac(cs, ISAC_MASK, 0xFF);
 }
 
-void __devinit
-setup_isac(struct IsdnCardState *cs)
+void setup_isac(struct IsdnCardState *cs)
 {
        INIT_WORK(&cs->tqueue, isac_bh);
        cs->dbusytimer.function = (void *) dbusy_timer_handler;
index c1530fe248c265a927f29009db48c3014134880a..1399ddd4f6cb3b62bdae723b63e0ffe86461a615 100644 (file)
@@ -194,11 +194,10 @@ isurf_auxcmd(struct IsdnCardState *cs, isdn_ctrl *ic) {
 }
 
 #ifdef __ISAPNP__
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct pnp_card *pnp_c = NULL;
 #endif
 
-int __devinit
-setup_isurf(struct IsdnCard *card)
+int setup_isurf(struct IsdnCard *card)
 {
        int ver;
        struct IsdnCardState *cs = card->cs;
index 5f299f82b801a3554f55f659b1e455014d3ccc70..7ae39f5e865defc018a81aa555787bba5b78f07b 100644 (file)
@@ -209,7 +209,7 @@ ix1_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 }
 
 #ifdef __ISAPNP__
-static struct isapnp_device_id itk_ids[] __devinitdata = {
+static struct isapnp_device_id itk_ids[] = {
        { ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25),
          ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25),
          (unsigned long) "ITK micro 2" },
@@ -219,13 +219,12 @@ static struct isapnp_device_id itk_ids[] __devinitdata = {
        { 0, }
 };
 
-static struct isapnp_device_id *ipid __devinitdata = &itk_ids[0];
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct isapnp_device_id *ipid = &itk_ids[0];
+static struct pnp_card *pnp_c = NULL;
 #endif
 
 
-int __devinit
-setup_ix1micro(struct IsdnCard *card)
+int setup_ix1micro(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index 08a6b7fb17f7769e406eb8927d5d0eba9df501e7..93398676f78fd2529b6fd2fd9670c7a96a2268b9 100644 (file)
@@ -187,8 +187,7 @@ mic_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-int __devinit
-setup_mic(struct IsdnCard *card)
+int setup_mic(struct IsdnCard *card)
 {
        int bytecnt;
        struct IsdnCardState *cs = card->cs;
index 6569e0315cca2c3a2a0a016ad7dc76cf245f6a99..e4c33cfe3ef489f7a26eefcebdba625e039cb9d5 100644 (file)
@@ -223,10 +223,10 @@ static int niccy_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 }
 
 #ifdef __ISAPNP__
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct pnp_card *pnp_c = NULL;
 #endif
 
-int __devinit setup_niccy(struct IsdnCard *card)
+int setup_niccy(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
@@ -298,7 +298,7 @@ int __devinit setup_niccy(struct IsdnCard *card)
                }
        } else {
 #ifdef CONFIG_PCI
-               static struct pci_dev *niccy_dev __devinitdata;
+               static struct pci_dev *niccy_dev;
 
                u_int pci_ioaddr;
                cs->subtyp = 0;
index f36ff69c07e1c870c7881c9f7e817d841ff5e0f1..32b4bbd18eb9237208eb13f4c95e567bd237b750 100644 (file)
@@ -148,8 +148,7 @@ NETjet_S_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-static int __devinit njs_pci_probe(struct pci_dev *dev_netjet,
-                                  struct IsdnCardState *cs)
+static int njs_pci_probe(struct pci_dev *dev_netjet, struct IsdnCardState *cs)
 {
        u32 cfg;
 
@@ -187,8 +186,7 @@ static int __devinit njs_pci_probe(struct pci_dev *dev_netjet,
        return (1);
 }
 
-static int __devinit njs_cs_init(struct IsdnCard *card,
-                                struct IsdnCardState *cs)
+static int njs_cs_init(struct IsdnCard *card, struct IsdnCardState *cs)
 {
 
        cs->hw.njet.auxa = cs->hw.njet.base + NETJET_AUXDATA;
@@ -225,8 +223,7 @@ static int __devinit njs_cs_init(struct IsdnCard *card,
        return 1;                       /* end loop */
 }
 
-static int __devinit njs_cs_init_rest(struct IsdnCard *card,
-                                     struct IsdnCardState *cs)
+static int njs_cs_init_rest(struct IsdnCard *card, struct IsdnCardState *cs)
 {
        const int bytecnt = 256;
 
@@ -256,10 +253,9 @@ static int __devinit njs_cs_init_rest(struct IsdnCard *card,
        return (1);
 }
 
-static struct pci_dev *dev_netjet __devinitdata = NULL;
+static struct pci_dev *dev_netjet = NULL;
 
-int __devinit
-setup_netjet_s(struct IsdnCard *card)
+int setup_netjet_s(struct IsdnCard *card)
 {
        int ret;
        struct IsdnCardState *cs = card->cs;
index 333484aef425640e7d7cdb13ff7de983b3cb5bfb..4e8adbede361d5ddc147cbc811eda65f82a807f6 100644 (file)
@@ -128,8 +128,7 @@ NETjet_U_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-static int __devinit nju_pci_probe(struct pci_dev *dev_netjet,
-                                  struct IsdnCardState *cs)
+static int nju_pci_probe(struct pci_dev *dev_netjet, struct IsdnCardState *cs)
 {
        if (pci_enable_device(dev_netjet))
                return (0);
@@ -148,8 +147,7 @@ static int __devinit nju_pci_probe(struct pci_dev *dev_netjet,
        return (1);
 }
 
-static int __devinit nju_cs_init(struct IsdnCard *card,
-                                struct IsdnCardState *cs)
+static int nju_cs_init(struct IsdnCard *card, struct IsdnCardState *cs)
 {
        cs->hw.njet.auxa = cs->hw.njet.base + NETJET_AUXDATA;
        cs->hw.njet.isac = cs->hw.njet.base | NETJET_ISAC_OFF;
@@ -187,8 +185,7 @@ static int __devinit nju_cs_init(struct IsdnCard *card,
        return 1;                       /* end loop */
 }
 
-static int __devinit nju_cs_init_rest(struct IsdnCard *card,
-                                     struct IsdnCardState *cs)
+static int nju_cs_init_rest(struct IsdnCard *card, struct IsdnCardState *cs)
 {
        const int bytecnt = 256;
 
@@ -219,10 +216,9 @@ static int __devinit nju_cs_init_rest(struct IsdnCard *card,
        return (1);
 }
 
-static struct pci_dev *dev_netjet __devinitdata = NULL;
+static struct pci_dev *dev_netjet = NULL;
 
-int __devinit
-setup_netjet_u(struct IsdnCard *card)
+int setup_netjet_u(struct IsdnCard *card)
 {
        int ret;
        struct IsdnCardState *cs = card->cs;
index 383c4e7ce50b5012c3bd501d4207ea54be7f97d6..4e7d0aa227ad887e23a1550f1d44f7cdb20f64a7 100644 (file)
@@ -210,8 +210,7 @@ S0Box_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-int __devinit
-setup_s0box(struct IsdnCard *card)
+int setup_s0box(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index 75dcae6d36e0b55d016117982d76b3f8ade315b9..6b2d0eccdd562dcee54e5e0917474a8bf56e4eee 100644 (file)
@@ -240,8 +240,7 @@ saphir_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 }
 
 
-int __devinit
-setup_saphir(struct IsdnCard *card)
+int setup_saphir(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index 1ee531b6be9978003b2bcbcf695bb425877b83af..f16a47bcef485cc41dcf688e2d87a48ef1b7aa87 100644 (file)
@@ -517,7 +517,7 @@ Sedl_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 }
 
 #ifdef __ISAPNP__
-static struct isapnp_device_id sedl_ids[] __devinitdata = {
+static struct isapnp_device_id sedl_ids[] = {
        { ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01),
          ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01),
          (unsigned long) "Speed win" },
@@ -527,11 +527,10 @@ static struct isapnp_device_id sedl_ids[] __devinitdata = {
        { 0, }
 };
 
-static struct isapnp_device_id *ipid __devinitdata = &sedl_ids[0];
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct isapnp_device_id *ipid = &sedl_ids[0];
+static struct pnp_card *pnp_c = NULL;
 
-static int __devinit
-setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
+static int setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
 {
        struct IsdnCardState *cs = card->cs;
        struct pnp_dev *pnp_d;
@@ -591,18 +590,16 @@ setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
 }
 #else
 
-static int __devinit
-setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
+static int setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt)
 {
        return -1;
 }
 #endif /* __ISAPNP__ */
 
 #ifdef CONFIG_PCI
-static struct pci_dev *dev_sedl __devinitdata = NULL;
+static struct pci_dev *dev_sedl = NULL;
 
-static int __devinit
-setup_sedlbauer_pci(struct IsdnCard *card)
+static int setup_sedlbauer_pci(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        u16 sub_vendor_id, sub_id;
@@ -667,16 +664,14 @@ setup_sedlbauer_pci(struct IsdnCard *card)
 
 #else
 
-static int __devinit
-setup_sedlbauer_pci(struct IsdnCard *card)
+static int setup_sedlbauer_pci(struct IsdnCard *card)
 {
        return (1);
 }
 
 #endif /* CONFIG_PCI */
 
-int __devinit
-setup_sedlbauer(struct IsdnCard *card)
+int setup_sedlbauer(struct IsdnCard *card)
 {
        int bytecnt = 8, ver, val, rc;
        struct IsdnCardState *cs = card->cs;
index f0dfc0c976eb780cfd131478c964c00ad9e4c71f..90f81291641b714f45236b698b2caf54b5d1624a 100644 (file)
@@ -62,10 +62,10 @@ MODULE_LICENSE("Dual MPL/GPL");
 static int protocol = 2;        /* EURO-ISDN Default */
 module_param(protocol, int, 0);
 
-static int sedlbauer_config(struct pcmcia_device *link) __devinit;
+static int sedlbauer_config(struct pcmcia_device *link);
 static void sedlbauer_release(struct pcmcia_device *link);
 
-static void sedlbauer_detach(struct pcmcia_device *p_dev) __devexit;
+static void sedlbauer_detach(struct pcmcia_device *p_dev);
 
 typedef struct local_info_t {
        struct pcmcia_device    *p_dev;
@@ -73,7 +73,7 @@ typedef struct local_info_t {
        int                     cardnr;
 } local_info_t;
 
-static int __devinit sedlbauer_probe(struct pcmcia_device *link)
+static int sedlbauer_probe(struct pcmcia_device *link)
 {
        local_info_t *local;
 
@@ -90,7 +90,7 @@ static int __devinit sedlbauer_probe(struct pcmcia_device *link)
        return sedlbauer_config(link);
 } /* sedlbauer_attach */
 
-static void __devexit sedlbauer_detach(struct pcmcia_device *link)
+static void sedlbauer_detach(struct pcmcia_device *link)
 {
        dev_dbg(&link->dev, "sedlbauer_detach(0x%p)\n", link);
 
@@ -110,7 +110,7 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev, void *priv_data)
        return pcmcia_request_io(p_dev);
 }
 
-static int __devinit sedlbauer_config(struct pcmcia_device *link)
+static int sedlbauer_config(struct pcmcia_device *link)
 {
        int ret;
        IsdnCard_t  icard;
@@ -201,7 +201,7 @@ static struct pcmcia_driver sedlbauer_driver = {
        .owner          = THIS_MODULE,
        .name           = "sedlbauer_cs",
        .probe          = sedlbauer_probe,
-       .remove         = __devexit_p(sedlbauer_detach),
+       .remove         = sedlbauer_detach,
        .id_table       = sedlbauer_ids,
        .suspend        = sedlbauer_suspend,
        .resume         = sedlbauer_resume,
index 1267298ef551b0a707cba1f11e92017ad9094743..18cee6360d0a330672fc58f3caf811e3d9b46b64 100644 (file)
@@ -183,8 +183,7 @@ Sportster_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-static int __devinit
-get_io_range(struct IsdnCardState *cs)
+static int get_io_range(struct IsdnCardState *cs)
 {
        int i, j, adr;
 
@@ -208,8 +207,7 @@ get_io_range(struct IsdnCardState *cs)
        }
 }
 
-int __devinit
-setup_sportster(struct IsdnCard *card)
+int setup_sportster(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index fa329e27cc5b0c07e78f80e95ae83090de7e090c..bf647545c70c45b9bc5b0e381af27f67f17a3662 100644 (file)
@@ -259,8 +259,7 @@ TeleInt_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-int __devinit
-setup_TeleInt(struct IsdnCard *card)
+int setup_TeleInt(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index 49b4a26f91e018be2490c5abf0afee7e65d4bb74..ce9eabdd2f6e26f0b358487180c2cad92a493bbc 100644 (file)
@@ -263,8 +263,7 @@ Teles_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-int __devinit
-setup_teles0(struct IsdnCard *card)
+int setup_teles0(struct IsdnCard *card)
 {
        u_char val;
        struct IsdnCardState *cs = card->cs;
index 220b919fafc3b8cb0f1e15be3f79ac19381fcec1..38fb2c1a3f0f48cdbbf3511a467d09e16b042e33 100644 (file)
@@ -253,7 +253,7 @@ Teles_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 
 #ifdef __ISAPNP__
 
-static struct isapnp_device_id teles_ids[] __devinitdata = {
+static struct isapnp_device_id teles_ids[] = {
        { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2110),
          ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2110),
          (unsigned long) "Teles 16.3 PnP" },
@@ -266,12 +266,11 @@ static struct isapnp_device_id teles_ids[] __devinitdata = {
        { 0, }
 };
 
-static struct isapnp_device_id *ipid __devinitdata = &teles_ids[0];
-static struct pnp_card *pnp_c __devinitdata = NULL;
+static struct isapnp_device_id *ipid = &teles_ids[0];
+static struct pnp_card *pnp_c = NULL;
 #endif
 
-int __devinit
-setup_teles3(struct IsdnCard *card)
+int setup_teles3(struct IsdnCard *card)
 {
        u_char val;
        struct IsdnCardState *cs = card->cs;
index 4deac451807cb5891d12bdd9f2bd1efddffc113a..f2476ffb04fda65d87d146b8729c1ac9080db153 100644 (file)
@@ -43,9 +43,9 @@ MODULE_LICENSE("GPL");
 static int protocol = 2;        /* EURO-ISDN Default */
 module_param(protocol, int, 0);
 
-static int teles_cs_config(struct pcmcia_device *link) __devinit;
+static int teles_cs_config(struct pcmcia_device *link);
 static void teles_cs_release(struct pcmcia_device *link);
-static void teles_detach(struct pcmcia_device *p_dev) __devexit;
+static void teles_detach(struct pcmcia_device *p_dev);
 
 typedef struct local_info_t {
        struct pcmcia_device    *p_dev;
@@ -53,7 +53,7 @@ typedef struct local_info_t {
        int                     cardnr;
 } local_info_t;
 
-static int __devinit teles_probe(struct pcmcia_device *link)
+static int teles_probe(struct pcmcia_device *link)
 {
        local_info_t *local;
 
@@ -72,7 +72,7 @@ static int __devinit teles_probe(struct pcmcia_device *link)
        return teles_cs_config(link);
 } /* teles_attach */
 
-static void __devexit teles_detach(struct pcmcia_device *link)
+static void teles_detach(struct pcmcia_device *link)
 {
        local_info_t *info = link->priv;
 
@@ -108,7 +108,7 @@ static int teles_cs_configcheck(struct pcmcia_device *p_dev, void *priv_data)
        return -ENODEV;
 }
 
-static int __devinit teles_cs_config(struct pcmcia_device *link)
+static int teles_cs_config(struct pcmcia_device *link)
 {
        int i;
        IsdnCard_t icard;
@@ -192,7 +192,7 @@ static struct pcmcia_driver teles_cs_driver = {
        .owner          = THIS_MODULE,
        .name           = "teles_cs",
        .probe          = teles_probe,
-       .remove         = __devexit_p(teles_detach),
+       .remove         = teles_detach,
        .id_table       = teles_ids,
        .suspend        = teles_suspend,
        .resume         = teles_resume,
index 9c002c9dc7715c653957c9017f5c2113b66194ed..f6ab63aa699590278531ba9ae6ceabe75ba90813 100644 (file)
@@ -283,10 +283,9 @@ TelesPCI_card_msg(struct IsdnCardState *cs, int mt, void *arg)
        return (0);
 }
 
-static struct pci_dev *dev_tel __devinitdata = NULL;
+static struct pci_dev *dev_tel = NULL;
 
-int __devinit
-setup_telespci(struct IsdnCard *card)
+int setup_telespci(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index 0f0d094af85b2e3427374446110648245cc53e0e..d8cac69358180ee455c92d99a0c58b8203372203 100644 (file)
@@ -991,10 +991,9 @@ w6692_card_msg(struct IsdnCardState *cs, int mt, void *arg)
 
 static int id_idx;
 
-static struct pci_dev *dev_w6692 __devinitdata = NULL;
+static struct pci_dev *dev_w6692 = NULL;
 
-int __devinit
-setup_w6692(struct IsdnCard *card)
+int setup_w6692(struct IsdnCard *card)
 {
        struct IsdnCardState *cs = card->cs;
        char tmp[64];
index b61bbb4bb52b96e9590ade19442c2764d07641dd..0db2f7506250dccae8987911f8e522a596b6f2f9 100644 (file)
@@ -56,8 +56,8 @@ static hysdn_card *card_last = NULL;  /* pointer to first card */
 /* is assumed and the module will not be kept in memory.                    */
 /****************************************************************************/
 
-static int __devinit hysdn_pci_init_one(struct pci_dev *akt_pcidev,
-                                       const struct pci_device_id *ent)
+static int hysdn_pci_init_one(struct pci_dev *akt_pcidev,
+                             const struct pci_device_id *ent)
 {
        hysdn_card *card;
        int rc;
@@ -109,7 +109,7 @@ err_out:
        return rc;
 }
 
-static void __devexit hysdn_pci_remove_one(struct pci_dev *akt_pcidev)
+static void hysdn_pci_remove_one(struct pci_dev *akt_pcidev)
 {
        hysdn_card *card = pci_get_drvdata(akt_pcidev);
 
@@ -147,7 +147,7 @@ static struct pci_driver hysdn_pci_driver = {
        .name           = "hysdn",
        .id_table       = hysdn_pci_tbl,
        .probe          = hysdn_pci_init_one,
-       .remove         = __devexit_p(hysdn_pci_remove_one),
+       .remove         = hysdn_pci_remove_one,
 };
 
 static int hysdn_have_procfs;
index c401634c00eccb3802aaae1d12e955ac92d8d91e..3e245712bba7e17a9f47e2060fc0dc4fdcd4b7ae 100644 (file)
@@ -140,7 +140,6 @@ static struct device_attribute mISDN_dev_attrs[] = {
        {}
 };
 
-#ifdef CONFIG_HOTPLUG
 static int mISDN_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
        struct mISDNdevice *mdev = dev_to_mISDN(dev);
@@ -153,7 +152,6 @@ static int mISDN_uevent(struct device *dev, struct kobj_uevent_env *env)
 
        return 0;
 }
-#endif
 
 static void mISDN_class_release(struct class *cls)
 {
@@ -163,9 +161,7 @@ static void mISDN_class_release(struct class *cls)
 static struct class mISDN_class = {
        .name = "mISDN",
        .owner = THIS_MODULE,
-#ifdef CONFIG_HOTPLUG
        .dev_uevent = mISDN_uevent,
-#endif
        .dev_attrs = mISDN_dev_attrs,
        .dev_release = mISDN_dev_release,
        .class_release = mISDN_class_release,
index 1885a26776b1b38256756d202639dc5a25a75f5a..a0d931bcb37c5cda58766ff365a0a42dd112f45d 100644 (file)
@@ -127,8 +127,9 @@ static int create_gpio_led(const struct gpio_led *template,
                led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
 
        ret = devm_gpio_request_one(parent, template->gpio,
-                       GPIOF_DIR_OUT | (led_dat->active_low ^ state),
-                       template->name);
+                                   (led_dat->active_low ^ state) ?
+                                   GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
+                                   template->name);
        if (ret < 0)
                return ret;
 
index ef87310b7662415b4fca8f18c212d85090790ee1..ac5c879398604a48da1c193c6b9936a072736c7d 100644 (file)
@@ -679,7 +679,7 @@ void macio_release_resources(struct macio_dev *dev)
 
 #ifdef CONFIG_PCI
 
-static int __devinit macio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int macio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct device_node* np;
        struct macio_chip* chip;
@@ -739,7 +739,7 @@ static int __devinit macio_pci_probe(struct pci_dev *pdev, const struct pci_devi
        return 0;
 }
 
-static void __devexit macio_pci_remove(struct pci_dev* pdev)
+static void macio_pci_remove(struct pci_dev* pdev)
 {
        panic("removing of macio-asic not supported !\n");
 }
@@ -748,7 +748,7 @@ static void __devexit macio_pci_remove(struct pci_dev* pdev)
  * MacIO is matched against any Apple ID, it's probe() function
  * will then decide wether it applies or not
  */
-static const struct pci_device_id __devinitconst pci_ids[] = { {
+static const struct pci_device_id pci_ids[] = { {
        .vendor         = PCI_VENDOR_ID_APPLE,
        .device         = PCI_ANY_ID,
        .subvendor      = PCI_ANY_ID,
index 3f8d032f180fd5c0ec76901742c00cb58212acb1..d98e566a8f5e843abff7ccbafa25be1a957e3cc6 100644 (file)
@@ -556,7 +556,8 @@ static int media_bay_task(void *x)
        return 0;
 }
 
-static int __devinit media_bay_attach(struct macio_dev *mdev, const struct of_device_id *match)
+static int media_bay_attach(struct macio_dev *mdev,
+                           const struct of_device_id *match)
 {
        struct media_bay_info* bay;
        u32 __iomem *regbase;
index 6dc26b61219b423da10ec463df990532440c9ecc..cad0e19b47a285eb4b96ae9d9869f640f26e064e 100644 (file)
@@ -253,7 +253,7 @@ static void rackmeter_do_timer(struct work_struct *work)
                                 msecs_to_jiffies(CPU_SAMPLING_RATE));
 }
 
-static void __devinit rackmeter_init_cpu_sniffer(struct rackmeter *rm)
+static void rackmeter_init_cpu_sniffer(struct rackmeter *rm)
 {
        unsigned int cpu;
 
@@ -287,7 +287,7 @@ static void rackmeter_stop_cpu_sniffer(struct rackmeter *rm)
        cancel_delayed_work_sync(&rm->cpu[1].sniffer);
 }
 
-static int __devinit rackmeter_setup(struct rackmeter *rm)
+static int rackmeter_setup(struct rackmeter *rm)
 {
        pr_debug("rackmeter: setting up i2s..\n");
        rackmeter_setup_i2s(rm);
@@ -362,8 +362,8 @@ static irqreturn_t rackmeter_irq(int irq, void *arg)
        return IRQ_HANDLED;
 }
 
-static int __devinit rackmeter_probe(struct macio_dev* mdev,
-                                    const struct of_device_id *match)
+static int rackmeter_probe(struct macio_dev* mdev,
+                          const struct of_device_id *match)
 {
        struct device_node *i2s = NULL, *np = NULL;
        struct rackmeter *rm = NULL;
@@ -521,7 +521,7 @@ static int __devinit rackmeter_probe(struct macio_dev* mdev,
        return rc;
 }
 
-static int __devexit rackmeter_remove(struct macio_dev* mdev)
+static int rackmeter_remove(struct macio_dev* mdev)
 {
        struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev);
 
@@ -588,7 +588,7 @@ static struct macio_driver rackmeter_driver = {
                .of_match_table = rackmeter_match,
        },
        .probe = rackmeter_probe,
-       .remove = __devexit_p(rackmeter_remove),
+       .remove = rackmeter_remove,
        .shutdown = rackmeter_shutdown,
 };
 
index ac3f243b9c5a15b2528814808865ebf38ea1e472..7c28b71246c994d71bdf1c379b29e4e669ec466b 100644 (file)
@@ -177,9 +177,9 @@ static const struct wf_sensor_ops wf_ad7417_adc_ops = {
        .owner          = THIS_MODULE,
 };
 
-static void __devinit wf_ad7417_add_sensor(struct wf_ad7417_priv *pv,
-                                          int index, const char *name,
-                                          const struct wf_sensor_ops *ops)
+static void wf_ad7417_add_sensor(struct wf_ad7417_priv *pv,
+                                int index, const char *name,
+                                const struct wf_sensor_ops *ops)
 {
        pv->sensors[index].name = kasprintf(GFP_KERNEL, "%s-%d", name, pv->cpu);
        pv->sensors[index].priv = pv;
@@ -188,7 +188,7 @@ static void __devinit wf_ad7417_add_sensor(struct wf_ad7417_priv *pv,
                kref_get(&pv->ref);
 }
 
-static void __devinit wf_ad7417_init_chip(struct wf_ad7417_priv *pv)
+static void wf_ad7417_init_chip(struct wf_ad7417_priv *pv)
 {
        int rc;
        u8 buf[2];
@@ -230,8 +230,8 @@ static void __devinit wf_ad7417_init_chip(struct wf_ad7417_priv *pv)
        pv->config = config;
 }
 
-static int __devinit wf_ad7417_probe(struct i2c_client *client,
-                                    const struct i2c_device_id *id)
+static int wf_ad7417_probe(struct i2c_client *client,
+                          const struct i2c_device_id *id)
 {
        struct wf_ad7417_priv *pv;
        const struct mpu_data *mpu;
@@ -290,7 +290,7 @@ static int __devinit wf_ad7417_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit wf_ad7417_remove(struct i2c_client *client)
+static int wf_ad7417_remove(struct i2c_client *client)
 {
        struct wf_ad7417_priv *pv = dev_get_drvdata(&client->dev);
        int i;
@@ -322,7 +322,7 @@ static struct i2c_driver wf_ad7417_driver = {
        .id_table       = wf_ad7417_id,
 };
 
-static int __devinit wf_ad7417_init(void)
+static int wf_ad7417_init(void)
 {
        /* This is only supported on these machines */
        if (!of_machine_is_compatible("PowerMac7,2") &&
@@ -333,7 +333,7 @@ static int __devinit wf_ad7417_init(void)
        return i2c_add_driver(&wf_ad7417_driver);
 }
 
-static void __devexit wf_ad7417_exit(void)
+static void wf_ad7417_exit(void)
 {
        i2c_del_driver(&wf_ad7417_driver);
 }
index fd6ed15a979dfae62db35fb2fd7ea3ff4f1c650b..0226b796a21c9aa3f1ca2b28b02ca3b66fd6316b 100644 (file)
@@ -282,7 +282,7 @@ static const struct wf_control_ops wf_fcu_fan_pwm_ops = {
        .owner          = THIS_MODULE,
 };
 
-static void __devinit wf_fcu_get_pump_minmax(struct wf_fcu_fan *fan)
+static void wf_fcu_get_pump_minmax(struct wf_fcu_fan *fan)
 {
        const struct mpu_data *mpu = wf_get_mpu(0);
        u16 pump_min = 0, pump_max = 0xffff;
@@ -317,7 +317,7 @@ static void __devinit wf_fcu_get_pump_minmax(struct wf_fcu_fan *fan)
            fan->ctrl.name, pump_min, pump_max);
 }
 
-static void __devinit wf_fcu_get_rpmfan_minmax(struct wf_fcu_fan *fan)
+static void wf_fcu_get_rpmfan_minmax(struct wf_fcu_fan *fan)
 {
        struct wf_fcu_priv *pv = fan->fcu_priv;
        const struct mpu_data *mpu0 = wf_get_mpu(0);
@@ -359,9 +359,8 @@ static void __devinit wf_fcu_get_rpmfan_minmax(struct wf_fcu_fan *fan)
            fan->ctrl.name, fan->min, fan->max);
 }
 
-static void __devinit wf_fcu_add_fan(struct wf_fcu_priv *pv,
-                                    const char *name,
-                                    int type, int id)
+static void wf_fcu_add_fan(struct wf_fcu_priv *pv, const char *name,
+                          int type, int id)
 {
        struct wf_fcu_fan *fan;
 
@@ -399,7 +398,7 @@ static void __devinit wf_fcu_add_fan(struct wf_fcu_priv *pv,
        kref_get(&pv->ref);
 }
 
-static void __devinit wf_fcu_lookup_fans(struct wf_fcu_priv *pv)
+static void wf_fcu_lookup_fans(struct wf_fcu_priv *pv)
 {
        /* Translation of device-tree location properties to
         * windfarm fan names
@@ -481,7 +480,7 @@ static void __devinit wf_fcu_lookup_fans(struct wf_fcu_priv *pv)
        }
 }
 
-static void __devinit wf_fcu_default_fans(struct wf_fcu_priv *pv)
+static void wf_fcu_default_fans(struct wf_fcu_priv *pv)
 {
        /* We only support the default fans for PowerMac7,2 */
        if (!of_machine_is_compatible("PowerMac7,2"))
@@ -496,7 +495,7 @@ static void __devinit wf_fcu_default_fans(struct wf_fcu_priv *pv)
        wf_fcu_add_fan(pv, "cpu-rear-fan-1",    FCU_FAN_RPM, 6);
 }
 
-static int __devinit wf_fcu_init_chip(struct wf_fcu_priv *pv)
+static int wf_fcu_init_chip(struct wf_fcu_priv *pv)
 {
        unsigned char buf = 0xff;
        int rc;
@@ -518,8 +517,8 @@ static int __devinit wf_fcu_init_chip(struct wf_fcu_priv *pv)
        return 0;
 }
 
-static int __devinit wf_fcu_probe(struct i2c_client *client,
-                                 const struct i2c_device_id *id)
+static int wf_fcu_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
 {
        struct wf_fcu_priv *pv;
 
@@ -564,7 +563,7 @@ static int __devinit wf_fcu_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit wf_fcu_remove(struct i2c_client *client)
+static int wf_fcu_remove(struct i2c_client *client)
 {
        struct wf_fcu_priv *pv = dev_get_drvdata(&client->dev);
        struct wf_fcu_fan *fan;
index e0ee80700cde4713430452bffbeb0625a51479db..35ef6e2582b85da123c9e0b9eb99889abc1b8b15 100644 (file)
@@ -656,7 +656,7 @@ static int wf_pm112_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit wf_pm112_remove(struct platform_device *dev)
+static int wf_pm112_remove(struct platform_device *dev)
 {
        wf_unregister_client(&pm112_events);
        /* should release all sensors and controls */
@@ -665,7 +665,7 @@ static int __devexit wf_pm112_remove(struct platform_device *dev)
 
 static struct platform_driver wf_pm112_driver = {
        .probe = wf_pm112_probe,
-       .remove = __devexit_p(wf_pm112_remove),
+       .remove = wf_pm112_remove,
        .driver = {
                .name = "windfarm",
                .owner  = THIS_MODULE,
index 04067e073aa956ee89e14b1898dbd5c0154c6c2c..af605e915d4196422681b6cd809d8aee3eadf600 100644 (file)
@@ -987,7 +987,7 @@ static int pm121_probe(struct platform_device *ddev)
        return 0;
 }
 
-static int __devexit pm121_remove(struct platform_device *ddev)
+static int pm121_remove(struct platform_device *ddev)
 {
        wf_unregister_client(&pm121_events);
        return 0;
@@ -995,7 +995,7 @@ static int __devexit pm121_remove(struct platform_device *ddev)
 
 static struct platform_driver pm121_driver = {
        .probe = pm121_probe,
-       .remove = __devexit_p(pm121_remove),
+       .remove = pm121_remove,
        .driver = {
                .name = "windfarm",
                .bus = &platform_bus_type,
index 84ac913d7e3a11242ec891faa82a61597635da92..6e5585357cd356dfde400a0ab6590b94cdc22b03 100644 (file)
@@ -776,7 +776,7 @@ static int wf_pm72_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit wf_pm72_remove(struct platform_device *dev)
+static int wf_pm72_remove(struct platform_device *dev)
 {
        wf_unregister_client(&pm72_events);
 
index 990c87606be9579db02549c765a05b9ebb82ee5c..f84933ff32988abac0ca8511b997f188dc9f226e 100644 (file)
@@ -720,7 +720,7 @@ static int wf_smu_probe(struct platform_device *ddev)
        return 0;
 }
 
-static int __devexit wf_smu_remove(struct platform_device *ddev)
+static int wf_smu_remove(struct platform_device *ddev)
 {
        wf_unregister_client(&wf_smu_events);
 
@@ -763,7 +763,7 @@ static int __devexit wf_smu_remove(struct platform_device *ddev)
 
 static struct platform_driver wf_smu_driver = {
         .probe = wf_smu_probe,
-        .remove = __devexit_p(wf_smu_remove),
+        .remove = wf_smu_remove,
        .driver = {
                .name = "windfarm",
                .owner  = THIS_MODULE,
index 7653603cb00eee8069eabf10d3a022e4b54a00ce..2eb484f213c84086655aae5adbedf9cebbb98cf0 100644 (file)
@@ -642,7 +642,7 @@ static int wf_smu_probe(struct platform_device *ddev)
        return 0;
 }
 
-static int __devexit wf_smu_remove(struct platform_device *ddev)
+static int wf_smu_remove(struct platform_device *ddev)
 {
        wf_unregister_client(&wf_smu_events);
 
@@ -692,7 +692,7 @@ static int __devexit wf_smu_remove(struct platform_device *ddev)
 
 static struct platform_driver wf_smu_driver = {
         .probe = wf_smu_probe,
-        .remove = __devexit_p(wf_smu_remove),
+        .remove = wf_smu_remove,
        .driver = {
                .name = "windfarm",
                .owner  = THIS_MODULE,
index 3eca6d4b52fce708235d4ddbc6c5b8c71905040f..844003fb4ef0d798001660e8ab8c58ad6d85354f 100644 (file)
@@ -669,7 +669,7 @@ static int wf_rm31_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit wf_rm31_remove(struct platform_device *dev)
+static int wf_rm31_remove(struct platform_device *dev)
 {
        wf_unregister_client(&rm31_events);
 
index 45ecf8db1eaecadbc6debf310d0d5313dd2bc185..64d71fb87a96acc7dcda6eddc9069f8561842fbc 100644 (file)
@@ -540,8 +540,8 @@ static int init_device(struct i2c_client *client, struct adv7180_state *state)
        return 0;
 }
 
-static __devinit int adv7180_probe(struct i2c_client *client,
-                                  const struct i2c_device_id *id)
+static int adv7180_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct adv7180_state *state;
        struct v4l2_subdev *sd;
@@ -587,7 +587,7 @@ err:
        return ret;
 }
 
-static __devexit int adv7180_remove(struct i2c_client *client)
+static int adv7180_remove(struct i2c_client *client)
 {
        struct v4l2_subdev *sd = i2c_get_clientdata(client);
        struct adv7180_state *state = to_state(sd);
@@ -652,7 +652,7 @@ static struct i2c_driver adv7180_driver = {
                   .name = KBUILD_MODNAME,
                   },
        .probe = adv7180_probe,
-       .remove = __devexit_p(adv7180_remove),
+       .remove = adv7180_remove,
 #ifdef CONFIG_PM
        .suspend = adv7180_suspend,
        .resume = adv7180_resume,
index 10c3c1db4cdd1a473232027c602de8b3513ecb58..6fed5b74e74302e6580e43422202b4cf1942ca9a 100644 (file)
@@ -677,7 +677,7 @@ static struct i2c_driver adv7183_driver = {
                .name   = "adv7183",
        },
        .probe          = adv7183_probe,
-       .remove         = __devexit_p(adv7183_remove),
+       .remove         = adv7183_remove,
        .id_table       = adv7183_id,
 };
 
index 3bfdbf9d9bf1b4accb9632dd2f831d64fe89c12f..58d523f2648f61894ff8ed98526fff077da79e91 100644 (file)
@@ -713,7 +713,7 @@ static int as3645a_resume(struct device *dev)
  * The number of LEDs reported in platform data is used to compute default
  * limits. Parameters passed through platform data can override those limits.
  */
-static int __devinit as3645a_init_controls(struct as3645a *flash)
+static int as3645a_init_controls(struct as3645a *flash)
 {
        const struct as3645a_platform_data *pdata = flash->pdata;
        struct v4l2_ctrl *ctrl;
@@ -804,8 +804,8 @@ static int __devinit as3645a_init_controls(struct as3645a *flash)
        return flash->ctrls.error;
 }
 
-static int __devinit as3645a_probe(struct i2c_client *client,
-                                  const struct i2c_device_id *devid)
+static int as3645a_probe(struct i2c_client *client,
+                        const struct i2c_device_id *devid)
 {
        struct as3645a *flash;
        int ret;
@@ -846,7 +846,7 @@ done:
        return ret;
 }
 
-static int __devexit as3645a_remove(struct i2c_client *client)
+static int as3645a_remove(struct i2c_client *client)
 {
        struct v4l2_subdev *subdev = i2c_get_clientdata(client);
        struct as3645a *flash = to_as3645a(subdev);
@@ -877,7 +877,7 @@ static struct i2c_driver as3645a_i2c_driver = {
                .pm   = &as3645a_pm_ops,
        },
        .probe  = as3645a_probe,
-       .remove = __devexit_p(as3645a_remove),
+       .remove = as3645a_remove,
        .id_table = as3645a_id_table,
 };
 
index 8131d651de9ef11ea5c10d8e4111e9c8e4468896..8a8d42fe26332e0765f6ebad93b435b954d42da0 100644 (file)
@@ -926,8 +926,8 @@ static irqreturn_t m5mols_irq_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit m5mols_probe(struct i2c_client *client,
-                                 const struct i2c_device_id *id)
+static int m5mols_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
 {
        const struct m5mols_platform_data *pdata = client->dev.platform_data;
        struct m5mols_info *info;
@@ -1018,7 +1018,7 @@ out_free:
        return ret;
 }
 
-static int __devexit m5mols_remove(struct i2c_client *client)
+static int m5mols_remove(struct i2c_client *client)
 {
        struct v4l2_subdev *sd = i2c_get_clientdata(client);
        struct m5mols_info *info = to_m5mols(sd);
@@ -1045,7 +1045,7 @@ static struct i2c_driver m5mols_i2c_driver = {
                .name   = MODULE_NAME,
        },
        .probe          = m5mols_probe,
-       .remove         = __devexit_p(m5mols_remove),
+       .remove         = m5mols_remove,
        .id_table       = m5mols_id,
 };
 
index f434a19b9bcbb43fcbdb4d9e48f240fe9d2ae372..9ac1b8c3a837c4c0a0e33c321b7978785ea51843 100644 (file)
@@ -788,7 +788,7 @@ static const struct v4l2_subdev_ops vs6624_ops = {
        .video = &vs6624_video_ops,
 };
 
-static int __devinit vs6624_probe(struct i2c_client *client,
+static int vs6624_probe(struct i2c_client *client,
                        const struct i2c_device_id *id)
 {
        struct vs6624 *sensor;
@@ -881,7 +881,7 @@ static int __devinit vs6624_probe(struct i2c_client *client,
        return ret;
 }
 
-static int __devexit vs6624_remove(struct i2c_client *client)
+static int vs6624_remove(struct i2c_client *client)
 {
        struct v4l2_subdev *sd = i2c_get_clientdata(client);
        struct vs6624 *sensor = to_vs6624(sd);
@@ -906,7 +906,7 @@ static struct i2c_driver vs6624_driver = {
                .name   = "vs6624",
        },
        .probe          = vs6624_probe,
-       .remove         = __devexit_p(vs6624_remove),
+       .remove         = vs6624_remove,
        .id_table       = vs6624_id,
 };
 
index d6f3f100699ae13e2f3dfec60fc1455db34adb07..15d34935e00b217da1e5e5a29518644de75a45e1 100644 (file)
@@ -50,7 +50,7 @@
 #define SMSSDIO_INT            0x04
 #define SMSSDIO_BLOCK_SIZE     128
 
-static const struct sdio_device_id smssdio_ids[] __devinitconst = {
+static const struct sdio_device_id smssdio_ids[] = {
        {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_STELLAR),
         .driver_data = SMS1XXX_BOARD_SIANO_STELLAR},
        {SDIO_DEVICE(SDIO_VENDOR_ID_SIANO, SDIO_DEVICE_ID_SIANO_NOVA_A0),
@@ -224,7 +224,7 @@ static void smssdio_interrupt(struct sdio_func *func)
        smscore_onresponse(smsdev->coredev, cb);
 }
 
-static int __devinit smssdio_probe(struct sdio_func *func,
+static int smssdio_probe(struct sdio_func *func,
                         const struct sdio_device_id *id)
 {
        int ret;
index b34fa95185e4ac65ac96200c8a800d46889504d8..66eb0baab0e9948cb4beeb88a1bac60e71c19821 100644 (file)
@@ -391,7 +391,7 @@ EXPORT_SYMBOL(bt878_device_control);
                .driver_data = (unsigned long) name \
        }
 
-static struct pci_device_id bt878_pci_tbl[] __devinitdata = {
+static struct pci_device_id bt878_pci_tbl[] = {
        BROOKTREE_878_DEVICE(0x0071, 0x0101, "Nebula Electronics DigiTV"),
        BROOKTREE_878_DEVICE(0x1461, 0x0761, "AverMedia AverTV DVB-T 761"),
        BROOKTREE_878_DEVICE(0x11bd, 0x001c, "Pinnacle PCTV Sat"),
@@ -410,7 +410,7 @@ static struct pci_device_id bt878_pci_tbl[] __devinitdata = {
 
 MODULE_DEVICE_TABLE(pci, bt878_pci_tbl);
 
-static const char * __devinit card_name(const struct pci_device_id *id)
+static const char * card_name(const struct pci_device_id *id)
 {
        return id->driver_data ? (const char *)id->driver_data : "Unknown";
 }
@@ -419,8 +419,7 @@ static const char * __devinit card_name(const struct pci_device_id *id)
 /* PCI device handling */
 /***********************/
 
-static int __devinit bt878_probe(struct pci_dev *dev,
-                                const struct pci_device_id *pci_id)
+static int bt878_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
 {
        int result = 0;
        unsigned char lat;
@@ -529,7 +528,7 @@ static int __devinit bt878_probe(struct pci_dev *dev,
        return result;
 }
 
-static void __devexit bt878_remove(struct pci_dev *pci_dev)
+static void bt878_remove(struct pci_dev *pci_dev)
 {
        u8 command;
        struct bt878 *bt = pci_get_drvdata(pci_dev);
@@ -573,7 +572,7 @@ static struct pci_driver bt878_pci_driver = {
       .name    = "bt878",
       .id_table = bt878_pci_tbl,
       .probe   = bt878_probe,
-      .remove  = __devexit_p(bt878_remove),
+      .remove  = bt878_remove,
 };
 
 /*******************************/
index 38952faaffda3a44ed81d7d268bc7c98306d3b64..c4c59175e52c6c526042ed5fdf332641740f2b82 100644 (file)
@@ -87,7 +87,7 @@ static int tea5757_read(struct bttv *btv);
 static int tea5757_write(struct bttv *btv, int value);
 static void identify_by_eeprom(struct bttv *btv,
                               unsigned char eeprom_data[256]);
-static int __devinit pvr_boot(struct bttv *btv);
+static int pvr_boot(struct bttv *btv);
 
 /* config variables */
 static unsigned int triton1;
@@ -151,7 +151,7 @@ static struct CARD {
        unsigned id;
        int cardnr;
        char *name;
-} cards[] __devinitdata = {
+} cards[] = {
        { 0x13eb0070, BTTV_BOARD_HAUPPAUGE878,  "Hauppauge WinTV" },
        { 0x39000070, BTTV_BOARD_HAUPPAUGE878,  "Hauppauge WinTV-D" },
        { 0x45000070, BTTV_BOARD_HAUPPAUGEPVR,  "Hauppauge WinTV/PVR" },
@@ -2837,7 +2837,7 @@ static unsigned char eeprom_data[256];
 /*
  * identify card
  */
-void __devinit bttv_idcard(struct bttv *btv)
+void bttv_idcard(struct bttv *btv)
 {
        unsigned int gpiobits;
        int i,type;
@@ -3235,7 +3235,7 @@ static void bttv_reset_audio(struct bttv *btv)
 }
 
 /* initialization part one -- before registering i2c bus */
-void __devinit bttv_init_card1(struct bttv *btv)
+void bttv_init_card1(struct bttv *btv)
 {
        switch (btv->c.type) {
        case BTTV_BOARD_HAUPPAUGE:
@@ -3267,7 +3267,7 @@ void __devinit bttv_init_card1(struct bttv *btv)
 }
 
 /* initialization part two -- after registering i2c bus */
-void __devinit bttv_init_card2(struct bttv *btv)
+void bttv_init_card2(struct bttv *btv)
 {
        btv->tuner_type = UNSET;
 
@@ -3571,7 +3571,7 @@ no_audio:
 
 
 /* initialize the tuner */
-void __devinit bttv_init_tuner(struct bttv *btv)
+void bttv_init_tuner(struct bttv *btv)
 {
        int addr = ADDR_UNSET;
 
@@ -3635,7 +3635,7 @@ static void modtec_eeprom(struct bttv *btv)
        }
 }
 
-static void __devinit hauppauge_eeprom(struct bttv *btv)
+static void hauppauge_eeprom(struct bttv *btv)
 {
        struct tveeprom tv;
 
@@ -3709,8 +3709,7 @@ static int terratec_active_radio_upgrade(struct bttv *btv)
 #define BTTV_ALT_DCLK          0x100000
 #define BTTV_ALT_NCONFIG       0x800000
 
-static int __devinit pvr_altera_load(struct bttv *btv, const u8 *micro,
-                                    u32 microlen)
+static int pvr_altera_load(struct bttv *btv, const u8 *micro, u32 microlen)
 {
        u32 n;
        u8 bits;
@@ -3747,7 +3746,7 @@ static int __devinit pvr_altera_load(struct bttv *btv, const u8 *micro,
        return 0;
 }
 
-static int __devinit pvr_boot(struct bttv *btv)
+static int pvr_boot(struct bttv *btv)
 {
        const struct firmware *fw_entry;
        int rc;
@@ -3767,7 +3766,7 @@ static int __devinit pvr_boot(struct bttv *btv)
 /* ----------------------------------------------------------------------- */
 /* some osprey specific stuff                                              */
 
-static void __devinit osprey_eeprom(struct bttv *btv, const u8 ee[256])
+static void osprey_eeprom(struct bttv *btv, const u8 ee[256])
 {
        int i;
        u32 serial = 0;
@@ -3898,7 +3897,7 @@ static int tuner_1_table[] = {
        TUNER_TEMIC_4012FY5, TUNER_TEMIC_4012FY5, /* TUNER_TEMIC_SECAM */
        TUNER_TEMIC_4012FY5, TUNER_TEMIC_PAL};
 
-static void __devinit avermedia_eeprom(struct bttv *btv)
+static void avermedia_eeprom(struct bttv *btv)
 {
        int tuner_make, tuner_tv_fm, tuner_format, tuner_type = 0;
 
@@ -3960,7 +3959,7 @@ u32 bttv_tda9880_setnorm(struct bttv *btv, u32 gpiobits)
  * Hauppauge:  pin  5
  * Voodoo:     pin 20
  */
-static void __devinit boot_msp34xx(struct bttv *btv, int pin)
+static void boot_msp34xx(struct bttv *btv, int pin)
 {
        int mask = (1 << pin);
 
@@ -3983,11 +3982,10 @@ static void __devinit boot_msp34xx(struct bttv *btv, int pin)
  *  used by Alessandro Rubini in his pxc200
  *  driver, but using BTTV functions */
 
-static void __devinit init_PXC200(struct bttv *btv)
+static void init_PXC200(struct bttv *btv)
 {
-       static int vals[] __devinitdata = { 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0d,
-                                           0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
-                                           0x00 };
+       static int vals[] = { 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0d, 0x01, 0x02,
+                             0x03, 0x04, 0x05, 0x06, 0x00 };
        unsigned int i;
        int tmp;
        u32 val;
@@ -4851,7 +4849,7 @@ void __init bttv_check_chipset(void)
        }
 }
 
-int __devinit bttv_handle_chipset(struct bttv *btv)
+int bttv_handle_chipset(struct bttv *btv)
 {
        unsigned char command;
 
index de6f41f19187dd584be669baadc0398910e71b2b..45e5d0661b605fdeea861506c538e42e27f0ce22 100644 (file)
@@ -4199,7 +4199,7 @@ static void bttv_unregister_video(struct bttv *btv)
 }
 
 /* register video4linux devices */
-static int __devinit bttv_register_video(struct bttv *btv)
+static int bttv_register_video(struct bttv *btv)
 {
        if (no_overlay > 0)
                pr_notice("Overlay support disabled\n");
@@ -4265,8 +4265,7 @@ static void pci_set_command(struct pci_dev *dev)
 #endif
 }
 
-static int __devinit bttv_probe(struct pci_dev *dev,
-                               const struct pci_device_id *pci_id)
+static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
 {
        int result;
        unsigned char lat;
@@ -4454,7 +4453,7 @@ fail0:
        return result;
 }
 
-static void __devexit bttv_remove(struct pci_dev *pci_dev)
+static void bttv_remove(struct pci_dev *pci_dev)
 {
        struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
        struct bttv *btv = to_bttv(v4l2_dev);
@@ -4598,7 +4597,7 @@ static struct pci_driver bttv_pci_driver = {
        .name     = "bttv",
        .id_table = bttv_pci_tbl,
        .probe    = bttv_probe,
-       .remove   = __devexit_p(bttv_remove),
+       .remove   = bttv_remove,
 #ifdef CONFIG_PM
        .suspend  = bttv_suspend,
        .resume   = bttv_resume,
index 580c8e682392c4c5524c789c8b21a75fbbe23314..5039b8826e0a9c08dac1db8eb20f008d9c75ce47 100644 (file)
@@ -99,7 +99,7 @@ static int bttv_bit_getsda(void *data)
        return state;
 }
 
-static struct i2c_algo_bit_data __devinitdata bttv_i2c_algo_bit_template = {
+static struct i2c_algo_bit_data bttv_i2c_algo_bit_template = {
        .setsda  = bttv_bit_setsda,
        .setscl  = bttv_bit_setscl,
        .getsda  = bttv_bit_getsda,
@@ -312,7 +312,7 @@ int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned char b1,
 }
 
 /* read EEPROM content */
-void __devinit bttv_readee(struct bttv *btv, unsigned char *eedata, int addr)
+void bttv_readee(struct bttv *btv, unsigned char *eedata, int addr)
 {
        memset(eedata, 0, 256);
        if (0 != btv->i2c_rc)
@@ -347,7 +347,7 @@ static void do_i2c_scan(char *name, struct i2c_client *c)
 }
 
 /* init + register i2c adapter */
-int __devinit init_bttv_i2c(struct bttv *btv)
+int init_bttv_i2c(struct bttv *btv)
 {
        strlcpy(btv->i2c_client.name, "bttv internal", I2C_NAME_SIZE);
 
index ef4c7cd419827f800f2073775923e042e73536a7..04207a7990557a763e9cd18eea252713dd8ff8ec 100644 (file)
@@ -368,7 +368,7 @@ static int get_key_pv951(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
 }
 
 /* Instantiate the I2C IR receiver device, if present */
-void __devinit init_bttv_i2c_ir(struct bttv *btv)
+void init_bttv_i2c_ir(struct bttv *btv)
 {
        const unsigned short addr_list[] = {
                0x1a, 0x18, 0x64, 0x30, 0x71,
@@ -411,7 +411,7 @@ void __devinit init_bttv_i2c_ir(struct bttv *btv)
        return;
 }
 
-int __devexit fini_bttv_i2c(struct bttv *btv)
+int fini_bttv_i2c(struct bttv *btv)
 {
        if (0 != btv->i2c_rc)
                return 0;
index 81fab9adc1cad18de7d3f24420893fdc894f1994..d407244fd1bce3339b3fdbc13ea3e4801114f19a 100644 (file)
@@ -118,7 +118,8 @@ static int is_pci_slot_eq(struct pci_dev* adev, struct pci_dev* bdev)
        return 0;
 }
 
-static struct bt878 __devinit *dvb_bt8xx_878_match(unsigned int bttv_nr, struct pci_dev* bttv_pci_dev)
+static struct bt878 *dvb_bt8xx_878_match(unsigned int bttv_nr,
+                                        struct pci_dev* bttv_pci_dev)
 {
        unsigned int card_nr;
 
@@ -720,7 +721,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
                }
 }
 
-static int __devinit dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
+static int dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
 {
        int result;
 
@@ -811,7 +812,7 @@ err_unregister_adaptor:
        return result;
 }
 
-static int __devinit dvb_bt8xx_probe(struct bttv_sub_device *sub)
+static int dvb_bt8xx_probe(struct bttv_sub_device *sub)
 {
        struct dvb_bt8xx_card *card;
        struct pci_dev* bttv_pci_dev;
index 039133d692e34e0f839c1496ce13cb6b869b67d8..613e5ae7d5caed9da4c38cd60da171097460bb4c 100644 (file)
@@ -53,7 +53,7 @@ int (*cx18_ext_init)(struct cx18 *);
 EXPORT_SYMBOL(cx18_ext_init);
 
 /* add your revision and whatnot here */
-static struct pci_device_id cx18_pci_tbl[] __devinitdata = {
+static struct pci_device_id cx18_pci_tbl[] = {
        {PCI_VENDOR_ID_CX, PCI_DEVICE_ID_CX23418,
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {0,}
@@ -691,7 +691,7 @@ done:
        cx->card_i2c = cx->card->i2c;
 }
 
-static int __devinit cx18_create_in_workq(struct cx18 *cx)
+static int cx18_create_in_workq(struct cx18 *cx)
 {
        snprintf(cx->in_workq_name, sizeof(cx->in_workq_name), "%s-in",
                 cx->v4l2_dev.name);
@@ -703,7 +703,7 @@ static int __devinit cx18_create_in_workq(struct cx18 *cx)
        return 0;
 }
 
-static void __devinit cx18_init_in_work_orders(struct cx18 *cx)
+static void cx18_init_in_work_orders(struct cx18 *cx)
 {
        int i;
        for (i = 0; i < CX18_MAX_IN_WORK_ORDERS; i++) {
@@ -718,7 +718,7 @@ static void __devinit cx18_init_in_work_orders(struct cx18 *cx)
    No assumptions on the card type may be made here (see cx18_init_struct2
    for that).
  */
-static int __devinit cx18_init_struct1(struct cx18 *cx)
+static int cx18_init_struct1(struct cx18 *cx)
 {
        int ret;
 
@@ -775,7 +775,7 @@ static int __devinit cx18_init_struct1(struct cx18 *cx)
 
 /* Second initialization part. Here the card type has been
    autodetected. */
-static void __devinit cx18_init_struct2(struct cx18 *cx)
+static void cx18_init_struct2(struct cx18 *cx)
 {
        int i;
 
@@ -892,8 +892,8 @@ static void cx18_init_subdevs(struct cx18 *cx)
                cx->sd_extmux = cx18_find_hw(cx, cx->card->hw_muxer);
 }
 
-static int __devinit cx18_probe(struct pci_dev *pci_dev,
-                               const struct pci_device_id *pci_id)
+static int cx18_probe(struct pci_dev *pci_dev,
+                     const struct pci_device_id *pci_id)
 {
        int retval = 0;
        int i;
index 065ecd54bda3d6127b4ff0ab8e846c41924b3d96..f0416a668b4cf8f0ea75d25b124404aaffce1c3c 100644 (file)
@@ -2086,8 +2086,8 @@ void cx23885_gpio_enable(struct cx23885_dev *dev, u32 mask, int asoutput)
        /* TODO: 23-19 */
 }
 
-static int __devinit cx23885_initdev(struct pci_dev *pci_dev,
-                                    const struct pci_device_id *pci_id)
+static int cx23885_initdev(struct pci_dev *pci_dev,
+                          const struct pci_device_id *pci_id)
 {
        struct cx23885_dev *dev;
        int err;
@@ -2167,7 +2167,7 @@ fail_free:
        return err;
 }
 
-static void __devexit cx23885_finidev(struct pci_dev *pci_dev)
+static void cx23885_finidev(struct pci_dev *pci_dev)
 {
        struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
        struct cx23885_dev *dev = to_cx23885(v4l2_dev);
@@ -2210,7 +2210,7 @@ static struct pci_driver cx23885_pci_driver = {
        .name     = "cx23885",
        .id_table = cx23885_pci_tbl,
        .probe    = cx23885_initdev,
-       .remove   = __devexit_p(cx23885_finidev),
+       .remove   = cx23885_finidev,
        /* TODO */
        .suspend  = NULL,
        .resume   = NULL,
index f11f6f07e9154cd4d00790031d3da5e63c1ec8d1..1884e2cc35e9426805e589f2e53cd024a3ceff6c 100644 (file)
@@ -1361,8 +1361,8 @@ struct cx25821_dev *cx25821_dev_get(struct pci_dev *pci)
 }
 EXPORT_SYMBOL(cx25821_dev_get);
 
-static int __devinit cx25821_initdev(struct pci_dev *pci_dev,
-                                    const struct pci_device_id *pci_id)
+static int cx25821_initdev(struct pci_dev *pci_dev,
+                          const struct pci_device_id *pci_id)
 {
        struct cx25821_dev *dev;
        int err = 0;
@@ -1433,7 +1433,7 @@ fail_free:
        return err;
 }
 
-static void __devexit cx25821_finidev(struct pci_dev *pci_dev)
+static void cx25821_finidev(struct pci_dev *pci_dev)
 {
        struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
        struct cx25821_dev *dev = get_cx25821(v4l2_dev);
@@ -1478,7 +1478,7 @@ static struct pci_driver cx25821_pci_driver = {
        .name = "cx25821",
        .id_table = cx25821_pci_tbl,
        .probe = cx25821_initdev,
-       .remove = __devexit_p(cx25821_finidev),
+       .remove = cx25821_finidev,
        /* TODO */
        .suspend = NULL,
        .resume = NULL,
index d2de1a913e1978343937682689f2096320169f41..27d62623274bbd967fa56559f3ed617a0557c6ba 100644 (file)
@@ -540,7 +540,7 @@ static struct snd_pcm_ops snd_cx88_pcm_ops = {
 /*
  * create a PCM device
  */
-static int __devinit snd_cx88_pcm(snd_cx88_card_t *chip, int device, const char *name)
+static int snd_cx88_pcm(snd_cx88_card_t *chip, int device, const char *name)
 {
        int err;
        struct snd_pcm *pcm;
@@ -753,7 +753,7 @@ static struct snd_kcontrol_new snd_cx88_alc_switch = {
  * Only boards with eeprom and byte 1 at eeprom=1 have it
  */
 
-static const struct pci_device_id cx88_audio_pci_tbl[] __devinitdata = {
+static const struct pci_device_id cx88_audio_pci_tbl[] = {
        {0x14f1,0x8801,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
        {0x14f1,0x8811,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
        {0, }
@@ -792,10 +792,9 @@ static void snd_cx88_dev_free(struct snd_card * card)
  */
 
 static int devno;
-static int __devinit snd_cx88_create(struct snd_card *card,
-                                    struct pci_dev *pci,
-                                    snd_cx88_card_t **rchip,
-                                    struct cx88_core **core_ptr)
+static int snd_cx88_create(struct snd_card *card, struct pci_dev *pci,
+                          snd_cx88_card_t **rchip,
+                          struct cx88_core **core_ptr)
 {
        snd_cx88_card_t   *chip;
        struct cx88_core  *core;
@@ -862,8 +861,8 @@ static int __devinit snd_cx88_create(struct snd_card *card,
        return 0;
 }
 
-static int __devinit cx88_audio_initdev(struct pci_dev *pci,
-                                   const struct pci_device_id *pci_id)
+static int cx88_audio_initdev(struct pci_dev *pci,
+                             const struct pci_device_id *pci_id)
 {
        struct snd_card  *card;
        snd_cx88_card_t  *chip;
@@ -931,7 +930,7 @@ error:
 /*
  * ALSA destructor
  */
-static void __devexit cx88_audio_finidev(struct pci_dev *pci)
+static void cx88_audio_finidev(struct pci_dev *pci)
 {
        struct cx88_audio_dev *card = pci_get_drvdata(pci);
 
@@ -950,7 +949,7 @@ static struct pci_driver cx88_audio_pci_driver = {
        .name     = "cx88_audio",
        .id_table = cx88_audio_pci_tbl,
        .probe    = cx88_audio_initdev,
-       .remove   = __devexit_p(cx88_audio_finidev),
+       .remove   = cx88_audio_finidev,
 };
 
 /****************************************************************************
index d46b008a46b86f4d2e2684cba33b650d2b12ff44..c9d3182f79d57a0a9fd26b321ca27fbf66c0a9ce 100644 (file)
@@ -791,8 +791,8 @@ int cx8802_unregister_driver(struct cx8802_driver *drv)
 }
 
 /* ----------------------------------------------------------- */
-static int __devinit cx8802_probe(struct pci_dev *pci_dev,
-                              const struct pci_device_id *pci_id)
+static int cx8802_probe(struct pci_dev *pci_dev,
+                       const struct pci_device_id *pci_id)
 {
        struct cx8802_dev *dev;
        struct cx88_core  *core;
@@ -840,7 +840,7 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
        return err;
 }
 
-static void __devexit cx8802_remove(struct pci_dev *pci_dev)
+static void cx8802_remove(struct pci_dev *pci_dev)
 {
        struct cx8802_dev *dev;
 
@@ -898,7 +898,7 @@ static struct pci_driver cx8802_pci_driver = {
        .name     = "cx88-mpeg driver manager",
        .id_table = cx8802_pci_tbl,
        .probe    = cx8802_probe,
-       .remove   = __devexit_p(cx8802_remove),
+       .remove   = cx8802_remove,
 };
 
 static int __init cx8802_init(void)
index 05171457bf282e42c47dfe00c4410c33cde74518..bc78354262acae2dc90c877455c532a0120cd47a 100644 (file)
@@ -1696,8 +1696,8 @@ static void cx8800_unregister_video(struct cx8800_dev *dev)
        }
 }
 
-static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
-                                   const struct pci_device_id *pci_id)
+static int cx8800_initdev(struct pci_dev *pci_dev,
+                         const struct pci_device_id *pci_id)
 {
        struct cx8800_dev *dev;
        struct cx88_core *core;
@@ -1923,7 +1923,7 @@ fail_free:
        return err;
 }
 
-static void __devexit cx8800_finidev(struct pci_dev *pci_dev)
+static void cx8800_finidev(struct pci_dev *pci_dev)
 {
        struct cx8800_dev *dev = pci_get_drvdata(pci_dev);
        struct cx88_core *core = dev->core;
@@ -2052,7 +2052,7 @@ static struct pci_driver cx8800_pci_driver = {
        .name     = "cx8800",
        .id_table = cx8800_pci_tbl,
        .probe    = cx8800_initdev,
-       .remove   = __devexit_p(cx8800_finidev),
+       .remove   = cx8800_finidev,
 #ifdef CONFIG_PM
        .suspend  = cx8800_suspend,
        .resume   = cx8800_resume,
index feff57ee5a083b55ec1c822b69807d4d1df84851..36e34522b9a80878b61e78ed10a5276f3e7b570f 100644 (file)
@@ -1542,7 +1542,7 @@ static void ddb_unmap(struct ddb *dev)
 }
 
 
-static void __devexit ddb_remove(struct pci_dev *pdev)
+static void ddb_remove(struct pci_dev *pdev)
 {
        struct ddb *dev = (struct ddb *) pci_get_drvdata(pdev);
 
@@ -1565,8 +1565,7 @@ static void __devexit ddb_remove(struct pci_dev *pdev)
 }
 
 
-static int __devinit ddb_probe(struct pci_dev *pdev,
-                              const struct pci_device_id *id)
+static int ddb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct ddb *dev;
        int stat = 0;
@@ -1679,7 +1678,7 @@ static struct ddb_info ddb_v6 = {
        .subvendor   = _subvend, .subdevice = _subdev, \
        .driver_data = (unsigned long)&_driverdata }
 
-static const struct pci_device_id ddb_id_tbl[] __devinitdata = {
+static const struct pci_device_id ddb_id_tbl[] = {
        DDB_ID(DDVID, 0x0002, DDVID, 0x0001, ddb_octopus),
        DDB_ID(DDVID, 0x0003, DDVID, 0x0001, ddb_octopus),
        DDB_ID(DDVID, 0x0003, DDVID, 0x0002, ddb_octopus_le),
@@ -1696,7 +1695,7 @@ static struct pci_driver ddb_pci_driver = {
        .name        = "DDBridge",
        .id_table    = ddb_id_tbl,
        .probe       = ddb_probe,
-       .remove      = __devexit_p(ddb_remove),
+       .remove      = ddb_remove,
 };
 
 static __init int module_init_ddbridge(void)
index f288ffcc4b6bb9004941d75830c2b90e393d2565..904c3ea350f5468a0161a70d2d3672f038662a8e 100644 (file)
@@ -616,7 +616,7 @@ static void dm1105_set_dma_addr(struct dm1105_dev *dev)
        dm_writel(DM1105_STADR, cpu_to_le32(dev->dma_addr));
 }
 
-static int __devinit dm1105_dma_map(struct dm1105_dev *dev)
+static int dm1105_dma_map(struct dm1105_dev *dev)
 {
        dev->ts_buf = pci_alloc_consistent(dev->pdev,
                                        6 * DM1105_DMA_BYTES,
@@ -736,7 +736,7 @@ static irqreturn_t dm1105_irq(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit dm1105_ir_init(struct dm1105_dev *dm1105)
+static int dm1105_ir_init(struct dm1105_dev *dm1105)
 {
        struct rc_dev *dev;
        int err = -ENOMEM;
@@ -776,12 +776,12 @@ static int __devinit dm1105_ir_init(struct dm1105_dev *dm1105)
        return 0;
 }
 
-static void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105)
+static void dm1105_ir_exit(struct dm1105_dev *dm1105)
 {
        rc_unregister_device(dm1105->ir.dev);
 }
 
-static int __devinit dm1105_hw_init(struct dm1105_dev *dev)
+static int dm1105_hw_init(struct dm1105_dev *dev)
 {
        dm1105_disable_irqs(dev);
 
@@ -849,7 +849,7 @@ static struct ds3000_config dvbworld_ds3000_config = {
        .demod_address = 0x68,
 };
 
-static int __devinit frontend_init(struct dm1105_dev *dev)
+static int frontend_init(struct dm1105_dev *dev)
 {
        int ret;
 
@@ -949,7 +949,7 @@ static int __devinit frontend_init(struct dm1105_dev *dev)
        return 0;
 }
 
-static void __devinit dm1105_read_mac(struct dm1105_dev *dev, u8 *mac)
+static void dm1105_read_mac(struct dm1105_dev *dev, u8 *mac)
 {
        static u8 command[1] = { 0x28 };
 
@@ -971,7 +971,7 @@ static void __devinit dm1105_read_mac(struct dm1105_dev *dev, u8 *mac)
        dev_info(&dev->pdev->dev, "MAC %pM\n", mac);
 }
 
-static int __devinit dm1105_probe(struct pci_dev *pdev,
+static int dm1105_probe(struct pci_dev *pdev,
                                  const struct pci_device_id *ent)
 {
        struct dm1105_dev *dev;
@@ -1174,7 +1174,7 @@ err_kfree:
        return ret;
 }
 
-static void __devexit dm1105_remove(struct pci_dev *pdev)
+static void dm1105_remove(struct pci_dev *pdev)
 {
        struct dm1105_dev *dev = pci_get_drvdata(pdev);
        struct dvb_adapter *dvb_adapter = &dev->dvb_adapter;
@@ -1207,7 +1207,7 @@ static void __devexit dm1105_remove(struct pci_dev *pdev)
        kfree(dev);
 }
 
-static struct pci_device_id dm1105_id_table[] __devinitdata = {
+static struct pci_device_id dm1105_id_table[] = {
        {
                .vendor = PCI_VENDOR_ID_TRIGEM,
                .device = PCI_DEVICE_ID_DM1105,
@@ -1229,7 +1229,7 @@ static struct pci_driver dm1105_driver = {
        .name = DRIVER_NAME,
        .id_table = dm1105_id_table,
        .probe = dm1105_probe,
-       .remove = __devexit_p(dm1105_remove),
+       .remove = dm1105_remove,
 };
 
 static int __init dm1105_init(void)
index 74e9a503236432b8c606ebfed56e87bca1fca10d..df88dc4ab555616dc830c1c7f237eefef3aa2191 100644 (file)
@@ -73,7 +73,7 @@ int (*ivtv_ext_init)(struct ivtv *);
 EXPORT_SYMBOL(ivtv_ext_init);
 
 /* add your revision and whatnot here */
-static struct pci_device_id ivtv_pci_tbl[] __devinitdata = {
+static struct pci_device_id ivtv_pci_tbl[] = {
        {PCI_VENDOR_ID_ICOMP, PCI_DEVICE_ID_IVTV15,
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {PCI_VENDOR_ID_ICOMP, PCI_DEVICE_ID_IVTV16,
@@ -736,7 +736,7 @@ done:
    No assumptions on the card type may be made here (see ivtv_init_struct2
    for that).
  */
-static int __devinit ivtv_init_struct1(struct ivtv *itv)
+static int ivtv_init_struct1(struct ivtv *itv)
 {
        struct sched_param param = { .sched_priority = 99 };
 
@@ -802,7 +802,7 @@ static int __devinit ivtv_init_struct1(struct ivtv *itv)
 
 /* Second initialization part. Here the card type has been
    autodetected. */
-static void __devinit ivtv_init_struct2(struct ivtv *itv)
+static void ivtv_init_struct2(struct ivtv *itv)
 {
        int i;
 
@@ -1001,8 +1001,7 @@ static void ivtv_load_and_init_modules(struct ivtv *itv)
        }
 }
 
-static int __devinit ivtv_probe(struct pci_dev *pdev,
-                               const struct pci_device_id *pci_id)
+static int ivtv_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
 {
        int retval = 0;
        int vbi_buf_size;
index cc0251e010776525301319ada5cada8f648d9641..6fe9fe5293dc79fd1c5154c0dd52dd8a543793e0 100644 (file)
@@ -151,7 +151,8 @@ static irqreturn_t hopper_irq_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit hopper_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
+static int hopper_pci_probe(struct pci_dev *pdev,
+                           const struct pci_device_id *pci_id)
 {
        struct mantis_pci *mantis;
        struct mantis_hwconfig *config;
@@ -230,7 +231,7 @@ fail0:
        return err;
 }
 
-static void __devexit hopper_pci_remove(struct pci_dev *pdev)
+static void hopper_pci_remove(struct pci_dev *pdev)
 {
        struct mantis_pci *mantis = pci_get_drvdata(pdev);
 
@@ -259,12 +260,12 @@ static struct pci_driver hopper_pci_driver = {
        .remove         = hopper_pci_remove,
 };
 
-static int __devinit hopper_init(void)
+static int hopper_init(void)
 {
        return pci_register_driver(&hopper_pci_driver);
 }
 
-static void __devexit hopper_exit(void)
+static void hopper_exit(void)
 {
        return pci_unregister_driver(&hopper_pci_driver);
 }
index 0207d1f064e080ea2739a8c1a47d6d5a95c6dbcd..932a0d73a7f8f7d40b5d447f9d88f49fb60d6b4c 100644 (file)
@@ -159,7 +159,8 @@ static irqreturn_t mantis_irq_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
+static int mantis_pci_probe(struct pci_dev *pdev,
+                           const struct pci_device_id *pci_id)
 {
        struct mantis_pci *mantis;
        struct mantis_hwconfig *config;
@@ -249,7 +250,7 @@ fail0:
        return err;
 }
 
-static void __devexit mantis_pci_remove(struct pci_dev *pdev)
+static void mantis_pci_remove(struct pci_dev *pdev)
 {
        struct mantis_pci *mantis = pci_get_drvdata(pdev);
 
@@ -289,12 +290,12 @@ static struct pci_driver mantis_pci_driver = {
        .remove         = mantis_pci_remove,
 };
 
-static int __devinit mantis_init(void)
+static int mantis_init(void)
 {
        return pci_register_driver(&mantis_pci_driver);
 }
 
-static void __devexit mantis_exit(void)
+static void mantis_exit(void)
 {
        return pci_unregister_driver(&mantis_pci_driver);
 }
index 5d15c6b74d9be621bb5cb8fecfae9ad50512804f..5a71e1791cf5a00ab1d198520c380cf7a44c1890 100644 (file)
@@ -144,7 +144,7 @@ static int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
        return 0;
 }
 
-int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+int mantis_dvb_init(struct mantis_pci *mantis)
 {
        struct mantis_hwconfig *config = mantis->hwconfig;
        int result = -1;
@@ -271,7 +271,7 @@ err0:
 }
 EXPORT_SYMBOL_GPL(mantis_dvb_init);
 
-int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+int mantis_dvb_exit(struct mantis_pci *mantis)
 {
        int err;
 
index e7794517fe26c36098ff1d56fffcbde814e52a37..937fb9d50213ce94484a0be496ac0820b568eda3 100644 (file)
@@ -217,7 +217,7 @@ static struct i2c_algorithm mantis_algo = {
        .functionality          = mantis_i2c_func,
 };
 
-int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+int mantis_i2c_init(struct mantis_pci *mantis)
 {
        u32 intstat, intmask;
        struct i2c_adapter *i2c_adapter = &mantis->adapter;
index 371558af2d9613fd45307c2e8a95d0ccaf62f4e9..a846036ea0227dfaabcc64d7e20401b495dcc424 100644 (file)
@@ -46,7 +46,7 @@
 
 #define DRIVER_NAME            "Mantis Core"
 
-int __devinit mantis_pci_init(struct mantis_pci *mantis)
+int mantis_pci_init(struct mantis_pci *mantis)
 {
        u8 latency;
        struct mantis_hwconfig *config  = mantis->hwconfig;
index ae7d32027bf726e0e73499880a61a07187fa6744..049e18667cd0339bbfc4437ca4d66d9fe6776594 100644 (file)
@@ -1728,8 +1728,7 @@ static int meye_resume(struct pci_dev *pdev)
 }
 #endif
 
-static int __devinit meye_probe(struct pci_dev *pcidev,
-                               const struct pci_device_id *ent)
+static int meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
 {
        struct v4l2_device *v4l2_dev = &meye.v4l2_dev;
        int ret = -EBUSY;
@@ -1889,7 +1888,7 @@ outnotdev:
        return ret;
 }
 
-static void __devexit meye_remove(struct pci_dev *pcidev)
+static void meye_remove(struct pci_dev *pcidev)
 {
        video_unregister_device(meye.vdev);
 
@@ -1935,7 +1934,7 @@ static struct pci_driver meye_driver = {
        .name           = "meye",
        .id_table       = meye_pci_tbl,
        .probe          = meye_probe,
-       .remove         = __devexit_p(meye_remove),
+       .remove         = meye_remove,
 #ifdef CONFIG_PM
        .suspend        = meye_suspend,
        .resume         = meye_resume,
index b38bce529566cdaa02b87b2855674ba5a03dd90e..fad2141136696a87d5f3e9dbbe2ebc28f51518ec 100644 (file)
@@ -743,7 +743,7 @@ static struct ngene_info ngene_info_terratec = {
 
 /****************************************************************************/
 
-static const struct pci_device_id ngene_id_tbl[] __devinitdata = {
+static const struct pci_device_id ngene_id_tbl[] = {
        NGENE_ID(0x18c3, 0xabc3, ngene_info_cineS2),
        NGENE_ID(0x18c3, 0xabc4, ngene_info_cineS2),
        NGENE_ID(0x18c3, 0xdb01, ngene_info_satixS2),
@@ -800,7 +800,7 @@ static struct pci_driver ngene_pci_driver = {
        .name        = "ngene",
        .id_table    = ngene_id_tbl,
        .probe       = ngene_probe,
-       .remove      = __devexit_p(ngene_remove),
+       .remove      = ngene_remove,
        .err_handler = &ngene_errors,
        .shutdown    = ngene_shutdown,
 };
index 8eeec4f50ccb4103d2db272b3c1bc6d7b2608f18..37ebc42392adb45f0de0be794548a17761be0543 100644 (file)
@@ -1636,7 +1636,7 @@ void ngene_shutdown(struct pci_dev *pdev)
 /* device probe/remove calls ************************************************/
 /****************************************************************************/
 
-void __devexit ngene_remove(struct pci_dev *pdev)
+void ngene_remove(struct pci_dev *pdev)
 {
        struct ngene *dev = pci_get_drvdata(pdev);
        int i;
@@ -1652,8 +1652,7 @@ void __devexit ngene_remove(struct pci_dev *pdev)
        pci_disable_device(pdev);
 }
 
-int __devinit ngene_probe(struct pci_dev *pci_dev,
-                         const struct pci_device_id *id)
+int ngene_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
 {
        struct ngene *dev;
        int stat = 0;
index 5443dc0caea50e2067a68c5df66d6563d79f7f58..22c39ff6bfa0e90c278d08c0cbc84d156c8e5732 100644 (file)
@@ -887,9 +887,8 @@ struct ngene_buffer {
 
 
 /* Provided by ngene-core.c */
-int __devinit ngene_probe(struct pci_dev *pci_dev,
-                         const struct pci_device_id *id);
-void __devexit ngene_remove(struct pci_dev *pdev);
+int ngene_probe(struct pci_dev *pci_dev, const struct pci_device_id *id);
+void ngene_remove(struct pci_dev *pdev);
 void ngene_shutdown(struct pci_dev *pdev);
 int ngene_command(struct ngene *dev, struct ngene_command *com);
 int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
index f148b19a206a0bd617c29a1cf65a0aa83c2649ac..2290faee5852f13124d83503538fbd8bc6cd59af 100644 (file)
@@ -240,7 +240,7 @@ static void pluto_set_dma_addr(struct pluto *pluto)
        pluto_writereg(pluto, REG_PCAR, pluto->dma_addr);
 }
 
-static int __devinit pluto_dma_map(struct pluto *pluto)
+static int pluto_dma_map(struct pluto *pluto)
 {
        pluto->dma_addr = pci_map_single(pluto->pdev, pluto->dma_buf,
                        TS_DMA_BYTES, PCI_DMA_FROMDEVICE);
@@ -368,7 +368,7 @@ static irqreturn_t pluto_irq(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static void __devinit pluto_enable_irqs(struct pluto *pluto)
+static void pluto_enable_irqs(struct pluto *pluto)
 {
        u32 val = pluto_readreg(pluto, REG_TSCR);
 
@@ -394,7 +394,7 @@ static void pluto_disable_irqs(struct pluto *pluto)
        pluto_write_tscr(pluto, val);
 }
 
-static int __devinit pluto_hw_init(struct pluto *pluto)
+static int pluto_hw_init(struct pluto *pluto)
 {
        pluto_reset_frontend(pluto, 1);
 
@@ -505,7 +505,7 @@ static int pluto2_request_firmware(struct dvb_frontend *fe,
        return request_firmware(fw, name, &pluto->pdev->dev);
 }
 
-static struct tda1004x_config pluto2_fe_config __devinitdata = {
+static struct tda1004x_config pluto2_fe_config = {
        .demod_address = I2C_ADDR_TDA10046 >> 1,
        .invert = 1,
        .invert_oclk = 0,
@@ -515,7 +515,7 @@ static struct tda1004x_config pluto2_fe_config __devinitdata = {
        .request_firmware = pluto2_request_firmware,
 };
 
-static int __devinit frontend_init(struct pluto *pluto)
+static int frontend_init(struct pluto *pluto)
 {
        int ret;
 
@@ -536,14 +536,14 @@ static int __devinit frontend_init(struct pluto *pluto)
        return 0;
 }
 
-static void __devinit pluto_read_rev(struct pluto *pluto)
+static void pluto_read_rev(struct pluto *pluto)
 {
        u32 val = pluto_readreg(pluto, REG_MISC) & MISC_DVR;
        dev_info(&pluto->pdev->dev, "board revision %d.%d\n",
                        (val >> 12) & 0x0f, (val >> 4) & 0xff);
 }
 
-static void __devinit pluto_read_mac(struct pluto *pluto, u8 *mac)
+static void pluto_read_mac(struct pluto *pluto, u8 *mac)
 {
        u32 val = pluto_readreg(pluto, REG_MMAC);
        mac[0] = (val >> 8) & 0xff;
@@ -560,7 +560,7 @@ static void __devinit pluto_read_mac(struct pluto *pluto, u8 *mac)
        dev_info(&pluto->pdev->dev, "MAC %pM\n", mac);
 }
 
-static int __devinit pluto_read_serial(struct pluto *pluto)
+static int pluto_read_serial(struct pluto *pluto)
 {
        struct pci_dev *pdev = pluto->pdev;
        unsigned int i, j;
@@ -588,8 +588,7 @@ out:
        return 0;
 }
 
-static int __devinit pluto2_probe(struct pci_dev *pdev,
-                                 const struct pci_device_id *ent)
+static int pluto2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct pluto *pluto;
        struct dvb_adapter *dvb_adapter;
@@ -742,7 +741,7 @@ err_kfree:
        goto out;
 }
 
-static void __devexit pluto2_remove(struct pci_dev *pdev)
+static void pluto2_remove(struct pci_dev *pdev)
 {
        struct pluto *pluto = pci_get_drvdata(pdev);
        struct dvb_adapter *dvb_adapter = &pluto->dvb_adapter;
@@ -777,7 +776,7 @@ static void __devexit pluto2_remove(struct pci_dev *pdev)
 #define PCI_DEVICE_ID_PLUTO2   0x0001
 #endif
 
-static struct pci_device_id pluto2_id_table[] __devinitdata = {
+static struct pci_device_id pluto2_id_table[] = {
        {
                .vendor = PCI_VENDOR_ID_SCM,
                .device = PCI_DEVICE_ID_PLUTO2,
@@ -794,7 +793,7 @@ static struct pci_driver pluto2_driver = {
        .name = DRIVER_NAME,
        .id_table = pluto2_id_table,
        .probe = pluto2_probe,
-       .remove = __devexit_p(pluto2_remove),
+       .remove = pluto2_remove,
 };
 
 static int __init pluto2_init(void)
index 15b35c4725f18874b3306be104cadf6cc6dc8a7b..e9211086df490c1b7ec9db82f7ab74d82f4fd427 100644 (file)
@@ -1058,7 +1058,7 @@ static void pt1_i2c_init(struct pt1 *pt1)
                pt1_i2c_emit(pt1, i, 0, 0, 1, 1, 0);
 }
 
-static void __devexit pt1_remove(struct pci_dev *pdev)
+static void pt1_remove(struct pci_dev *pdev)
 {
        struct pt1 *pt1;
        void __iomem *regs;
@@ -1083,8 +1083,7 @@ static void __devexit pt1_remove(struct pci_dev *pdev)
        pci_disable_device(pdev);
 }
 
-static int __devinit
-pt1_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int pt1_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int ret;
        void __iomem *regs;
@@ -1222,7 +1221,7 @@ MODULE_DEVICE_TABLE(pci, pt1_id_table);
 static struct pci_driver pt1_driver = {
        .name           = DRIVER_NAME,
        .probe          = pt1_probe,
-       .remove         = __devexit_p(pt1_remove),
+       .remove         = pt1_remove,
        .id_table       = pt1_id_table,
 };
 
index 8976d0e65813d26d7c2761d7172fd7549899d1d4..e359d200d698d9b03ff7a07dba9236c6070fc6d9 100644 (file)
@@ -754,7 +754,7 @@ static int saa7134_hwfini(struct saa7134_dev *dev)
        return 0;
 }
 
-static void __devinit must_configure_manually(int has_eeprom)
+static void must_configure_manually(int has_eeprom)
 {
        unsigned int i,p;
 
@@ -860,8 +860,8 @@ static void mpeg_ops_detach(struct saa7134_mpeg_ops *ops,
        dev->mops = NULL;
 }
 
-static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
-                                    const struct pci_device_id *pci_id)
+static int saa7134_initdev(struct pci_dev *pci_dev,
+                          const struct pci_device_id *pci_id)
 {
        struct saa7134_dev *dev;
        struct saa7134_mpeg_ops *mops;
@@ -1102,7 +1102,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
        return err;
 }
 
-static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
+static void saa7134_finidev(struct pci_dev *pci_dev)
 {
        struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
        struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev);
@@ -1322,7 +1322,7 @@ static struct pci_driver saa7134_pci_driver = {
        .name     = "saa7134",
        .id_table = saa7134_pci_tbl,
        .probe    = saa7134_initdev,
-       .remove   = __devexit_p(saa7134_finidev),
+       .remove   = saa7134_finidev,
 #ifdef CONFIG_PM
        .suspend  = saa7134_suspend,
        .resume   = saa7134_resume
index c24b6512bd8f8976f514c8a609f2238eaa2b9f45..075908fae4d90a409849825c97b0d1d701762f7e 100644 (file)
@@ -739,7 +739,7 @@ extern int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
 
 extern struct saa7134_board saa7134_boards[];
 extern const unsigned int saa7134_bcount;
-extern struct pci_device_id __devinitdata saa7134_pci_tbl[];
+extern struct pci_device_id saa7134_pci_tbl[];
 
 extern int saa7134_board_init1(struct saa7134_dev *dev);
 extern int saa7134_board_init2(struct saa7134_dev *dev);
index 063047f567669f1bdc6c33bcfdca33528d56f5a3..63502e7a2a762fbf75f90108ac9cf3b8781ad70b 100644 (file)
@@ -1185,8 +1185,8 @@ static int saa7164_thread_function(void *data)
        return 0;
 }
 
-static int __devinit saa7164_initdev(struct pci_dev *pci_dev,
-                                    const struct pci_device_id *pci_id)
+static int saa7164_initdev(struct pci_dev *pci_dev,
+                          const struct pci_device_id *pci_id)
 {
        struct saa7164_dev *dev;
        int err, i;
@@ -1376,7 +1376,7 @@ static void saa7164_shutdown(struct saa7164_dev *dev)
        dprintk(1, "%s()\n", __func__);
 }
 
-static void __devexit saa7164_finidev(struct pci_dev *pci_dev)
+static void saa7164_finidev(struct pci_dev *pci_dev)
 {
        struct saa7164_dev *dev = pci_get_drvdata(pci_dev);
 
@@ -1459,7 +1459,7 @@ static struct pci_driver saa7164_pci_driver = {
        .name     = "saa7164",
        .id_table = saa7164_pci_tbl,
        .probe    = saa7164_initdev,
-       .remove   = __devexit_p(saa7164_finidev),
+       .remove   = saa7164_finidev,
        /* TODO */
        .suspend  = NULL,
        .resume   = NULL,
index 4c10205264d4d7c0e2ba25ae48e999bb1aa593a7..27ae4884265644190b1777d61059c84410f8d3ea 100644 (file)
@@ -1205,8 +1205,8 @@ static void vip_gpio_release(struct device *dev, int pin, const char *name)
  *
  * -ENODEV, device could not be detected or registered
  */
-static int __devinit sta2x11_vip_init_one(struct pci_dev *pdev,
-                                         const struct pci_device_id *ent)
+static int sta2x11_vip_init_one(struct pci_dev *pdev,
+                               const struct pci_device_id *ent)
 {
        int ret;
        struct sta2x11_vip *vip;
@@ -1376,7 +1376,7 @@ disable:
  * free memory
  * free GPIO pins
  */
-static void __devexit sta2x11_vip_remove_one(struct pci_dev *pdev)
+static void sta2x11_vip_remove_one(struct pci_dev *pdev)
 {
        struct v4l2_device *v4l2_dev = pci_get_drvdata(pdev);
        struct sta2x11_vip *vip =
@@ -1517,7 +1517,7 @@ static DEFINE_PCI_DEVICE_TABLE(sta2x11_vip_pci_tbl) = {
 static struct pci_driver sta2x11_vip_driver = {
        .name = DRV_NAME,
        .probe = sta2x11_vip_init_one,
-       .remove = __devexit_p(sta2x11_vip_remove_one),
+       .remove = sta2x11_vip_remove_one,
        .id_table = sta2x11_vip_pci_tbl,
 #ifdef CONFIG_PM
        .suspend = sta2x11_vip_suspend,
index 4bd8bd56befc2230d739c89c7deea63b0644bd25..4656d4a10af062286f313ef0aa4ac73f10b45014 100644 (file)
@@ -2367,8 +2367,8 @@ static int frontend_init(struct av7110 *av7110)
  * The same behaviour of missing VSYNC can be duplicated on budget
  * cards, by seting DD1_INIT trigger mode 7 in 3rd nibble.
  */
-static int __devinit av7110_attach(struct saa7146_dev* dev,
-                                  struct saa7146_pci_extension_data *pci_ext)
+static int av7110_attach(struct saa7146_dev* dev,
+                        struct saa7146_pci_extension_data *pci_ext)
 {
        const int length = TS_WIDTH * TS_HEIGHT;
        struct pci_dev *pdev = dev->pci;
@@ -2761,7 +2761,7 @@ err_kfree_0:
        goto out;
 }
 
-static int __devexit av7110_detach(struct saa7146_dev* saa)
+static int av7110_detach(struct saa7146_dev* saa)
 {
        struct av7110 *av7110 = saa->ext_priv;
        dprintk(4, "%p\n", av7110);
@@ -2910,7 +2910,7 @@ static struct saa7146_extension av7110_extension_driver = {
        .module         = THIS_MODULE,
        .pci_tbl        = &pci_tbl[0],
        .attach         = av7110_attach,
-       .detach         = __devexit_p(av7110_detach),
+       .detach         = av7110_detach,
 
        .irq_mask       = MASK_19 | MASK_03 | MASK_10,
        .irq_func       = av7110_irq,
index 908f272fe26cc0b1c6ad8c4517c8342b1a94a44a..eb822862a6467fdc096fd9f992d8c6b863045cb2 100644 (file)
@@ -324,7 +324,7 @@ static void ir_handler(struct av7110 *av7110, u32 ircom)
 }
 
 
-int __devinit av7110_ir_init(struct av7110 *av7110)
+int av7110_ir_init(struct av7110 *av7110)
 {
        struct input_dev *input_dev;
        static struct proc_dir_entry *e;
@@ -385,7 +385,7 @@ int __devinit av7110_ir_init(struct av7110 *av7110)
 }
 
 
-void __devexit av7110_ir_exit(struct av7110 *av7110)
+void av7110_ir_exit(struct av7110 *av7110)
 {
        int i;
 
index fffc54b452c8aa8f510928eaa40c7e99171f8d3f..a90a3b9b09bff6074f1f06c808b655425b1180c2 100644 (file)
@@ -369,7 +369,7 @@ static const unsigned short bt819_addrs[] = { 0x45, I2C_CLIENT_END };
 static const unsigned short bt856_addrs[] = { 0x44, I2C_CLIENT_END };
 static const unsigned short bt866_addrs[] = { 0x44, I2C_CLIENT_END };
 
-static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
+static struct card_info zoran_cards[NUM_CARDS] = {
        {
                .type = DC10_old,
                .name = "DC10(old)",
@@ -948,8 +948,7 @@ zoran_open_init_params (struct zoran *zr)
        zr->testing = 0;
 }
 
-static void __devinit
-test_interrupts (struct zoran *zr)
+static void test_interrupts (struct zoran *zr)
 {
        DEFINE_WAIT(wait);
        int timeout, icr;
@@ -974,8 +973,7 @@ test_interrupts (struct zoran *zr)
        btwrite(icr, ZR36057_ICR);
 }
 
-static int __devinit
-zr36057_init (struct zoran *zr)
+static int zr36057_init (struct zoran *zr)
 {
        int j, err;
 
@@ -1083,7 +1081,7 @@ exit_free:
        return err;
 }
 
-static void __devexit zoran_remove(struct pci_dev *pdev)
+static void zoran_remove(struct pci_dev *pdev)
 {
        struct v4l2_device *v4l2_dev = dev_get_drvdata(&pdev->dev);
        struct zoran *zr = to_zoran(v4l2_dev);
@@ -1129,9 +1127,8 @@ zoran_vdev_release (struct video_device *vdev)
        kfree(vdev);
 }
 
-static struct videocodec_master * __devinit
-zoran_setup_videocodec (struct zoran *zr,
-                       int           type)
+static struct videocodec_master *zoran_setup_videocodec(struct zoran *zr,
+                                                       int type)
 {
        struct videocodec_master *m = NULL;
 
@@ -1192,8 +1189,7 @@ static void zoran_subdev_notify(struct v4l2_subdev *sd, unsigned int cmd, void *
  *   Scan for a Buz card (actually for the PCI controller ZR36057),
  *   request the irq and map the io memory
  */
-static int __devinit zoran_probe(struct pci_dev *pdev,
-                                const struct pci_device_id *ent)
+static int zoran_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        unsigned char latency, need_latency;
        struct zoran *zr;
@@ -1459,7 +1455,7 @@ static struct pci_driver zoran_driver = {
        .name = "zr36067",
        .id_table = zr36067_pci_tbl,
        .probe = zoran_probe,
-       .remove = __devexit_p(zoran_remove),
+       .remove = zoran_remove,
 };
 
 static int __init zoran_init(void)
index 53f12c7466b0b971218c2c1c6d769fa0d3f32461..e60ae41e2319e0aaf91538454984a12e8975ab8e 100644 (file)
@@ -3080,7 +3080,7 @@ static const struct v4l2_file_operations zoran_fops = {
        .poll = zoran_poll,
 };
 
-struct video_device zoran_template __devinitdata = {
+struct video_device zoran_template = {
        .name = ZORAN_NAME,
        .fops = &zoran_fops,
        .ioctl_ops = &zoran_ioctl_ops,
index ec476ef5b709bbe8c56e354e6fecb5d3c70902d5..1aad2a65d2f35d2e2c280ad77db725a2a0d3305b 100644 (file)
@@ -862,7 +862,7 @@ static struct v4l2_file_operations bcap_fops = {
        .poll = bcap_poll
 };
 
-static int __devinit bcap_probe(struct platform_device *pdev)
+static int bcap_probe(struct platform_device *pdev)
 {
        struct bcap_device *bcap_dev;
        struct video_device *vfd;
@@ -1026,7 +1026,7 @@ err_free_dev:
        return ret;
 }
 
-static int __devexit bcap_remove(struct platform_device *pdev)
+static int bcap_remove(struct platform_device *pdev)
 {
        struct v4l2_device *v4l2_dev = platform_get_drvdata(pdev);
        struct bcap_device *bcap_dev = container_of(v4l2_dev,
@@ -1048,7 +1048,7 @@ static struct platform_driver bcap_driver = {
                .owner = THIS_MODULE,
        },
        .probe = bcap_probe,
-       .remove = __devexit_p(bcap_remove),
+       .remove = bcap_remove,
 };
 module_platform_driver(bcap_driver);
 
index 7b8b547f2d51867115f9bf5a510495e6c35baebb..1cf8293c0fb048054177b82e0f0ce44b704de81c 100644 (file)
@@ -1891,7 +1891,7 @@ static const struct of_device_id coda_dt_ids[] = {
 MODULE_DEVICE_TABLE(of, coda_dt_ids);
 #endif
 
-static int __devinit coda_probe(struct platform_device *pdev)
+static int coda_probe(struct platform_device *pdev)
 {
        const struct of_device_id *of_id =
                        of_match_device(of_match_ptr(coda_dt_ids), &pdev->dev);
@@ -2033,7 +2033,7 @@ static int coda_remove(struct platform_device *pdev)
 
 static struct platform_driver coda_driver = {
        .probe  = coda_probe,
-       .remove = __devexit_p(coda_remove),
+       .remove = coda_remove,
        .driver = {
                .name   = CODA_NAME,
                .owner  = THIS_MODULE,
index 030950dcfb1628d56d0a640e264750da0ea62f45..f263cabade7af0d7b8f315fdce1102160b5d3610 100644 (file)
@@ -965,7 +965,7 @@ static struct ccdc_hw_device ccdc_hw_dev = {
        },
 };
 
-static int __devinit dm355_ccdc_probe(struct platform_device *pdev)
+static int dm355_ccdc_probe(struct platform_device *pdev)
 {
        void (*setup_pinmux)(void);
        struct resource *res;
@@ -1069,7 +1069,7 @@ static struct platform_driver dm355_ccdc_driver = {
                .name   = "dm355_ccdc",
                .owner = THIS_MODULE,
        },
-       .remove = __devexit_p(dm355_ccdc_remove),
+       .remove = dm355_ccdc_remove,
        .probe = dm355_ccdc_probe,
 };
 
index 0215ab6ebc909d3ae4b4042aa4c8880223b0beb4..318e805129984348cb6d3295c7caa71f0e9a2548 100644 (file)
@@ -957,7 +957,7 @@ static struct ccdc_hw_device ccdc_hw_dev = {
        },
 };
 
-static int __devinit dm644x_ccdc_probe(struct platform_device *pdev)
+static int dm644x_ccdc_probe(struct platform_device *pdev)
 {
        struct resource *res;
        int status = 0;
@@ -1078,7 +1078,7 @@ static struct platform_driver dm644x_ccdc_driver = {
                .owner = THIS_MODULE,
                .pm = &dm644x_ccdc_pm_ops,
        },
-       .remove = __devexit_p(dm644x_ccdc_remove),
+       .remove = dm644x_ccdc_remove,
        .probe = dm644x_ccdc_probe,
 };
 
index 2c26c3e1837eb05b974a8e071f62640354264407..5050f9265f48333c53a3bdaa35353ebe7daf60bd 100644 (file)
@@ -1032,7 +1032,7 @@ static struct ccdc_hw_device isif_hw_dev = {
        },
 };
 
-static int __devinit isif_probe(struct platform_device *pdev)
+static int isif_probe(struct platform_device *pdev)
 {
        void (*setup_pinmux)(void);
        struct resource *res;
@@ -1156,7 +1156,7 @@ static struct platform_driver isif_driver = {
                .name   = "isif",
                .owner = THIS_MODULE,
        },
-       .remove = __devexit_p(isif_remove),
+       .remove = isif_remove,
        .probe = isif_probe,
 };
 
index 7f5cf9b347b2c40e22f5056a0fe062a31cfabf86..841b91a3d2551763db04cdc4c6a6e0459645a457 100644 (file)
@@ -807,7 +807,7 @@ static struct vpbe_device_ops vpbe_dev_ops = {
        .set_mode = vpbe_set_mode,
 };
 
-static __devinit int vpbe_probe(struct platform_device *pdev)
+static int vpbe_probe(struct platform_device *pdev)
 {
        struct vpbe_device *vpbe_dev;
        struct vpbe_config *cfg;
index 2bfde7958fefb700d948d9635a32ae9c4888ab88..e707a6f2325ba63cced2d05839f092171c382f15 100644 (file)
@@ -1662,8 +1662,8 @@ static int vpbe_device_get(struct device *dev, void *data)
        return 0;
 }
 
-static __devinit int init_vpbe_layer(int i, struct vpbe_display *disp_dev,
-                                    struct platform_device *pdev)
+static int init_vpbe_layer(int i, struct vpbe_display *disp_dev,
+                          struct platform_device *pdev)
 {
        struct vpbe_layer *vpbe_display_layer = NULL;
        struct video_device *vbd = NULL;
@@ -1718,9 +1718,10 @@ static __devinit int init_vpbe_layer(int i, struct vpbe_display *disp_dev,
        return 0;
 }
 
-static __devinit int register_device(struct vpbe_layer *vpbe_display_layer,
-                                       struct vpbe_display *disp_dev,
-                                       struct platform_device *pdev) {
+static int register_device(struct vpbe_layer *vpbe_display_layer,
+                          struct vpbe_display *disp_dev,
+                          struct platform_device *pdev)
+{
        int err;
 
        v4l2_info(&disp_dev->vpbe_dev->v4l2_dev,
@@ -1752,7 +1753,7 @@ static __devinit int register_device(struct vpbe_layer *vpbe_display_layer,
  * This function creates device entries by register itself to the V4L2 driver
  * and initializes fields of each layer objects
  */
-static __devinit int vpbe_display_probe(struct platform_device *pdev)
+static int vpbe_display_probe(struct platform_device *pdev)
 {
        struct vpbe_layer *vpbe_display_layer;
        struct vpbe_display *disp_dev;
@@ -1886,7 +1887,7 @@ static struct platform_driver vpbe_display_driver = {
                .bus = &platform_bus_type,
        },
        .probe = vpbe_display_probe,
-       .remove = __devexit_p(vpbe_display_remove),
+       .remove = vpbe_display_remove,
 };
 
 module_platform_driver(vpbe_display_driver);
index 8be492cd8ed46bf58a9cd79ce4d26ed8474404aa..be9d3e1b48687bf25830fec6f53711aed6eafbf5 100644 (file)
@@ -1831,7 +1831,7 @@ static struct vpfe_device *vpfe_initialize(void)
  * itself to the V4L2 driver and initializes fields of each
  * device objects
  */
-static __devinit int vpfe_probe(struct platform_device *pdev)
+static int vpfe_probe(struct platform_device *pdev)
 {
        struct vpfe_subdev_info *sdinfo;
        struct vpfe_config *vpfe_cfg;
@@ -2038,7 +2038,7 @@ probe_free_dev_mem:
 /*
  * vpfe_remove : It un-register device from V4L2 driver
  */
-static int __devexit vpfe_remove(struct platform_device *pdev)
+static int vpfe_remove(struct platform_device *pdev)
 {
        struct vpfe_device *vpfe_dev = platform_get_drvdata(pdev);
 
@@ -2075,7 +2075,7 @@ static struct platform_driver vpfe_driver = {
                .pm = &vpfe_dev_pm_ops,
        },
        .probe = vpfe_probe,
-       .remove = __devexit_p(vpfe_remove),
+       .remove = vpfe_remove,
 };
 
 module_platform_driver(vpfe_driver);
index 0d6cc8e4deb28889ea2286b0e84cb8a194475dd2..28638a86f12964c9ab81e3d5bd99d9ba495429a7 100644 (file)
@@ -419,7 +419,7 @@ int vpif_channel_getfid(u8 channel_id)
 }
 EXPORT_SYMBOL(vpif_channel_getfid);
 
-static int __devinit vpif_probe(struct platform_device *pdev)
+static int vpif_probe(struct platform_device *pdev)
 {
        int status = 0;
 
@@ -457,7 +457,7 @@ fail:
        return status;
 }
 
-static int __devexit vpif_remove(struct platform_device *pdev)
+static int vpif_remove(struct platform_device *pdev)
 {
        if (vpif_clk) {
                clk_disable_unprepare(vpif_clk);
@@ -498,7 +498,7 @@ static struct platform_driver vpif_driver = {
                .owner = THIS_MODULE,
                .pm     = vpif_pm_ops,
        },
-       .remove = __devexit_p(vpif_remove),
+       .remove = vpif_remove,
        .probe = vpif_probe,
 };
 
index 146e4b01ac177593b58ad5c7fadc1724d2118973..cdbff88e0f1e337beacb06d108f403ba422396ba 100644 (file)
@@ -357,7 +357,7 @@ void dm365_vpss_set_pg_frame_size(struct vpss_pg_frame_size frame_size)
 }
 EXPORT_SYMBOL(dm365_vpss_set_pg_frame_size);
 
-static int __devinit vpss_probe(struct platform_device *pdev)
+static int vpss_probe(struct platform_device *pdev)
 {
        struct resource         *r1, *r2;
        char *platform_name;
@@ -445,7 +445,7 @@ fail1:
        return status;
 }
 
-static int __devexit vpss_remove(struct platform_device *pdev)
+static int vpss_remove(struct platform_device *pdev)
 {
        struct resource         *res;
 
@@ -465,7 +465,7 @@ static struct platform_driver vpss_driver = {
                .name   = "vpss",
                .owner = THIS_MODULE,
        },
-       .remove = __devexit_p(vpss_remove),
+       .remove = vpss_remove,
        .probe = vpss_probe,
 };
 
index cc7b218d047cffb5e48e0e031eaae6ae7a0bbffb..2b1b9f30e1f940032e20505142cd7291f3587511 100644 (file)
@@ -1151,7 +1151,7 @@ err_clk:
        return ret;
 }
 
-static int __devexit gsc_remove(struct platform_device *pdev)
+static int gsc_remove(struct platform_device *pdev)
 {
        struct gsc_dev *gsc = platform_get_drvdata(pdev);
 
@@ -1237,7 +1237,7 @@ static const struct dev_pm_ops gsc_pm_ops = {
 
 static struct platform_driver gsc_driver = {
        .probe          = gsc_probe,
-       .remove = __devexit_p(gsc_remove),
+       .remove         = gsc_remove,
        .id_table       = gsc_driver_ids,
        .driver = {
                .name   = GSC_MODULE_NAME,
index a8ddb0cacab82cc7d81e5c3f17b6d4d5f29d9a2a..9115a2c8d075b4be9f69be36cfcb1bcfd05bf820 100644 (file)
@@ -1478,7 +1478,7 @@ static struct video_device viu_template = {
        .current_norm   = V4L2_STD_NTSC_M,
 };
 
-static int __devinit viu_of_probe(struct platform_device *op)
+static int viu_of_probe(struct platform_device *op)
 {
        struct viu_dev *viu_dev;
        struct video_device *vdev;
@@ -1615,7 +1615,7 @@ err:
        return ret;
 }
 
-static int __devexit viu_of_remove(struct platform_device *op)
+static int viu_of_remove(struct platform_device *op)
 {
        struct v4l2_device *v4l2_dev = dev_get_drvdata(&op->dev);
        struct viu_dev *dev = container_of(v4l2_dev, struct viu_dev, v4l2_dev);
@@ -1668,7 +1668,7 @@ MODULE_DEVICE_TABLE(of, mpc512x_viu_of_match);
 
 static struct platform_driver viu_of_platform_driver = {
        .probe = viu_of_probe,
-       .remove = __devexit_p(viu_of_remove),
+       .remove = viu_of_remove,
 #ifdef CONFIG_PM
        .suspend = viu_suspend,
        .resume = viu_resume,
index 70f45c381318929f4b80b70025fb368305a0b788..8b7ccea982e771e109327cbcf40683b41bd48c18 100644 (file)
@@ -1736,7 +1736,7 @@ static struct v4l2_int_device omap24xxcam = {
  *
  */
 
-static int __devinit omap24xxcam_probe(struct platform_device *pdev)
+static int omap24xxcam_probe(struct platform_device *pdev)
 {
        struct omap24xxcam_device *cam;
        struct resource *mem;
index a9f6de5b69d85949fdda469d9ed2e9aaafa8cdd5..e4aaee91201dade6d811ebdb2b3c21d44f69f299 100644 (file)
@@ -71,8 +71,6 @@
 #include <media/v4l2-common.h>
 #include <media/v4l2-device.h>
 
-#include <plat/cpu.h>
-
 #include "isp.h"
 #include "ispreg.h"
 #include "ispccdc.h"
@@ -1992,7 +1990,7 @@ error_csiphy:
  *
  * Always returns 0.
  */
-static int __devexit isp_remove(struct platform_device *pdev)
+static int isp_remove(struct platform_device *pdev)
 {
        struct isp_device *isp = platform_get_drvdata(pdev);
        int i;
@@ -2073,7 +2071,7 @@ static int isp_map_mem_resource(struct platform_device *pdev,
  *   -EINVAL if couldn't install ISR,
  *   or clk_get return error value.
  */
-static int __devinit isp_probe(struct platform_device *pdev)
+static int isp_probe(struct platform_device *pdev)
 {
        struct isp_platform_data *pdata = pdev->dev.platform_data;
        struct isp_device *isp;
@@ -2252,7 +2250,7 @@ MODULE_DEVICE_TABLE(platform, omap3isp_id_table);
 
 static struct platform_driver omap3isp_driver = {
        .probe = isp_probe,
-       .remove = __devexit_p(isp_remove),
+       .remove = isp_remove,
        .id_table = omap3isp_id_table,
        .driver = {
                .owner = THIS_MODULE,
index 0dd65376c067a2052373c82a13a3b13d7600ffb6..e2716c35f8f189ebbfbbb44de6386ffb82fc4133 100644 (file)
@@ -531,7 +531,7 @@ err_sd:
        return ret;
 }
 
-static int __devexit s3c_camif_remove(struct platform_device *pdev)
+static int s3c_camif_remove(struct platform_device *pdev)
 {
        struct camif_dev *camif = platform_get_drvdata(pdev);
        struct s3c_camif_plat_data *pdata = &camif->pdata;
@@ -645,7 +645,7 @@ static const struct dev_pm_ops s3c_camif_pm_ops = {
 
 static struct platform_driver s3c_camif_driver = {
        .probe          = s3c_camif_probe,
-       .remove         = __devexit_p(s3c_camif_remove),
+       .remove         = s3c_camif_remove,
        .id_table       = s3c_camif_driver_ids,
        .driver = {
                .name   = S3C_CAMIF_DRIVER_NAME,
index 8d0d2b94a135f45b0d8fa2c1378fd287aff7ef27..545b46ae12a1ae90c63c93c4e18f76ddc81ca7af 100644 (file)
@@ -1035,7 +1035,7 @@ static int fimc_suspend(struct device *dev)
 }
 #endif /* CONFIG_PM_SLEEP */
 
-static int __devexit fimc_remove(struct platform_device *pdev)
+static int fimc_remove(struct platform_device *pdev)
 {
        struct fimc_dev *fimc = platform_get_drvdata(pdev);
 
@@ -1234,7 +1234,7 @@ static const struct dev_pm_ops fimc_pm_ops = {
 
 static struct platform_driver fimc_driver = {
        .probe          = fimc_probe,
-       .remove         = __devexit_p(fimc_remove),
+       .remove         = fimc_remove,
        .id_table       = fimc_driver_ids,
        .driver = {
                .name   = FIMC_MODULE_NAME,
index 1b309a72f09fbe847c1b4ac2178c1717a68f5a04..ed67220d0a64734bd56498c63555db5c732d4f5a 100644 (file)
@@ -1406,7 +1406,7 @@ static int fimc_lite_clk_get(struct fimc_lite *fimc)
        return ret;
 }
 
-static int __devinit fimc_lite_probe(struct platform_device *pdev)
+static int fimc_lite_probe(struct platform_device *pdev)
 {
        struct flite_drvdata *drv_data = fimc_lite_get_drvdata(pdev);
        struct fimc_lite *fimc;
@@ -1547,7 +1547,7 @@ static int fimc_lite_suspend(struct device *dev)
 }
 #endif /* CONFIG_PM_SLEEP */
 
-static int __devexit fimc_lite_remove(struct platform_device *pdev)
+static int fimc_lite_remove(struct platform_device *pdev)
 {
        struct fimc_lite *fimc = platform_get_drvdata(pdev);
        struct device *dev = &pdev->dev;
@@ -1595,7 +1595,7 @@ static const struct dev_pm_ops fimc_lite_pm_ops = {
 
 static struct platform_driver fimc_lite_driver = {
        .probe          = fimc_lite_probe,
-       .remove         = __devexit_p(fimc_lite_remove),
+       .remove         = fimc_lite_remove,
        .id_table       = fimc_lite_driver_ids,
        .driver = {
                .name           = FIMC_LITE_DRV_NAME,
index 1bd5678cfeb9d13f4bfd4b1dc0f7ffccac5ce33b..4ab99f3a7b0950310d89470d7be47854f4f6f219 100644 (file)
@@ -1000,7 +1000,7 @@ err_md:
        return ret;
 }
 
-static int __devexit fimc_md_remove(struct platform_device *pdev)
+static int fimc_md_remove(struct platform_device *pdev)
 {
        struct fimc_md *fmd = platform_get_drvdata(pdev);
 
@@ -1015,7 +1015,7 @@ static int __devexit fimc_md_remove(struct platform_device *pdev)
 
 static struct platform_driver fimc_md_driver = {
        .probe          = fimc_md_probe,
-       .remove         = __devexit_p(fimc_md_remove),
+       .remove         = fimc_md_remove,
        .driver = {
                .name   = "s5p-fimc-md",
                .owner  = THIS_MODULE,
index 4c961b1b68e6004ab1dd98d578b0e6cc407e97f9..ec3fa7d75306675d4fde53ecb2c2f52c0fc6cbe8 100644 (file)
@@ -654,7 +654,7 @@ static irqreturn_t s5pcsis_irq_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit s5pcsis_probe(struct platform_device *pdev)
+static int s5pcsis_probe(struct platform_device *pdev)
 {
        struct s5p_platform_mipi_csis *pdata;
        struct resource *mem_res;
@@ -851,7 +851,7 @@ static int s5pcsis_runtime_resume(struct device *dev)
 }
 #endif
 
-static int __devexit s5pcsis_remove(struct platform_device *pdev)
+static int s5pcsis_remove(struct platform_device *pdev)
 {
        struct v4l2_subdev *sd = platform_get_drvdata(pdev);
        struct csis_state *state = sd_to_csis_state(sd);
@@ -876,7 +876,7 @@ static const struct dev_pm_ops s5pcsis_pm_ops = {
 
 static struct platform_driver s5pcsis_driver = {
        .probe          = s5pcsis_probe,
-       .remove         = __devexit_p(s5pcsis_remove),
+       .remove         = s5pcsis_remove,
        .driver         = {
                .name   = CSIS_DRIVER_NAME,
                .owner  = THIS_MODULE,
index 3afe879d54d7dec195cc99ff49aa316ff42ff53a..379f574337119e4aecc60896e3ae0fc6fc336e39 100644 (file)
@@ -1203,7 +1203,7 @@ err_res:
 }
 
 /* Remove the driver */
-static int __devexit s5p_mfc_remove(struct platform_device *pdev)
+static int s5p_mfc_remove(struct platform_device *pdev)
 {
        struct s5p_mfc_dev *dev = platform_get_drvdata(pdev);
 
@@ -1368,7 +1368,7 @@ MODULE_DEVICE_TABLE(platform, mfc_driver_ids);
 
 static struct platform_driver s5p_mfc_driver = {
        .probe          = s5p_mfc_probe,
-       .remove         = __devexit_p(s5p_mfc_remove),
+       .remove         = s5p_mfc_remove,
        .id_table       = mfc_driver_ids,
        .driver = {
                .name   = S5P_MFC_NAME,
index 8a9cf43018f635f48724953756108ec3ce800cb5..7c1116c73bf3e09c76d81c2ca397bcc042fc3c13 100644 (file)
@@ -830,7 +830,7 @@ fail:
        return -ENODEV;
 }
 
-static int __devinit hdmi_probe(struct platform_device *pdev)
+static int hdmi_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct resource *res;
@@ -979,7 +979,7 @@ fail:
        return ret;
 }
 
-static int __devexit hdmi_remove(struct platform_device *pdev)
+static int hdmi_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct v4l2_subdev *sd = dev_get_drvdata(dev);
@@ -997,7 +997,7 @@ static int __devexit hdmi_remove(struct platform_device *pdev)
 
 static struct platform_driver hdmi_driver __refdata = {
        .probe = hdmi_probe,
-       .remove = __devexit_p(hdmi_remove),
+       .remove = hdmi_remove,
        .id_table = hdmi_driver_types,
        .driver = {
                .name = "s5p-hdmi",
index f67b386318014c34dff3fdc13c9aa8815eaf1d13..06b5d2dbb2d9000294209a74c04d85606f5083c9 100644 (file)
@@ -279,8 +279,8 @@ static const struct v4l2_subdev_ops hdmiphy_ops = {
        .video = &hdmiphy_video_ops,
 };
 
-static int __devinit hdmiphy_probe(struct i2c_client *client,
-       const struct i2c_device_id *id)
+static int hdmiphy_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct hdmiphy_ctx *ctx;
 
@@ -295,7 +295,7 @@ static int __devinit hdmiphy_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit hdmiphy_remove(struct i2c_client *client)
+static int hdmiphy_remove(struct i2c_client *client)
 {
        struct v4l2_subdev *sd = i2c_get_clientdata(client);
        struct hdmiphy_ctx *ctx = sd_to_ctx(sd);
@@ -322,7 +322,7 @@ static struct i2c_driver hdmiphy_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = hdmiphy_probe,
-       .remove         = __devexit_p(hdmiphy_remove),
+       .remove         = hdmiphy_remove,
        .id_table = hdmiphy_id,
 };
 
index ddb422e23550214df4877bd1767495723acab0a9..b671e20e9318abcb6e062c6648bc967485a20e01 100644 (file)
@@ -290,7 +290,7 @@ static inline struct v4l2_subdev *to_outsd(struct mxr_device *mdev)
 struct mxr_platform_data;
 
 /** acquiring common video resources */
-int __devinit mxr_acquire_video(struct mxr_device *mdev,
+int mxr_acquire_video(struct mxr_device *mdev,
        struct mxr_output_conf *output_cont, int output_count);
 
 /** releasing common video resources */
index ca0f2971744851e6ee9770fcc3227ad8c699be72..02faea03aa7d1679cbdefe5fe9b9b002c60abdfc 100644 (file)
@@ -151,8 +151,8 @@ void mxr_power_put(struct mxr_device *mdev)
 
 /* --------- RESOURCE MANAGEMENT -------------*/
 
-static int __devinit mxr_acquire_plat_resources(struct mxr_device *mdev,
-       struct platform_device *pdev)
+static int mxr_acquire_plat_resources(struct mxr_device *mdev,
+                                     struct platform_device *pdev)
 {
        struct resource *res;
        int ret;
@@ -271,8 +271,8 @@ fail:
        return -ENODEV;
 }
 
-static int __devinit mxr_acquire_resources(struct mxr_device *mdev,
-       struct platform_device *pdev)
+static int mxr_acquire_resources(struct mxr_device *mdev,
+                                struct platform_device *pdev)
 {
        int ret;
        ret = mxr_acquire_plat_resources(mdev, pdev);
@@ -310,8 +310,8 @@ static void mxr_release_layers(struct mxr_device *mdev)
                        mxr_layer_release(mdev->layer[i]);
 }
 
-static int __devinit mxr_acquire_layers(struct mxr_device *mdev,
-       struct mxr_platform_data *pdata)
+static int mxr_acquire_layers(struct mxr_device *mdev,
+                             struct mxr_platform_data *pdata)
 {
        mdev->layer[0] = mxr_graph_layer_create(mdev, 0);
        mdev->layer[1] = mxr_graph_layer_create(mdev, 1);
@@ -372,7 +372,7 @@ static const struct dev_pm_ops mxr_pm_ops = {
 
 /* --------- DRIVER INITIALIZATION ---------- */
 
-static int __devinit mxr_probe(struct platform_device *pdev)
+static int mxr_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct mxr_platform_data *pdata = dev->platform_data;
@@ -431,7 +431,7 @@ fail:
        return ret;
 }
 
-static int __devexit mxr_remove(struct platform_device *pdev)
+static int mxr_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct mxr_device *mdev = to_mdev(dev);
@@ -450,7 +450,7 @@ static int __devexit mxr_remove(struct platform_device *pdev)
 
 static struct platform_driver mxr_driver __refdata = {
        .probe = mxr_probe,
-       .remove = __devexit_p(mxr_remove),
+       .remove = mxr_remove,
        .driver = {
                .name = MXR_DRIVER_NAME,
                .owner = THIS_MODULE,
index 7379e77bf4e1daf1b89ae7a3b66ba24322c18942..1f3b7436511cee3331956c7e2f6f5a75b3e56d14 100644 (file)
@@ -62,8 +62,8 @@ done:
        return sd;
 }
 
-int __devinit mxr_acquire_video(struct mxr_device *mdev,
-       struct mxr_output_conf *output_conf, int output_count)
+int mxr_acquire_video(struct mxr_device *mdev,
+                     struct mxr_output_conf *output_conf, int output_count)
 {
        struct device *dev = mdev->dev;
        struct v4l2_device *v4l2_dev = &mdev->v4l2_dev;
index ad68bbed014e2c3a31119c0f4ea46c0317903b5f..91a6939a270a56a237b450c57fb26bd1977af4fc 100644 (file)
@@ -292,7 +292,7 @@ static const struct dev_pm_ops sdo_pm_ops = {
        .runtime_resume  = sdo_runtime_resume,
 };
 
-static int __devinit sdo_probe(struct platform_device *pdev)
+static int sdo_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct sdo_device *sdev;
@@ -419,7 +419,7 @@ fail:
        return ret;
 }
 
-static int __devexit sdo_remove(struct platform_device *pdev)
+static int sdo_remove(struct platform_device *pdev)
 {
        struct v4l2_subdev *sd = dev_get_drvdata(&pdev->dev);
        struct sdo_device *sdev = sd_to_sdev(sd);
@@ -437,7 +437,7 @@ static int __devexit sdo_remove(struct platform_device *pdev)
 
 static struct platform_driver sdo_driver __refdata = {
        .probe = sdo_probe,
-       .remove = __devexit_p(sdo_remove),
+       .remove = sdo_remove,
        .driver = {
                .name = "s5p-sdo",
                .owner = THIS_MODULE,
index 716d4846f8bdba7cadf04e992fc36ece0ffac226..49191aac96348fb1ffa4c5fe771dc2a797b09e32 100644 (file)
@@ -315,8 +315,8 @@ static const struct v4l2_subdev_ops sii9234_ops = {
        .video = &sii9234_video_ops,
 };
 
-static int __devinit sii9234_probe(struct i2c_client *client,
-       const struct i2c_device_id *id)
+static int sii9234_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct device *dev = &client->dev;
        struct sii9234_platform_data *pdata = dev->platform_data;
@@ -378,7 +378,7 @@ fail:
        return ret;
 }
 
-static int __devexit sii9234_remove(struct i2c_client *client)
+static int sii9234_remove(struct i2c_client *client)
 {
        struct device *dev = &client->dev;
        struct v4l2_subdev *sd = i2c_get_clientdata(client);
@@ -406,7 +406,7 @@ static struct i2c_driver sii9234_driver = {
                .pm = &sii9234_pm_ops,
        },
        .probe          = sii9234_probe,
-       .remove         = __devexit_p(sii9234_remove),
+       .remove         = sii9234_remove,
        .id_table = sii9234_id,
 };
 
index a1c87f0ceaabe0285ddd2d6b03dd3ead5303d22d..f3c4571ac01e65064b28ef8917b27380351c5350 100644 (file)
@@ -1326,7 +1326,7 @@ static const struct video_device sh_vou_video_template = {
        .vfl_dir        = VFL_DIR_TX,
 };
 
-static int __devinit sh_vou_probe(struct platform_device *pdev)
+static int sh_vou_probe(struct platform_device *pdev)
 {
        struct sh_vou_pdata *vou_pdata = pdev->dev.platform_data;
        struct v4l2_rect *rect;
@@ -1461,7 +1461,7 @@ ereqmemreg:
        return ret;
 }
 
-static int __devexit sh_vou_remove(struct platform_device *pdev)
+static int sh_vou_remove(struct platform_device *pdev)
 {
        int irq = platform_get_irq(pdev, 0);
        struct v4l2_device *v4l2_dev = platform_get_drvdata(pdev);
@@ -1487,7 +1487,7 @@ static int __devexit sh_vou_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver __refdata sh_vou = {
-       .remove  = __devexit_p(sh_vou_remove),
+       .remove  = sh_vou_remove,
        .driver  = {
                .name   = "sh-vou",
                .owner  = THIS_MODULE,
index 6274a91c25c74b711f30510a584056697edaa6ed..d96c8c7e01d9f41f04c461556c841243e59a057b 100644 (file)
@@ -897,7 +897,7 @@ static struct soc_camera_host_ops isi_soc_camera_host_ops = {
 };
 
 /* -----------------------------------------------------------------------*/
-static int __devexit atmel_isi_remove(struct platform_device *pdev)
+static int atmel_isi_remove(struct platform_device *pdev)
 {
        struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
        struct atmel_isi *isi = container_of(soc_host,
@@ -921,7 +921,7 @@ static int __devexit atmel_isi_remove(struct platform_device *pdev)
        return 0;
 }
 
-static int __devinit atmel_isi_probe(struct platform_device *pdev)
+static int atmel_isi_probe(struct platform_device *pdev)
 {
        unsigned int irq;
        struct atmel_isi *isi;
@@ -1074,7 +1074,7 @@ err_clk_prepare_pclk:
 
 static struct platform_driver atmel_isi_driver = {
        .probe          = atmel_isi_probe,
-       .remove         = __devexit_p(atmel_isi_remove),
+       .remove         = atmel_isi_remove,
        .driver         = {
                .name = "atmel_isi",
                .owner = THIS_MODULE,
index 791cd1d54a769c5321cca32d8fa7cc6665467324..8bda2c908aba3b17aa53dc44f96474aca76a284f 100644 (file)
@@ -1692,7 +1692,7 @@ static irqreturn_t mx27_camera_emma_irq(int irq_emma, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit mx27_camera_emma_init(struct platform_device *pdev)
+static int mx27_camera_emma_init(struct platform_device *pdev)
 {
        struct mx2_camera_dev *pcdev = platform_get_drvdata(pdev);
        struct resource *res_emma;
@@ -1750,7 +1750,7 @@ out:
        return err;
 }
 
-static int __devinit mx2_camera_probe(struct platform_device *pdev)
+static int mx2_camera_probe(struct platform_device *pdev)
 {
        struct mx2_camera_dev *pcdev;
        struct resource *res_csi;
@@ -1887,7 +1887,7 @@ exit:
        return err;
 }
 
-static int __devexit mx2_camera_remove(struct platform_device *pdev)
+static int mx2_camera_remove(struct platform_device *pdev)
 {
        struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
        struct mx2_camera_dev *pcdev = container_of(soc_host,
@@ -1912,7 +1912,7 @@ static struct platform_driver mx2_camera_driver = {
                .name   = MX2_CAM_DRV_NAME,
        },
        .id_table       = mx2_camera_devtype,
-       .remove         = __devexit_p(mx2_camera_remove),
+       .remove         = mx2_camera_remove,
 };
 
 
index 06d16de763773b54f11941a73e2806fcbad30dab..45aef1053a49834c3515ee8093e99ceb0ea1b85a 100644 (file)
@@ -1143,7 +1143,7 @@ static struct soc_camera_host_ops mx3_soc_camera_host_ops = {
        .set_bus_param  = mx3_camera_set_bus_param,
 };
 
-static int __devinit mx3_camera_probe(struct platform_device *pdev)
+static int mx3_camera_probe(struct platform_device *pdev)
 {
        struct mx3_camera_dev *mx3_cam;
        struct resource *res;
@@ -1246,7 +1246,7 @@ egetres:
        return err;
 }
 
-static int __devexit mx3_camera_remove(struct platform_device *pdev)
+static int mx3_camera_remove(struct platform_device *pdev)
 {
        struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
        struct mx3_camera_dev *mx3_cam = container_of(soc_host,
@@ -1279,7 +1279,7 @@ static struct platform_driver mx3_camera_driver = {
                .name   = MX3_CAM_DRV_NAME,
        },
        .probe          = mx3_camera_probe,
-       .remove         = __devexit_p(mx3_camera_remove),
+       .remove         = mx3_camera_remove,
 };
 
 module_platform_driver(mx3_camera_driver);
index 3434ffe79c6ecc445a8b451dc2c55767b552c217..523330d00deeb08de48b525df93c8f71c29d6005 100644 (file)
@@ -1651,7 +1651,7 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
        .set_bus_param  = pxa_camera_set_bus_param,
 };
 
-static int __devinit pxa_camera_probe(struct platform_device *pdev)
+static int pxa_camera_probe(struct platform_device *pdev)
 {
        struct pxa_camera_dev *pcdev;
        struct resource *res;
@@ -1801,7 +1801,7 @@ exit:
        return err;
 }
 
-static int __devexit pxa_camera_remove(struct platform_device *pdev)
+static int pxa_camera_remove(struct platform_device *pdev)
 {
        struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
        struct pxa_camera_dev *pcdev = container_of(soc_host,
@@ -1840,7 +1840,7 @@ static struct platform_driver pxa_camera_driver = {
                .pm     = &pxa_camera_pm,
        },
        .probe          = pxa_camera_probe,
-       .remove         = __devexit_p(pxa_camera_remove),
+       .remove         = pxa_camera_remove,
 };
 
 module_platform_driver(pxa_camera_driver);
index 2d8861c0e8f2c23baae9908a0fdf2955e458ead3..ebbc126e71a6e409fda2cf5d798441531b004659 100644 (file)
@@ -2071,7 +2071,7 @@ static int bus_notify(struct notifier_block *nb,
        return NOTIFY_DONE;
 }
 
-static int __devinit sh_mobile_ceu_probe(struct platform_device *pdev)
+static int sh_mobile_ceu_probe(struct platform_device *pdev)
 {
        struct sh_mobile_ceu_dev *pcdev;
        struct resource *res;
@@ -2258,7 +2258,7 @@ exit:
        return err;
 }
 
-static int __devexit sh_mobile_ceu_remove(struct platform_device *pdev)
+static int sh_mobile_ceu_remove(struct platform_device *pdev)
 {
        struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
        struct sh_mobile_ceu_dev *pcdev = container_of(soc_host,
@@ -2307,7 +2307,7 @@ static struct platform_driver sh_mobile_ceu_driver = {
                .pm     = &sh_mobile_ceu_dev_pm_ops,
        },
        .probe          = sh_mobile_ceu_probe,
-       .remove         = __devexit_p(sh_mobile_ceu_remove),
+       .remove         = sh_mobile_ceu_remove,
 };
 
 static int __init sh_mobile_ceu_init(void)
index 05286500b4d432de590fa206070c2611bcb57a5a..a17aba9a0104c41cbc4e5e5d277010ecac577600 100644 (file)
@@ -294,7 +294,7 @@ static struct v4l2_subdev_ops sh_csi2_subdev_ops = {
        .video  = &sh_csi2_subdev_video_ops,
 };
 
-static __devinit int sh_csi2_probe(struct platform_device *pdev)
+static int sh_csi2_probe(struct platform_device *pdev)
 {
        struct resource *res;
        unsigned int irq;
@@ -366,7 +366,7 @@ ereqreg:
        return ret;
 }
 
-static __devexit int sh_csi2_remove(struct platform_device *pdev)
+static int sh_csi2_remove(struct platform_device *pdev)
 {
        struct sh_csi2 *priv = platform_get_drvdata(pdev);
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -382,7 +382,7 @@ static __devexit int sh_csi2_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver __refdata sh_csi2_pdrv = {
-       .remove = __devexit_p(sh_csi2_remove),
+       .remove = sh_csi2_remove,
        .probe  = sh_csi2_probe,
        .driver = {
                .name   = "sh-mobile-csi2",
index 4e3735679f172fa3daf9620e3364a26987649da3..2ec90eae6ba0e01c34e5d837749e3aa9e3ad4dca 100644 (file)
@@ -1530,7 +1530,7 @@ static int soc_camera_video_start(struct soc_camera_device *icd)
        return 0;
 }
 
-static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
+static int soc_camera_pdrv_probe(struct platform_device *pdev)
 {
        struct soc_camera_link *icl = pdev->dev.platform_data;
        struct soc_camera_device *icd;
@@ -1558,7 +1558,7 @@ static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
  * hot-pluggable. Now we know, that all our users - hosts and devices have
  * been unloaded already
  */
-static int __devexit soc_camera_pdrv_remove(struct platform_device *pdev)
+static int soc_camera_pdrv_remove(struct platform_device *pdev)
 {
        struct soc_camera_device *icd = platform_get_drvdata(pdev);
 
@@ -1572,7 +1572,7 @@ static int __devexit soc_camera_pdrv_remove(struct platform_device *pdev)
 
 static struct platform_driver __refdata soc_camera_pdrv = {
        .probe = soc_camera_pdrv_probe,
-       .remove  = __devexit_p(soc_camera_pdrv_remove),
+       .remove  = soc_camera_pdrv_remove,
        .driver  = {
                .name   = "soc-camera-pdrv",
                .owner  = THIS_MODULE,
index 02194c056b005f601d5d6743221f38c7f67971ab..d854d08a6c7f5f2c1e152215acc3daceb74bfc0b 100644 (file)
@@ -745,7 +745,7 @@ static int timblogiw_mmap(struct file *file, struct vm_area_struct *vma)
 
 /* Platform device functions */
 
-static __devinitconst struct v4l2_ioctl_ops timblogiw_ioctl_ops = {
+static struct v4l2_ioctl_ops timblogiw_ioctl_ops = {
        .vidioc_querycap                = timblogiw_querycap,
        .vidioc_enum_fmt_vid_cap        = timblogiw_enum_fmt,
        .vidioc_g_fmt_vid_cap           = timblogiw_g_fmt,
@@ -767,7 +767,7 @@ static __devinitconst struct v4l2_ioctl_ops timblogiw_ioctl_ops = {
        .vidioc_enum_framesizes         = timblogiw_enum_framesizes,
 };
 
-static __devinitconst struct v4l2_file_operations timblogiw_fops = {
+static struct v4l2_file_operations timblogiw_fops = {
        .owner          = THIS_MODULE,
        .open           = timblogiw_open,
        .release        = timblogiw_close,
@@ -777,7 +777,7 @@ static __devinitconst struct v4l2_file_operations timblogiw_fops = {
        .poll           = timblogiw_poll,
 };
 
-static __devinitconst struct video_device timblogiw_template = {
+static struct video_device timblogiw_template = {
        .name           = TIMBLOGIWIN_NAME,
        .fops           = &timblogiw_fops,
        .ioctl_ops      = &timblogiw_ioctl_ops,
@@ -786,7 +786,7 @@ static __devinitconst struct video_device timblogiw_template = {
        .tvnorms        = V4L2_STD_PAL | V4L2_STD_NTSC
 };
 
-static int __devinit timblogiw_probe(struct platform_device *pdev)
+static int timblogiw_probe(struct platform_device *pdev)
 {
        int err;
        struct timblogiw *lw = NULL;
@@ -848,7 +848,7 @@ err:
        return err;
 }
 
-static int __devexit timblogiw_remove(struct platform_device *pdev)
+static int timblogiw_remove(struct platform_device *pdev)
 {
        struct timblogiw *lw = platform_get_drvdata(pdev);
 
@@ -869,7 +869,7 @@ static struct platform_driver timblogiw_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = timblogiw_probe,
-       .remove         = __devexit_p(timblogiw_remove),
+       .remove         = timblogiw_remove,
 };
 
 module_platform_driver(timblogiw_platform_driver);
index eb404c2ce27043489a80ebfe1cbff114f55438ae..63e8c34612392fa808e2921ebcb7754902dde36e 100644 (file)
@@ -1324,7 +1324,7 @@ static struct video_device viacam_v4l_template = {
 #define VIACAM_SERIAL_CREG 0x46
 #define VIACAM_SERIAL_BIT 0x40
 
-static __devinit bool viacam_serial_is_enabled(void)
+static bool viacam_serial_is_enabled(void)
 {
        struct pci_bus *pbus = pci_find_bus(0, 0);
        u8 cbyte;
@@ -1353,7 +1353,7 @@ static struct ov7670_config sensor_cfg = {
        .clock_speed = 90,
 };
 
-static __devinit int viacam_probe(struct platform_device *pdev)
+static int viacam_probe(struct platform_device *pdev)
 {
        int ret;
        struct i2c_adapter *sensor_adapter;
@@ -1490,7 +1490,7 @@ out_unregister:
        return ret;
 }
 
-static __devexit int viacam_remove(struct platform_device *pdev)
+static int viacam_remove(struct platform_device *pdev)
 {
        struct via_camera *cam = via_cam_info;
        struct viafb_dev *viadev = pdev->dev.platform_data;
index b415211d0c4bee08a38093f3ddb11c9e9918a79e..bd4d3a7cdadd130511cc186679124fd6231a929c 100644 (file)
@@ -114,7 +114,8 @@ static struct snd_tea575x_ops maxiradio_tea_ops = {
        .set_direction = maxiradio_tea575x_set_direction,
 };
 
-static int __devinit maxiradio_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int maxiradio_probe(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        struct maxiradio *dev;
        struct v4l2_device *v4l2_dev;
@@ -172,7 +173,7 @@ errfr:
        return retval;
 }
 
-static void __devexit maxiradio_remove(struct pci_dev *pdev)
+static void maxiradio_remove(struct pci_dev *pdev)
 {
        struct v4l2_device *v4l2_dev = dev_get_drvdata(&pdev->dev);
        struct maxiradio *dev = to_maxiradio(v4l2_dev);
@@ -196,7 +197,7 @@ static struct pci_driver maxiradio_driver = {
        .name           = "radio-maxiradio",
        .id_table       = maxiradio_pci_tbl,
        .probe          = maxiradio_probe,
-       .remove         = __devexit_p(maxiradio_remove),
+       .remove         = maxiradio_remove,
 };
 
 static int __init maxiradio_init(void)
index c260a2a354b1d0ab7eabaa3c0166c44df1682c67..637a555649582e1ed8aaa9913d4c66ea47318b0d 100644 (file)
@@ -265,7 +265,7 @@ static const struct v4l2_ioctl_ops fmi_ioctl_ops = {
 };
 
 /* ladis: this is my card. does any other types exist? */
-static struct isapnp_device_id id_table[] __devinitdata = {
+static struct isapnp_device_id id_table[] = {
                /* SF16-FMI */
        {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
                ISAPNP_VENDOR('M','F','R'), ISAPNP_FUNCTION(0xad10), 0},
index 4efcbec74c52dd0f63532891f4f7ff8e7176e83e..9c0990457a7cd9b6982475072888d7de82fe548c 100644 (file)
@@ -197,13 +197,13 @@ static int fmr2_tea_ext_init(struct snd_tea575x *tea)
        return 0;
 }
 
-static struct pnp_device_id fmr2_pnp_ids[] __devinitdata = {
+static struct pnp_device_id fmr2_pnp_ids[] = {
        { .id = "MFRad13" }, /* tuner subdevice of SF16-FMD2 */
        { .id = "" }
 };
 MODULE_DEVICE_TABLE(pnp, fmr2_pnp_ids);
 
-static int __devinit fmr2_probe(struct fmr2 *fmr2, struct device *pdev, int io)
+static int fmr2_probe(struct fmr2 *fmr2, struct device *pdev, int io)
 {
        int err, i;
        char *card_name = fmr2->is_fmd2 ? "SF16-FMD2" : "SF16-FMR2";
@@ -249,7 +249,7 @@ static int __devinit fmr2_probe(struct fmr2 *fmr2, struct device *pdev, int io)
        return 0;
 }
 
-static int __devinit fmr2_isa_match(struct device *pdev, unsigned int ndev)
+static int fmr2_isa_match(struct device *pdev, unsigned int ndev)
 {
        struct fmr2 *fmr2 = kzalloc(sizeof(*fmr2), GFP_KERNEL);
        if (!fmr2)
@@ -265,8 +265,7 @@ static int __devinit fmr2_isa_match(struct device *pdev, unsigned int ndev)
        return 1;
 }
 
-static int __devinit fmr2_pnp_probe(struct pnp_dev *pdev,
-                               const struct pnp_device_id *id)
+static int fmr2_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
 {
        int ret;
        struct fmr2 *fmr2 = kzalloc(sizeof(*fmr2), GFP_KERNEL);
@@ -285,7 +284,7 @@ static int __devinit fmr2_pnp_probe(struct pnp_dev *pdev,
        return 0;
 }
 
-static void __devexit fmr2_remove(struct fmr2 *fmr2)
+static void fmr2_remove(struct fmr2 *fmr2)
 {
        snd_tea575x_exit(&fmr2->tea);
        release_region(fmr2->io, 2);
@@ -293,7 +292,7 @@ static void __devexit fmr2_remove(struct fmr2 *fmr2)
        kfree(fmr2);
 }
 
-static int __devexit fmr2_isa_remove(struct device *pdev, unsigned int ndev)
+static int fmr2_isa_remove(struct device *pdev, unsigned int ndev)
 {
        fmr2_remove(dev_get_drvdata(pdev));
        dev_set_drvdata(pdev, NULL);
@@ -301,7 +300,7 @@ static int __devexit fmr2_isa_remove(struct device *pdev, unsigned int ndev)
        return 0;
 }
 
-static void __devexit fmr2_pnp_remove(struct pnp_dev *pdev)
+static void fmr2_pnp_remove(struct pnp_dev *pdev)
 {
        fmr2_remove(pnp_get_drvdata(pdev));
        pnp_set_drvdata(pdev, NULL);
@@ -309,7 +308,7 @@ static void __devexit fmr2_pnp_remove(struct pnp_dev *pdev)
 
 struct isa_driver fmr2_isa_driver = {
        .match          = fmr2_isa_match,
-       .remove         = __devexit_p(fmr2_isa_remove),
+       .remove         = fmr2_isa_remove,
        .driver         = {
                .name   = "radio-sf16fmr2",
        },
@@ -319,7 +318,7 @@ struct pnp_driver fmr2_pnp_driver = {
        .name           = "radio-sf16fmr2",
        .id_table       = fmr2_pnp_ids,
        .probe          = fmr2_pnp_probe,
-       .remove         = __devexit_p(fmr2_pnp_remove),
+       .remove         = fmr2_pnp_remove,
 };
 
 static int __init fmr2_init(void)
index 36aec575e0ecd37e3ad7ddab10735684ad1c951b..1978516af67e01510fc849f006dcfdd0d59ba2a1 100644 (file)
@@ -493,8 +493,8 @@ static struct video_device tea5764_radio_template = {
 };
 
 /* I2C probe: check if the device exists and register with v4l if it is */
-static int __devinit tea5764_i2c_probe(struct i2c_client *client,
-                                       const struct i2c_device_id *id)
+static int tea5764_i2c_probe(struct i2c_client *client,
+                            const struct i2c_device_id *id)
 {
        struct tea5764_device *radio;
        struct tea5764_regs *r;
@@ -552,7 +552,7 @@ errfr:
        return ret;
 }
 
-static int __devexit tea5764_i2c_remove(struct i2c_client *client)
+static int tea5764_i2c_remove(struct i2c_client *client)
 {
        struct tea5764_device *radio = i2c_get_clientdata(client);
 
@@ -578,7 +578,7 @@ static struct i2c_driver tea5764_i2c_driver = {
                .owner = THIS_MODULE,
        },
        .probe = tea5764_i2c_probe,
-       .remove = __devexit_p(tea5764_i2c_remove),
+       .remove = tea5764_i2c_remove,
        .id_table = tea5764_id,
 };
 
index 5cf07779f4bb2b1ccddad9756f772184e036bed3..b87effeb5dc607ea57bf08bd1ca17cd0afabefff 100644 (file)
@@ -145,7 +145,7 @@ static const struct v4l2_file_operations timbradio_fops = {
        .unlocked_ioctl = video_ioctl2,
 };
 
-static int __devinit timbradio_probe(struct platform_device *pdev)
+static int timbradio_probe(struct platform_device *pdev)
 {
        struct timb_radio_platform_data *pdata = pdev->dev.platform_data;
        struct timbradio *tr;
@@ -201,7 +201,7 @@ err:
        return err;
 }
 
-static int __devexit timbradio_remove(struct platform_device *pdev)
+static int timbradio_remove(struct platform_device *pdev)
 {
        struct timbradio *tr = platform_get_drvdata(pdev);
 
@@ -219,7 +219,7 @@ static struct platform_driver timbradio_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = timbradio_probe,
-       .remove         = __devexit_p(timbradio_remove),
+       .remove         = timbradio_remove,
 };
 
 module_platform_driver(timbradio_platform_driver);
index 9b0c9fa0beb80307ac0a4b95785a2aaaa50fb0f3..c48be195bbad59a917141489887a8b4a1356a970 100644 (file)
@@ -1990,7 +1990,7 @@ static int wl1273_fm_radio_remove(struct platform_device *pdev)
        return 0;
 }
 
-static int __devinit wl1273_fm_radio_probe(struct platform_device *pdev)
+static int wl1273_fm_radio_probe(struct platform_device *pdev)
 {
        struct wl1273_core **core = pdev->dev.platform_data;
        struct wl1273_device *radio;
@@ -2145,7 +2145,7 @@ pdata_err:
 
 static struct platform_driver wl1273_fm_radio_driver = {
        .probe          = wl1273_fm_radio_probe,
-       .remove         = __devexit_p(wl1273_fm_radio_remove),
+       .remove         = wl1273_fm_radio_remove,
        .driver         = {
                .name   = "wl1273_fm_radio",
                .owner  = THIS_MODULE,
index 54db36ccb9ee2bb23d3e9615fe7c5b8a7e0967ef..06c06cc9ff254ef767d96dae23ab40912c24d035 100644 (file)
@@ -373,8 +373,8 @@ static const struct v4l2_subdev_ops saa7706h_ops = {
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
 
-static int __devinit saa7706h_probe(struct i2c_client *client,
-                       const struct i2c_device_id *id)
+static int saa7706h_probe(struct i2c_client *client,
+                         const struct i2c_device_id *id)
 {
        struct saa7706h_state *state;
        struct v4l2_subdev *sd;
@@ -418,7 +418,7 @@ err:
        return err;
 }
 
-static int __devexit saa7706h_remove(struct i2c_client *client)
+static int saa7706h_remove(struct i2c_client *client)
 {
        struct v4l2_subdev *sd = i2c_get_clientdata(client);
 
@@ -441,7 +441,7 @@ static struct i2c_driver saa7706h_driver = {
                .name   = DRIVER_NAME,
        },
        .probe          = saa7706h_probe,
-       .remove         = __devexit_p(saa7706h_remove),
+       .remove         = saa7706h_remove,
        .id_table       = saa7706h_id,
 };
 
index 4ef55ec8045e432fcc9576e130e902bc92446bed..e5fc9acd0c4f5debdc03cb4645ac2cd3f2a23c6b 100644 (file)
@@ -347,8 +347,8 @@ end:
 /*
  * si470x_i2c_probe - probe for the device
  */
-static int __devinit si470x_i2c_probe(struct i2c_client *client,
-               const struct i2c_device_id *id)
+static int si470x_i2c_probe(struct i2c_client *client,
+                           const struct i2c_device_id *id)
 {
        struct si470x_device *radio;
        int retval = 0;
@@ -451,7 +451,7 @@ err_initial:
 /*
  * si470x_i2c_remove - remove the device
  */
-static __devexit int si470x_i2c_remove(struct i2c_client *client)
+static int si470x_i2c_remove(struct i2c_client *client)
 {
        struct si470x_device *radio = i2c_get_clientdata(client);
 
@@ -514,7 +514,7 @@ static struct i2c_driver si470x_i2c_driver = {
 #endif
        },
        .probe                  = si470x_i2c_probe,
-       .remove                 = __devexit_p(si470x_i2c_remove),
+       .remove                 = si470x_i2c_remove,
        .id_table               = si470x_i2c_id,
 };
 
index 06d47e5cce9f31433263bde7987033180d427f79..b18c2dc268bab2705ee6cd88cdcea9bb970c71aa 100644 (file)
@@ -165,8 +165,8 @@ static const struct v4l2_subdev_ops tef6862_ops = {
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
 
-static int __devinit tef6862_probe(struct i2c_client *client,
-                       const struct i2c_device_id *id)
+static int tef6862_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct tef6862_state *state;
        struct v4l2_subdev *sd;
@@ -189,7 +189,7 @@ static int __devinit tef6862_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit tef6862_remove(struct i2c_client *client)
+static int tef6862_remove(struct i2c_client *client)
 {
        struct v4l2_subdev *sd = i2c_get_clientdata(client);
 
@@ -211,7 +211,7 @@ static struct i2c_driver tef6862_driver = {
                .name   = DRIVER_NAME,
        },
        .probe          = tef6862_probe,
-       .remove         = __devexit_p(tef6862_remove),
+       .remove         = tef6862_remove,
        .id_table       = tef6862_id,
 };
 
index 22231dd4f62b9432039bc41fdf954c86d60415b0..cef04786b52f57bc69eec2658a8712d75ccfd8ee 100644 (file)
@@ -1172,7 +1172,7 @@ static struct pnp_driver ene_driver = {
        .flags = PNP_DRIVER_RES_DO_NOT_CHANGE,
 
        .probe = ene_probe,
-       .remove = __devexit_p(ene_remove),
+       .remove = ene_remove,
 #ifdef CONFIG_PM
        .suspend = ene_suspend,
        .resume = ene_resume,
index 936c3f79b62cba500b8e53ba4adffb899bfda007..1df410e136881f3cafad5777bc84096771bc3027 100644 (file)
@@ -590,7 +590,7 @@ failure:
        return ret;
 }
 
-static void __devexit fintek_remove(struct pnp_dev *pdev)
+static void fintek_remove(struct pnp_dev *pdev)
 {
        struct fintek_dev *fintek = pnp_get_drvdata(pdev);
        unsigned long flags;
@@ -678,7 +678,7 @@ static struct pnp_driver fintek_driver = {
        .id_table       = fintek_ids,
        .flags          = PNP_DRIVER_RES_DO_NOT_CHANGE,
        .probe          = fintek_probe,
-       .remove         = __devexit_p(fintek_remove),
+       .remove         = fintek_remove,
        .suspend        = fintek_suspend,
        .resume         = fintek_resume,
        .shutdown       = fintek_shutdown,
index ba1a1eb356cf765d47d48b0e829f37b0133b5259..4f71a7d1f0196f73b2b3547fa30b75eb7afd4bca 100644 (file)
@@ -58,7 +58,7 @@ err_get_value:
        return IRQ_HANDLED;
 }
 
-static int __devinit gpio_ir_recv_probe(struct platform_device *pdev)
+static int gpio_ir_recv_probe(struct platform_device *pdev)
 {
        struct gpio_rc_dev *gpio_dev;
        struct rc_dev *rcdev;
@@ -140,7 +140,7 @@ err_allocate_device:
        return rc;
 }
 
-static int __devexit gpio_ir_recv_remove(struct platform_device *pdev)
+static int gpio_ir_recv_remove(struct platform_device *pdev)
 {
        struct gpio_rc_dev *gpio_dev = platform_get_drvdata(pdev);
 
@@ -188,7 +188,7 @@ static const struct dev_pm_ops gpio_ir_recv_pm_ops = {
 
 static struct platform_driver gpio_ir_recv_driver = {
        .probe  = gpio_ir_recv_probe,
-       .remove = __devexit_p(gpio_ir_recv_remove),
+       .remove = gpio_ir_recv_remove,
        .driver = {
                .name   = GPIO_IR_DRIVER_NAME,
                .owner  = THIS_MODULE,
index 5a9163da63c36c2fbf8527996d9b24134d5ba79e..b99b096d8a8f11d834b82f36061b47599d687712 100644 (file)
@@ -425,8 +425,8 @@ static void iguanair_close(struct rc_dev *rdev)
        mutex_unlock(&ir->lock);
 }
 
-static int __devinit iguanair_probe(struct usb_interface *intf,
-                                               const struct usb_device_id *id)
+static int iguanair_probe(struct usb_interface *intf,
+                         const struct usb_device_id *id)
 {
        struct usb_device *udev = interface_to_usbdev(intf);
        struct iguanair *ir;
@@ -538,7 +538,7 @@ out:
        return ret;
 }
 
-static void __devexit iguanair_disconnect(struct usb_interface *intf)
+static void iguanair_disconnect(struct usb_interface *intf)
 {
        struct iguanair *ir = usb_get_intfdata(intf);
 
@@ -604,7 +604,7 @@ static const struct usb_device_id iguanair_table[] = {
 static struct usb_driver iguanair_driver = {
        .name = DRIVER_NAME,
        .probe = iguanair_probe,
-       .disconnect = __devexit_p(iguanair_disconnect),
+       .disconnect = iguanair_disconnect,
        .suspend = iguanair_suspend,
        .resume = iguanair_resume,
        .reset_resume = iguanair_resume,
index 8f6a28921ed413c718c0efea9ea70e437d2ac9d7..78d109b978ddde799030f20301f4baba97150f0e 100644 (file)
@@ -255,7 +255,7 @@ static struct usb_device_id imon_usb_id_table[] = {
 static struct usb_driver imon_driver = {
        .name           = MOD_NAME,
        .probe          = imon_probe,
-       .disconnect     = __devexit_p(imon_disconnect),
+       .disconnect     = imon_disconnect,
        .suspend        = imon_suspend,
        .resume         = imon_resume,
        .id_table       = imon_usb_id_table,
@@ -2288,8 +2288,8 @@ static void imon_init_display(struct imon_context *ictx,
 /**
  * Callback function for USB core API: Probe
  */
-static int __devinit imon_probe(struct usb_interface *interface,
-                               const struct usb_device_id *id)
+static int imon_probe(struct usb_interface *interface,
+                     const struct usb_device_id *id)
 {
        struct usb_device *usbdev = NULL;
        struct usb_host_interface *iface_desc = NULL;
@@ -2372,7 +2372,7 @@ fail:
 /**
  * Callback function for USB core API: disconnect
  */
-static void __devexit imon_disconnect(struct usb_interface *interface)
+static void imon_disconnect(struct usb_interface *interface)
 {
        struct imon_context *ictx;
        struct device *dev;
index 9e76c7b40af2f63430d69f25299307164b7daf17..8ead492d03aac905f2d1007bd22173c57ab3fc1c 100644 (file)
@@ -443,7 +443,7 @@ static int lirc_rx51_resume(struct platform_device *dev)
 
 #endif /* CONFIG_PM */
 
-static int __devinit lirc_rx51_probe(struct platform_device *dev)
+static int lirc_rx51_probe(struct platform_device *dev)
 {
        lirc_rx51_driver.features = LIRC_RX51_DRIVER_FEATURES;
        lirc_rx51.pdata = dev->dev.platform_data;
index 5e5a7f2b8184cc992fab2bf0e3e90cb09c65c154..1b8669b6d042ce1110710fdc4a049521733e0c40 100644 (file)
@@ -1620,7 +1620,7 @@ failure:
        return ret;
 }
 
-static void __devexit ite_remove(struct pnp_dev *pdev)
+static void ite_remove(struct pnp_dev *pdev)
 {
        struct ite_dev *dev = pnp_get_drvdata(pdev);
        unsigned long flags;
@@ -1702,7 +1702,7 @@ static struct pnp_driver ite_driver = {
        .name           = ITE_DRIVER_NAME,
        .id_table       = ite_ids,
        .probe          = ite_probe,
-       .remove         = __devexit_p(ite_remove),
+       .remove         = ite_remove,
        .suspend        = ite_suspend,
        .resume         = ite_resume,
        .shutdown       = ite_shutdown,
index b2146cd99fd8a74f65a57c7b11886b27764f8272..9afb9331217ddebe9cb8e122e67473563b0aadc9 100644 (file)
@@ -1229,8 +1229,8 @@ out:
        return NULL;
 }
 
-static int __devinit mceusb_dev_probe(struct usb_interface *intf,
-                                     const struct usb_device_id *id)
+static int mceusb_dev_probe(struct usb_interface *intf,
+                           const struct usb_device_id *id)
 {
        struct usb_device *dev = interface_to_usbdev(intf);
        struct usb_host_interface *idesc;
@@ -1393,7 +1393,7 @@ mem_alloc_fail:
 }
 
 
-static void __devexit mceusb_dev_disconnect(struct usb_interface *intf)
+static void mceusb_dev_disconnect(struct usb_interface *intf)
 {
        struct usb_device *dev = interface_to_usbdev(intf);
        struct mceusb_dev *ir = usb_get_intfdata(intf);
@@ -1432,7 +1432,7 @@ static int mceusb_dev_resume(struct usb_interface *intf)
 static struct usb_driver mceusb_dev_driver = {
        .name =         DRIVER_NAME,
        .probe =        mceusb_dev_probe,
-       .disconnect =   __devexit_p(mceusb_dev_disconnect),
+       .disconnect =   mceusb_dev_disconnect,
        .suspend =      mceusb_dev_suspend,
        .resume =       mceusb_dev_resume,
        .reset_resume = mceusb_dev_resume,
index e4ea89a11eed451efd967b36a41a4fbbf5a7edf0..b8aa9abb31ffe03161b0a8b99f273afcd8d05df5 100644 (file)
@@ -1113,7 +1113,7 @@ failure:
        return ret;
 }
 
-static void __devexit nvt_remove(struct pnp_dev *pdev)
+static void nvt_remove(struct pnp_dev *pdev)
 {
        struct nvt_dev *nvt = pnp_get_drvdata(pdev);
        unsigned long flags;
@@ -1211,7 +1211,7 @@ static struct pnp_driver nvt_driver = {
        .id_table       = nvt_ids,
        .flags          = PNP_DRIVER_RES_DO_NOT_CHANGE,
        .probe          = nvt_probe,
-       .remove         = __devexit_p(nvt_remove),
+       .remove         = nvt_remove,
        .suspend        = nvt_suspend,
        .resume         = nvt_resume,
        .shutdown       = nvt_shutdown,
index a8887aba9fafe9483267f9122d0b8e39929b5c8c..1800326f93e60a1f30301c2979fadcc8e261c304 100644 (file)
@@ -1102,8 +1102,8 @@ out:
        return NULL;
 }
 
-static int __devinit redrat3_dev_probe(struct usb_interface *intf,
-                                      const struct usb_device_id *id)
+static int redrat3_dev_probe(struct usb_interface *intf,
+                            const struct usb_device_id *id)
 {
        struct usb_device *udev = interface_to_usbdev(intf);
        struct device *dev = &intf->dev;
@@ -1241,7 +1241,7 @@ no_endpoints:
        return retval;
 }
 
-static void __devexit redrat3_dev_disconnect(struct usb_interface *intf)
+static void redrat3_dev_disconnect(struct usb_interface *intf)
 {
        struct usb_device *udev = interface_to_usbdev(intf);
        struct redrat3_dev *rr3 = usb_get_intfdata(intf);
@@ -1281,7 +1281,7 @@ static int redrat3_dev_resume(struct usb_interface *intf)
 static struct usb_driver redrat3_dev_driver = {
        .name           = DRIVER_NAME,
        .probe          = redrat3_dev_probe,
-       .disconnect     = __devexit_p(redrat3_dev_disconnect),
+       .disconnect     = redrat3_dev_disconnect,
        .suspend        = redrat3_dev_suspend,
        .resume         = redrat3_dev_resume,
        .reset_resume   = redrat3_dev_resume,
index c720f12f661e5121c7ad0e5d9ba77e13f43d5013..d7b11e6a998253dd362654ed468edcb11cfef103 100644 (file)
@@ -346,8 +346,8 @@ out:
  *     On any failure the return value is the ERROR
  *     On success return 0
  */
-static int __devinit streamzap_probe(struct usb_interface *intf,
-                                    const struct usb_device_id *id)
+static int streamzap_probe(struct usb_interface *intf,
+                          const struct usb_device_id *id)
 {
        struct usb_device *usbdev = interface_to_usbdev(intf);
        struct usb_host_interface *iface_host;
index f0921b5483ebdd34bd967d8f03434c2d843e86b8..78be8a91422533d7c6396dabadabb7af148a31a9 100644 (file)
@@ -194,8 +194,8 @@ static void ttusbir_urb_complete(struct urb *urb)
                dev_warn(tt->dev, "failed to resubmit urb: %d\n", rc);
 }
 
-static int __devinit ttusbir_probe(struct usb_interface *intf,
-                                               const struct usb_device_id *id)
+static int ttusbir_probe(struct usb_interface *intf,
+                        const struct usb_device_id *id)
 {
        struct ttusbir *tt;
        struct usb_interface_descriptor *idesc;
@@ -367,7 +367,7 @@ out:
        return ret;
 }
 
-static void __devexit ttusbir_disconnect(struct usb_interface *intf)
+static void ttusbir_disconnect(struct usb_interface *intf)
 {
        struct ttusbir *tt = usb_get_intfdata(intf);
        struct usb_device *udev = tt->udev;
@@ -435,7 +435,7 @@ static struct usb_driver ttusbir_driver = {
        .suspend = ttusbir_suspend,
        .resume = ttusbir_resume,
        .reset_resume = ttusbir_resume,
-       .disconnect = __devexit_p(ttusbir_disconnect)
+       .disconnect = ttusbir_disconnect,
 };
 
 module_usb_driver(ttusbir_driver);
index 7f3c476dde05fb712cbb0fbbbc55c36e3150aba4..930c61499037090af51d788e6019be955394e347 100644 (file)
@@ -1008,7 +1008,7 @@ wbcir_resume(struct pnp_dev *device)
        return 0;
 }
 
-static int __devinit
+static int
 wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
 {
        struct device *dev = &device->dev;
@@ -1155,7 +1155,7 @@ exit:
        return err;
 }
 
-static void __devexit
+static void
 wbcir_remove(struct pnp_dev *device)
 {
        struct wbcir_data *data = pnp_get_drvdata(device);
@@ -1201,7 +1201,7 @@ static struct pnp_driver wbcir_driver = {
        .name     = WBCIR_NAME,
        .id_table = wbcir_ids,
        .probe    = wbcir_probe,
-       .remove   = __devexit_p(wbcir_remove),
+       .remove   = wbcir_remove,
        .suspend  = wbcir_suspend,
        .resume   = wbcir_resume,
        .shutdown = wbcir_shutdown
index bab01c86c3154933c819d941bbcfe3c6ffea60ef..bcd2c04c770e919d86473adc6282e8f5b0f11c4e 100644 (file)
@@ -590,8 +590,7 @@ static const struct usb_device_id device_table[] = {
 MODULE_DEVICE_TABLE(usb, device_table);
 
 /* -- device connect -- */
-static int __devinit sd_probe(struct usb_interface *intf,
-                       const struct usb_device_id *id)
+static int sd_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
        return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
                                THIS_MODULE);
index aac622200e99a9e244523b8ead9994d510cac891..de2c10289eecc3d109b534c7bf8b68499c1ec023 100644 (file)
@@ -389,7 +389,7 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
        return rc;
 }
 
-static int __devinit smsusb_probe(struct usb_interface *intf,
+static int smsusb_probe(struct usb_interface *intf,
                        const struct usb_device_id *id)
 {
        struct usb_device *udev = interface_to_usbdev(intf);
index 5c36a57e6590d6c731341663296faad17607a7ef..ad7f7448072ef8ba995c10c9f06471a25314bd96 100644 (file)
@@ -1363,7 +1363,7 @@ static void usbvision_unregister_video(struct usb_usbvision *usbvision)
 }
 
 /* register video4linux devices */
-static int __devinit usbvision_register_video(struct usb_usbvision *usbvision)
+static int usbvision_register_video(struct usb_usbvision *usbvision)
 {
        /* Video Device: */
        usbvision->vdev = usbvision_vdev_init(usbvision,
@@ -1510,8 +1510,8 @@ static void usbvision_configure_video(struct usb_usbvision *usbvision)
  * if it looks like USBVISION video device
  *
  */
-static int __devinit usbvision_probe(struct usb_interface *intf,
-                                    const struct usb_device_id *devid)
+static int usbvision_probe(struct usb_interface *intf,
+                          const struct usb_device_id *devid)
 {
        struct usb_device *dev = usb_get_dev(interface_to_usbdev(intf));
        struct usb_interface *uif;
@@ -1619,7 +1619,7 @@ static int __devinit usbvision_probe(struct usb_interface *intf,
  * with no ill consequences.
  *
  */
-static void __devexit usbvision_disconnect(struct usb_interface *intf)
+static void usbvision_disconnect(struct usb_interface *intf)
 {
        struct usb_usbvision *usbvision = to_usbvision(usb_get_intfdata(intf));
 
@@ -1664,7 +1664,7 @@ static struct usb_driver usbvision_driver = {
        .name           = "usbvision",
        .id_table       = usbvision_table,
        .probe          = usbvision_probe,
-       .disconnect     = __devexit_p(usbvision_disconnect),
+       .disconnect     = usbvision_disconnect,
 };
 
 /*
index e6764bb41cb9b5aaf5e46e110d699d8fac3b5047..186f27d9e5f1ac25e2302f04bcedc1c656c19f4f 100644 (file)
@@ -177,7 +177,7 @@ static void tegra20_mc_decode(struct tegra20_mc *mc, int n)
                            "carveout" : "trustzone") : "");
 }
 
-static const struct of_device_id tegra20_mc_of_match[] __devinitconst = {
+static const struct of_device_id tegra20_mc_of_match[] = {
        { .compatible = "nvidia,tegra20-mc", },
        {},
 };
@@ -198,7 +198,7 @@ static irqreturn_t tegra20_mc_isr(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit tegra20_mc_probe(struct platform_device *pdev)
+static int tegra20_mc_probe(struct platform_device *pdev)
 {
        struct resource *irq;
        struct tegra20_mc *mc;
index 802b9ea431fa41f3831f13a5d6e8c7a95422b54c..0b7ab9332a182b867ad0375b5c1a31632eb4969e 100644 (file)
@@ -295,7 +295,7 @@ static UNIVERSAL_DEV_PM_OPS(tegra30_mc_pm,
                            tegra30_mc_suspend,
                            tegra30_mc_resume, NULL);
 
-static const struct of_device_id tegra30_mc_of_match[] __devinitconst = {
+static const struct of_device_id tegra30_mc_of_match[] = {
        { .compatible = "nvidia,tegra30-mc", },
        {},
 };
@@ -316,7 +316,7 @@ static irqreturn_t tegra30_mc_isr(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-static int __devinit tegra30_mc_probe(struct platform_device *pdev)
+static int tegra30_mc_probe(struct platform_device *pdev)
 {
        struct resource *irq;
        struct tegra30_mc *mc;
index d784c36707c0b12c318c1f2be20fe98b425eabad..c13cd9bc590b91c83a7ab03308acf2bfaa9f7ae7 100644 (file)
@@ -100,7 +100,7 @@ static int mptfc_slave_alloc(struct scsi_device *sdev);
 static int mptfc_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt);
 static void mptfc_target_destroy(struct scsi_target *starget);
 static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout);
-static void __devexit mptfc_remove(struct pci_dev *pdev);
+static void mptfc_remove(struct pci_dev *pdev);
 static int mptfc_abort(struct scsi_cmnd *SCpnt);
 static int mptfc_dev_reset(struct scsi_cmnd *SCpnt);
 static int mptfc_bus_reset(struct scsi_cmnd *SCpnt);
@@ -1360,7 +1360,7 @@ static struct pci_driver mptfc_driver = {
        .name           = "mptfc",
        .id_table       = mptfc_pci_table,
        .probe          = mptfc_probe,
-       .remove         = __devexit_p(mptfc_remove),
+       .remove         = mptfc_remove,
        .shutdown       = mptscsih_shutdown,
 #ifdef CONFIG_PM
        .suspend        = mptscsih_suspend,
@@ -1496,8 +1496,7 @@ mptfc_init(void)
  *     @pdev: Pointer to pci_dev structure
  *
  */
-static void __devexit
-mptfc_remove(struct pci_dev *pdev)
+static void mptfc_remove(struct pci_dev *pdev)
 {
        MPT_ADAPTER             *ioc = pci_get_drvdata(pdev);
        struct mptfc_rport_info *p, *n;
index 551262e4b96e0829bc4f64c15357f9862f006c76..fa43c391c8ed1072b35200ba671623c933c1df80 100644 (file)
@@ -5332,7 +5332,7 @@ mptsas_shutdown(struct pci_dev *pdev)
        mptsas_cleanup_fw_event_q(ioc);
 }
 
-static void __devexit mptsas_remove(struct pci_dev *pdev)
+static void mptsas_remove(struct pci_dev *pdev)
 {
        MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
        struct mptsas_portinfo *p, *n;
@@ -5387,7 +5387,7 @@ static struct pci_driver mptsas_driver = {
        .name           = "mptsas",
        .id_table       = mptsas_pci_table,
        .probe          = mptsas_probe,
-       .remove         = __devexit_p(mptsas_remove),
+       .remove         = mptsas_remove,
        .shutdown       = mptsas_shutdown,
 #ifdef CONFIG_PM
        .suspend        = mptscsih_suspend,
index 8f61ba6aac239c210fbc99b1365e8115650fd2ed..c3aabde2dc4fad50bb0781757bff0605121ba5b0 100644 (file)
@@ -1550,7 +1550,7 @@ static struct pci_driver mptspi_driver = {
        .name           = "mptspi",
        .id_table       = mptspi_pci_table,
        .probe          = mptspi_probe,
-       .remove         = __devexit_p(mptscsih_remove),
+       .remove         = mptscsih_remove,
        .shutdown       = mptscsih_shutdown,
 #ifdef CONFIG_PM
        .suspend        = mptscsih_suspend,
index 7190d5239b4fa0e5725169a134ed620b776e25d4..0f9f3e1a2b6b4f75db8c3413dc83a549dc1c8cb4 100644 (file)
@@ -37,7 +37,7 @@
 #define OSM_DESCRIPTION        "I2O-subsystem"
 
 /* PCI device id table for all I2O controllers */
-static struct pci_device_id __devinitdata i2o_pci_ids[] = {
+static struct pci_device_id i2o_pci_ids[] = {
        {PCI_DEVICE_CLASS(PCI_CLASS_INTELLIGENT_I2O << 8, 0xffff00)},
        {PCI_DEVICE(PCI_VENDOR_ID_DPT, 0xa511)},
        {.vendor = PCI_VENDOR_ID_INTEL,.device = 0x1962,
@@ -84,7 +84,7 @@ static void i2o_pci_free(struct i2o_controller *c)
  *
  *     Returns 0 on success or negative error code on failure.
  */
-static int __devinit i2o_pci_alloc(struct i2o_controller *c)
+static int i2o_pci_alloc(struct i2o_controller *c)
 {
        struct pci_dev *pdev = c->pdev;
        struct device *dev = &pdev->dev;
@@ -315,8 +315,7 @@ static void i2o_pci_irq_disable(struct i2o_controller *c)
  *
  *     Returns 0 on success or negative error code on failure.
  */
-static int __devinit i2o_pci_probe(struct pci_dev *pdev,
-                                  const struct pci_device_id *id)
+static int i2o_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct i2o_controller *c;
        int rc;
@@ -453,7 +452,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev,
  *     Reset the I2O controller, disable interrupts and remove all allocated
  *     resources.
  */
-static void __devexit i2o_pci_remove(struct pci_dev *pdev)
+static void i2o_pci_remove(struct pci_dev *pdev)
 {
        struct i2o_controller *c;
        c = pci_get_drvdata(pdev);
@@ -474,7 +473,7 @@ static struct pci_driver i2o_pci_driver = {
        .name = "PCI_I2O",
        .id_table = i2o_pci_ids,
        .probe = i2o_pci_probe,
-       .remove = __devexit_p(i2o_pci_remove),
+       .remove = i2o_pci_remove,
 };
 
 /**
index abd5c80c7cf5f59c9a3adf78d188482148ecf512..14714058f2d2a673e5b678d950e6184454a189bf 100644 (file)
@@ -50,7 +50,7 @@ static struct mfd_cell max8997_devs[] = {
 };
 
 #ifdef CONFIG_OF
-static struct of_device_id __devinitdata max8997_pmic_dt_match[] = {
+static struct of_device_id max8997_pmic_dt_match[] = {
        { .compatible = "maxim,max8997-pmic", .data = TYPE_MAX8997 },
        {},
 };
index 7ff4a37ab0c05e89da349966dccc588a5648061b..3ba048655bf37fe5a9b1f1ff2ad7a2e6748fe0c7 100644 (file)
@@ -171,8 +171,7 @@ static struct regmap_config retu_config = {
        .val_bits = 16,
 };
 
-static int __devinit retu_probe(struct i2c_client *i2c,
-                               const struct i2c_device_id *id)
+static int retu_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
 {
        struct retu_dev *rdev;
        int ret;
@@ -225,7 +224,7 @@ static int __devinit retu_probe(struct i2c_client *i2c,
        return 0;
 }
 
-static int __devexit retu_remove(struct i2c_client *i2c)
+static int retu_remove(struct i2c_client *i2c)
 {
        struct retu_dev *rdev = i2c_get_clientdata(i2c);
 
index 3a44efa292036df17261bf7b2c95f35522d9f651..7a7b0bda4618926fffea21dc23a3f386e1303777 100644 (file)
@@ -998,8 +998,8 @@ static int rtsx_pci_init_chip(struct rtsx_pcr *pcr)
        return 0;
 }
 
-static int __devinit rtsx_pci_probe(struct pci_dev *pcidev,
-                                   const struct pci_device_id *id)
+static int rtsx_pci_probe(struct pci_dev *pcidev,
+                         const struct pci_device_id *id)
 {
        struct rtsx_pcr *pcr;
        struct pcr_handle *handle;
@@ -1123,7 +1123,7 @@ disable:
        return ret;
 }
 
-static void __devexit rtsx_pci_remove(struct pci_dev *pcidev)
+static void rtsx_pci_remove(struct pci_dev *pcidev)
 {
        struct pcr_handle *handle = pci_get_drvdata(pcidev);
        struct rtsx_pcr *pcr = handle->pcr;
@@ -1241,7 +1241,7 @@ static struct pci_driver rtsx_pci_driver = {
        .name = DRV_NAME_RTSX_PCI,
        .id_table = rtsx_pci_ids,
        .probe = rtsx_pci_probe,
-       .remove = __devexit_p(rtsx_pci_remove),
+       .remove = rtsx_pci_remove,
        .suspend = rtsx_pci_suspend,
        .resume = rtsx_pci_resume,
 };
index 1225dcbcfcfcc6fa9db396e1ea47c43b6a9a85b0..9bd33169a1118b835c4e4bd53f7f069d5ae764e5 100644 (file)
@@ -510,19 +510,19 @@ enum mfd1_bar1_cells {
        STA2X11_APB_SOC_REGS = 0,
 };
 
-static const __devinitconst struct resource vic_resources[] = {
+static const struct resource vic_resources[] = {
        CELL_4K(STA2X11_MFD_VIC_NAME, STA2X11_VIC),
 };
 
-static const __devinitconst struct resource apb_soc_regs_resources[] = {
+static const struct resource apb_soc_regs_resources[] = {
        CELL_4K(STA2X11_MFD_APB_SOC_REGS_NAME, STA2X11_APB_SOC_REGS),
 };
 
-static __devinitdata struct mfd_cell sta2x11_mfd1_bar0[] = {
+static struct mfd_cell sta2x11_mfd1_bar0[] = {
        DEV(STA2X11_MFD_VIC_NAME, vic_resources),
 };
 
-static __devinitdata struct mfd_cell sta2x11_mfd1_bar1[] = {
+static struct mfd_cell sta2x11_mfd1_bar1[] = {
        DEV(STA2X11_MFD_APB_SOC_REGS_NAME, apb_soc_regs_resources),
 };
 
index 5e8e6927cfcd8a78db34c3e7a6efb9858aa9551b..4b11202061bef686b62275f59690e2d4fa29778f 100644 (file)
@@ -892,8 +892,7 @@ static struct irq_domain_ops stmpe_irq_ops = {
         .xlate  = irq_domain_xlate_twocell,
 };
 
-static int __devinit stmpe_irq_init(struct stmpe *stmpe,
-                               struct device_node *np)
+static int stmpe_irq_init(struct stmpe *stmpe, struct device_node *np)
 {
        int base = 0;
        int num_irqs = stmpe->variant->num_irqs;
@@ -911,7 +910,7 @@ static int __devinit stmpe_irq_init(struct stmpe *stmpe,
        return 0;
 }
 
-static int __devinit stmpe_chip_init(struct stmpe *stmpe)
+static int stmpe_chip_init(struct stmpe *stmpe)
 {
        unsigned int irq_trigger = stmpe->pdata->irq_trigger;
        int autosleep_timeout = stmpe->pdata->autosleep_timeout;
@@ -970,14 +969,13 @@ static int __devinit stmpe_chip_init(struct stmpe *stmpe)
        return stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_ICR_LSB], icr);
 }
 
-static int __devinit stmpe_add_device(struct stmpe *stmpe,
-                                     struct mfd_cell *cell)
+static int stmpe_add_device(struct stmpe *stmpe, struct mfd_cell *cell)
 {
        return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1,
                               NULL, stmpe->irq_base, stmpe->domain);
 }
 
-static int __devinit stmpe_devices_init(struct stmpe *stmpe)
+static int stmpe_devices_init(struct stmpe *stmpe)
 {
        struct stmpe_variant_info *variant = stmpe->variant;
        unsigned int platform_blocks = stmpe->pdata->blocks;
@@ -1013,8 +1011,7 @@ static int __devinit stmpe_devices_init(struct stmpe *stmpe)
        return ret;
 }
 
-void __devinit stmpe_of_probe(struct stmpe_platform_data *pdata,
-                       struct device_node *np)
+void stmpe_of_probe(struct stmpe_platform_data *pdata, struct device_node *np)
 {
        struct device_node *child;
 
@@ -1044,7 +1041,7 @@ void __devinit stmpe_of_probe(struct stmpe_platform_data *pdata,
 }
 
 /* Called from client specific probe routines */
-int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
+int stmpe_probe(struct stmpe_client_info *ci, int partnum)
 {
        struct stmpe_platform_data *pdata = dev_get_platdata(ci->dev);
        struct device_node *np = ci->dev->of_node;
index 8ca3bf023fb25a2e70a5d78dd8426e7a3cfa6109..e9f3fb510b44f965795bc87f56c26bffeefe2078 100644 (file)
@@ -58,7 +58,7 @@ static void tscadc_idle_config(struct ti_tscadc_dev *config)
        tscadc_writel(config, REG_IDLECONFIG, idleconfig);
 }
 
-static int __devinit ti_tscadc_probe(struct platform_device *pdev)
+static int ti_tscadc_probe(struct platform_device *pdev)
 {
        struct ti_tscadc_dev    *tscadc;
        struct resource         *res;
@@ -202,7 +202,7 @@ ret:
        return err;
 }
 
-static int __devexit ti_tscadc_remove(struct platform_device *pdev)
+static int ti_tscadc_remove(struct platform_device *pdev)
 {
        struct ti_tscadc_dev    *tscadc = platform_get_drvdata(pdev);
 
@@ -263,7 +263,7 @@ static struct platform_driver ti_tscadc_driver = {
                .pm     = TSCADC_PM_OPS,
        },
        .probe  = ti_tscadc_probe,
-       .remove = __devexit_p(ti_tscadc_remove),
+       .remove = ti_tscadc_remove,
 
 };
 
index 10b51f7dfff39dec18b83ee79eebb484480584ba..c90a2c450f5113c44536eac3b82315be92e9e89d 100644 (file)
@@ -269,8 +269,7 @@ static int tps80031_init_ext_control(struct tps80031 *tps80031,
        return ret;
 }
 
-static int __devinit tps80031_irq_init(struct tps80031 *tps80031, int irq,
-                               int irq_base)
+static int tps80031_irq_init(struct tps80031 *tps80031, int irq, int irq_base)
 {
        struct device *dev = tps80031->dev;
        int i, ret;
@@ -416,8 +415,8 @@ static const struct regmap_config tps80031_regmap_configs[] = {
        },
 };
 
-static int __devinit tps80031_probe(struct i2c_client *client,
-                                       const struct i2c_device_id *id)
+static int tps80031_probe(struct i2c_client *client,
+                         const struct i2c_device_id *id)
 {
        struct tps80031_platform_data *pdata = client->dev.platform_data;
        struct tps80031 *tps80031;
@@ -519,7 +518,7 @@ fail_client_reg:
        return ret;
 }
 
-static int __devexit tps80031_remove(struct i2c_client *client)
+static int tps80031_remove(struct i2c_client *client)
 {
        struct tps80031 *tps80031 = i2c_get_clientdata(client);
        int i;
@@ -553,7 +552,7 @@ static struct i2c_driver tps80031_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = tps80031_probe,
-       .remove         = __devexit_p(tps80031_remove),
+       .remove         = tps80031_remove,
        .id_table       = tps80031_id_table,
 };
 
index 583be76e36a804162341b0d23b4e98b4d13f8aff..f361bf38a0aa115ff539f94b740810f22ecb730a 100644 (file)
@@ -517,8 +517,8 @@ static struct regmap_irq_chip twl6040_irq_chip = {
        .mask_base = TWL6040_REG_INTMR,
 };
 
-static int __devinit twl6040_probe(struct i2c_client *client,
-                                    const struct i2c_device_id *id)
+static int twl6040_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct twl6040_platform_data *pdata = client->dev.platform_data;
        struct device_node *node = client->dev.of_node;
@@ -699,7 +699,7 @@ err:
        return ret;
 }
 
-static int __devexit twl6040_remove(struct i2c_client *client)
+static int twl6040_remove(struct i2c_client *client)
 {
        struct twl6040 *twl6040 = i2c_get_clientdata(client);
 
@@ -735,7 +735,7 @@ static struct i2c_driver twl6040_driver = {
                .owner = THIS_MODULE,
        },
        .probe          = twl6040_probe,
-       .remove         = __devexit_p(twl6040_remove),
+       .remove         = twl6040_remove,
        .id_table       = twl6040_i2c_id,
 };
 
index 733c06bd2d17808b95b1cc0c21e094720e9743ca..e5d8f63b252aa887e0493d3ae44725792217daea 100644 (file)
@@ -414,7 +414,7 @@ static ssize_t vexpress_sysreg_sys_id_show(struct device *dev,
 
 DEVICE_ATTR(sys_id, S_IRUGO, vexpress_sysreg_sys_id_show, NULL);
 
-static int __devinit vexpress_sysreg_probe(struct platform_device *pdev)
+static int vexpress_sysreg_probe(struct platform_device *pdev)
 {
        int err;
        struct resource *res = platform_get_resource(pdev,
index 18794aea606282a8925a4ef93d9596948760c3f0..e40ffd9502d17eddaf7f41618d3f33d41b8012af 100644 (file)
@@ -187,13 +187,13 @@ int mei_amthif_read(struct mei_device *dev, struct file *file,
                wait_ret = wait_event_interruptible(dev->iamthif_cl.wait,
                        (cb = mei_amthif_find_read_list_entry(dev, file)));
 
+               /* Locking again the Mutex */
+               mutex_lock(&dev->device_lock);
+
                if (wait_ret)
                        return -ERESTARTSYS;
 
                dev_dbg(&dev->pdev->dev, "woke up from sleep\n");
-
-               /* Locking again the Mutex */
-               mutex_lock(&dev->device_lock);
        }
 
 
index 8ee0f74f9374b834f88bcd328c8d233369e61b14..083fcd29c9c60dd89f8cd935589a5501aabbc541 100644 (file)
@@ -134,7 +134,7 @@ static struct pci_driver dw_mci_pci_driver = {
        .name           = "dw_mmc_pci",
        .id_table       = dw_mci_pci_id,
        .probe          = dw_mci_pci_probe,
-       .remove         = __devexit_p(dw_mci_pci_remove),
+       .remove         = dw_mci_pci_remove,
        .driver         =       {
                .pm =   &dw_mci_pci_pmops
        },
index 222036c9e053b6cc783aa1faf322283d0e257971..5e1fb1d2c422447b62c5c264f1a7be014a5c2f87 100644 (file)
@@ -120,7 +120,7 @@ MODULE_DEVICE_TABLE(of, dw_mci_pltfm_match);
 
 static struct platform_driver dw_mci_pltfm_driver = {
        .probe          = dw_mci_pltfm_probe,
-       .remove         = __devexit_p(dw_mci_pltfm_remove),
+       .remove         = dw_mci_pltfm_remove,
        .driver         = {
                .name           = "dw_mmc",
                .of_match_table = of_match_ptr(dw_mci_pltfm_match),
index 12b0a78497f68a3563785ebb1e558f96530fa132..2592dddbd965933f10a627073f48ef1caef4e4ba 100644 (file)
@@ -111,7 +111,7 @@ static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(const char *hid)
        return NULL;
 }
 
-static int __devinit sdhci_acpi_probe(struct platform_device *pdev)
+static int sdhci_acpi_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        acpi_handle handle = ACPI_HANDLE(dev);
@@ -214,7 +214,7 @@ err_free:
        return err;
 }
 
-static int __devexit sdhci_acpi_remove(struct platform_device *pdev)
+static int sdhci_acpi_remove(struct platform_device *pdev)
 {
        struct sdhci_acpi_host *c = platform_get_drvdata(pdev);
        struct device *dev = &pdev->dev;
@@ -302,7 +302,7 @@ static struct platform_driver sdhci_acpi_driver = {
                .pm                     = &sdhci_acpi_pm_ops,
        },
        .probe  = sdhci_acpi_probe,
-       .remove = __devexit_p(sdhci_acpi_remove),
+       .remove = sdhci_acpi_remove,
 };
 
 module_platform_driver(sdhci_acpi_driver);
index 5ba4605e4f8017e8f77e285157a7c0abbac4af91..154f0e8e931c5db0ccbdf3a418695aca0a72343c 100644 (file)
@@ -766,7 +766,7 @@ static struct of_device_id wmt_mci_dt_ids[] = {
        { /* Sentinel */ },
 };
 
-static int __devinit wmt_mci_probe(struct platform_device *pdev)
+static int wmt_mci_probe(struct platform_device *pdev)
 {
        struct mmc_host *mmc;
        struct wmt_mci_priv *priv;
@@ -892,7 +892,7 @@ fail1:
        return ret;
 }
 
-static int __devexit wmt_mci_remove(struct platform_device *pdev)
+static int wmt_mci_remove(struct platform_device *pdev)
 {
        struct mmc_host *mmc;
        struct wmt_mci_priv *priv;
index ea7ea7b595d86eff7eb8bd3f8952c25b90764150..945c9f7623499fb3798314e508ad65779755b863 100644 (file)
@@ -618,9 +618,8 @@ static char *otp_setup(struct mtd_info *device, char revision)
 /*
  * Register DataFlash device with MTD subsystem.
  */
-static int
-add_dataflash_otp(struct spi_device *spi, char *name,
-               int nr_pages, int pagesize, int pageoffset, char revision)
+static int add_dataflash_otp(struct spi_device *spi, char *name, int nr_pages,
+                            int pagesize, int pageoffset, char revision)
 {
        struct dataflash                *priv;
        struct mtd_info                 *device;
@@ -679,9 +678,8 @@ add_dataflash_otp(struct spi_device *spi, char *name,
        return err;
 }
 
-static inline int
-add_dataflash(struct spi_device *spi, char *name,
-               int nr_pages, int pagesize, int pageoffset)
+static inline int add_dataflash(struct spi_device *spi, char *name,
+                               int nr_pages, int pagesize, int pageoffset)
 {
        return add_dataflash_otp(spi, name, nr_pages, pagesize,
                        pageoffset, 0);
index 2d2c2a5d4d2ac0e7df2698b7002f53608fbd9c79..2aabd96bf0fff57381efb499a83d88d4c17e476d 100644 (file)
@@ -757,7 +757,7 @@ err_probe:
 
 #ifdef CONFIG_OF
 static int spear_smi_probe_config_dt(struct platform_device *pdev,
-                                              struct device_node *np)
+                                    struct device_node *np)
 {
        struct spear_smi_plat_data *pdata = dev_get_platdata(&pdev->dev);
        struct device_node *pp = NULL;
@@ -800,7 +800,7 @@ static int spear_smi_probe_config_dt(struct platform_device *pdev,
 }
 #else
 static int spear_smi_probe_config_dt(struct platform_device *pdev,
-                                              struct device_node *np)
+                                    struct device_node *np)
 {
        return -ENOSYS;
 }
index ff8681a25831052f0773b1829fec9336f2844aba..f784cf0caa13b03d7a24542befe1a29e3638e35f 100644 (file)
@@ -145,7 +145,7 @@ static void esb2rom_cleanup(struct esb2rom_window *window)
 }
 
 static int esb2rom_init_one(struct pci_dev *pdev,
-                                     const struct pci_device_id *ent)
+                           const struct pci_device_id *ent)
 {
        static char *rom_probe_types[] = { "cfi_probe", "jedec_probe", NULL };
        struct esb2rom_window *window = &esb2rom_window;
index 3ee2ad1dcbe76cb327b3e0c6b94e33e30db7d3c1..b14053b2502618e89fc7889ff385bc68db8f074d 100644 (file)
@@ -189,8 +189,7 @@ static void vr_nor_pci_remove(struct pci_dev *dev)
        pci_disable_device(dev);
 }
 
-static int
-vr_nor_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int vr_nor_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct vr_nor_mtd *p = NULL;
        unsigned int exp_timing_cs0;
index ed82914966f52db7ebdd0d5524d5595ec0af9d72..c3aebd5da5d61046c9f9047148d3d7347a00ec2a 100644 (file)
@@ -253,8 +253,7 @@ static struct pci_device_id mtd_pci_ids[] = {
  * Generic code follows.
  */
 
-static int
-mtd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int mtd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct mtd_pci_info *info = (struct mtd_pci_info *)id->driver_data;
        struct map_pci_info *map = NULL;
@@ -308,8 +307,7 @@ out:
        return err;
 }
 
-static void
-mtd_pci_remove(struct pci_dev *dev)
+static void mtd_pci_remove(struct pci_dev *dev)
 {
        struct mtd_info *mtd = pci_get_drvdata(dev);
        struct map_pci_info *map = mtd->priv;
index 37cdc201652f612406883f60243121fc78d55a60..67cc73c18ddd6e0ca10d0438403d61436971b734 100644 (file)
@@ -78,7 +78,7 @@ static int of_flash_remove(struct platform_device *dev)
  * compatible binding, which has an extra "probe-type" property
  * describing the type of flash probe necessary. */
 static struct mtd_info *obsolete_probe(struct platform_device *dev,
-                                                 struct map_info *map)
+                                      struct map_info *map)
 {
        struct device_node *dp = dev->dev.of_node;
        const char *of_probe;
index afea93b515d5c70e93974b5f02b29ca8c6e6dd7b..dc6df9abea0bb51666566b06800ba84d7fee6fe9 100644 (file)
@@ -66,8 +66,8 @@ static unsigned int pismo_width_to_bytes(unsigned int width)
        return 1 << width;
 }
 
-static int pismo_eeprom_read(struct i2c_client *client, void *buf,
-       u8 addr, size_t size)
+static int pismo_eeprom_read(struct i2c_client *client, void *buf, u8 addr,
+                            size_t size)
 {
        int ret;
        struct i2c_msg msg[] = {
@@ -89,7 +89,8 @@ static int pismo_eeprom_read(struct i2c_client *client, void *buf,
 }
 
 static int pismo_add_device(struct pismo_data *pismo, int i,
-       struct pismo_mem *region, const char *name, void *pdata, size_t psize)
+                           struct pismo_mem *region, const char *name,
+                           void *pdata, size_t psize)
 {
        struct platform_device *dev;
        struct resource res = { };
@@ -130,7 +131,7 @@ static int pismo_add_device(struct pismo_data *pismo, int i,
 }
 
 static int pismo_add_nor(struct pismo_data *pismo, int i,
-       struct pismo_mem *region)
+                        struct pismo_mem *region)
 {
        struct physmap_flash_data data = {
                .width = region->width,
@@ -144,7 +145,7 @@ static int pismo_add_nor(struct pismo_data *pismo, int i,
 }
 
 static int pismo_add_sram(struct pismo_data *pismo, int i,
-       struct pismo_mem *region)
+                         struct pismo_mem *region)
 {
        struct platdata_mtd_ram data = {
                .bankwidth = region->width,
@@ -155,7 +156,7 @@ static int pismo_add_sram(struct pismo_data *pismo, int i,
 }
 
 static void pismo_add_one(struct pismo_data *pismo, int i,
-       const struct pismo_cs_block *cs, phys_addr_t base)
+                         const struct pismo_cs_block *cs, phys_addr_t base)
 {
        struct device *dev = &pismo->client->dev;
        struct pismo_mem region;
@@ -211,7 +212,7 @@ static int pismo_remove(struct i2c_client *client)
 }
 
 static int pismo_probe(struct i2c_client *client,
-                                const struct i2c_device_id *id)
+                      const struct i2c_device_id *id)
 {
        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
        struct pismo_pdata *pdata = client->dev.platform_data;
index 71796137e97b12c2061640e3e3a2a9aa0784800d..c77b68c9412f8631955f6b52df633a6ab3fbce07 100644 (file)
@@ -69,8 +69,7 @@ static struct map_info scb2_map = {
 };
 static int region_fail;
 
-static int
-scb2_fixup_mtd(struct mtd_info *mtd)
+static int scb2_fixup_mtd(struct mtd_info *mtd)
 {
        int i;
        int done = 0;
@@ -133,8 +132,8 @@ scb2_fixup_mtd(struct mtd_info *mtd)
 /* CSB5's 'Function Control Register' has bits for decoding @ >= 0xffc00000 */
 #define CSB5_FCR       0x41
 #define CSB5_FCR_DECODE_ALL 0x0e
-static int
-scb2_flash_probe(struct pci_dev *dev, const struct pci_device_id *ent)
+static int scb2_flash_probe(struct pci_dev *dev,
+                           const struct pci_device_id *ent)
 {
        u8 reg;
 
@@ -197,8 +196,7 @@ scb2_flash_probe(struct pci_dev *dev, const struct pci_device_id *ent)
        return 0;
 }
 
-static void
-scb2_flash_remove(struct pci_dev *dev)
+static void scb2_flash_remove(struct pci_dev *dev)
 {
        if (!scb2_mtd)
                return;
index 90bdca61c797d9f4be16ea8ac6e71956363e1914..c516a9408087921a9d8c40b243e2f9005964b2e6 100644 (file)
@@ -338,7 +338,7 @@ static int pmecc_get_ecc_bytes(int cap, int sector_size)
 }
 
 static void pmecc_config_ecc_layout(struct nand_ecclayout *layout,
-       int oobsize, int ecc_len)
+                                   int oobsize, int ecc_len)
 {
        int i;
 
@@ -1213,7 +1213,7 @@ static void atmel_nand_hwctl(struct mtd_info *mtd, int mode)
 
 #if defined(CONFIG_OF)
 static int atmel_of_init_port(struct atmel_nand_host *host,
-                                        struct device_node *np)
+                             struct device_node *np)
 {
        u32 val, table_offset;
        u32 offset[2];
@@ -1300,7 +1300,7 @@ static int atmel_of_init_port(struct atmel_nand_host *host,
 }
 #else
 static int atmel_of_init_port(struct atmel_nand_host *host,
-                                        struct device_node *np)
+                             struct device_node *np)
 {
        return -EINVAL;
 }
index 2b8b05bec3ddf3b530653f4a006caecba443dc40..8363a9a5fa3f7984ca4c1706be76544eb18254c4 100644 (file)
@@ -66,7 +66,7 @@ out:
        return err;
 }
 
-static int __devexit bcm47xxnflash_remove(struct platform_device *pdev)
+static int bcm47xxnflash_remove(struct platform_device *pdev)
 {
        struct bcma_nflash *nflash = dev_get_platdata(&pdev->dev);
 
@@ -77,7 +77,7 @@ static int __devexit bcm47xxnflash_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver bcm47xxnflash_driver = {
-       .remove = __devexit_p(bcm47xxnflash_remove),
+       .remove = bcm47xxnflash_remove,
        .driver = {
                .name = "bcma_nflash",
                .owner = THIS_MODULE,
index 5a8f5c4ce512255ed38a30b245149d618d044c0e..04e07252d74b82684532ad713e5e9fcfbd4e04aa 100644 (file)
@@ -153,8 +153,8 @@ static void fun_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
 }
 
 static int fun_chip_init(struct fsl_upm_nand *fun,
-                                  const struct device_node *upm_np,
-                                  const struct resource *io_res)
+                        const struct device_node *upm_np,
+                        const struct resource *io_res)
 {
        int ret;
        struct device_node *flash_np;
index 1d7446434b0ea4cf42a983de97661cfdc6a2dc33..67e62d3d495cce93a4d633937466c4c6a9524177 100644 (file)
@@ -865,7 +865,7 @@ static bool filter(struct dma_chan *chan, void *slave)
 
 #ifdef CONFIG_OF
 static int fsmc_nand_probe_config_dt(struct platform_device *pdev,
-                                              struct device_node *np)
+                                    struct device_node *np)
 {
        struct fsmc_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
        u32 val;
@@ -887,7 +887,7 @@ static int fsmc_nand_probe_config_dt(struct platform_device *pdev,
 }
 #else
 static int fsmc_nand_probe_config_dt(struct platform_device *pdev,
-                                              struct device_node *np)
+                                    struct device_node *np)
 {
        return -ENOSYS;
 }
index 5cd141f7bfc262bae10e7bfadc5b8a7e2b8dc848..e9b1c47e3cf96111183b210967b3b824b7efdbe6 100644 (file)
@@ -319,8 +319,8 @@ int start_dma_with_bch_irq(struct gpmi_nand_data *this,
        return 0;
 }
 
-static int
-acquire_register_block(struct gpmi_nand_data *this, const char *res_name)
+static int acquire_register_block(struct gpmi_nand_data *this,
+                                 const char *res_name)
 {
        struct platform_device *pdev = this->pdev;
        struct resources *res = &this->resources;
@@ -360,8 +360,7 @@ static void release_register_block(struct gpmi_nand_data *this)
        res->bch_regs = NULL;
 }
 
-static int
-acquire_bch_irq(struct gpmi_nand_data *this, irq_handler_t irq_h)
+static int acquire_bch_irq(struct gpmi_nand_data *this, irq_handler_t irq_h)
 {
        struct platform_device *pdev = this->pdev;
        struct resources *res = &this->resources;
index 8d415f014e1dbda06e78b4091f1533878b5bf57f..b76460eeaf2253f7db3e69404ff4afb51298f84b 100644 (file)
@@ -326,7 +326,8 @@ static inline void jz_nand_iounmap_resource(struct resource *res,
 static int jz_nand_detect_bank(struct platform_device *pdev,
                               struct jz_nand *nand, unsigned char bank,
                               size_t chipnr, uint8_t *nand_maf_id,
-                              uint8_t *nand_dev_id) {
+                              uint8_t *nand_dev_id)
+{
        int ret;
        int gpio;
        char gpio_name[9];
index e3f0faca98d02e7a2002ad5d076274a6ee38b2b4..3a8c7532ee0d23ed1e896fe94ff017e9cbb82738 100644 (file)
    ethernet adaptor have the name "eth[0123...]".
    */
 
-extern struct net_device *ne2_probe(int unit);
 extern struct net_device *hp100_probe(int unit);
 extern struct net_device *ultra_probe(int unit);
-extern struct net_device *ultra32_probe(int unit);
 extern struct net_device *wd_probe(int unit);
-extern struct net_device *el2_probe(int unit);
 extern struct net_device *ne_probe(int unit);
-extern struct net_device *hp_probe(int unit);
-extern struct net_device *hp_plus_probe(int unit);
-extern struct net_device *express_probe(int unit);
-extern struct net_device *eepro_probe(int unit);
-extern struct net_device *at1700_probe(int unit);
 extern struct net_device *fmv18x_probe(int unit);
-extern struct net_device *eth16i_probe(int unit);
 extern struct net_device *i82596_probe(int unit);
-extern struct net_device *ewrk3_probe(int unit);
-extern struct net_device *el1_probe(int unit);
-extern struct net_device *el16_probe(int unit);
-extern struct net_device *elmc_probe(int unit);
-extern struct net_device *elplus_probe(int unit);
-extern struct net_device *ac3200_probe(int unit);
-extern struct net_device *es_probe(int unit);
-extern struct net_device *lne390_probe(int unit);
-extern struct net_device *e2100_probe(int unit);
-extern struct net_device *ni5010_probe(int unit);
-extern struct net_device *ni52_probe(int unit);
 extern struct net_device *ni65_probe(int unit);
 extern struct net_device *sonic_probe(int unit);
-extern struct net_device *seeq8005_probe(int unit);
 extern struct net_device *smc_init(int unit);
 extern struct net_device *atarilance_probe(int unit);
 extern struct net_device *sun3lance_probe(int unit);
@@ -77,13 +56,9 @@ extern struct net_device *tc515_probe(int unit);
 extern struct net_device *lance_probe(int unit);
 extern struct net_device *mac8390_probe(int unit);
 extern struct net_device *mac89x0_probe(int unit);
-extern struct net_device *mc32_probe(int unit);
 extern struct net_device *cops_probe(int unit);
 extern struct net_device *ltpc_probe(void);
 
-/* Detachable devices ("pocket adaptors") */
-extern struct net_device *de620_probe(int unit);
-
 /* Fibre Channel adapters */
 extern int iph5526_probe(struct net_device *dev);
 
@@ -110,29 +85,6 @@ static int __init probe_list2(int unit, struct devprobe2 *p, int autoprobe)
        return -ENODEV;
 }
 
-/*
- * This is a bit of an artificial separation as there are PCI drivers
- * that also probe for EISA cards (in the PCI group) and there are ISA
- * drivers that probe for EISA cards (in the ISA group).  These are the
- * legacy EISA only driver probes, and also the legacy PCI probes
- */
-
-static struct devprobe2 eisa_probes[] __initdata = {
-#ifdef CONFIG_ULTRA32
-       {ultra32_probe, 0},
-#endif
-#ifdef CONFIG_AC3200
-       {ac3200_probe, 0},
-#endif
-#ifdef CONFIG_ES3210
-       {es_probe, 0},
-#endif
-#ifdef CONFIG_LNE390
-       {lne390_probe, 0},
-#endif
-       {NULL, 0},
-};
-
 /*
  * ISA probes that touch addresses < 0x400 (including those that also
  * look for EISA/PCI cards in addition to ISA cards).
@@ -150,18 +102,6 @@ static struct devprobe2 isa_probes[] __initdata = {
 #ifdef CONFIG_WD80x3
        {wd_probe, 0},
 #endif
-#ifdef CONFIG_EL2              /* 3c503 */
-       {el2_probe, 0},
-#endif
-#ifdef CONFIG_HPLAN
-       {hp_probe, 0},
-#endif
-#ifdef CONFIG_HPLAN_PLUS
-       {hp_plus_probe, 0},
-#endif
-#ifdef CONFIG_E2100            /* Cabletron E21xx series. */
-       {e2100_probe, 0},
-#endif
 #if defined(CONFIG_NE2000) || \
     defined(CONFIG_NE_H8300)  /* ISA (use ne2k-pci for PCI cards) */
        {ne_probe, 0},
@@ -172,60 +112,20 @@ static struct devprobe2 isa_probes[] __initdata = {
 #ifdef CONFIG_SMC9194
        {smc_init, 0},
 #endif
-#ifdef CONFIG_SEEQ8005
-       {seeq8005_probe, 0},
-#endif
 #ifdef CONFIG_CS89x0
 #ifndef CONFIG_CS89x0_PLATFORM
        {cs89x0_probe, 0},
 #endif
 #endif
-#ifdef CONFIG_AT1700
-       {at1700_probe, 0},
-#endif
-#ifdef CONFIG_ETH16I
-       {eth16i_probe, 0},      /* ICL EtherTeam 16i/32 */
-#endif
-#ifdef CONFIG_EEXPRESS         /* Intel EtherExpress */
-       {express_probe, 0},
-#endif
-#ifdef CONFIG_EEXPRESS_PRO     /* Intel EtherExpress Pro/10 */
-       {eepro_probe, 0},
-#endif
-#ifdef CONFIG_EWRK3             /* DEC EtherWORKS 3 */
-       {ewrk3_probe, 0},
-#endif
-#if defined(CONFIG_APRICOT) || defined(CONFIG_MVME16x_NET) || defined(CONFIG_BVME6000_NET)     /* Intel I82596 */
+#if defined(CONFIG_MVME16x_NET) || defined(CONFIG_BVME6000_NET)        /* Intel I82596 */
        {i82596_probe, 0},
 #endif
-#ifdef CONFIG_EL1              /* 3c501 */
-       {el1_probe, 0},
-#endif
-#ifdef CONFIG_EL16             /* 3c507 */
-       {el16_probe, 0},
-#endif
-#ifdef CONFIG_ELPLUS           /* 3c505 */
-       {elplus_probe, 0},
-#endif
-#ifdef CONFIG_NI5010
-       {ni5010_probe, 0},
-#endif
-#ifdef CONFIG_NI52
-       {ni52_probe, 0},
-#endif
 #ifdef CONFIG_NI65
        {ni65_probe, 0},
 #endif
        {NULL, 0},
 };
 
-static struct devprobe2 parport_probes[] __initdata = {
-#ifdef CONFIG_DE620            /* D-Link DE-620 adapter */
-       {de620_probe, 0},
-#endif
-       {NULL, 0},
-};
-
 static struct devprobe2 m68k_probes[] __initdata = {
 #ifdef CONFIG_ATARILANCE       /* Lance-based Atari ethernet boards */
        {atarilance_probe, 0},
@@ -264,9 +164,7 @@ static void __init ethif_probe2(int unit)
                return;
 
        (void)( probe_list2(unit, m68k_probes, base_addr == 0) &&
-               probe_list2(unit, eisa_probes, base_addr == 0) &&
-               probe_list2(unit, isa_probes, base_addr == 0) &&
-               probe_list2(unit, parport_probes, base_addr == 0));
+               probe_list2(unit, isa_probes, base_addr == 0));
 }
 
 /*  Statically configured drivers -- order matters here. */
index 325391d19badb8366f27f726dbee042d1fe430ad..7a54ec04b4181210961f2819c7fca1e260cb7661 100644 (file)
@@ -8,6 +8,8 @@
  * (at your option) any later version.
  */
 
+#include <linux/delay.h>
+#include <linux/jiffies.h>
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
@@ -66,36 +68,30 @@ static int mv88e6060_switch_reset(struct dsa_switch *ds)
 {
        int i;
        int ret;
+       unsigned long timeout;
 
-       /*
-        * Set all ports to the disabled state.
-        */
+       /* Set all ports to the disabled state. */
        for (i = 0; i < 6; i++) {
                ret = REG_READ(REG_PORT(i), 0x04);
                REG_WRITE(REG_PORT(i), 0x04, ret & 0xfffc);
        }
 
-       /*
-        * Wait for transmit queues to drain.
-        */
-       msleep(2);
+       /* Wait for transmit queues to drain. */
+       usleep_range(2000, 4000);
 
-       /*
-        * Reset the switch.
-        */
+       /* Reset the switch. */
        REG_WRITE(REG_GLOBAL, 0x0a, 0xa130);
 
-       /*
-        * Wait up to one second for reset to complete.
-        */
-       for (i = 0; i < 1000; i++) {
+       /* Wait up to one second for reset to complete. */
+       timeout = jiffies + 1 * HZ;
+       while (time_before(jiffies, timeout)) {
                ret = REG_READ(REG_GLOBAL, 0x00);
                if ((ret & 0x8000) == 0x0000)
                        break;
 
-               msleep(1);
+               usleep_range(1000, 2000);
        }
-       if (i == 1000)
+       if (time_after(jiffies, timeout))
                return -ETIMEDOUT;
 
        return 0;
@@ -103,15 +99,13 @@ static int mv88e6060_switch_reset(struct dsa_switch *ds)
 
 static int mv88e6060_setup_global(struct dsa_switch *ds)
 {
-       /*
-        * Disable discarding of frames with excessive collisions,
+       /* Disable discarding of frames with excessive collisions,
         * set the maximum frame size to 1536 bytes, and mask all
         * interrupt sources.
         */
        REG_WRITE(REG_GLOBAL, 0x04, 0x0800);
 
-       /*
-        * Enable automatic address learning, set the address
+       /* Enable automatic address learning, set the address
         * database size to 1024 entries, and set the default aging
         * time to 5 minutes.
         */
@@ -124,16 +118,14 @@ static int mv88e6060_setup_port(struct dsa_switch *ds, int p)
 {
        int addr = REG_PORT(p);
 
-       /*
-        * Do not force flow control, disable Ingress and Egress
+       /* Do not force flow control, disable Ingress and Egress
         * Header tagging, disable VLAN tunneling, and set the port
         * state to Forwarding.  Additionally, if this is the CPU
         * port, enable Ingress and Egress Trailer tagging mode.
         */
        REG_WRITE(addr, 0x04, dsa_is_cpu_port(ds, p) ?  0x4103 : 0x0003);
 
-       /*
-        * Port based VLAN map: give each port its own address
+       /* Port based VLAN map: give each port its own address
         * database, allow the CPU port to talk to each of the 'real'
         * ports, and allow each of the 'real' ports to only talk to
         * the CPU port.
@@ -144,8 +136,7 @@ static int mv88e6060_setup_port(struct dsa_switch *ds, int p)
                                ds->phys_port_mask :
                                (1 << ds->dst->cpu_port)));
 
-       /*
-        * Port Association Vector: when learning source addresses
+       /* Port Association Vector: when learning source addresses
         * of packets, add the address to the address database using
         * a port bitmap that has only the bit for this port set and
         * the other bits clear.
@@ -245,7 +236,7 @@ static void mv88e6060_poll_link(struct dsa_switch *ds)
 
                if (!link) {
                        if (netif_carrier_ok(dev)) {
-                               printk(KERN_INFO "%s: link down\n", dev->name);
+                               netdev_info(dev, "link down\n");
                                netif_carrier_off(dev);
                        }
                        continue;
@@ -256,10 +247,11 @@ static void mv88e6060_poll_link(struct dsa_switch *ds)
                fc = ((port_status & 0xc000) == 0xc000) ? 1 : 0;
 
                if (!netif_carrier_ok(dev)) {
-                       printk(KERN_INFO "%s: link up, %d Mb/s, %s duplex, "
-                                        "flow control %sabled\n", dev->name,
-                                        speed, duplex ? "full" : "half",
-                                        fc ? "en" : "dis");
+                       netdev_info(dev,
+                                   "link up, %d Mb/s, %s duplex, flow control %sabled\n",
+                                   speed,
+                                   duplex ? "full" : "half",
+                                   fc ? "en" : "dis");
                        netif_carrier_on(dev);
                }
        }
index c17c75b9f531f49c661b132267653e2984212059..41ee5b6ae91751239d81e4613f336aff02fbff84 100644 (file)
@@ -8,6 +8,8 @@
  * (at your option) any later version.
  */
 
+#include <linux/delay.h>
+#include <linux/jiffies.h>
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
@@ -50,36 +52,30 @@ static int mv88e6123_61_65_switch_reset(struct dsa_switch *ds)
 {
        int i;
        int ret;
+       unsigned long timeout;
 
-       /*
-        * Set all ports to the disabled state.
-        */
+       /* Set all ports to the disabled state. */
        for (i = 0; i < 8; i++) {
                ret = REG_READ(REG_PORT(i), 0x04);
                REG_WRITE(REG_PORT(i), 0x04, ret & 0xfffc);
        }
 
-       /*
-        * Wait for transmit queues to drain.
-        */
-       msleep(2);
+       /* Wait for transmit queues to drain. */
+       usleep_range(2000, 4000);
 
-       /*
-        * Reset the switch.
-        */
+       /* Reset the switch. */
        REG_WRITE(REG_GLOBAL, 0x04, 0xc400);
 
-       /*
-        * Wait up to one second for reset to complete.
-        */
-       for (i = 0; i < 1000; i++) {
+       /* Wait up to one second for reset to complete. */
+       timeout = jiffies + 1 * HZ;
+       while (time_before(jiffies, timeout)) {
                ret = REG_READ(REG_GLOBAL, 0x00);
                if ((ret & 0xc800) == 0xc800)
                        break;
 
-               msleep(1);
+               usleep_range(1000, 2000);
        }
-       if (i == 1000)
+       if (time_after(jiffies, timeout))
                return -ETIMEDOUT;
 
        return 0;
@@ -90,54 +86,45 @@ static int mv88e6123_61_65_setup_global(struct dsa_switch *ds)
        int ret;
        int i;
 
-       /*
-        * Disable the PHY polling unit (since there won't be any
+       /* Disable the PHY polling unit (since there won't be any
         * external PHYs to poll), don't discard packets with
         * excessive collisions, and mask all interrupt sources.
         */
        REG_WRITE(REG_GLOBAL, 0x04, 0x0000);
 
-       /*
-        * Set the default address aging time to 5 minutes, and
+       /* Set the default address aging time to 5 minutes, and
         * enable address learn messages to be sent to all message
         * ports.
         */
        REG_WRITE(REG_GLOBAL, 0x0a, 0x0148);
 
-       /*
-        * Configure the priority mapping registers.
-        */
+       /* Configure the priority mapping registers. */
        ret = mv88e6xxx_config_prio(ds);
        if (ret < 0)
                return ret;
 
-       /*
-        * Configure the upstream port, and configure the upstream
+       /* Configure the upstream port, and configure the upstream
         * port as the port to which ingress and egress monitor frames
         * are to be sent.
         */
        REG_WRITE(REG_GLOBAL, 0x1a, (dsa_upstream_port(ds) * 0x1110));
 
-       /*
-        * Disable remote management for now, and set the switch's
+       /* Disable remote management for now, and set the switch's
         * DSA device number.
         */
        REG_WRITE(REG_GLOBAL, 0x1c, ds->index & 0x1f);
 
-       /*
-        * Send all frames with destination addresses matching
+       /* Send all frames with destination addresses matching
         * 01:80:c2:00:00:2x to the CPU port.
         */
        REG_WRITE(REG_GLOBAL2, 0x02, 0xffff);
 
-       /*
-        * Send all frames with destination addresses matching
+       /* Send all frames with destination addresses matching
         * 01:80:c2:00:00:0x to the CPU port.
         */
        REG_WRITE(REG_GLOBAL2, 0x03, 0xffff);
 
-       /*
-        * Disable the loopback filter, disable flow control
+       /* Disable the loopback filter, disable flow control
         * messages, disable flood broadcast override, disable
         * removing of provider tags, disable ATU age violation
         * interrupts, disable tag flow control, force flow
@@ -146,9 +133,7 @@ static int mv88e6123_61_65_setup_global(struct dsa_switch *ds)
         */
        REG_WRITE(REG_GLOBAL2, 0x05, 0x00ff);
 
-       /*
-        * Program the DSA routing table.
-        */
+       /* Program the DSA routing table. */
        for (i = 0; i < 32; i++) {
                int nexthop;
 
@@ -159,33 +144,24 @@ static int mv88e6123_61_65_setup_global(struct dsa_switch *ds)
                REG_WRITE(REG_GLOBAL2, 0x06, 0x8000 | (i << 8) | nexthop);
        }
 
-       /*
-        * Clear all trunk masks.
-        */
+       /* Clear all trunk masks. */
        for (i = 0; i < 8; i++)
                REG_WRITE(REG_GLOBAL2, 0x07, 0x8000 | (i << 12) | 0xff);
 
-       /*
-        * Clear all trunk mappings.
-        */
+       /* Clear all trunk mappings. */
        for (i = 0; i < 16; i++)
                REG_WRITE(REG_GLOBAL2, 0x08, 0x8000 | (i << 11));
 
-       /*
-        * Disable ingress rate limiting by resetting all ingress
+       /* Disable ingress rate limiting by resetting all ingress
         * rate limit registers to their initial state.
         */
        for (i = 0; i < 6; i++)
                REG_WRITE(REG_GLOBAL2, 0x09, 0x9000 | (i << 8));
 
-       /*
-        * Initialise cross-chip port VLAN table to reset defaults.
-        */
+       /* Initialise cross-chip port VLAN table to reset defaults. */
        REG_WRITE(REG_GLOBAL2, 0x0b, 0x9000);
 
-       /*
-        * Clear the priority override table.
-        */
+       /* Clear the priority override table. */
        for (i = 0; i < 16; i++)
                REG_WRITE(REG_GLOBAL2, 0x0f, 0x8000 | (i << 8));
 
@@ -199,8 +175,7 @@ static int mv88e6123_61_65_setup_port(struct dsa_switch *ds, int p)
        int addr = REG_PORT(p);
        u16 val;
 
-       /*
-        * MAC Forcing register: don't force link, speed, duplex
+       /* MAC Forcing register: don't force link, speed, duplex
         * or flow control state to any particular values on physical
         * ports, but force the CPU port and all DSA ports to 1000 Mb/s
         * full duplex.
@@ -210,15 +185,13 @@ static int mv88e6123_61_65_setup_port(struct dsa_switch *ds, int p)
        else
                REG_WRITE(addr, 0x01, 0x0003);
 
-       /*
-        * Do not limit the period of time that this port can be
+       /* Do not limit the period of time that this port can be
         * paused for by the remote end or the period of time that
         * this port can pause the remote end.
         */
        REG_WRITE(addr, 0x02, 0x0000);
 
-       /*
-        * Port Control: disable Drop-on-Unlock, disable Drop-on-Lock,
+       /* Port Control: disable Drop-on-Unlock, disable Drop-on-Lock,
         * disable Header mode, enable IGMP/MLD snooping, disable VLAN
         * tunneling, determine priority by looking at 802.1p and IP
         * priority fields (IP prio has precedence), and set STP state
@@ -245,14 +218,12 @@ static int mv88e6123_61_65_setup_port(struct dsa_switch *ds, int p)
                val |= 0x000c;
        REG_WRITE(addr, 0x04, val);
 
-       /*
-        * Port Control 1: disable trunking.  Also, if this is the
+       /* Port Control 1: disable trunking.  Also, if this is the
         * CPU port, enable learn messages to be sent to this port.
         */
        REG_WRITE(addr, 0x05, dsa_is_cpu_port(ds, p) ? 0x8000 : 0x0000);
 
-       /*
-        * Port based VLAN map: give each port its own address
+       /* Port based VLAN map: give each port its own address
         * database, allow the CPU port to talk to each of the 'real'
         * ports, and allow each of the 'real' ports to only talk to
         * the upstream port.
@@ -264,14 +235,12 @@ static int mv88e6123_61_65_setup_port(struct dsa_switch *ds, int p)
                val |= 1 << dsa_upstream_port(ds);
        REG_WRITE(addr, 0x06, val);
 
-       /*
-        * Default VLAN ID and priority: don't set a default VLAN
+       /* Default VLAN ID and priority: don't set a default VLAN
         * ID, and set the default packet priority to zero.
         */
        REG_WRITE(addr, 0x07, 0x0000);
 
-       /*
-        * Port Control 2: don't force a good FCS, set the maximum
+       /* Port Control 2: don't force a good FCS, set the maximum
         * frame size to 10240 bytes, don't let the switch add or
         * strip 802.1q tags, don't discard tagged or untagged frames
         * on this port, do a destination address lookup on all
@@ -281,48 +250,36 @@ static int mv88e6123_61_65_setup_port(struct dsa_switch *ds, int p)
         */
        REG_WRITE(addr, 0x08, 0x2080);
 
-       /*
-        * Egress rate control: disable egress rate control.
-        */
+       /* Egress rate control: disable egress rate control. */
        REG_WRITE(addr, 0x09, 0x0001);
 
-       /*
-        * Egress rate control 2: disable egress rate control.
-        */
+       /* Egress rate control 2: disable egress rate control. */
        REG_WRITE(addr, 0x0a, 0x0000);
 
-       /*
-        * Port Association Vector: when learning source addresses
+       /* Port Association Vector: when learning source addresses
         * of packets, add the address to the address database using
         * a port bitmap that has only the bit for this port set and
         * the other bits clear.
         */
        REG_WRITE(addr, 0x0b, 1 << p);
 
-       /*
-        * Port ATU control: disable limiting the number of address
+       /* Port ATU control: disable limiting the number of address
         * database entries that this port is allowed to use.
         */
        REG_WRITE(addr, 0x0c, 0x0000);
 
-       /*
-        * Priorit Override: disable DA, SA and VTU priority override.
-        */
+       /* Priority Override: disable DA, SA and VTU priority override. */
        REG_WRITE(addr, 0x0d, 0x0000);
 
-       /*
-        * Port Ethertype: use the Ethertype DSA Ethertype value.
-        */
+       /* Port Ethertype: use the Ethertype DSA Ethertype value. */
        REG_WRITE(addr, 0x0f, ETH_P_EDSA);
 
-       /*
-        * Tag Remap: use an identity 802.1p prio -> switch prio
+       /* Tag Remap: use an identity 802.1p prio -> switch prio
         * mapping.
         */
        REG_WRITE(addr, 0x18, 0x3210);
 
-       /*
-        * Tag Remap 2: use an identity 802.1p prio -> switch prio
+       /* Tag Remap 2: use an identity 802.1p prio -> switch prio
         * mapping.
         */
        REG_WRITE(addr, 0x19, 0x7654);
index 55888b06d8b47af7c90564027db08e2f54bf512d..dadfafba64e9ac0aad3de55d84e5bdea3ceb00a0 100644 (file)
@@ -8,6 +8,8 @@
  * (at your option) any later version.
  */
 
+#include <linux/delay.h>
+#include <linux/jiffies.h>
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
@@ -15,9 +17,7 @@
 #include <net/dsa.h>
 #include "mv88e6xxx.h"
 
-/*
- * Switch product IDs
- */
+/* Switch product IDs */
 #define ID_6085                0x04a0
 #define ID_6095                0x0950
 #define ID_6131                0x1060
@@ -44,36 +44,30 @@ static int mv88e6131_switch_reset(struct dsa_switch *ds)
 {
        int i;
        int ret;
+       unsigned long timeout;
 
-       /*
-        * Set all ports to the disabled state.
-        */
+       /* Set all ports to the disabled state. */
        for (i = 0; i < 11; i++) {
                ret = REG_READ(REG_PORT(i), 0x04);
                REG_WRITE(REG_PORT(i), 0x04, ret & 0xfffc);
        }
 
-       /*
-        * Wait for transmit queues to drain.
-        */
-       msleep(2);
+       /* Wait for transmit queues to drain. */
+       usleep_range(2000, 4000);
 
-       /*
-        * Reset the switch.
-        */
+       /* Reset the switch. */
        REG_WRITE(REG_GLOBAL, 0x04, 0xc400);
 
-       /*
-        * Wait up to one second for reset to complete.
-        */
-       for (i = 0; i < 1000; i++) {
+       /* Wait up to one second for reset to complete. */
+       timeout = jiffies + 1 * HZ;
+       while (time_before(jiffies, timeout)) {
                ret = REG_READ(REG_GLOBAL, 0x00);
                if ((ret & 0xc800) == 0xc800)
                        break;
 
-               msleep(1);
+               usleep_range(1000, 2000);
        }
-       if (i == 1000)
+       if (time_after(jiffies, timeout))
                return -ETIMEDOUT;
 
        return 0;
@@ -84,42 +78,34 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)
        int ret;
        int i;
 
-       /*
-        * Enable the PHY polling unit, don't discard packets with
+       /* Enable the PHY polling unit, don't discard packets with
         * excessive collisions, use a weighted fair queueing scheme
         * to arbitrate between packet queues, set the maximum frame
         * size to 1632, and mask all interrupt sources.
         */
        REG_WRITE(REG_GLOBAL, 0x04, 0x4400);
 
-       /*
-        * Set the default address aging time to 5 minutes, and
+       /* Set the default address aging time to 5 minutes, and
         * enable address learn messages to be sent to all message
         * ports.
         */
        REG_WRITE(REG_GLOBAL, 0x0a, 0x0148);
 
-       /*
-        * Configure the priority mapping registers.
-        */
+       /* Configure the priority mapping registers. */
        ret = mv88e6xxx_config_prio(ds);
        if (ret < 0)
                return ret;
 
-       /*
-        * Set the VLAN ethertype to 0x8100.
-        */
+       /* Set the VLAN ethertype to 0x8100. */
        REG_WRITE(REG_GLOBAL, 0x19, 0x8100);
 
-       /*
-        * Disable ARP mirroring, and configure the upstream port as
+       /* Disable ARP mirroring, and configure the upstream port as
         * the port to which ingress and egress monitor frames are to
         * be sent.
         */
        REG_WRITE(REG_GLOBAL, 0x1a, (dsa_upstream_port(ds) * 0x1100) | 0x00f0);
 
-       /*
-        * Disable cascade port functionality unless this device
+       /* Disable cascade port functionality unless this device
         * is used in a cascade configuration, and set the switch's
         * DSA device number.
         */
@@ -128,23 +114,19 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)
        else
                REG_WRITE(REG_GLOBAL, 0x1c, 0xe000 | (ds->index & 0x1f));
 
-       /*
-        * Send all frames with destination addresses matching
+       /* Send all frames with destination addresses matching
         * 01:80:c2:00:00:0x to the CPU port.
         */
        REG_WRITE(REG_GLOBAL2, 0x03, 0xffff);
 
-       /*
-        * Ignore removed tag data on doubly tagged packets, disable
+       /* Ignore removed tag data on doubly tagged packets, disable
         * flow control messages, force flow control priority to the
         * highest, and send all special multicast frames to the CPU
         * port at the highest priority.
         */
        REG_WRITE(REG_GLOBAL2, 0x05, 0x00ff);
 
-       /*
-        * Program the DSA routing table.
-        */
+       /* Program the DSA routing table. */
        for (i = 0; i < 32; i++) {
                int nexthop;
 
@@ -155,20 +137,15 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)
                REG_WRITE(REG_GLOBAL2, 0x06, 0x8000 | (i << 8) | nexthop);
        }
 
-       /*
-        * Clear all trunk masks.
-        */
+       /* Clear all trunk masks. */
        for (i = 0; i < 8; i++)
                REG_WRITE(REG_GLOBAL2, 0x07, 0x8000 | (i << 12) | 0x7ff);
 
-       /*
-        * Clear all trunk mappings.
-        */
+       /* Clear all trunk mappings. */
        for (i = 0; i < 16; i++)
                REG_WRITE(REG_GLOBAL2, 0x08, 0x8000 | (i << 11));
 
-       /*
-        * Force the priority of IGMP/MLD snoop frames and ARP frames
+       /* Force the priority of IGMP/MLD snoop frames and ARP frames
         * to the highest setting.
         */
        REG_WRITE(REG_GLOBAL2, 0x0f, 0x00ff);
@@ -182,8 +159,7 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
        int addr = REG_PORT(p);
        u16 val;
 
-       /*
-        * MAC Forcing register: don't force link, speed, duplex
+       /* MAC Forcing register: don't force link, speed, duplex
         * or flow control state to any particular values on physical
         * ports, but force the CPU port and all DSA ports to 1000 Mb/s
         * (100 Mb/s on 6085) full duplex.
@@ -196,8 +172,7 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
        else
                REG_WRITE(addr, 0x01, 0x0003);
 
-       /*
-        * Port Control: disable Core Tag, disable Drop-on-Lock,
+       /* Port Control: disable Core Tag, disable Drop-on-Lock,
         * transmit frames unmodified, disable Header mode,
         * enable IGMP/MLD snoop, disable DoubleTag, disable VLAN
         * tunneling, determine priority by looking at 802.1p and
@@ -214,8 +189,7 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
        val = 0x0433;
        if (p == dsa_upstream_port(ds)) {
                val |= 0x0104;
-               /*
-                * On 6085, unknown multicast forward is controlled
+               /* On 6085, unknown multicast forward is controlled
                 * here rather than in Port Control 2 register.
                 */
                if (ps->id == ID_6085)
@@ -225,14 +199,12 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
                val |= 0x0100;
        REG_WRITE(addr, 0x04, val);
 
-       /*
-        * Port Control 1: disable trunking.  Also, if this is the
+       /* Port Control 1: disable trunking.  Also, if this is the
         * CPU port, enable learn messages to be sent to this port.
         */
        REG_WRITE(addr, 0x05, dsa_is_cpu_port(ds, p) ? 0x8000 : 0x0000);
 
-       /*
-        * Port based VLAN map: give each port its own address
+       /* Port based VLAN map: give each port its own address
         * database, allow the CPU port to talk to each of the 'real'
         * ports, and allow each of the 'real' ports to only talk to
         * the upstream port.
@@ -244,14 +216,12 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
                val |= 1 << dsa_upstream_port(ds);
        REG_WRITE(addr, 0x06, val);
 
-       /*
-        * Default VLAN ID and priority: don't set a default VLAN
+       /* Default VLAN ID and priority: don't set a default VLAN
         * ID, and set the default packet priority to zero.
         */
        REG_WRITE(addr, 0x07, 0x0000);
 
-       /*
-        * Port Control 2: don't force a good FCS, don't use
+       /* Port Control 2: don't force a good FCS, don't use
         * VLAN-based, source address-based or destination
         * address-based priority overrides, don't let the switch
         * add or strip 802.1q tags, don't discard tagged or
@@ -264,8 +234,7 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
         * forwarding of unknown multicast addresses.
         */
        if (ps->id == ID_6085)
-               /*
-                * on 6085, bits 3:0 are reserved, bit 6 control ARP
+               /* on 6085, bits 3:0 are reserved, bit 6 control ARP
                 * mirroring, and multicast forward is handled in
                 * Port Control register.
                 */
@@ -277,32 +246,25 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)
                REG_WRITE(addr, 0x08, val);
        }
 
-       /*
-        * Rate Control: disable ingress rate limiting.
-        */
+       /* Rate Control: disable ingress rate limiting. */
        REG_WRITE(addr, 0x09, 0x0000);
 
-       /*
-        * Rate Control 2: disable egress rate limiting.
-        */
+       /* Rate Control 2: disable egress rate limiting. */
        REG_WRITE(addr, 0x0a, 0x0000);
 
-       /*
-        * Port Association Vector: when learning source addresses
+       /* Port Association Vector: when learning source addresses
         * of packets, add the address to the address database using
         * a port bitmap that has only the bit for this port set and
         * the other bits clear.
         */
        REG_WRITE(addr, 0x0b, 1 << p);
 
-       /*
-        * Tag Remap: use an identity 802.1p prio -> switch prio
+       /* Tag Remap: use an identity 802.1p prio -> switch prio
         * mapping.
         */
        REG_WRITE(addr, 0x18, 0x3210);
 
-       /*
-        * Tag Remap 2: use an identity 802.1p prio -> switch prio
+       /* Tag Remap 2: use an identity 802.1p prio -> switch prio
         * mapping.
         */
        REG_WRITE(addr, 0x19, 0x7654);
index a2c62c2f30ee40f7ecb11d460958cae0f5c94e80..17314ed9456d32c961aea31db10a650a2ffb1392 100644 (file)
@@ -8,6 +8,8 @@
  * (at your option) any later version.
  */
 
+#include <linux/delay.h>
+#include <linux/jiffies.h>
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
@@ -15,8 +17,7 @@
 #include <net/dsa.h>
 #include "mv88e6xxx.h"
 
-/*
- * If the switch's ADDR[4:0] strap pins are strapped to zero, it will
+/* If the switch's ADDR[4:0] strap pins are strapped to zero, it will
  * use all 32 SMI bus addresses on its SMI bus, and all switch registers
  * will be directly accessible on some {device address,register address}
  * pair.  If the ADDR[4:0] pins are not strapped to zero, the switch
@@ -48,30 +49,22 @@ int __mv88e6xxx_reg_read(struct mii_bus *bus, int sw_addr, int addr, int reg)
        if (sw_addr == 0)
                return mdiobus_read(bus, addr, reg);
 
-       /*
-        * Wait for the bus to become free.
-        */
+       /* Wait for the bus to become free. */
        ret = mv88e6xxx_reg_wait_ready(bus, sw_addr);
        if (ret < 0)
                return ret;
 
-       /*
-        * Transmit the read command.
-        */
+       /* Transmit the read command. */
        ret = mdiobus_write(bus, sw_addr, 0, 0x9800 | (addr << 5) | reg);
        if (ret < 0)
                return ret;
 
-       /*
-        * Wait for the read command to complete.
-        */
+       /* Wait for the read command to complete. */
        ret = mv88e6xxx_reg_wait_ready(bus, sw_addr);
        if (ret < 0)
                return ret;
 
-       /*
-        * Read the data.
-        */
+       /* Read the data. */
        ret = mdiobus_read(bus, sw_addr, 1);
        if (ret < 0)
                return ret;
@@ -100,30 +93,22 @@ int __mv88e6xxx_reg_write(struct mii_bus *bus, int sw_addr, int addr,
        if (sw_addr == 0)
                return mdiobus_write(bus, addr, reg, val);
 
-       /*
-        * Wait for the bus to become free.
-        */
+       /* Wait for the bus to become free. */
        ret = mv88e6xxx_reg_wait_ready(bus, sw_addr);
        if (ret < 0)
                return ret;
 
-       /*
-        * Transmit the data to write.
-        */
+       /* Transmit the data to write. */
        ret = mdiobus_write(bus, sw_addr, 1, val);
        if (ret < 0)
                return ret;
 
-       /*
-        * Transmit the write command.
-        */
+       /* Transmit the write command. */
        ret = mdiobus_write(bus, sw_addr, 0, 0x9400 | (addr << 5) | reg);
        if (ret < 0)
                return ret;
 
-       /*
-        * Wait for the write command to complete.
-        */
+       /* Wait for the write command to complete. */
        ret = mv88e6xxx_reg_wait_ready(bus, sw_addr);
        if (ret < 0)
                return ret;
@@ -146,9 +131,7 @@ int mv88e6xxx_reg_write(struct dsa_switch *ds, int addr, int reg, u16 val)
 
 int mv88e6xxx_config_prio(struct dsa_switch *ds)
 {
-       /*
-        * Configure the IP ToS mapping registers.
-        */
+       /* Configure the IP ToS mapping registers. */
        REG_WRITE(REG_GLOBAL, 0x10, 0x0000);
        REG_WRITE(REG_GLOBAL, 0x11, 0x0000);
        REG_WRITE(REG_GLOBAL, 0x12, 0x5555);
@@ -158,9 +141,7 @@ int mv88e6xxx_config_prio(struct dsa_switch *ds)
        REG_WRITE(REG_GLOBAL, 0x16, 0xffff);
        REG_WRITE(REG_GLOBAL, 0x17, 0xffff);
 
-       /*
-        * Configure the IEEE 802.1p priority mapping register.
-        */
+       /* Configure the IEEE 802.1p priority mapping register. */
        REG_WRITE(REG_GLOBAL, 0x18, 0xfa41);
 
        return 0;
@@ -183,14 +164,10 @@ int mv88e6xxx_set_addr_indirect(struct dsa_switch *ds, u8 *addr)
        for (i = 0; i < 6; i++) {
                int j;
 
-               /*
-                * Write the MAC address byte.
-                */
+               /* Write the MAC address byte. */
                REG_WRITE(REG_GLOBAL2, 0x0d, 0x8000 | (i << 8) | addr[i]);
 
-               /*
-                * Wait for the write to complete.
-                */
+               /* Wait for the write to complete. */
                for (j = 0; j < 16; j++) {
                        ret = REG_READ(REG_GLOBAL2, 0x0d);
                        if ((ret & 0x8000) == 0)
@@ -221,16 +198,17 @@ int mv88e6xxx_phy_write(struct dsa_switch *ds, int addr, int regnum, u16 val)
 static int mv88e6xxx_ppu_disable(struct dsa_switch *ds)
 {
        int ret;
-       int i;
+       unsigned long timeout;
 
        ret = REG_READ(REG_GLOBAL, 0x04);
        REG_WRITE(REG_GLOBAL, 0x04, ret & ~0x4000);
 
-       for (i = 0; i < 1000; i++) {
-               ret = REG_READ(REG_GLOBAL, 0x00);
-               msleep(1);
-               if ((ret & 0xc000) != 0xc000)
-                       return 0;
+       timeout = jiffies + 1 * HZ;
+       while (time_before(jiffies, timeout)) {
+               ret = REG_READ(REG_GLOBAL, 0x00);
+               usleep_range(1000, 2000);
+               if ((ret & 0xc000) != 0xc000)
+                       return 0;
        }
 
        return -ETIMEDOUT;
@@ -239,16 +217,17 @@ static int mv88e6xxx_ppu_disable(struct dsa_switch *ds)
 static int mv88e6xxx_ppu_enable(struct dsa_switch *ds)
 {
        int ret;
-       int i;
+       unsigned long timeout;
 
        ret = REG_READ(REG_GLOBAL, 0x04);
        REG_WRITE(REG_GLOBAL, 0x04, ret | 0x4000);
 
-       for (i = 0; i < 1000; i++) {
-               ret = REG_READ(REG_GLOBAL, 0x00);
-               msleep(1);
-               if ((ret & 0xc000) == 0xc000)
-                       return 0;
+       timeout = jiffies + 1 * HZ;
+       while (time_before(jiffies, timeout)) {
+               ret = REG_READ(REG_GLOBAL, 0x00);
+               usleep_range(1000, 2000);
+               if ((ret & 0xc000) == 0xc000)
+                       return 0;
        }
 
        return -ETIMEDOUT;
@@ -260,11 +239,11 @@ static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
 
        ps = container_of(ugly, struct mv88e6xxx_priv_state, ppu_work);
        if (mutex_trylock(&ps->ppu_mutex)) {
-               struct dsa_switch *ds = ((struct dsa_switch *)ps) - 1;
+               struct dsa_switch *ds = ((struct dsa_switch *)ps) - 1;
 
-               if (mv88e6xxx_ppu_enable(ds) == 0)
-                       ps->ppu_disabled = 0;
-               mutex_unlock(&ps->ppu_mutex);
+               if (mv88e6xxx_ppu_enable(ds) == 0)
+                       ps->ppu_disabled = 0;
+               mutex_unlock(&ps->ppu_mutex);
        }
 }
 
@@ -282,22 +261,21 @@ static int mv88e6xxx_ppu_access_get(struct dsa_switch *ds)
 
        mutex_lock(&ps->ppu_mutex);
 
-       /*
-        * If the PHY polling unit is enabled, disable it so that
+       /* If the PHY polling unit is enabled, disable it so that
         * we can access the PHY registers.  If it was already
         * disabled, cancel the timer that is going to re-enable
         * it.
         */
        if (!ps->ppu_disabled) {
-               ret = mv88e6xxx_ppu_disable(ds);
-               if (ret < 0) {
-                       mutex_unlock(&ps->ppu_mutex);
-                       return ret;
-               }
-               ps->ppu_disabled = 1;
+               ret = mv88e6xxx_ppu_disable(ds);
+               if (ret < 0) {
+                       mutex_unlock(&ps->ppu_mutex);
+                       return ret;
+               }
+               ps->ppu_disabled = 1;
        } else {
-               del_timer(&ps->ppu_timer);
-               ret = 0;
+               del_timer(&ps->ppu_timer);
+               ret = 0;
        }
 
        return ret;
@@ -307,9 +285,7 @@ static void mv88e6xxx_ppu_access_put(struct dsa_switch *ds)
 {
        struct mv88e6xxx_priv_state *ps = (void *)(ds + 1);
 
-       /*
-        * Schedule a timer to re-enable the PHY polling unit.
-        */
+       /* Schedule a timer to re-enable the PHY polling unit. */
        mod_timer(&ps->ppu_timer, jiffies + msecs_to_jiffies(10));
        mutex_unlock(&ps->ppu_mutex);
 }
@@ -331,8 +307,8 @@ int mv88e6xxx_phy_read_ppu(struct dsa_switch *ds, int addr, int regnum)
 
        ret = mv88e6xxx_ppu_access_get(ds);
        if (ret >= 0) {
-               ret = mv88e6xxx_reg_read(ds, addr, regnum);
-               mv88e6xxx_ppu_access_put(ds);
+               ret = mv88e6xxx_reg_read(ds, addr, regnum);
+               mv88e6xxx_ppu_access_put(ds);
        }
 
        return ret;
@@ -345,8 +321,8 @@ int mv88e6xxx_phy_write_ppu(struct dsa_switch *ds, int addr,
 
        ret = mv88e6xxx_ppu_access_get(ds);
        if (ret >= 0) {
-               ret = mv88e6xxx_reg_write(ds, addr, regnum, val);
-               mv88e6xxx_ppu_access_put(ds);
+               ret = mv88e6xxx_reg_write(ds, addr, regnum, val);
+               mv88e6xxx_ppu_access_put(ds);
        }
 
        return ret;
@@ -380,7 +356,7 @@ void mv88e6xxx_poll_link(struct dsa_switch *ds)
 
                if (!link) {
                        if (netif_carrier_ok(dev)) {
-                               printk(KERN_INFO "%s: link down\n", dev->name);
+                               netdev_info(dev, "link down\n");
                                netif_carrier_off(dev);
                        }
                        continue;
@@ -404,10 +380,11 @@ void mv88e6xxx_poll_link(struct dsa_switch *ds)
                fc = (port_status & 0x8000) ? 1 : 0;
 
                if (!netif_carrier_ok(dev)) {
-                       printk(KERN_INFO "%s: link up, %d Mb/s, %s duplex, "
-                                        "flow control %sabled\n", dev->name,
-                                        speed, duplex ? "full" : "half",
-                                        fc ? "en" : "dis");
+                       netdev_info(dev,
+                                   "link up, %d Mb/s, %s duplex, flow control %sabled\n",
+                                   speed,
+                                   duplex ? "full" : "half",
+                                   fc ? "en" : "dis");
                        netif_carrier_on(dev);
                }
        }
@@ -431,14 +408,10 @@ static int mv88e6xxx_stats_snapshot(struct dsa_switch *ds, int port)
 {
        int ret;
 
-       /*
-        * Snapshot the hardware statistics counters for this port.
-        */
+       /* Snapshot the hardware statistics counters for this port. */
        REG_WRITE(REG_GLOBAL, 0x1d, 0xdc00 | port);
 
-       /*
-        * Wait for the snapshotting to complete.
-        */
+       /* Wait for the snapshotting to complete. */
        ret = mv88e6xxx_stats_wait(ds);
        if (ret < 0)
                return ret;
@@ -502,9 +475,7 @@ void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds,
                return;
        }
 
-       /*
-        * Read each of the counters.
-        */
+       /* Read each of the counters. */
        for (i = 0; i < nr_stats; i++) {
                struct mv88e6xxx_hw_stat *s = stats + i;
                u32 low;
index fc2cd7b90e8d257f9144933bb93f29c77b51ad83..911ede58dd12d22223cfa71cce53e32eba55f5f8 100644 (file)
 #define REG_GLOBAL2            0x1c
 
 struct mv88e6xxx_priv_state {
-       /*
-        * When using multi-chip addressing, this mutex protects
+       /* When using multi-chip addressing, this mutex protects
         * access to the indirect access registers.  (In single-chip
         * mode, this mutex is effectively useless.)
         */
        struct mutex    smi_mutex;
 
 #ifdef CONFIG_NET_DSA_MV88E6XXX_NEED_PPU
-       /*
-        * Handles automatic disabling and re-enabling of the PHY
+       /* Handles automatic disabling and re-enabling of the PHY
         * polling unit.
         */
        struct mutex            ppu_mutex;
@@ -34,8 +32,7 @@ struct mv88e6xxx_priv_state {
        struct timer_list       ppu_timer;
 #endif
 
-       /*
-        * This mutex serialises access to the statistics unit.
+       /* This mutex serialises access to the statistics unit.
         * Hold this mutex over snapshot + dump sequences.
         */
        struct mutex    stats_mutex;
@@ -52,7 +49,7 @@ struct mv88e6xxx_hw_stat {
 int __mv88e6xxx_reg_read(struct mii_bus *bus, int sw_addr, int addr, int reg);
 int mv88e6xxx_reg_read(struct dsa_switch *ds, int addr, int reg);
 int __mv88e6xxx_reg_write(struct mii_bus *bus, int sw_addr, int addr,
-                          int reg, u16 val);
+                         int reg, u16 val);
 int mv88e6xxx_reg_write(struct dsa_switch *ds, int addr, int reg, u16 val);
 int mv88e6xxx_config_prio(struct dsa_switch *ds);
 int mv88e6xxx_set_addr_direct(struct dsa_switch *ds, u8 *addr);
diff --git a/drivers/net/ethernet/3com/3c501.c b/drivers/net/ethernet/3com/3c501.c
deleted file mode 100644 (file)
index 9abd9a7..0000000
+++ /dev/null
@@ -1,897 +0,0 @@
-/* 3c501.c: A 3Com 3c501 Ethernet driver for Linux. */
-/*
-    Written 1992,1993,1994  Donald Becker
-
-    Copyright 1993 United States Government as represented by the
-    Director, National Security Agency.  This software may be used and
-    distributed according to the terms of the GNU General Public License,
-    incorporated herein by reference.
-
-    This is a device driver for the 3Com Etherlink 3c501.
-    Do not purchase this card, even as a joke.  It's performance is horrible,
-    and it breaks in many ways.
-
-    The original author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-    Fixed (again!) the missing interrupt locking on TX/RX shifting.
-       Alan Cox <alan@lxorguk.ukuu.org.uk>
-
-    Removed calls to init_etherdev since they are no longer needed, and
-    cleaned up modularization just a bit. The driver still allows only
-    the default address for cards when loaded as a module, but that's
-    really less braindead than anyone using a 3c501 board. :)
-                   19950208 (invid@msen.com)
-
-    Added traps for interrupts hitting the window as we clear and TX load
-    the board. Now getting 150K/second FTP with a 3c501 card. Still playing
-    with a TX-TX optimisation to see if we can touch 180-200K/second as seems
-    theoretically maximum.
-               19950402 Alan Cox <alan@lxorguk.ukuu.org.uk>
-
-    Cleaned up for 2.3.x because we broke SMP now.
-               20000208 Alan Cox <alan@lxorguk.ukuu.org.uk>
-
-    Check up pass for 2.5. Nothing significant changed
-               20021009 Alan Cox <alan@lxorguk.ukuu.org.uk>
-
-    Fixed zero fill corner case
-               20030104 Alan Cox <alan@lxorguk.ukuu.org.uk>
-
-
-   For the avoidance of doubt the "preferred form" of this code is one which
-   is in an open non patent encumbered format. Where cryptographic key signing
-   forms part of the process of creating an executable the information
-   including keys needed to generate an equivalently functional executable
-   are deemed to be part of the source code.
-
-*/
-
-
-/**
- * DOC: 3c501 Card Notes
- *
- *  Some notes on this thing if you have to hack it.  [Alan]
- *
- *  Some documentation is available from 3Com. Due to the boards age
- *  standard responses when you ask for this will range from 'be serious'
- *  to 'give it to a museum'. The documentation is incomplete and mostly
- *  of historical interest anyway.
- *
- *  The basic system is a single buffer which can be used to receive or
- *  transmit a packet. A third command mode exists when you are setting
- *  things up.
- *
- *  If it's transmitting it's not receiving and vice versa. In fact the
- *  time to get the board back into useful state after an operation is
- *  quite large.
- *
- *  The driver works by keeping the board in receive mode waiting for a
- *  packet to arrive. When one arrives it is copied out of the buffer
- *  and delivered to the kernel. The card is reloaded and off we go.
- *
- *  When transmitting lp->txing is set and the card is reset (from
- *  receive mode) [possibly losing a packet just received] to command
- *  mode. A packet is loaded and transmit mode triggered. The interrupt
- *  handler runs different code for transmit interrupts and can handle
- *  returning to receive mode or retransmissions (yes you have to help
- *  out with those too).
- *
- * DOC: Problems
- *
- *  There are a wide variety of undocumented error returns from the card
- *  and you basically have to kick the board and pray if they turn up. Most
- *  only occur under extreme load or if you do something the board doesn't
- *  like (eg touching a register at the wrong time).
- *
- *  The driver is less efficient than it could be. It switches through
- *  receive mode even if more transmits are queued. If this worries you buy
- *  a real Ethernet card.
- *
- *  The combination of slow receive restart and no real multicast
- *  filter makes the board unusable with a kernel compiled for IP
- *  multicasting in a real multicast environment. That's down to the board,
- *  but even with no multicast programs running a multicast IP kernel is
- *  in group 224.0.0.1 and you will therefore be listening to all multicasts.
- *  One nv conference running over that Ethernet and you can give up.
- *
- */
-
-#define DRV_NAME       "3c501"
-#define DRV_VERSION    "2002/10/09"
-
-
-static const char version[] =
-       DRV_NAME ".c: " DRV_VERSION " Alan Cox (alan@lxorguk.ukuu.org.uk).\n";
-
-/*
- *     Braindamage remaining:
- *     The 3c501 board.
- */
-
-#include <linux/module.h>
-
-#include <linux/kernel.h>
-#include <linux/fcntl.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/spinlock.h>
-#include <linux/ethtool.h>
-#include <linux/delay.h>
-#include <linux/bitops.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/init.h>
-
-#include "3c501.h"
-
-/*
- *     The boilerplate probe code.
- */
-
-static int io = 0x280;
-static int irq = 5;
-static int mem_start;
-
-/**
- * el1_probe           -       probe for a 3c501
- * @dev: The device structure passed in to probe.
- *
- * This can be called from two places. The network layer will probe using
- * a device structure passed in with the probe information completed. For a
- * modular driver we use #init_module to fill in our own structure and probe
- * for it.
- *
- * Returns 0 on success. ENXIO if asked not to probe and ENODEV if asked to
- * probe and failing to find anything.
- */
-
-struct net_device * __init el1_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-       static const unsigned ports[] = { 0x280, 0x300, 0};
-       const unsigned *port;
-       int err = 0;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-               io = dev->base_addr;
-               irq = dev->irq;
-               mem_start = dev->mem_start & 7;
-       }
-
-       if (io > 0x1ff) {       /* Check a single specified location. */
-               err = el1_probe1(dev, io);
-       } else if (io != 0) {
-               err = -ENXIO;           /* Don't probe at all. */
-       } else {
-               for (port = ports; *port && el1_probe1(dev, *port); port++)
-                       ;
-               if (!*port)
-                       err = -ENODEV;
-       }
-       if (err)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-       release_region(dev->base_addr, EL1_IO_EXTENT);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-static const struct net_device_ops el_netdev_ops = {
-       .ndo_open               = el_open,
-       .ndo_stop               = el1_close,
-       .ndo_start_xmit         = el_start_xmit,
-       .ndo_tx_timeout         = el_timeout,
-       .ndo_set_rx_mode        = set_multicast_list,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-/**
- *     el1_probe1:
- *     @dev: The device structure to use
- *     @ioaddr: An I/O address to probe at.
- *
- *     The actual probe. This is iterated over by #el1_probe in order to
- *     check all the applicable device locations.
- *
- *     Returns 0 for a success, in which case the device is activated,
- *     EAGAIN if the IRQ is in use by another driver, and ENODEV if the
- *     board cannot be found.
- */
-
-static int __init el1_probe1(struct net_device *dev, int ioaddr)
-{
-       struct net_local *lp;
-       const char *mname;              /* Vendor name */
-       unsigned char station_addr[6];
-       int autoirq = 0;
-       int i;
-
-       /*
-        *      Reserve I/O resource for exclusive use by this driver
-        */
-
-       if (!request_region(ioaddr, EL1_IO_EXTENT, DRV_NAME))
-               return -ENODEV;
-
-       /*
-        *      Read the station address PROM data from the special port.
-        */
-
-       for (i = 0; i < 6; i++) {
-               outw(i, ioaddr + EL1_DATAPTR);
-               station_addr[i] = inb(ioaddr + EL1_SAPROM);
-       }
-       /*
-        *      Check the first three octets of the S.A. for 3Com's prefix, or
-        *      for the Sager NP943 prefix.
-        */
-
-       if (station_addr[0] == 0x02 && station_addr[1] == 0x60 &&
-           station_addr[2] == 0x8c)
-               mname = "3c501";
-       else if (station_addr[0] == 0x00 && station_addr[1] == 0x80 &&
-                station_addr[2] == 0xC8)
-               mname = "NP943";
-       else {
-               release_region(ioaddr, EL1_IO_EXTENT);
-               return -ENODEV;
-       }
-
-       /*
-        *      We auto-IRQ by shutting off the interrupt line and letting it
-        *      float high.
-        */
-
-       dev->irq = irq;
-
-       if (dev->irq < 2) {
-               unsigned long irq_mask;
-
-               irq_mask = probe_irq_on();
-               inb(RX_STATUS);         /* Clear pending interrupts. */
-               inb(TX_STATUS);
-               outb(AX_LOOP + 1, AX_CMD);
-
-               outb(0x00, AX_CMD);
-
-               mdelay(20);
-               autoirq = probe_irq_off(irq_mask);
-
-               if (autoirq == 0) {
-                       pr_warning("%s probe at %#x failed to detect IRQ line.\n",
-                               mname, ioaddr);
-                       release_region(ioaddr, EL1_IO_EXTENT);
-                       return -EAGAIN;
-               }
-       }
-
-       outb(AX_RESET+AX_LOOP, AX_CMD);                 /* Loopback mode. */
-       dev->base_addr = ioaddr;
-       memcpy(dev->dev_addr, station_addr, ETH_ALEN);
-
-       if (mem_start & 0xf)
-               el_debug = mem_start & 0x7;
-       if (autoirq)
-               dev->irq = autoirq;
-
-       pr_info("%s: %s EtherLink at %#lx, using %sIRQ %d.\n",
-                       dev->name, mname, dev->base_addr,
-                       autoirq ? "auto":"assigned ", dev->irq);
-
-#ifdef CONFIG_IP_MULTICAST
-       pr_warning("WARNING: Use of the 3c501 in a multicast kernel is NOT recommended.\n");
-#endif
-
-       if (el_debug)
-               pr_debug("%s", version);
-
-       lp = netdev_priv(dev);
-       memset(lp, 0, sizeof(struct net_local));
-       spin_lock_init(&lp->lock);
-
-       /*
-        *      The EL1-specific entries in the device structure.
-        */
-
-       dev->netdev_ops = &el_netdev_ops;
-       dev->watchdog_timeo = HZ;
-       dev->ethtool_ops = &netdev_ethtool_ops;
-       return 0;
-}
-
-/**
- *     el1_open:
- *     @dev: device that is being opened
- *
- *     When an ifconfig is issued which changes the device flags to include
- *     IFF_UP this function is called. It is only called when the change
- *     occurs, not when the interface remains up. #el1_close will be called
- *     when it goes down.
- *
- *     Returns 0 for a successful open, or -EAGAIN if someone has run off
- *     with our interrupt line.
- */
-
-static int el_open(struct net_device *dev)
-{
-       int retval;
-       int ioaddr = dev->base_addr;
-       struct net_local *lp = netdev_priv(dev);
-       unsigned long flags;
-
-       if (el_debug > 2)
-               pr_debug("%s: Doing el_open()...\n", dev->name);
-
-       retval = request_irq(dev->irq, el_interrupt, 0, dev->name, dev);
-       if (retval)
-               return retval;
-
-       spin_lock_irqsave(&lp->lock, flags);
-       el_reset(dev);
-       spin_unlock_irqrestore(&lp->lock, flags);
-
-       lp->txing = 0;          /* Board in RX mode */
-       outb(AX_RX, AX_CMD);    /* Aux control, irq and receive enabled */
-       netif_start_queue(dev);
-       return 0;
-}
-
-/**
- * el_timeout:
- * @dev: The 3c501 card that has timed out
- *
- * Attempt to restart the board. This is basically a mixture of extreme
- * violence and prayer
- *
- */
-
-static void el_timeout(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       if (el_debug)
-               pr_debug("%s: transmit timed out, txsr %#2x axsr=%02x rxsr=%02x.\n",
-                       dev->name, inb(TX_STATUS),
-                       inb(AX_STATUS), inb(RX_STATUS));
-       dev->stats.tx_errors++;
-       outb(TX_NORM, TX_CMD);
-       outb(RX_NORM, RX_CMD);
-       outb(AX_OFF, AX_CMD);   /* Just trigger a false interrupt. */
-       outb(AX_RX, AX_CMD);    /* Aux control, irq and receive enabled */
-       lp->txing = 0;          /* Ripped back in to RX */
-       netif_wake_queue(dev);
-}
-
-
-/**
- * el_start_xmit:
- * @skb: The packet that is queued to be sent
- * @dev: The 3c501 card we want to throw it down
- *
- * Attempt to send a packet to a 3c501 card. There are some interesting
- * catches here because the 3c501 is an extremely old and therefore
- * stupid piece of technology.
- *
- * If we are handling an interrupt on the other CPU we cannot load a packet
- * as we may still be attempting to retrieve the last RX packet buffer.
- *
- * When a transmit times out we dump the card into control mode and just
- * start again. It happens enough that it isn't worth logging.
- *
- * We avoid holding the spin locks when doing the packet load to the board.
- * The device is very slow, and its DMA mode is even slower. If we held the
- * lock while loading 1500 bytes onto the controller we would drop a lot of
- * serial port characters. This requires we do extra locking, but we have
- * no real choice.
- */
-
-static netdev_tx_t el_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       unsigned long flags;
-
-       /*
-        *      Avoid incoming interrupts between us flipping txing and flipping
-        *      mode as the driver assumes txing is a faithful indicator of card
-        *      state
-        */
-
-       spin_lock_irqsave(&lp->lock, flags);
-
-       /*
-        *      Avoid timer-based retransmission conflicts.
-        */
-
-       netif_stop_queue(dev);
-
-       do {
-               int len = skb->len;
-               int pad = 0;
-               int gp_start;
-               unsigned char *buf = skb->data;
-
-               if (len < ETH_ZLEN)
-                       pad = ETH_ZLEN - len;
-
-               gp_start = 0x800 - (len + pad);
-
-               lp->tx_pkt_start = gp_start;
-               lp->collisions = 0;
-
-               dev->stats.tx_bytes += skb->len;
-
-               /*
-                *      Command mode with status cleared should [in theory]
-                *      mean no more interrupts can be pending on the card.
-                */
-
-               outb_p(AX_SYS, AX_CMD);
-               inb_p(RX_STATUS);
-               inb_p(TX_STATUS);
-
-               lp->loading = 1;
-               lp->txing = 1;
-
-               /*
-                *      Turn interrupts back on while we spend a pleasant
-                *      afternoon loading bytes into the board
-                */
-
-               spin_unlock_irqrestore(&lp->lock, flags);
-
-               /* Set rx packet area to 0. */
-               outw(0x00, RX_BUF_CLR);
-               /* aim - packet will be loaded into buffer start */
-               outw(gp_start, GP_LOW);
-               /* load buffer (usual thing each byte increments the pointer) */
-               outsb(DATAPORT, buf, len);
-               if (pad) {
-                       while (pad--)           /* Zero fill buffer tail */
-                               outb(0, DATAPORT);
-               }
-               /* the board reuses the same register */
-               outw(gp_start, GP_LOW);
-
-               if (lp->loading != 2) {
-                       /* fire ... Trigger xmit.  */
-                       outb(AX_XMIT, AX_CMD);
-                       lp->loading = 0;
-                       if (el_debug > 2)
-                               pr_debug(" queued xmit.\n");
-                       dev_kfree_skb(skb);
-                       return NETDEV_TX_OK;
-               }
-               /* A receive upset our load, despite our best efforts */
-               if (el_debug > 2)
-                       pr_debug("%s: burped during tx load.\n", dev->name);
-               spin_lock_irqsave(&lp->lock, flags);
-       } while (1);
-}
-
-/**
- * el_interrupt:
- * @irq: Interrupt number
- * @dev_id: The 3c501 that burped
- *
- * Handle the ether interface interrupts. The 3c501 needs a lot more
- * hand holding than most cards. In particular we get a transmit interrupt
- * with a collision error because the board firmware isn't capable of rewinding
- * its own transmit buffer pointers. It can however count to 16 for us.
- *
- * On the receive side the card is also very dumb. It has no buffering to
- * speak of. We simply pull the packet out of its PIO buffer (which is slow)
- * and queue it for the kernel. Then we reset the card for the next packet.
- *
- * We sometimes get surprise interrupts late both because the SMP IRQ delivery
- * is message passing and because the card sometimes seems to deliver late. I
- * think if it is part way through a receive and the mode is changed it carries
- * on receiving and sends us an interrupt. We have to band aid all these cases
- * to get a sensible 150kBytes/second performance. Even then you want a small
- * TCP window.
- */
-
-static irqreturn_t el_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct net_local *lp;
-       int ioaddr;
-       int axsr;                       /* Aux. status reg. */
-
-       ioaddr = dev->base_addr;
-       lp = netdev_priv(dev);
-
-       spin_lock(&lp->lock);
-
-       /*
-        *      What happened ?
-        */
-
-       axsr = inb(AX_STATUS);
-
-       /*
-        *      Log it
-        */
-
-       if (el_debug > 3)
-               pr_debug("%s: el_interrupt() aux=%#02x\n", dev->name, axsr);
-
-       if (lp->loading == 1 && !lp->txing)
-               pr_warning("%s: Inconsistent state loading while not in tx\n",
-                       dev->name);
-
-       if (lp->txing) {
-               /*
-                *      Board in transmit mode. May be loading. If we are
-                *      loading we shouldn't have got this.
-                */
-               int txsr = inb(TX_STATUS);
-
-               if (lp->loading == 1) {
-                       if (el_debug > 2)
-                               pr_debug("%s: Interrupt while loading [txsr=%02x gp=%04x rp=%04x]\n",
-                                       dev->name, txsr, inw(GP_LOW), inw(RX_LOW));
-
-                       /* Force a reload */
-                       lp->loading = 2;
-                       spin_unlock(&lp->lock);
-                       goto out;
-               }
-               if (el_debug > 6)
-                       pr_debug("%s: txsr=%02x gp=%04x rp=%04x\n", dev->name,
-                                       txsr, inw(GP_LOW), inw(RX_LOW));
-
-               if ((axsr & 0x80) && (txsr & TX_READY) == 0) {
-                       /*
-                        *      FIXME: is there a logic to whether to keep
-                        *      on trying or reset immediately ?
-                        */
-                       if (el_debug > 1)
-                               pr_debug("%s: Unusual interrupt during Tx, txsr=%02x axsr=%02x gp=%03x rp=%03x.\n",
-                                       dev->name, txsr, axsr,
-                                       inw(ioaddr + EL1_DATAPTR),
-                                       inw(ioaddr + EL1_RXPTR));
-                       lp->txing = 0;
-                       netif_wake_queue(dev);
-               } else if (txsr & TX_16COLLISIONS) {
-                       /*
-                        *      Timed out
-                        */
-                       if (el_debug)
-                               pr_debug("%s: Transmit failed 16 times, Ethernet jammed?\n", dev->name);
-                       outb(AX_SYS, AX_CMD);
-                       lp->txing = 0;
-                       dev->stats.tx_aborted_errors++;
-                       netif_wake_queue(dev);
-               } else if (txsr & TX_COLLISION) {
-                       /*
-                        *      Retrigger xmit.
-                        */
-
-                       if (el_debug > 6)
-                               pr_debug("%s: retransmitting after a collision.\n", dev->name);
-                       /*
-                        *      Poor little chip can't reset its own start
-                        *      pointer
-                        */
-
-                       outb(AX_SYS, AX_CMD);
-                       outw(lp->tx_pkt_start, GP_LOW);
-                       outb(AX_XMIT, AX_CMD);
-                       dev->stats.collisions++;
-                       spin_unlock(&lp->lock);
-                       goto out;
-               } else {
-                       /*
-                        *      It worked.. we will now fall through and receive
-                        */
-                       dev->stats.tx_packets++;
-                       if (el_debug > 6)
-                               pr_debug("%s: Tx succeeded %s\n", dev->name,
-                                       (txsr & TX_RDY) ? "." : "but tx is busy!");
-                       /*
-                        *      This is safe the interrupt is atomic WRT itself.
-                        */
-                       lp->txing = 0;
-                       /* In case more to transmit */
-                       netif_wake_queue(dev);
-               }
-       } else {
-               /*
-                *      In receive mode.
-                */
-
-               int rxsr = inb(RX_STATUS);
-               if (el_debug > 5)
-                       pr_debug("%s: rxsr=%02x txsr=%02x rp=%04x\n",
-                               dev->name, rxsr, inb(TX_STATUS), inw(RX_LOW));
-               /*
-                *      Just reading rx_status fixes most errors.
-                */
-               if (rxsr & RX_MISSED)
-                       dev->stats.rx_missed_errors++;
-               else if (rxsr & RX_RUNT) {
-                       /* Handled to avoid board lock-up. */
-                       dev->stats.rx_length_errors++;
-                       if (el_debug > 5)
-                               pr_debug("%s: runt.\n", dev->name);
-               } else if (rxsr & RX_GOOD) {
-                       /*
-                        *      Receive worked.
-                        */
-                       el_receive(dev);
-               } else {
-                       /*
-                        *      Nothing?  Something is broken!
-                        */
-                       if (el_debug > 2)
-                               pr_debug("%s: No packet seen, rxsr=%02x **resetting 3c501***\n",
-                                       dev->name, rxsr);
-                       el_reset(dev);
-               }
-       }
-
-       /*
-        *      Move into receive mode
-        */
-
-       outb(AX_RX, AX_CMD);
-       outw(0x00, RX_BUF_CLR);
-       inb(RX_STATUS);         /* Be certain that interrupts are cleared. */
-       inb(TX_STATUS);
-       spin_unlock(&lp->lock);
-out:
-       return IRQ_HANDLED;
-}
-
-
-/**
- * el_receive:
- * @dev: Device to pull the packets from
- *
- * We have a good packet. Well, not really "good", just mostly not broken.
- * We must check everything to see if it is good. In particular we occasionally
- * get wild packet sizes from the card. If the packet seems sane we PIO it
- * off the card and queue it for the protocol layers.
- */
-
-static void el_receive(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       int pkt_len;
-       struct sk_buff *skb;
-
-       pkt_len = inw(RX_LOW);
-
-       if (el_debug > 4)
-               pr_debug(" el_receive %d.\n", pkt_len);
-
-       if (pkt_len < 60 || pkt_len > 1536) {
-               if (el_debug)
-                       pr_debug("%s: bogus packet, length=%d\n",
-                                               dev->name, pkt_len);
-               dev->stats.rx_over_errors++;
-               return;
-       }
-
-       /*
-        *      Command mode so we can empty the buffer
-        */
-
-       outb(AX_SYS, AX_CMD);
-       skb = netdev_alloc_skb(dev, pkt_len + 2);
-
-       /*
-        *      Start of frame
-        */
-
-       outw(0x00, GP_LOW);
-       if (skb == NULL) {
-               pr_info("%s: Memory squeeze, dropping packet.\n", dev->name);
-               dev->stats.rx_dropped++;
-               return;
-       } else {
-               skb_reserve(skb, 2);    /* Force 16 byte alignment */
-               /*
-                *      The read increments through the bytes. The interrupt
-                *      handler will fix the pointer when it returns to
-                *      receive mode.
-                */
-               insb(DATAPORT, skb_put(skb, pkt_len), pkt_len);
-               skb->protocol = eth_type_trans(skb, dev);
-               netif_rx(skb);
-               dev->stats.rx_packets++;
-               dev->stats.rx_bytes += pkt_len;
-       }
-}
-
-/**
- * el_reset: Reset a 3c501 card
- * @dev: The 3c501 card about to get zapped
- *
- * Even resetting a 3c501 isn't simple. When you activate reset it loses all
- * its configuration. You must hold the lock when doing this. The function
- * cannot take the lock itself as it is callable from the irq handler.
- */
-
-static void  el_reset(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       if (el_debug > 2)
-               pr_info("3c501 reset...\n");
-       outb(AX_RESET, AX_CMD);         /* Reset the chip */
-       /* Aux control, irq and loopback enabled */
-       outb(AX_LOOP, AX_CMD);
-       {
-               int i;
-               for (i = 0; i < 6; i++) /* Set the station address. */
-                       outb(dev->dev_addr[i], ioaddr + i);
-       }
-
-       outw(0, RX_BUF_CLR);            /* Set rx packet area to 0. */
-       outb(TX_NORM, TX_CMD);          /* tx irq on done, collision */
-       outb(RX_NORM, RX_CMD);          /* Set Rx commands. */
-       inb(RX_STATUS);                 /* Clear status. */
-       inb(TX_STATUS);
-       lp->txing = 0;
-}
-
-/**
- * el1_close:
- * @dev: 3c501 card to shut down
- *
- * Close a 3c501 card. The IFF_UP flag has been cleared by the user via
- * the SIOCSIFFLAGS ioctl. We stop any further transmissions being queued,
- * and then disable the interrupts. Finally we reset the chip. The effects
- * of the rest will be cleaned up by #el1_open. Always returns 0 indicating
- * a success.
- */
-
-static int el1_close(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       if (el_debug > 2)
-               pr_info("%s: Shutting down Ethernet card at %#x.\n",
-                                               dev->name, ioaddr);
-
-       netif_stop_queue(dev);
-
-       /*
-        *      Free and disable the IRQ.
-        */
-
-       free_irq(dev->irq, dev);
-       outb(AX_RESET, AX_CMD);         /* Reset the chip */
-
-       return 0;
-}
-
-/**
- * set_multicast_list:
- * @dev: The device to adjust
- *
- * Set or clear the multicast filter for this adaptor to use the best-effort
- * filtering supported. The 3c501 supports only three modes of filtering.
- * It always receives broadcasts and packets for itself. You can choose to
- * optionally receive all packets, or all multicast packets on top of this.
- */
-
-static void set_multicast_list(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       if (dev->flags & IFF_PROMISC) {
-               outb(RX_PROM, RX_CMD);
-               inb(RX_STATUS);
-       } else if (!netdev_mc_empty(dev) || dev->flags & IFF_ALLMULTI) {
-               /* Multicast or all multicast is the same */
-               outb(RX_MULT, RX_CMD);
-               inb(RX_STATUS);         /* Clear status. */
-       } else {
-               outb(RX_NORM, RX_CMD);
-               inb(RX_STATUS);
-       }
-}
-
-
-static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
-{
-       strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
-       strlcpy(info->version, DRV_VERSION, sizeof(info->version));
-       snprintf(info->bus_info, sizeof(info->bus_info), "ISA 0x%lx",
-                dev->base_addr);
-}
-
-static u32 netdev_get_msglevel(struct net_device *dev)
-{
-       return debug;
-}
-
-static void netdev_set_msglevel(struct net_device *dev, u32 level)
-{
-       debug = level;
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
-       .get_msglevel           = netdev_get_msglevel,
-       .set_msglevel           = netdev_set_msglevel,
-};
-
-#ifdef MODULE
-
-static struct net_device *dev_3c501;
-
-module_param(io, int, 0);
-module_param(irq, int, 0);
-MODULE_PARM_DESC(io, "EtherLink I/O base address");
-MODULE_PARM_DESC(irq, "EtherLink IRQ number");
-
-/**
- * init_module:
- *
- * When the driver is loaded as a module this function is called. We fake up
- * a device structure with the base I/O and interrupt set as if it were being
- * called from Space.c. This minimises the extra code that would otherwise
- * be required.
- *
- * Returns 0 for success or -EIO if a card is not found. Returning an error
- * here also causes the module to be unloaded
- */
-
-int __init init_module(void)
-{
-       dev_3c501 = el1_probe(-1);
-       if (IS_ERR(dev_3c501))
-               return PTR_ERR(dev_3c501);
-       return 0;
-}
-
-/**
- * cleanup_module:
- *
- * The module is being unloaded. We unhook our network device from the system
- * and then free up the resources we took when the card was found.
- */
-
-void __exit cleanup_module(void)
-{
-       struct net_device *dev = dev_3c501;
-       unregister_netdev(dev);
-       release_region(dev->base_addr, EL1_IO_EXTENT);
-       free_netdev(dev);
-}
-
-#endif /* MODULE */
-
-MODULE_AUTHOR("Donald Becker, Alan Cox");
-MODULE_DESCRIPTION("Support for the ancient 3Com 3c501 ethernet card");
-MODULE_LICENSE("GPL");
-
diff --git a/drivers/net/ethernet/3com/3c501.h b/drivers/net/ethernet/3com/3c501.h
deleted file mode 100644 (file)
index 183fd55..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-
-/*
- *     Index to functions.
- */
-
-static int  el1_probe1(struct net_device *dev, int ioaddr);
-static int  el_open(struct net_device *dev);
-static void el_timeout(struct net_device *dev);
-static netdev_tx_t el_start_xmit(struct sk_buff *skb, struct net_device *dev);
-static irqreturn_t el_interrupt(int irq, void *dev_id);
-static void el_receive(struct net_device *dev);
-static void el_reset(struct net_device *dev);
-static int  el1_close(struct net_device *dev);
-static void set_multicast_list(struct net_device *dev);
-static const struct ethtool_ops netdev_ethtool_ops;
-
-#define EL1_IO_EXTENT  16
-
-#ifndef EL_DEBUG
-#define EL_DEBUG  0    /* use 0 for production, 1 for devel., >2 for debug */
-#endif                 /* Anything above 5 is wordy death! */
-#define debug el_debug
-static int el_debug = EL_DEBUG;
-
-/*
- *     Board-specific info in netdev_priv(dev).
- */
-
-struct net_local
-{
-       int             tx_pkt_start;   /* The length of the current Tx packet. */
-       int             collisions;     /* Tx collisions this packet */
-       int             loading;        /* Spot buffer load collisions */
-       int             txing;          /* True if card is in TX mode */
-       spinlock_t      lock;           /* Serializing lock */
-};
-
-
-#define RX_STATUS (ioaddr + 0x06)
-#define RX_CMD   RX_STATUS
-#define TX_STATUS (ioaddr + 0x07)
-#define TX_CMD   TX_STATUS
-#define GP_LOW           (ioaddr + 0x08)
-#define GP_HIGH   (ioaddr + 0x09)
-#define RX_BUF_CLR (ioaddr + 0x0A)
-#define RX_LOW   (ioaddr + 0x0A)
-#define RX_HIGH   (ioaddr + 0x0B)
-#define SAPROM   (ioaddr + 0x0C)
-#define AX_STATUS (ioaddr + 0x0E)
-#define AX_CMD   AX_STATUS
-#define DATAPORT  (ioaddr + 0x0F)
-#define TX_RDY 0x08            /* In TX_STATUS */
-
-#define EL1_DATAPTR    0x08
-#define EL1_RXPTR      0x0A
-#define EL1_SAPROM     0x0C
-#define EL1_DATAPORT   0x0f
-
-/*
- *     Writes to the ax command register.
- */
-
-#define AX_OFF 0x00                    /* Irq off, buffer access on */
-#define AX_SYS  0x40                   /* Load the buffer */
-#define AX_XMIT 0x44                   /* Transmit a packet */
-#define AX_RX  0x48                    /* Receive a packet */
-#define AX_LOOP        0x0C                    /* Loopback mode */
-#define AX_RESET 0x80
-
-/*
- *     Normal receive mode written to RX_STATUS.  We must intr on short packets
- *     to avoid bogus rx lockups.
- */
-
-#define RX_NORM 0xA8           /* 0x68 == all addrs, 0xA8 only to me. */
-#define RX_PROM 0x68           /* Senior Prom, uhmm promiscuous mode. */
-#define RX_MULT 0xE8           /* Accept multicast packets. */
-#define TX_NORM 0x0A           /* Interrupt on everything that might hang the chip */
-
-/*
- *     TX_STATUS register.
- */
-
-#define TX_COLLISION 0x02
-#define TX_16COLLISIONS 0x04
-#define TX_READY 0x08
-
-#define RX_RUNT 0x08
-#define RX_MISSED 0x01         /* Missed a packet due to 3c501 braindamage. */
-#define RX_GOOD        0x30            /* Good packet 0x20, or simple overflow 0x10. */
-
index ed0feb3cc6fac83436a862b11e49d1fdbc07648c..1928e2001587405294acee6473139f7f86285f67 100644 (file)
@@ -1293,7 +1293,6 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
                pr_cont(" ***INVALID CHECKSUM %4.4x*** ", checksum);
        for (i = 0; i < 3; i++)
                ((__be16 *)dev->dev_addr)[i] = htons(eeprom[i + 10]);
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
        if (print_info)
                pr_cont(" %pM", dev->dev_addr);
        /* Unfortunately an all zero eeprom passes the checksum and this
index 8c417ed339b4ee29c0aba16c58f08885e26b5ea8..1c71c763f68009906a1d0bb1cd3eaf636a43ba1f 100644 (file)
@@ -18,20 +18,6 @@ config NET_VENDOR_3COM
 
 if NET_VENDOR_3COM
 
-config EL1
-       tristate "3c501 \"EtherLink\" support"
-       depends on ISA
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.  Also, consider buying a
-         new card, since the 3c501 is slow, broken, and obsolete: you will
-         have problems.  Some people suggest to ping ("man ping") a nearby
-         machine every minute ("man cron") when using this card.
-
-         To compile this driver as a module, choose M here. The module
-         will be called 3c501.
-
 config EL3
        tristate "3c509/3c579 \"EtherLink III\" support"
        depends on (ISA || EISA)
index 1e5382a30eadfe7eb9194a64bf2401177d0ea62a..74046afab99319b3784a8c1afd3dbe6397ae1724 100644 (file)
@@ -2,7 +2,6 @@
 # Makefile for the 3Com Ethernet device drivers
 #
 
-obj-$(CONFIG_EL1) += 3c501.o
 obj-$(CONFIG_EL3) += 3c509.o
 obj-$(CONFIG_3C515) += 3c515.o
 obj-$(CONFIG_PCMCIA_3C589) += 3c589_cs.o
diff --git a/drivers/net/ethernet/8390/3c503.c b/drivers/net/ethernet/8390/3c503.c
deleted file mode 100644 (file)
index 0e9afe7..0000000
+++ /dev/null
@@ -1,778 +0,0 @@
-/* 3c503.c: A shared-memory NS8390 ethernet driver for linux. */
-/*
-    Written 1992-94 by Donald Becker.
-
-    Copyright 1993 United States Government as represented by the
-    Director, National Security Agency.  This software may be used and
-    distributed according to the terms of the GNU General Public License,
-    incorporated herein by reference.
-
-    The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-
-    This driver should work with the 3c503 and 3c503/16.  It should be used
-    in shared memory mode for best performance, although it may also work
-    in programmed-I/O mode.
-
-    Sources:
-    EtherLink II Technical Reference Manual,
-    EtherLink II/16 Technical Reference Manual Supplement,
-    3Com Corporation, 5400 Bayfront Plaza, Santa Clara CA 95052-8145
-
-    The Crynwr 3c503 packet driver.
-
-    Changelog:
-
-    Paul Gortmaker     : add support for the 2nd 8kB of RAM on 16 bit cards.
-    Paul Gortmaker     : multiple card support for module users.
-    rjohnson@analogic.com : Fix up PIO interface for efficient operation.
-    Jeff Garzik                : ethtool support
-
-*/
-
-#define DRV_NAME       "3c503"
-#define DRV_VERSION    "1.10a"
-#define DRV_RELDATE    "11/17/2001"
-
-
-static const char version[] =
-    DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE "  Donald Becker (becker@scyld.com)\n";
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/delay.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/ethtool.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/byteorder.h>
-
-#include "8390.h"
-#include "3c503.h"
-#define WRD_COUNT 4
-
-static int el2_pio_probe(struct net_device *dev);
-static int el2_probe1(struct net_device *dev, int ioaddr);
-
-/* A zero-terminated list of I/O addresses to be probed in PIO mode. */
-static unsigned int netcard_portlist[] __initdata =
-       { 0x300,0x310,0x330,0x350,0x250,0x280,0x2a0,0x2e0,0};
-
-#define EL2_IO_EXTENT  16
-
-static int el2_open(struct net_device *dev);
-static int el2_close(struct net_device *dev);
-static void el2_reset_8390(struct net_device *dev);
-static void el2_init_card(struct net_device *dev);
-static void el2_block_output(struct net_device *dev, int count,
-                            const unsigned char *buf, int start_page);
-static void el2_block_input(struct net_device *dev, int count, struct sk_buff *skb,
-                          int ring_offset);
-static void el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                        int ring_page);
-static const struct ethtool_ops netdev_ethtool_ops;
-
-
-/* This routine probes for a memory-mapped 3c503 board by looking for
-   the "location register" at the end of the jumpered boot PROM space.
-   This works even if a PROM isn't there.
-
-   If the ethercard isn't found there is an optional probe for
-   ethercard jumpered to programmed-I/O mode.
-   */
-static int __init do_el2_probe(struct net_device *dev)
-{
-    int *addr, addrs[] = { 0xddffe, 0xd9ffe, 0xcdffe, 0xc9ffe, 0};
-    int base_addr = dev->base_addr;
-    int irq = dev->irq;
-
-    if (base_addr > 0x1ff)     /* Check a single specified location. */
-       return el2_probe1(dev, base_addr);
-    else if (base_addr != 0)           /* Don't probe at all. */
-       return -ENXIO;
-
-    for (addr = addrs; *addr; addr++) {
-       void __iomem *p = ioremap(*addr, 1);
-       unsigned base_bits;
-       int i;
-
-       if (!p)
-               continue;
-       base_bits = readb(p);
-       iounmap(p);
-       i = ffs(base_bits) - 1;
-       if (i == -1 || base_bits != (1 << i))
-           continue;
-       if (el2_probe1(dev, netcard_portlist[i]) == 0)
-           return 0;
-       dev->irq = irq;
-    }
-#if ! defined(no_probe_nonshared_memory)
-    return el2_pio_probe(dev);
-#else
-    return -ENODEV;
-#endif
-}
-
-/*  Try all of the locations that aren't obviously empty.  This touches
-    a lot of locations, and is much riskier than the code above. */
-static int __init
-el2_pio_probe(struct net_device *dev)
-{
-    int i;
-    int base_addr = dev->base_addr;
-    int irq = dev->irq;
-
-    if (base_addr > 0x1ff)     /* Check a single specified location. */
-       return el2_probe1(dev, base_addr);
-    else if (base_addr != 0)   /* Don't probe at all. */
-       return -ENXIO;
-
-    for (i = 0; netcard_portlist[i]; i++) {
-       if (el2_probe1(dev, netcard_portlist[i]) == 0)
-           return 0;
-       dev->irq = irq;
-    }
-
-    return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init el2_probe(int unit)
-{
-       struct net_device *dev = alloc_eip_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_el2_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static const struct net_device_ops el2_netdev_ops = {
-       .ndo_open               = el2_open,
-       .ndo_stop               = el2_close,
-
-       .ndo_start_xmit         = eip_start_xmit,
-       .ndo_tx_timeout         = eip_tx_timeout,
-       .ndo_get_stats          = eip_get_stats,
-       .ndo_set_rx_mode        = eip_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = eip_poll,
-#endif
-};
-
-/* Probe for the Etherlink II card at I/O port base IOADDR,
-   returning non-zero on success.  If found, set the station
-   address and memory parameters in DEVICE. */
-static int __init
-el2_probe1(struct net_device *dev, int ioaddr)
-{
-    int i, iobase_reg, membase_reg, saved_406, wordlength, retval;
-    static unsigned version_printed;
-    unsigned long vendor_id;
-
-    if (!request_region(ioaddr, EL2_IO_EXTENT, DRV_NAME))
-       return -EBUSY;
-
-    if (!request_region(ioaddr + 0x400, 8, DRV_NAME)) {
-       retval = -EBUSY;
-       goto out;
-    }
-
-    /* Reset and/or avoid any lurking NE2000 */
-    if (inb(ioaddr + 0x408) == 0xff) {
-       mdelay(1);
-       retval = -ENODEV;
-       goto out1;
-    }
-
-    /* We verify that it's a 3C503 board by checking the first three octets
-       of its ethernet address. */
-    iobase_reg = inb(ioaddr+0x403);
-    membase_reg = inb(ioaddr+0x404);
-    /* ASIC location registers should be 0 or have only a single bit set. */
-    if ((iobase_reg  & (iobase_reg - 1)) ||
-       (membase_reg & (membase_reg - 1))) {
-       retval = -ENODEV;
-       goto out1;
-    }
-    saved_406 = inb_p(ioaddr + 0x406);
-    outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406); /* Reset it... */
-    outb_p(ECNTRL_THIN, ioaddr + 0x406);
-    /* Map the station addr PROM into the lower I/O ports. We now check
-       for both the old and new 3Com prefix */
-    outb(ECNTRL_SAPROM|ECNTRL_THIN, ioaddr + 0x406);
-    vendor_id = inb(ioaddr)*0x10000 + inb(ioaddr + 1)*0x100 + inb(ioaddr + 2);
-    if ((vendor_id != OLD_3COM_ID) && (vendor_id != NEW_3COM_ID)) {
-       /* Restore the register we frobbed. */
-       outb(saved_406, ioaddr + 0x406);
-       retval = -ENODEV;
-       goto out1;
-    }
-
-    if (ei_debug  &&  version_printed++ == 0)
-       pr_debug("%s", version);
-
-    dev->base_addr = ioaddr;
-
-    pr_info("%s: 3c503 at i/o base %#3x, node ", dev->name, ioaddr);
-
-    /* Retrieve and print the ethernet address. */
-    for (i = 0; i < 6; i++)
-       dev->dev_addr[i] = inb(ioaddr + i);
-    pr_cont("%pM", dev->dev_addr);
-
-    /* Map the 8390 back into the window. */
-    outb(ECNTRL_THIN, ioaddr + 0x406);
-
-    /* Check for EL2/16 as described in tech. man. */
-    outb_p(E8390_PAGE0, ioaddr + E8390_CMD);
-    outb_p(0, ioaddr + EN0_DCFG);
-    outb_p(E8390_PAGE2, ioaddr + E8390_CMD);
-    wordlength = inb_p(ioaddr + EN0_DCFG) & ENDCFG_WTS;
-    outb_p(E8390_PAGE0, ioaddr + E8390_CMD);
-
-    /* Probe for, turn on and clear the board's shared memory. */
-    if (ei_debug > 2)
-       pr_cont(" memory jumpers %2.2x ", membase_reg);
-    outb(EGACFR_NORM, ioaddr + 0x405); /* Enable RAM */
-
-    /* This should be probed for (or set via an ioctl()) at run-time.
-       Right now we use a sleazy hack to pass in the interface number
-       at boot-time via the low bits of the mem_end field.  That value is
-       unused, and the low bits would be discarded even if it was used. */
-#if defined(EI8390_THICK) || defined(EL2_AUI)
-    ei_status.interface_num = 1;
-#else
-    ei_status.interface_num = dev->mem_end & 0xf;
-#endif
-    pr_cont(", using %sternal xcvr.\n", ei_status.interface_num == 0 ? "in" : "ex");
-
-    if ((membase_reg & 0xf0) == 0) {
-       dev->mem_start = 0;
-       ei_status.name = "3c503-PIO";
-       ei_status.mem = NULL;
-    } else {
-       dev->mem_start = ((membase_reg & 0xc0) ? 0xD8000 : 0xC8000) +
-           ((membase_reg & 0xA0) ? 0x4000 : 0);
-#define EL2_MEMSIZE (EL2_MB1_STOP_PG - EL2_MB1_START_PG)*256
-       ei_status.mem = ioremap(dev->mem_start, EL2_MEMSIZE);
-
-#ifdef EL2MEMTEST
-       /* This has never found an error, but someone might care.
-          Note that it only tests the 2nd 8kB on 16kB 3c503/16
-          cards between card addr. 0x2000 and 0x3fff. */
-       {                       /* Check the card's memory. */
-           void __iomem *mem_base = ei_status.mem;
-           unsigned int test_val = 0xbbadf00d;
-           writel(0xba5eba5e, mem_base);
-           for (i = sizeof(test_val); i < EL2_MEMSIZE; i+=sizeof(test_val)) {
-               writel(test_val, mem_base + i);
-               if (readl(mem_base) != 0xba5eba5e ||
-                   readl(mem_base + i) != test_val) {
-                   pr_warning("3c503: memory failure or memory address conflict.\n");
-                   dev->mem_start = 0;
-                   ei_status.name = "3c503-PIO";
-                   iounmap(mem_base);
-                   ei_status.mem = NULL;
-                   break;
-               }
-               test_val += 0x55555555;
-               writel(0, mem_base + i);
-           }
-       }
-#endif  /* EL2MEMTEST */
-
-       if (dev->mem_start)
-               dev->mem_end = dev->mem_start + EL2_MEMSIZE;
-
-       if (wordlength) {       /* No Tx pages to skip over to get to Rx */
-               ei_status.priv = 0;
-               ei_status.name = "3c503/16";
-       } else {
-               ei_status.priv = TX_PAGES * 256;
-               ei_status.name = "3c503";
-       }
-    }
-
-    /*
-       Divide up the memory on the card. This is the same regardless of
-       whether shared-mem or PIO is used. For 16 bit cards (16kB RAM),
-       we use the entire 8k of bank1 for an Rx ring. We only use 3k
-       of the bank0 for 2 full size Tx packet slots. For 8 bit cards,
-       (8kB RAM) we use 3kB of bank1 for two Tx slots, and the remaining
-       5kB for an Rx ring.  */
-
-    if (wordlength) {
-       ei_status.tx_start_page = EL2_MB0_START_PG;
-       ei_status.rx_start_page = EL2_MB1_START_PG;
-    } else {
-       ei_status.tx_start_page = EL2_MB1_START_PG;
-       ei_status.rx_start_page = EL2_MB1_START_PG + TX_PAGES;
-    }
-
-    /* Finish setting the board's parameters. */
-    ei_status.stop_page = EL2_MB1_STOP_PG;
-    ei_status.word16 = wordlength;
-    ei_status.reset_8390 = el2_reset_8390;
-    ei_status.get_8390_hdr = el2_get_8390_hdr;
-    ei_status.block_input = el2_block_input;
-    ei_status.block_output = el2_block_output;
-
-    if (dev->irq == 2)
-       dev->irq = 9;
-    else if (dev->irq > 5 && dev->irq != 9) {
-       pr_warning("3c503: configured interrupt %d invalid, will use autoIRQ.\n",
-              dev->irq);
-       dev->irq = 0;
-    }
-
-    ei_status.saved_irq = dev->irq;
-
-    dev->netdev_ops = &el2_netdev_ops;
-    dev->ethtool_ops = &netdev_ethtool_ops;
-
-    retval = register_netdev(dev);
-    if (retval)
-       goto out1;
-
-    if (dev->mem_start)
-       pr_info("%s: %s - %dkB RAM, 8kB shared mem window at %#6lx-%#6lx.\n",
-               dev->name, ei_status.name, (wordlength+1)<<3,
-               dev->mem_start, dev->mem_end-1);
-
-    else
-    {
-       ei_status.tx_start_page = EL2_MB1_START_PG;
-       ei_status.rx_start_page = EL2_MB1_START_PG + TX_PAGES;
-       pr_info("%s: %s, %dkB RAM, using programmed I/O (REJUMPER for SHARED MEMORY).\n",
-              dev->name, ei_status.name, (wordlength+1)<<3);
-    }
-    release_region(ioaddr + 0x400, 8);
-    return 0;
-out1:
-    release_region(ioaddr + 0x400, 8);
-out:
-    release_region(ioaddr, EL2_IO_EXTENT);
-    return retval;
-}
-
-static irqreturn_t el2_probe_interrupt(int irq, void *seen)
-{
-       *(bool *)seen = true;
-       return IRQ_HANDLED;
-}
-
-static int
-el2_open(struct net_device *dev)
-{
-    int retval;
-
-    if (dev->irq < 2) {
-       static const int irqlist[] = {5, 9, 3, 4, 0};
-       const int *irqp = irqlist;
-
-       outb(EGACFR_NORM, E33G_GACFR);  /* Enable RAM and interrupts. */
-       do {
-               bool seen;
-
-               retval = request_irq(*irqp, el2_probe_interrupt, 0,
-                                    dev->name, &seen);
-               if (retval == -EBUSY)
-                       continue;
-               if (retval < 0)
-                       goto err_disable;
-
-               /* Twinkle the interrupt, and check if it's seen. */
-               seen = false;
-               smp_wmb();
-               outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR);
-               outb_p(0x00, E33G_IDCFR);
-               msleep(1);
-               free_irq(*irqp, &seen);
-               if (!seen)
-                       continue;
-
-               retval = request_irq(dev->irq = *irqp, eip_interrupt, 0,
-                                    dev->name, dev);
-               if (retval == -EBUSY)
-                       continue;
-               if (retval < 0)
-                       goto err_disable;
-               break;
-       } while (*++irqp);
-
-       if (*irqp == 0) {
-       err_disable:
-           outb(EGACFR_IRQOFF, E33G_GACFR);    /* disable interrupts. */
-           return -EAGAIN;
-       }
-    } else {
-       if ((retval = request_irq(dev->irq, eip_interrupt, 0, dev->name, dev))) {
-           return retval;
-       }
-    }
-
-    el2_init_card(dev);
-    eip_open(dev);
-    return 0;
-}
-
-static int
-el2_close(struct net_device *dev)
-{
-    free_irq(dev->irq, dev);
-    dev->irq = ei_status.saved_irq;
-    outb(EGACFR_IRQOFF, E33G_GACFR);   /* disable interrupts. */
-
-    eip_close(dev);
-    return 0;
-}
-
-/* This is called whenever we have a unrecoverable failure:
-       transmit timeout
-       Bad ring buffer packet header
- */
-static void
-el2_reset_8390(struct net_device *dev)
-{
-    if (ei_debug > 1) {
-       pr_debug("%s: Resetting the 3c503 board...", dev->name);
-       pr_cont(" %#lx=%#02x %#lx=%#02x %#lx=%#02x...", E33G_IDCFR, inb(E33G_IDCFR),
-              E33G_CNTRL, inb(E33G_CNTRL), E33G_GACFR, inb(E33G_GACFR));
-    }
-    outb_p(ECNTRL_RESET|ECNTRL_THIN, E33G_CNTRL);
-    ei_status.txing = 0;
-    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-    el2_init_card(dev);
-    if (ei_debug > 1)
-       pr_cont("done\n");
-}
-
-/* Initialize the 3c503 GA registers after a reset. */
-static void
-el2_init_card(struct net_device *dev)
-{
-    /* Unmap the station PROM and select the DIX or BNC connector. */
-    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-
-    /* Set ASIC copy of rx's first and last+1 buffer pages */
-    /* These must be the same as in the 8390. */
-    outb(ei_status.rx_start_page, E33G_STARTPG);
-    outb(ei_status.stop_page,  E33G_STOPPG);
-
-    /* Point the vector pointer registers somewhere ?harmless?. */
-    outb(0xff, E33G_VP2);      /* Point at the ROM restart location 0xffff0 */
-    outb(0xff, E33G_VP1);
-    outb(0x00, E33G_VP0);
-    /* Turn off all interrupts until we're opened. */
-    outb_p(0x00,  dev->base_addr + EN0_IMR);
-    /* Enable IRQs iff started. */
-    outb(EGACFR_NORM, E33G_GACFR);
-
-    /* Set the interrupt line. */
-    outb_p((0x04 << (dev->irq == 9 ? 2 : dev->irq)), E33G_IDCFR);
-    outb_p((WRD_COUNT << 1), E33G_DRQCNT);     /* Set burst size to 8 */
-    outb_p(0x20, E33G_DMAAH);  /* Put a valid addr in the GA DMA */
-    outb_p(0x00, E33G_DMAAL);
-    return;                    /* We always succeed */
-}
-
-/*
- * Either use the shared memory (if enabled on the board) or put the packet
- * out through the ASIC FIFO.
- */
-static void
-el2_block_output(struct net_device *dev, int count,
-                const unsigned char *buf, int start_page)
-{
-    unsigned short int *wrd;
-    int boguscount;            /* timeout counter */
-    unsigned short word;       /* temporary for better machine code */
-    void __iomem *base = ei_status.mem;
-
-    if (ei_status.word16)      /* Tx packets go into bank 0 on EL2/16 card */
-       outb(EGACFR_RSEL|EGACFR_TCM, E33G_GACFR);
-    else
-       outb(EGACFR_NORM, E33G_GACFR);
-
-    if (base) {        /* Shared memory transfer */
-       memcpy_toio(base + ((start_page - ei_status.tx_start_page) << 8),
-                       buf, count);
-       outb(EGACFR_NORM, E33G_GACFR);  /* Back to bank1 in case on bank0 */
-       return;
-    }
-
-/*
- *  No shared memory, put the packet out the other way.
- *  Set up then start the internal memory transfer to Tx Start Page
- */
-
-    word = (unsigned short)start_page;
-    outb(word&0xFF, E33G_DMAAH);
-    outb(word>>8, E33G_DMAAL);
-
-    outb_p((ei_status.interface_num ? ECNTRL_AUI : ECNTRL_THIN ) | ECNTRL_OUTPUT
-          | ECNTRL_START, E33G_CNTRL);
-
-/*
- *  Here I am going to write data to the FIFO as quickly as possible.
- *  Note that E33G_FIFOH is defined incorrectly. It is really
- *  E33G_FIFOL, the lowest port address for both the byte and
- *  word write. Variable 'count' is NOT checked. Caller must supply a
- *  valid count. Note that I may write a harmless extra byte to the
- *  8390 if the byte-count was not even.
- */
-    wrd = (unsigned short int *) buf;
-    count  = (count + 1) >> 1;
-    for(;;)
-    {
-        boguscount = 0x1000;
-        while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
-        {
-            if(!boguscount--)
-            {
-                pr_notice("%s: FIFO blocked in el2_block_output.\n", dev->name);
-                el2_reset_8390(dev);
-                goto blocked;
-            }
-        }
-        if(count > WRD_COUNT)
-        {
-            outsw(E33G_FIFOH, wrd, WRD_COUNT);
-            wrd   += WRD_COUNT;
-            count -= WRD_COUNT;
-        }
-        else
-        {
-            outsw(E33G_FIFOH, wrd, count);
-            break;
-        }
-    }
-    blocked:;
-    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-}
-
-/* Read the 4 byte, page aligned 8390 specific header. */
-static void
-el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-    int boguscount;
-    void __iomem *base = ei_status.mem;
-    unsigned short word;
-
-    if (base) {       /* Use the shared memory. */
-       void __iomem *hdr_start = base + ((ring_page - EL2_MB1_START_PG)<<8);
-       memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
-       hdr->count = le16_to_cpu(hdr->count);
-       return;
-    }
-
-/*
- *  No shared memory, use programmed I/O.
- */
-
-    word = (unsigned short)ring_page;
-    outb(word&0xFF, E33G_DMAAH);
-    outb(word>>8, E33G_DMAAL);
-
-    outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT
-          | ECNTRL_START, E33G_CNTRL);
-    boguscount = 0x1000;
-    while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
-    {
-        if(!boguscount--)
-        {
-            pr_notice("%s: FIFO blocked in el2_get_8390_hdr.\n", dev->name);
-            memset(hdr, 0x00, sizeof(struct e8390_pkt_hdr));
-            el2_reset_8390(dev);
-            goto blocked;
-        }
-    }
-    insw(E33G_FIFOH, hdr, (sizeof(struct e8390_pkt_hdr))>> 1);
-    blocked:;
-    outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-}
-
-
-static void
-el2_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-    int boguscount = 0;
-    void __iomem *base = ei_status.mem;
-    unsigned short int *buf;
-    unsigned short word;
-
-    /* Maybe enable shared memory just be to be safe... nahh.*/
-    if (base) {        /* Use the shared memory. */
-       ring_offset -= (EL2_MB1_START_PG<<8);
-       if (ring_offset + count > EL2_MEMSIZE) {
-           /* We must wrap the input move. */
-           int semi_count = EL2_MEMSIZE - ring_offset;
-           memcpy_fromio(skb->data, base + ring_offset, semi_count);
-           count -= semi_count;
-           memcpy_fromio(skb->data + semi_count, base + ei_status.priv, count);
-       } else {
-               memcpy_fromio(skb->data, base + ring_offset, count);
-       }
-       return;
-    }
-
-/*
- *  No shared memory, use programmed I/O.
- */
-    word = (unsigned short) ring_offset;
-    outb(word>>8, E33G_DMAAH);
-    outb(word&0xFF, E33G_DMAAL);
-
-    outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT
-          | ECNTRL_START, E33G_CNTRL);
-
-/*
- *  Here I also try to get data as fast as possible. I am betting that I
- *  can read one extra byte without clobbering anything in the kernel because
- *  this would only occur on an odd byte-count and allocation of skb->data
- *  is word-aligned. Variable 'count' is NOT checked. Caller must check
- *  for a valid count.
- *  [This is currently quite safe.... but if one day the 3c503 explodes
- *   you know where to come looking ;)]
- */
-
-    buf =  (unsigned short int *) skb->data;
-    count =  (count + 1) >> 1;
-    for(;;)
-    {
-        boguscount = 0x1000;
-        while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
-        {
-            if(!boguscount--)
-            {
-                pr_notice("%s: FIFO blocked in el2_block_input.\n", dev->name);
-                el2_reset_8390(dev);
-                goto blocked;
-            }
-        }
-        if(count > WRD_COUNT)
-        {
-            insw(E33G_FIFOH, buf, WRD_COUNT);
-            buf   += WRD_COUNT;
-            count -= WRD_COUNT;
-        }
-        else
-        {
-            insw(E33G_FIFOH, buf, count);
-            break;
-        }
-    }
-    blocked:;
-    outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-}
-
-
-static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
-{
-       strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
-       strlcpy(info->version, DRV_VERSION, sizeof(info->version));
-       snprintf(info->bus_info, sizeof(info->bus_info), "ISA 0x%lx",
-                dev->base_addr);
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
-};
-
-#ifdef MODULE
-#define MAX_EL2_CARDS  4       /* Max number of EL2 cards per module */
-
-static struct net_device *dev_el2[MAX_EL2_CARDS];
-static int io[MAX_EL2_CARDS];
-static int irq[MAX_EL2_CARDS];
-static int xcvr[MAX_EL2_CARDS];        /* choose int. or ext. xcvr */
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(xcvr, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
-MODULE_PARM_DESC(xcvr, "transceiver(s) (0=internal, 1=external)");
-MODULE_DESCRIPTION("3Com ISA EtherLink II, II/16 (3c503, 3c503/16) driver");
-MODULE_LICENSE("GPL");
-
-/* This is set up so that only a single autoprobe takes place per call.
-ISA device autoprobes on a running machine are not recommended. */
-int __init
-init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) {
-               if (io[this_dev] == 0)  {
-                       if (this_dev != 0) break; /* only autoprobe 1st one */
-                       pr_notice("3c503.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-               dev = alloc_eip_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               dev->mem_end = xcvr[this_dev];  /* low 4bits = xcvr sel. */
-               if (do_el2_probe(dev) == 0) {
-                       dev_el2[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               pr_warning("3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       /* NB: el2_close() handles free_irq */
-       release_region(dev->base_addr, EL2_IO_EXTENT);
-       if (ei_status.mem)
-               iounmap(ei_status.mem);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) {
-               struct net_device *dev = dev_el2[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/8390/3c503.h b/drivers/net/ethernet/8390/3c503.h
deleted file mode 100644 (file)
index e2367b8..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Definitions for the 3Com 3c503 Etherlink 2. */
-/* This file is distributed under the GPL.
-   Many of these names and comments are directly from the Crynwr packet
-   drivers, which are released under the GPL. */
-
-#define EL2H (dev->base_addr + 0x400)
-#define EL2L (dev->base_addr)
-
-/* Vendor unique hardware addr. prefix. 3Com has 2 because they ran
-   out of available addresses on the first one... */
-
-#define OLD_3COM_ID    0x02608c
-#define NEW_3COM_ID    0x0020af
-
-/* Shared memory management parameters. NB: The 8 bit cards have only
-   one bank (MB1) which serves both Tx and Rx packet space. The 16bit
-   cards have 2 banks, MB0 for Tx packets, and MB1 for Rx packets.
-   You choose which bank appears in the sh. mem window with EGACFR_MBSn */
-
-#define EL2_MB0_START_PG       (0x00)  /* EL2/16 Tx packets go in bank 0 */
-#define EL2_MB1_START_PG       (0x20)  /* First page of bank 1 */
-#define EL2_MB1_STOP_PG                (0x40)  /* Last page +1 of bank 1 */
-
-/* 3Com 3c503 ASIC registers */
-#define E33G_STARTPG   (EL2H+0)        /* Start page, matching EN0_STARTPG */
-#define E33G_STOPPG    (EL2H+1)        /* Stop page, must match EN0_STOPPG */
-#define E33G_DRQCNT    (EL2H+2)        /* DMA burst count */
-#define E33G_IOBASE    (EL2H+3)        /* Read of I/O base jumpers. */
-       /* (non-useful, but it also appears at the end of EPROM space) */
-#define E33G_ROMBASE   (EL2H+4)        /* Read of memory base jumpers. */
-#define E33G_GACFR     (EL2H+5)        /* Config/setup bits for the ASIC GA */
-#define E33G_CNTRL     (EL2H+6)        /* Board's main control register */
-#define E33G_STATUS    (EL2H+7)        /* Status on completions. */
-#define E33G_IDCFR     (EL2H+8)        /* Interrupt/DMA config register */
-                               /* (Which IRQ to assert, DMA chan to use) */
-#define E33G_DMAAH     (EL2H+9)        /* High byte of DMA address reg */
-#define E33G_DMAAL     (EL2H+10)       /* Low byte of DMA address reg */
-/* "Vector pointer" - if this address matches a read, the EPROM (rather than
-   shared RAM) is mapped into memory space. */
-#define E33G_VP2       (EL2H+11)
-#define E33G_VP1       (EL2H+12)
-#define E33G_VP0       (EL2H+13)
-#define E33G_FIFOH     (EL2H+14)       /* FIFO for programmed I/O moves */
-#define E33G_FIFOL     (EL2H+15)       /* ... low byte of above. */
-
-/* Bits in E33G_CNTRL register: */
-
-#define ECNTRL_RESET   (0x01)  /* Software reset of the ASIC and 8390 */
-#define ECNTRL_THIN    (0x02)  /* Onboard xcvr enable, AUI disable */
-#define ECNTRL_AUI     (0x00)  /* Onboard xcvr disable, AUI enable */
-#define ECNTRL_SAPROM  (0x04)  /* Map the station address prom */
-#define ECNTRL_DBLBFR  (0x20)  /* FIFO configuration bit */
-#define ECNTRL_OUTPUT  (0x40)  /* PC-to-3C503 direction if 1 */
-#define ECNTRL_INPUT   (0x00)  /* 3C503-to-PC direction if 0 */
-#define ECNTRL_START   (0x80)  /* Start the DMA logic */
-
-/* Bits in E33G_STATUS register: */
-
-#define ESTAT_DPRDY    (0x80)  /* Data port (of FIFO) ready */
-#define ESTAT_UFLW     (0x40)  /* Tried to read FIFO when it was empty */
-#define ESTAT_OFLW     (0x20)  /* Tried to write FIFO when it was full */
-#define ESTAT_DTC      (0x10)  /* Terminal Count from PC bus DMA logic */
-#define ESTAT_DIP      (0x08)  /* DMA In Progress */
-
-/* Bits in E33G_GACFR register: */
-
-#define EGACFR_NIM     (0x80)  /* NIC interrupt mask */
-#define EGACFR_TCM     (0x40)  /* DMA term. count interrupt mask */
-#define EGACFR_RSEL    (0x08)  /* Map a bank of card mem into system mem */
-#define EGACFR_MBS2    (0x04)  /* Memory bank select, bit 2. */
-#define EGACFR_MBS1    (0x02)  /* Memory bank select, bit 1. */
-#define EGACFR_MBS0    (0x01)  /* Memory bank select, bit 0. */
-
-#define EGACFR_NORM    (0x49)  /* TCM | RSEL | MBS0 */
-#define EGACFR_IRQOFF  (0xc9)  /* TCM | RSEL | MBS0 | NIM */
-
-/*
-       MBS2    MBS1    MBS0    Sh. mem windows card mem at:
-       ----    ----    ----    -----------------------------
-       0       0       0       0x0000 -- bank 0
-       0       0       1       0x2000 -- bank 1 (only choice for 8bit card)
-       0       1       0       0x4000 -- bank 2, not used
-       0       1       1       0x6000 -- bank 3, not used
-
-There was going to be a 32k card that used bank 2 and 3, but it
-never got produced.
-
-*/
-
-
-/* End of 3C503 parameter definitions */
index 880121730cb0c817ef8032d4a742c3f3301d7461..1b78ca7a97868d78728bee1d25fc72203d1bfb28 100644 (file)
@@ -6,7 +6,7 @@ config NET_VENDOR_8390
        bool "National Semi-conductor 8390 devices"
        default y
        depends on NET_VENDOR_NATSEMI && (AMIGA_PCMCIA || PCI || SUPERH || \
-                  ISA || EISA || MAC || M32R || MACH_TX49XX || \
+                  ISA || MAC || M32R || MACH_TX49XX || \
                   H8300 || ARM || MIPS || ZORRO || PCMCIA || \
                   EXPERIMENTAL)
        ---help---
@@ -21,30 +21,6 @@ config NET_VENDOR_8390
 
 if NET_VENDOR_8390
 
-config EL2
-       tristate "3c503 \"EtherLink II\" support"
-       depends on ISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called 3c503.
-
-config AC3200
-       tristate "Ansel Communications EISA 3200 support (EXPERIMENTAL)"
-       depends on PCI && (ISA || EISA) && EXPERIMENTAL
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called ac3200.
-
 config PCMCIA_AXNET
        tristate "Asix AX88190 PCMCIA support"
        depends on PCMCIA
@@ -74,54 +50,6 @@ config AX88796_93CX6
        ---help---
          Select this if your platform comes with an external 93CX6 eeprom.
 
-config E2100
-       tristate "Cabletron E21xx support"
-       depends on ISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called e2100.
-
-config ES3210
-       tristate "Racal-Interlan EISA ES3210 support (EXPERIMENTAL)"
-       depends on PCI && EISA && EXPERIMENTAL
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called es3210.
-
-config HPLAN_PLUS
-       tristate "HP PCLAN+ (27247B and 27252A) support"
-       depends on ISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called hp-plus.
-
-config HPLAN
-       tristate "HP PCLAN (27245 and other 27xxx series) support"
-       depends on ISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called hp.
-
 config HYDRA
        tristate "Hydra support"
        depends on ZORRO
@@ -140,18 +68,6 @@ config ARM_ETHERH
          If you have an Acorn system with one of these network cards, you
          should say Y to this option if you wish to use it with Linux.
 
-config LNE390
-       tristate "Mylex EISA LNE390A/B support (EXPERIMENTAL)"
-       depends on PCI && EISA && EXPERIMENTAL
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called lne390.
-
 config MAC8390
        bool "Macintosh NS 8390 based ethernet cards"
        depends on MAC
@@ -187,8 +103,7 @@ config NE2000
          without a specific driver are compatible with NE2000.
 
          If you have a PCI NE2000 card however, say N here and Y to "PCI
-         NE2000 and clone support" under "EISA, VLB, PCI and on board
-         controllers" below.
+         NE2000 and clone support" below.
 
          To compile this driver as a module, choose M here. The module
          will be called ne.
@@ -223,19 +138,6 @@ config APNE
          To compile this driver as a module, choose M here: the module
          will be called apne.
 
-config NE3210
-       tristate "Novell/Eagle/Microdyne NE3210 EISA support (EXPERIMENTAL)"
-       depends on PCI && EISA && EXPERIMENTAL
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.  Note that this driver
-         will NOT WORK for NE3200 cards as they are completely different.
-
-         To compile this driver as a module, choose M here. The module
-         will be called ne3210.
-
 config PCMCIA_PCNET
        tristate "NE2000 compatible PCMCIA support"
        depends on PCMCIA
@@ -285,18 +187,6 @@ config ULTRA
          To compile this driver as a module, choose M here. The module
          will be called smc-ultra.
 
-config ULTRA32
-       tristate "SMC Ultra32 EISA support"
-       depends on EISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called smc-ultra32.
-
 config WD80x3
        tristate "WD80*3 support"
        depends on ISA
index 8fb462cb9774ddd097b5bf53ba34f7c6200a11ea..588954a79b2ae657bf905b0246a0b2753f72a5ed 100644 (file)
@@ -3,26 +3,17 @@
 #
 
 obj-$(CONFIG_MAC8390) += mac8390.o
-obj-$(CONFIG_AC3200) += ac3200.o 8390.o
 obj-$(CONFIG_APNE) += apne.o 8390.o
 obj-$(CONFIG_ARM_ETHERH) += etherh.o
 obj-$(CONFIG_AX88796) += ax88796.o
-obj-$(CONFIG_E2100) += e2100.o 8390.o
-obj-$(CONFIG_EL2) += 3c503.o 8390p.o
-obj-$(CONFIG_ES3210) += es3210.o 8390.o
-obj-$(CONFIG_HPLAN_PLUS) += hp-plus.o 8390p.o
-obj-$(CONFIG_HPLAN) += hp.o 8390p.o
 obj-$(CONFIG_HYDRA) += hydra.o 8390.o
-obj-$(CONFIG_LNE390) += lne390.o 8390.o
 obj-$(CONFIG_MCF8390) += mcf8390.o 8390.o
 obj-$(CONFIG_NE2000) += ne.o 8390p.o
 obj-$(CONFIG_NE2K_PCI) += ne2k-pci.o 8390.o
-obj-$(CONFIG_NE3210) += ne3210.o 8390.o
 obj-$(CONFIG_NE_H8300) += ne-h8300.o 8390.o
 obj-$(CONFIG_PCMCIA_AXNET) += axnet_cs.o 8390.o
 obj-$(CONFIG_PCMCIA_PCNET) += pcnet_cs.o 8390.o
 obj-$(CONFIG_STNIC) += stnic.o 8390.o
 obj-$(CONFIG_ULTRA) += smc-ultra.o 8390.o
-obj-$(CONFIG_ULTRA32) += smc-ultra32.o 8390.o
 obj-$(CONFIG_WD80x3) += wd.o 8390.o
 obj-$(CONFIG_ZORRO8390) += zorro8390.o 8390.o
diff --git a/drivers/net/ethernet/8390/ac3200.c b/drivers/net/ethernet/8390/ac3200.c
deleted file mode 100644 (file)
index ccf0794..0000000
+++ /dev/null
@@ -1,431 +0,0 @@
-/* ac3200.c: A driver for the Ansel Communications EISA ethernet adaptor. */
-/*
-       Written 1993, 1994 by Donald Becker.
-       Copyright 1993 United States Government as represented by the Director,
-       National Security Agency.  This software may only be used and distributed
-       according to the terms of the GNU General Public License as modified by SRC,
-       incorporated herein by reference.
-
-       The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-       This is driver for the Ansel Communications Model 3200 EISA Ethernet LAN
-       Adapter.  The programming information is from the users manual, as related
-       by glee@ardnassak.math.clemson.edu.
-
-       Changelog:
-
-       Paul Gortmaker 05/98    : add support for shared mem above 1MB.
-
-  */
-
-static const char version[] =
-       "ac3200.c:v1.01 7/1/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
-
-#include <linux/module.h>
-#include <linux/eisa.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-
-#include "8390.h"
-
-#define DRV_NAME       "ac3200"
-
-/* Offsets from the base address. */
-#define AC_NIC_BASE    0x00
-#define AC_SA_PROM     0x16                    /* The station address PROM. */
-#define AC_ADDR0       0x00                    /* Prefix station address values. */
-#define AC_ADDR1       0x40
-#define AC_ADDR2       0x90
-#define AC_ID_PORT     0xC80
-#define AC_EISA_ID     0x0110d305
-#define AC_RESET_PORT  0xC84
-#define AC_RESET       0x00
-#define AC_ENABLE      0x01
-#define AC_CONFIG      0xC90   /* The configuration port. */
-
-#define AC_IO_EXTENT 0x20
-                                /* Actually accessed is:
-                                                                * AC_NIC_BASE (0-15)
-                                                                * AC_SA_PROM (0-5)
-                                                                * AC_ID_PORT (0-3)
-                                                                * AC_RESET_PORT
-                                                                * AC_CONFIG
-                                                                */
-
-/* Decoding of the configuration register. */
-static unsigned char config2irqmap[8] __initdata = {15, 12, 11, 10, 9, 7, 5, 3};
-static int addrmap[8] =
-{0xFF0000, 0xFE0000, 0xFD0000, 0xFFF0000, 0xFFE0000, 0xFFC0000,  0xD0000, 0 };
-static const char *port_name[4] = { "10baseT", "invalid", "AUI", "10base2"};
-
-#define config2irq(configval)  config2irqmap[((configval) >> 3) & 7]
-#define config2mem(configval)  addrmap[(configval) & 7]
-#define config2name(configval) port_name[((configval) >> 6) & 3]
-
-/* First and last 8390 pages. */
-#define AC_START_PG            0x00    /* First page of 8390 TX buffer */
-#define AC_STOP_PG             0x80    /* Last page +1 of the 8390 RX ring */
-
-static int ac_probe1(int ioaddr, struct net_device *dev);
-
-static int ac_open(struct net_device *dev);
-static void ac_reset_8390(struct net_device *dev);
-static void ac_block_input(struct net_device *dev, int count,
-                                       struct sk_buff *skb, int ring_offset);
-static void ac_block_output(struct net_device *dev, const int count,
-                                                       const unsigned char *buf, const int start_page);
-static void ac_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                       int ring_page);
-
-static int ac_close_card(struct net_device *dev);
-
-
-/*     Probe for the AC3200.
-
-       The AC3200 can be identified by either the EISA configuration registers,
-       or the unique value in the station address PROM.
-       */
-
-static int __init do_ac3200_probe(struct net_device *dev)
-{
-       unsigned short ioaddr = dev->base_addr;
-       int irq = dev->irq;
-       int mem_start = dev->mem_start;
-
-       if (ioaddr > 0x1ff)             /* Check a single specified location. */
-               return ac_probe1(ioaddr, dev);
-       else if (ioaddr > 0)            /* Don't probe at all. */
-               return -ENXIO;
-
-       if ( ! EISA_bus)
-               return -ENXIO;
-
-       for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
-               if (ac_probe1(ioaddr, dev) == 0)
-                       return 0;
-               dev->irq = irq;
-               dev->mem_start = mem_start;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init ac3200_probe(int unit)
-{
-       struct net_device *dev = alloc_ei_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_ac3200_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static const struct net_device_ops ac_netdev_ops = {
-       .ndo_open               = ac_open,
-       .ndo_stop               = ac_close_card,
-
-       .ndo_start_xmit         = ei_start_xmit,
-       .ndo_tx_timeout         = ei_tx_timeout,
-       .ndo_get_stats          = ei_get_stats,
-       .ndo_set_rx_mode        = ei_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = ei_poll,
-#endif
-};
-
-static int __init ac_probe1(int ioaddr, struct net_device *dev)
-{
-       int i, retval;
-
-       if (!request_region(ioaddr, AC_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       if (inb_p(ioaddr + AC_ID_PORT) == 0xff) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       if (inl(ioaddr + AC_ID_PORT) != AC_EISA_ID) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-#ifndef final_version
-       printk(KERN_DEBUG "AC3200 ethercard configuration register is %#02x,"
-                  " EISA ID %02x %02x %02x %02x.\n", inb(ioaddr + AC_CONFIG),
-                  inb(ioaddr + AC_ID_PORT + 0), inb(ioaddr + AC_ID_PORT + 1),
-                  inb(ioaddr + AC_ID_PORT + 2), inb(ioaddr + AC_ID_PORT + 3));
-#endif
-
-       for (i = 0; i < 6; i++)
-               dev->dev_addr[i] = inb(ioaddr + AC_SA_PROM + i);
-
-       printk(KERN_DEBUG "AC3200 in EISA slot %d, node %pM",
-              ioaddr/0x1000, dev->dev_addr);
-#if 0
-       /* Check the vendor ID/prefix. Redundant after checking the EISA ID */
-       if (inb(ioaddr + AC_SA_PROM + 0) != AC_ADDR0
-               || inb(ioaddr + AC_SA_PROM + 1) != AC_ADDR1
-               || inb(ioaddr + AC_SA_PROM + 2) != AC_ADDR2 ) {
-               printk(", not found (invalid prefix).\n");
-               retval = -ENODEV;
-               goto out;
-       }
-#endif
-
-       /* Assign and allocate the interrupt now. */
-       if (dev->irq == 0) {
-               dev->irq = config2irq(inb(ioaddr + AC_CONFIG));
-               printk(", using");
-       } else {
-               dev->irq = irq_canonicalize(dev->irq);
-               printk(", assigning");
-       }
-
-       retval = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev);
-       if (retval) {
-               printk (" nothing! Unable to get IRQ %d.\n", dev->irq);
-               goto out;
-       }
-
-       printk(" IRQ %d, %s port\n", dev->irq, port_name[dev->if_port]);
-
-       dev->base_addr = ioaddr;
-
-#ifdef notyet
-       if (dev->mem_start)     {               /* Override the value from the board. */
-               for (i = 0; i < 7; i++)
-                       if (addrmap[i] == dev->mem_start)
-                               break;
-               if (i >= 7)
-                       i = 0;
-               outb((inb(ioaddr + AC_CONFIG) & ~7) | i, ioaddr + AC_CONFIG);
-       }
-#endif
-
-       dev->if_port = inb(ioaddr + AC_CONFIG) >> 6;
-       dev->mem_start = config2mem(inb(ioaddr + AC_CONFIG));
-
-       printk("%s: AC3200 at %#3x with %dkB memory at physical address %#lx.\n",
-                       dev->name, ioaddr, AC_STOP_PG/4, dev->mem_start);
-
-       /*
-        *  BEWARE!! Some dain-bramaged EISA SCUs will allow you to put
-        *  the card mem within the region covered by `normal' RAM  !!!
-        *
-        *  ioremap() will fail in that case.
-        */
-       ei_status.mem = ioremap(dev->mem_start, AC_STOP_PG*0x100);
-       if (!ei_status.mem) {
-               printk(KERN_ERR "ac3200.c: Unable to remap card memory above 1MB !!\n");
-               printk(KERN_ERR "ac3200.c: Try using EISA SCU to set memory below 1MB.\n");
-               printk(KERN_ERR "ac3200.c: Driver NOT installed.\n");
-               retval = -EINVAL;
-               goto out1;
-       }
-       printk("ac3200.c: remapped %dkB card memory to virtual address %p\n",
-                       AC_STOP_PG/4, ei_status.mem);
-
-       dev->mem_start = (unsigned long)ei_status.mem;
-       dev->mem_end = dev->mem_start + (AC_STOP_PG - AC_START_PG)*256;
-
-       ei_status.name = "AC3200";
-       ei_status.tx_start_page = AC_START_PG;
-       ei_status.rx_start_page = AC_START_PG + TX_PAGES;
-       ei_status.stop_page = AC_STOP_PG;
-       ei_status.word16 = 1;
-
-       if (ei_debug > 0)
-               printk(version);
-
-       ei_status.reset_8390 = &ac_reset_8390;
-       ei_status.block_input = &ac_block_input;
-       ei_status.block_output = &ac_block_output;
-       ei_status.get_8390_hdr = &ac_get_8390_hdr;
-
-       dev->netdev_ops = &ac_netdev_ops;
-       NS8390_init(dev, 0);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out2;
-       return 0;
-out2:
-       if (ei_status.reg0)
-               iounmap(ei_status.mem);
-out1:
-       free_irq(dev->irq, dev);
-out:
-       release_region(ioaddr, AC_IO_EXTENT);
-       return retval;
-}
-
-static int ac_open(struct net_device *dev)
-{
-#ifdef notyet
-       /* Someday we may enable the IRQ and shared memory here. */
-       int ioaddr = dev->base_addr;
-#endif
-
-       ei_open(dev);
-       return 0;
-}
-
-static void ac_reset_8390(struct net_device *dev)
-{
-       ushort ioaddr = dev->base_addr;
-
-       outb(AC_RESET, ioaddr + AC_RESET_PORT);
-       if (ei_debug > 1) printk("resetting AC3200, t=%ld...", jiffies);
-
-       ei_status.txing = 0;
-       outb(AC_ENABLE, ioaddr + AC_RESET_PORT);
-       if (ei_debug > 1) printk("reset done\n");
-}
-
-/* Grab the 8390 specific header. Similar to the block_input routine, but
-   we don't need to be concerned with ring wrap as the header will be at
-   the start of a page, so we optimize accordingly. */
-
-static void
-ac_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       void __iomem *hdr_start = ei_status.mem + ((ring_page - AC_START_PG)<<8);
-       memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
-}
-
-/*  Block input and output are easy on shared memory ethercards, the only
-       complication is when the ring buffer wraps. */
-
-static void ac_block_input(struct net_device *dev, int count, struct sk_buff *skb,
-                                                 int ring_offset)
-{
-       void __iomem *start = ei_status.mem + ring_offset - AC_START_PG*256;
-
-       if (ring_offset + count > AC_STOP_PG*256) {
-               /* We must wrap the input move. */
-               int semi_count = AC_STOP_PG*256 - ring_offset;
-               memcpy_fromio(skb->data, start, semi_count);
-               count -= semi_count;
-               memcpy_fromio(skb->data + semi_count,
-                               ei_status.mem + TX_PAGES*256, count);
-       } else {
-               memcpy_fromio(skb->data, start, count);
-       }
-}
-
-static void ac_block_output(struct net_device *dev, int count,
-                                                       const unsigned char *buf, int start_page)
-{
-       void __iomem *shmem = ei_status.mem + ((start_page - AC_START_PG)<<8);
-
-       memcpy_toio(shmem, buf, count);
-}
-
-static int ac_close_card(struct net_device *dev)
-{
-       if (ei_debug > 1)
-               printk("%s: Shutting down ethercard.\n", dev->name);
-
-#ifdef notyet
-       /* We should someday disable shared memory and interrupts. */
-       outb(0x00, ioaddr + 6); /* Disable interrupts. */
-       free_irq(dev->irq, dev);
-#endif
-
-       ei_close(dev);
-       return 0;
-}
-
-#ifdef MODULE
-#define MAX_AC32_CARDS 4       /* Max number of AC32 cards per module */
-static struct net_device *dev_ac32[MAX_AC32_CARDS];
-static int io[MAX_AC32_CARDS];
-static int irq[MAX_AC32_CARDS];
-static int mem[MAX_AC32_CARDS];
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(mem, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s)");
-MODULE_PARM_DESC(mem, "Memory base address(es)");
-MODULE_DESCRIPTION("Ansel AC3200 EISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-static int __init ac3200_module_init(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_AC32_CARDS; this_dev++) {
-               if (io[this_dev] == 0 && this_dev != 0)
-                       break;
-               dev = alloc_ei_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               dev->mem_start = mem[this_dev];         /* Currently ignored by driver */
-               if (do_ac3200_probe(dev) == 0) {
-                       dev_ac32[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "ac3200.c: No ac3200 card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       /* Someday free_irq may be in ac_close_card() */
-       free_irq(dev->irq, dev);
-       release_region(dev->base_addr, AC_IO_EXTENT);
-       iounmap(ei_status.mem);
-}
-
-static void __exit ac3200_module_exit(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_AC32_CARDS; this_dev++) {
-               struct net_device *dev = dev_ac32[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-module_init(ac3200_module_init);
-module_exit(ac3200_module_exit);
-#endif /* MODULE */
index 7eeddf01307f14d81ff43bae8979d43ba7b595c6..cab306a9888ea5a5ac0036058eaa0290968dbbec 100644 (file)
@@ -358,7 +358,7 @@ static int ax_mii_probe(struct net_device *dev)
                return -ENODEV;
        }
 
-       ret = phy_connect_direct(dev, phy_dev, ax_handle_link_change, 0,
+       ret = phy_connect_direct(dev, phy_dev, ax_handle_link_change,
                                 PHY_INTERFACE_MODE_MII);
        if (ret) {
                netdev_err(dev, "Could not attach to PHY\n");
diff --git a/drivers/net/ethernet/8390/e2100.c b/drivers/net/ethernet/8390/e2100.c
deleted file mode 100644 (file)
index ed55ce8..0000000
+++ /dev/null
@@ -1,489 +0,0 @@
-/* e2100.c: A Cabletron E2100 series ethernet driver for linux. */
-/*
-       Written 1993-1994 by Donald Becker.
-
-       Copyright 1994 by Donald Becker.
-       Copyright 1993 United States Government as represented by the
-       Director, National Security Agency.  This software may be used and
-       distributed according to the terms of the GNU General Public License,
-       incorporated herein by reference.
-
-       This is a driver for the Cabletron E2100 series ethercards.
-
-       The Author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-       The E2100 series ethercard is a fairly generic shared memory 8390
-       implementation.  The only unusual aspect is the way the shared memory
-       registers are set: first you do an inb() in what is normally the
-       station address region, and the low three bits of next outb() *address*
-       is used as the write value for that register.  Either someone wasn't
-       too used to dem bit en bites, or they were trying to obfuscate the
-       programming interface.
-
-       There is an additional complication when setting the window on the packet
-       buffer.  You must first do a read into the packet buffer region with the
-       low 8 address bits the address setting the page for the start of the packet
-       buffer window, and then do the above operation.  See mem_on() for details.
-
-       One bug on the chip is that even a hard reset won't disable the memory
-       window, usually resulting in a hung machine if mem_off() isn't called.
-       If this happens, you must power down the machine for about 30 seconds.
-*/
-
-static const char version[] =
-       "e2100.c:v1.01 7/21/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "e2100"
-
-static int e21_probe_list[] = {0x300, 0x280, 0x380, 0x220, 0};
-
-/* Offsets from the base_addr.
-   Read from the ASIC register, and the low three bits of the next outb()
-   address is used to set the corresponding register. */
-#define E21_NIC_OFFSET  0              /* Offset to the 8390 NIC. */
-#define E21_ASIC               0x10
-#define E21_MEM_ENABLE 0x10
-#define  E21_MEM_ON            0x05    /* Enable memory in 16 bit mode. */
-#define  E21_MEM_ON_8  0x07    /* Enable memory in  8 bit mode. */
-#define E21_MEM_BASE   0x11
-#define E21_IRQ_LOW            0x12    /* The low three bits of the IRQ number. */
-#define E21_IRQ_HIGH   0x14    /* The high IRQ bit and media select ...  */
-#define E21_MEDIA              0x14    /* (alias). */
-#define  E21_ALT_IFPORT 0x02   /* Set to use the other (BNC,AUI) port. */
-#define  E21_BIG_MEM   0x04    /* Use a bigger (64K) buffer (we don't) */
-#define E21_SAPROM             0x10    /* Offset to station address data. */
-#define E21_IO_EXTENT   0x20
-
-static inline void mem_on(short port, volatile char __iomem *mem_base,
-                                                 unsigned char start_page )
-{
-       /* This is a little weird: set the shared memory window by doing a
-          read.  The low address bits specify the starting page. */
-       readb(mem_base+start_page);
-       inb(port + E21_MEM_ENABLE);
-       outb(E21_MEM_ON, port + E21_MEM_ENABLE + E21_MEM_ON);
-}
-
-static inline void mem_off(short port)
-{
-       inb(port + E21_MEM_ENABLE);
-       outb(0x00, port + E21_MEM_ENABLE);
-}
-
-/* In other drivers I put the TX pages first, but the E2100 window circuitry
-   is designed to have a 4K Tx region last. The windowing circuitry wraps the
-   window at 0x2fff->0x0000 so that the packets at e.g. 0x2f00 in the RX ring
-   appear contiguously in the window. */
-#define E21_RX_START_PG                0x00    /* First page of RX buffer */
-#define E21_RX_STOP_PG         0x30    /* Last page +1 of RX ring */
-#define E21_BIG_RX_STOP_PG     0xF0    /* Last page +1 of RX ring */
-#define E21_TX_START_PG                E21_RX_STOP_PG  /* First page of TX buffer */
-
-static int e21_probe1(struct net_device *dev, int ioaddr);
-
-static int e21_open(struct net_device *dev);
-static void e21_reset_8390(struct net_device *dev);
-static void e21_block_input(struct net_device *dev, int count,
-                                                  struct sk_buff *skb, int ring_offset);
-static void e21_block_output(struct net_device *dev, int count,
-                                                        const unsigned char *buf, int start_page);
-static void e21_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                                       int ring_page);
-static int e21_open(struct net_device *dev);
-static int e21_close(struct net_device *dev);
-
-
-/*  Probe for the E2100 series ethercards.  These cards have an 8390 at the
-       base address and the station address at both offset 0x10 and 0x18.  I read
-       the station address from offset 0x18 to avoid the dataport of NE2000
-       ethercards, and look for Ctron's unique ID (first three octets of the
-       station address).
- */
-
-static int  __init do_e2100_probe(struct net_device *dev)
-{
-       int *port;
-       int base_addr = dev->base_addr;
-       int irq = dev->irq;
-
-       if (base_addr > 0x1ff)          /* Check a single specified location. */
-               return e21_probe1(dev, base_addr);
-       else if (base_addr != 0)        /* Don't probe at all. */
-               return -ENXIO;
-
-       for (port = e21_probe_list; *port; port++) {
-               dev->irq = irq;
-               if (e21_probe1(dev, *port) == 0)
-                       return 0;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init e2100_probe(int unit)
-{
-       struct net_device *dev = alloc_ei_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_e2100_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static const struct net_device_ops e21_netdev_ops = {
-       .ndo_open               = e21_open,
-       .ndo_stop               = e21_close,
-
-       .ndo_start_xmit         = ei_start_xmit,
-       .ndo_tx_timeout         = ei_tx_timeout,
-       .ndo_get_stats          = ei_get_stats,
-       .ndo_set_rx_mode        = ei_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = ei_poll,
-#endif
-};
-
-static int __init e21_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, status, retval;
-       unsigned char *station_addr = dev->dev_addr;
-       static unsigned version_printed;
-
-       if (!request_region(ioaddr, E21_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       /* First check the station address for the Ctron prefix. */
-       if (inb(ioaddr + E21_SAPROM + 0) != 0x00 ||
-           inb(ioaddr + E21_SAPROM + 1) != 0x00 ||
-           inb(ioaddr + E21_SAPROM + 2) != 0x1d) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /* Verify by making certain that there is a 8390 at there. */
-       outb(E8390_NODMA + E8390_STOP, ioaddr);
-       udelay(1);      /* we want to delay one I/O cycle - which is 2MHz */
-       status = inb(ioaddr);
-       if (status != 0x21 && status != 0x23) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /* Read the station address PROM.  */
-       for (i = 0; i < 6; i++)
-               station_addr[i] = inb(ioaddr + E21_SAPROM + i);
-
-       inb(ioaddr + E21_MEDIA);                /* Point to media selection. */
-       outb(0, ioaddr + E21_ASIC);     /* and disable the secondary interface. */
-
-       if (ei_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       for (i = 0; i < 6; i++)
-               printk(" %02X", station_addr[i]);
-
-       if (dev->irq < 2) {
-               static const int irqlist[] = {15, 11, 10, 12, 5, 9, 3, 4};
-               for (i = 0; i < ARRAY_SIZE(irqlist); i++)
-                       if (request_irq (irqlist[i], NULL, 0, "bogus", NULL) != -EBUSY) {
-                               dev->irq = irqlist[i];
-                               break;
-                       }
-               if (i >= ARRAY_SIZE(irqlist)) {
-                       printk(" unable to get IRQ %d.\n", dev->irq);
-                       retval = -EAGAIN;
-                       goto out;
-               }
-       } else if (dev->irq == 2)       /* Fixup luser bogosity: IRQ2 is really IRQ9 */
-               dev->irq = 9;
-
-       /* The 8390 is at the base address. */
-       dev->base_addr = ioaddr;
-
-       ei_status.name = "E2100";
-       ei_status.word16 = 1;
-       ei_status.tx_start_page = E21_TX_START_PG;
-       ei_status.rx_start_page = E21_RX_START_PG;
-       ei_status.stop_page = E21_RX_STOP_PG;
-       ei_status.saved_irq = dev->irq;
-
-       /* Check the media port used.  The port can be passed in on the
-          low mem_end bits. */
-       if (dev->mem_end & 15)
-               dev->if_port = dev->mem_end & 7;
-       else {
-               dev->if_port = 0;
-               inb(ioaddr + E21_MEDIA);        /* Turn automatic media detection on. */
-               for(i = 0; i < 6; i++)
-                       if (station_addr[i] != inb(ioaddr + E21_SAPROM + 8 + i)) {
-                               dev->if_port = 1;
-                               break;
-                       }
-       }
-
-       /* Never map in the E21 shared memory unless you are actively using it.
-          Also, the shared memory has effective only one setting -- spread all
-          over the 128K region! */
-       if (dev->mem_start == 0)
-               dev->mem_start = 0xd0000;
-
-       ei_status.mem = ioremap(dev->mem_start, 2*1024);
-       if (!ei_status.mem) {
-               printk("unable to remap memory\n");
-               retval = -EAGAIN;
-               goto out;
-       }
-
-#ifdef notdef
-       /* These values are unused.  The E2100 has a 2K window into the packet
-          buffer.  The window can be set to start on any page boundary. */
-       ei_status.rmem_start = dev->mem_start + TX_PAGES*256;
-       dev->mem_end = ei_status.rmem_end = dev->mem_start + 2*1024;
-#endif
-
-       printk(", IRQ %d, %s media, memory @ %#lx.\n", dev->irq,
-                  dev->if_port ? "secondary" : "primary", dev->mem_start);
-
-       ei_status.reset_8390 = &e21_reset_8390;
-       ei_status.block_input = &e21_block_input;
-       ei_status.block_output = &e21_block_output;
-       ei_status.get_8390_hdr = &e21_get_8390_hdr;
-
-       dev->netdev_ops = &e21_netdev_ops;
-       NS8390_init(dev, 0);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out;
-       return 0;
-out:
-       release_region(ioaddr, E21_IO_EXTENT);
-       return retval;
-}
-
-static int
-e21_open(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-       int retval;
-
-       if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev)))
-               return retval;
-
-       /* Set the interrupt line and memory base on the hardware. */
-       inb(ioaddr + E21_IRQ_LOW);
-       outb(0, ioaddr + E21_ASIC + (dev->irq & 7));
-       inb(ioaddr + E21_IRQ_HIGH);                     /* High IRQ bit, and if_port. */
-       outb(0, ioaddr + E21_ASIC + (dev->irq > 7 ? 1:0)
-                  + (dev->if_port ? E21_ALT_IFPORT : 0));
-       inb(ioaddr + E21_MEM_BASE);
-       outb(0, ioaddr + E21_ASIC + ((dev->mem_start >> 17) & 7));
-
-       ei_open(dev);
-       return 0;
-}
-
-static void
-e21_reset_8390(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-
-       outb(0x01, ioaddr);
-       if (ei_debug > 1) printk("resetting the E2180x3 t=%ld...", jiffies);
-       ei_status.txing = 0;
-
-       /* Set up the ASIC registers, just in case something changed them. */
-
-       if (ei_debug > 1) printk("reset done\n");
-}
-
-/* Grab the 8390 specific header. We put the 2k window so the header page
-   appears at the start of the shared memory. */
-
-static void
-e21_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-
-       short ioaddr = dev->base_addr;
-       char __iomem *shared_mem = ei_status.mem;
-
-       mem_on(ioaddr, shared_mem, ring_page);
-
-#ifdef notdef
-       /* Officially this is what we are doing, but the readl() is faster */
-       memcpy_fromio(hdr, shared_mem, sizeof(struct e8390_pkt_hdr));
-#else
-       ((unsigned int*)hdr)[0] = readl(shared_mem);
-#endif
-
-       /* Turn off memory access: we would need to reprogram the window anyway. */
-       mem_off(ioaddr);
-
-}
-
-/*  Block input and output are easy on shared memory ethercards.
-       The E21xx makes block_input() especially easy by wrapping the top
-       ring buffer to the bottom automatically. */
-static void
-e21_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-       short ioaddr = dev->base_addr;
-       char __iomem *shared_mem = ei_status.mem;
-
-       mem_on(ioaddr, shared_mem, (ring_offset>>8));
-
-       memcpy_fromio(skb->data, ei_status.mem + (ring_offset & 0xff), count);
-
-       mem_off(ioaddr);
-}
-
-static void
-e21_block_output(struct net_device *dev, int count, const unsigned char *buf,
-                                int start_page)
-{
-       short ioaddr = dev->base_addr;
-       volatile char __iomem *shared_mem = ei_status.mem;
-
-       /* Set the shared memory window start by doing a read, with the low address
-          bits specifying the starting page. */
-       readb(shared_mem + start_page);
-       mem_on(ioaddr, shared_mem, start_page);
-
-       memcpy_toio(shared_mem, buf, count);
-       mem_off(ioaddr);
-}
-
-static int
-e21_close(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-
-       if (ei_debug > 1)
-               printk("%s: Shutting down ethercard.\n", dev->name);
-
-       free_irq(dev->irq, dev);
-       dev->irq = ei_status.saved_irq;
-
-       /* Shut off the interrupt line and secondary interface. */
-       inb(ioaddr + E21_IRQ_LOW);
-       outb(0, ioaddr + E21_ASIC);
-       inb(ioaddr + E21_IRQ_HIGH);                     /* High IRQ bit, and if_port. */
-       outb(0, ioaddr + E21_ASIC);
-
-       ei_close(dev);
-
-       /* Double-check that the memory has been turned off, because really
-          really bad things happen if it isn't. */
-       mem_off(ioaddr);
-
-       return 0;
-}
-
-
-#ifdef MODULE
-#define MAX_E21_CARDS  4       /* Max number of E21 cards per module */
-static struct net_device *dev_e21[MAX_E21_CARDS];
-static int io[MAX_E21_CARDS];
-static int irq[MAX_E21_CARDS];
-static int mem[MAX_E21_CARDS];
-static int xcvr[MAX_E21_CARDS];                /* choose int. or ext. xcvr */
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(mem, int, NULL, 0);
-module_param_array(xcvr, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s)");
-MODULE_PARM_DESC(mem, " memory base address(es)");
-MODULE_PARM_DESC(xcvr, "transceiver(s) (0=internal, 1=external)");
-MODULE_DESCRIPTION("Cabletron E2100 ISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-/* This is set up so that only a single autoprobe takes place per call.
-ISA device autoprobes on a running machine are not recommended. */
-
-int __init init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
-               if (io[this_dev] == 0)  {
-                       if (this_dev != 0) break; /* only autoprobe 1st one */
-                       printk(KERN_NOTICE "e2100.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-               dev = alloc_ei_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               dev->mem_start = mem[this_dev];
-               dev->mem_end = xcvr[this_dev];  /* low 4bits = xcvr sel. */
-               if (do_e2100_probe(dev) == 0) {
-                       dev_e21[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       /* NB: e21_close() handles free_irq */
-       iounmap(ei_status.mem);
-       release_region(dev->base_addr, E21_IO_EXTENT);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
-               struct net_device *dev = dev_e21[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/8390/es3210.c b/drivers/net/ethernet/8390/es3210.c
deleted file mode 100644 (file)
index ba1b5c9..0000000
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
-       es3210.c
-
-       Linux driver for Racal-Interlan ES3210 EISA Network Adapter
-
-       Copyright (C) 1996, Paul Gortmaker.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       Information and Code Sources:
-
-       1) The existing myriad of Linux 8390 drivers written by Donald Becker.
-
-       2) Once again Russ Nelson's asm packet driver provided additional info.
-
-       3) Info for getting IRQ and sh-mem gleaned from the EISA cfg files.
-          Too bad it doesn't work -- see below.
-
-       The ES3210 is an EISA shared memory NS8390 implementation. Note
-       that all memory copies to/from the board must be 32bit transfers.
-       Which rules out using eth_io_copy_and_sum() in this driver.
-
-       Apparently there are two slightly different revisions of the
-       card, since there are two distinct EISA cfg files (!rii0101.cfg
-       and !rii0102.cfg) One has media select in the cfg file and the
-       other doesn't. Hopefully this will work with either.
-
-       That is about all I can tell you about it, having never actually
-       even seen one of these cards. :)  Try http://www.interlan.com
-       if you want more info.
-
-       Thanks go to Mark Salazar for testing v0.02 of this driver.
-
-       Bugs, to-fix, etc:
-
-       1) The EISA cfg ports that are *supposed* to have the IRQ and shared
-          mem values just read 0xff all the time. Hrrmpf. Apparently the
-          same happens with the packet driver as the code for reading
-          these registers is disabled there. In the meantime, boot with:
-          ether=<IRQ>,0,0x<shared_mem_addr>,eth0 to override the IRQ and
-          shared memory detection. (The i/o port detection is okay.)
-
-       2) Module support currently untested. Probably works though.
-
-*/
-
-static const char version[] =
-       "es3210.c: Driver revision v0.03, 14/09/96\n";
-
-#include <linux/module.h>
-#include <linux/eisa.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-static int es_probe1(struct net_device *dev, int ioaddr);
-
-static void es_reset_8390(struct net_device *dev);
-
-static void es_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page);
-static void es_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset);
-static void es_block_output(struct net_device *dev, int count, const unsigned char *buf, int start_page);
-
-#define ES_START_PG    0x00    /* First page of TX buffer              */
-#define ES_STOP_PG     0x40    /* Last page +1 of RX ring              */
-
-#define ES_IO_EXTENT   0x37    /* The cfg file says 0xc90 -> 0xcc7     */
-#define ES_ID_PORT     0xc80   /* Same for all EISA cards              */
-#define ES_SA_PROM     0xc90   /* Start of e'net addr.                 */
-#define ES_RESET_PORT  0xc84   /* From the packet driver source        */
-#define ES_NIC_OFFSET  0xca0   /* Hello, the 8390 is *here*            */
-
-#define ES_ADDR0       0x02    /* 3 byte vendor prefix                 */
-#define ES_ADDR1       0x07
-#define ES_ADDR2       0x01
-
-/*
- * Two card revisions. EISA ID's are always rev. minor, rev. major,, and
- * then the three vendor letters stored in 5 bits each, with an "a" = 1.
- * For eg: "rii" = 10010 01001 01001 = 0x4929, which is how the EISA
- * config utility determines automagically what config file(s) to use.
- */
-#define ES_EISA_ID1    0x01012949      /* !rii0101.cfg                 */
-#define ES_EISA_ID2    0x02012949      /* !rii0102.cfg                 */
-
-#define ES_CFG1                0xcc0   /* IOPORT(1) --> IOPORT(6) in cfg file  */
-#define ES_CFG2                0xcc1
-#define ES_CFG3                0xcc2
-#define ES_CFG4                0xcc3
-#define ES_CFG5                0xcc4
-#define ES_CFG6                0xc84   /* NB: 0xc84 is also "reset" port.      */
-
-/*
- *     You can OR any of the following bits together and assign it
- *     to ES_DEBUG to get verbose driver info during operation.
- *     Some of these don't do anything yet.
- */
-
-#define ES_D_PROBE     0x01
-#define ES_D_RX_PKT    0x02
-#define ES_D_TX_PKT    0x04
-#define ED_D_IRQ       0x08
-
-#define ES_DEBUG       0
-
-static unsigned char lo_irq_map[] __initdata = {3, 4, 5, 6, 7, 9, 10};
-static unsigned char hi_irq_map[] __initdata = {11, 12, 0, 14, 0, 0, 0, 15};
-
-/*
- *     Probe for the card. The best way is to read the EISA ID if it
- *     is known. Then we check the prefix of the station address
- *     PROM for a match against the Racal-Interlan assigned value.
- */
-
-static int __init do_es_probe(struct net_device *dev)
-{
-       unsigned short ioaddr = dev->base_addr;
-       int irq = dev->irq;
-       int mem_start = dev->mem_start;
-
-       if (ioaddr > 0x1ff)             /* Check a single specified location. */
-               return es_probe1(dev, ioaddr);
-       else if (ioaddr > 0)            /* Don't probe at all. */
-               return -ENXIO;
-
-       if (!EISA_bus) {
-#if ES_DEBUG & ES_D_PROBE
-               printk("es3210.c: Not EISA bus. Not probing high ports.\n");
-#endif
-               return -ENXIO;
-       }
-
-       /* EISA spec allows for up to 16 slots, but 8 is typical. */
-       for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
-               if (es_probe1(dev, ioaddr) == 0)
-                       return 0;
-               dev->irq = irq;
-               dev->mem_start = mem_start;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init es_probe(int unit)
-{
-       struct net_device *dev = alloc_ei_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_es_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static int __init es_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, retval;
-       unsigned long eisa_id;
-
-       if (!request_region(ioaddr + ES_SA_PROM, ES_IO_EXTENT, "es3210"))
-               return -ENODEV;
-
-#if ES_DEBUG & ES_D_PROBE
-       printk("es3210.c: probe at %#x, ID %#8x\n", ioaddr, inl(ioaddr + ES_ID_PORT));
-       printk("es3210.c: config regs: %#x %#x %#x %#x %#x %#x\n",
-               inb(ioaddr + ES_CFG1), inb(ioaddr + ES_CFG2), inb(ioaddr + ES_CFG3),
-               inb(ioaddr + ES_CFG4), inb(ioaddr + ES_CFG5), inb(ioaddr + ES_CFG6));
-#endif
-
-/*     Check the EISA ID of the card. */
-       eisa_id = inl(ioaddr + ES_ID_PORT);
-       if ((eisa_id != ES_EISA_ID1) && (eisa_id != ES_EISA_ID2)) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       for (i = 0; i < ETH_ALEN ; i++)
-               dev->dev_addr[i] = inb(ioaddr + ES_SA_PROM + i);
-
-/*     Check the Racal vendor ID as well. */
-       if (dev->dev_addr[0] != ES_ADDR0 ||
-           dev->dev_addr[1] != ES_ADDR1 ||
-           dev->dev_addr[2] != ES_ADDR2) {
-               printk("es3210.c: card not found %pM (invalid_prefix).\n",
-                      dev->dev_addr);
-               retval = -ENODEV;
-               goto out;
-       }
-
-       printk("es3210.c: ES3210 rev. %ld at %#x, node %pM",
-              eisa_id>>24, ioaddr, dev->dev_addr);
-
-       /* Snarf the interrupt now. */
-       if (dev->irq == 0) {
-               unsigned char hi_irq = inb(ioaddr + ES_CFG2) & 0x07;
-               unsigned char lo_irq = inb(ioaddr + ES_CFG1) & 0xfe;
-
-               if (hi_irq != 0) {
-                       dev->irq = hi_irq_map[hi_irq - 1];
-               } else {
-                       int i = 0;
-                       while (lo_irq > (1<<i)) i++;
-                       dev->irq = lo_irq_map[i];
-               }
-               printk(" using IRQ %d", dev->irq);
-#if ES_DEBUG & ES_D_PROBE
-               printk("es3210.c: hi_irq %#x, lo_irq %#x, dev->irq = %d\n",
-                                       hi_irq, lo_irq, dev->irq);
-#endif
-       } else {
-               if (dev->irq == 2)
-                       dev->irq = 9;                   /* Doh! */
-               printk(" assigning IRQ %d", dev->irq);
-       }
-
-       if (request_irq(dev->irq, ei_interrupt, 0, "es3210", dev)) {
-               printk (" unable to get IRQ %d.\n", dev->irq);
-               retval = -EAGAIN;
-               goto out;
-       }
-
-       if (dev->mem_start == 0) {
-               unsigned char mem_enabled = inb(ioaddr + ES_CFG2) & 0xc0;
-               unsigned char mem_bits = inb(ioaddr + ES_CFG3) & 0x07;
-
-               if (mem_enabled != 0x80) {
-                       printk(" shared mem disabled - giving up\n");
-                       retval = -ENXIO;
-                       goto out1;
-               }
-               dev->mem_start = 0xC0000 + mem_bits*0x4000;
-               printk(" using ");
-       } else {
-               printk(" assigning ");
-       }
-
-       ei_status.mem = ioremap(dev->mem_start, (ES_STOP_PG - ES_START_PG)*256);
-       if (!ei_status.mem) {
-               printk("ioremap failed - giving up\n");
-               retval = -ENXIO;
-               goto out1;
-       }
-
-       dev->mem_end = dev->mem_start + (ES_STOP_PG - ES_START_PG)*256;
-
-       printk("mem %#lx-%#lx\n", dev->mem_start, dev->mem_end-1);
-
-#if ES_DEBUG & ES_D_PROBE
-       if (inb(ioaddr + ES_CFG5))
-               printk("es3210: Warning - DMA channel enabled, but not used here.\n");
-#endif
-       /* Note, point at the 8390, and not the card... */
-       dev->base_addr = ioaddr + ES_NIC_OFFSET;
-
-       ei_status.name = "ES3210";
-       ei_status.tx_start_page = ES_START_PG;
-       ei_status.rx_start_page = ES_START_PG + TX_PAGES;
-       ei_status.stop_page = ES_STOP_PG;
-       ei_status.word16 = 1;
-
-       if (ei_debug > 0)
-               printk(version);
-
-       ei_status.reset_8390 = &es_reset_8390;
-       ei_status.block_input = &es_block_input;
-       ei_status.block_output = &es_block_output;
-       ei_status.get_8390_hdr = &es_get_8390_hdr;
-
-       dev->netdev_ops = &ei_netdev_ops;
-       NS8390_init(dev, 0);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out1;
-       return 0;
-out1:
-       free_irq(dev->irq, dev);
-out:
-       release_region(ioaddr + ES_SA_PROM, ES_IO_EXTENT);
-       return retval;
-}
-
-/*
- *     Reset as per the packet driver method. Judging by the EISA cfg
- *     file, this just toggles the "Board Enable" bits (bit 2 and 0).
- */
-
-static void es_reset_8390(struct net_device *dev)
-{
-       unsigned short ioaddr = dev->base_addr;
-       unsigned long end;
-
-       outb(0x04, ioaddr + ES_RESET_PORT);
-       if (ei_debug > 1) printk("%s: resetting the ES3210...", dev->name);
-
-       end = jiffies + 2*HZ/100;
-        while ((signed)(end - jiffies) > 0) continue;
-
-       ei_status.txing = 0;
-       outb(0x01, ioaddr + ES_RESET_PORT);
-       if (ei_debug > 1) printk("reset done\n");
-}
-
-/*
- *     Note: In the following three functions is the implicit assumption
- *     that the associated memcpy will only use "rep; movsl" as long as
- *     we keep the counts as some multiple of doublewords. This is a
- *     requirement of the hardware, and also prevents us from using
- *     eth_io_copy_and_sum() since we can't guarantee it will limit
- *     itself to doubleword access.
- */
-
-/*
- *     Grab the 8390 specific header. Similar to the block_input routine, but
- *     we don't need to be concerned with ring wrap as the header will be at
- *     the start of a page, so we optimize accordingly. (A single doubleword.)
- */
-
-static void
-es_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       void __iomem *hdr_start = ei_status.mem + ((ring_page - ES_START_PG)<<8);
-       memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
-       hdr->count = (hdr->count + 3) & ~3;     /* Round up allocation. */
-}
-
-/*
- *     Block input and output are easy on shared memory ethercards, the only
- *     complication is when the ring buffer wraps. The count will already
- *     be rounded up to a doubleword value via es_get_8390_hdr() above.
- */
-
-static void es_block_input(struct net_device *dev, int count, struct sk_buff *skb,
-                                                 int ring_offset)
-{
-       void __iomem *xfer_start = ei_status.mem + ring_offset - ES_START_PG*256;
-
-       if (ring_offset + count > ES_STOP_PG*256) {
-               /* Packet wraps over end of ring buffer. */
-               int semi_count = ES_STOP_PG*256 - ring_offset;
-               memcpy_fromio(skb->data, xfer_start, semi_count);
-               count -= semi_count;
-               memcpy_fromio(skb->data + semi_count, ei_status.mem, count);
-       } else {
-               /* Packet is in one chunk. */
-               memcpy_fromio(skb->data, xfer_start, count);
-       }
-}
-
-static void es_block_output(struct net_device *dev, int count,
-                               const unsigned char *buf, int start_page)
-{
-       void __iomem *shmem = ei_status.mem + ((start_page - ES_START_PG)<<8);
-
-       count = (count + 3) & ~3;     /* Round up to doubleword */
-       memcpy_toio(shmem, buf, count);
-}
-
-#ifdef MODULE
-#define MAX_ES_CARDS   4       /* Max number of ES3210 cards per module */
-#define NAMELEN                8       /* # of chars for storing dev->name */
-static struct net_device *dev_es3210[MAX_ES_CARDS];
-static int io[MAX_ES_CARDS];
-static int irq[MAX_ES_CARDS];
-static int mem[MAX_ES_CARDS];
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(mem, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s)");
-MODULE_PARM_DESC(mem, "memory base address(es)");
-MODULE_DESCRIPTION("Racal-Interlan ES3210 EISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-int __init init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_ES_CARDS; this_dev++) {
-               if (io[this_dev] == 0 && this_dev != 0)
-                       break;
-               dev = alloc_ei_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               dev->mem_start = mem[this_dev];
-               if (do_es_probe(dev) == 0) {
-                       dev_es3210[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "es3210.c: No es3210 card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       free_irq(dev->irq, dev);
-       release_region(dev->base_addr, ES_IO_EXTENT);
-       iounmap(ei_status.mem);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_ES_CARDS; this_dev++) {
-               struct net_device *dev = dev_es3210[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
-
diff --git a/drivers/net/ethernet/8390/hp-plus.c b/drivers/net/ethernet/8390/hp-plus.c
deleted file mode 100644 (file)
index 52f70f9..0000000
+++ /dev/null
@@ -1,505 +0,0 @@
-/* hp-plus.c: A HP PCLAN/plus ethernet driver for linux. */
-/*
-       Written 1994 by Donald Becker.
-
-       This driver is for the Hewlett Packard PC LAN (27***) plus ethercards.
-       These cards are sold under several model numbers, usually 2724*.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-       As is often the case, a great deal of credit is owed to Russ Nelson.
-       The Crynwr packet driver was my primary source of HP-specific
-       programming information.
-*/
-
-static const char version[] =
-"hp-plus.c:v1.10 9/24/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
-
-#include <linux/module.h>
-
-#include <linux/string.h>              /* Important -- this inlines word moves. */
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "hp-plus"
-
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int hpplus_portlist[] __initdata =
-{0x200, 0x240, 0x280, 0x2C0, 0x300, 0x320, 0x340, 0};
-
-/*
-   The HP EtherTwist chip implementation is a fairly routine DP8390
-   implementation.  It allows both shared memory and programmed-I/O buffer
-   access, using a custom interface for both.  The programmed-I/O mode is
-   entirely implemented in the HP EtherTwist chip, bypassing the problem
-   ridden built-in 8390 facilities used on NE2000 designs.  The shared
-   memory mode is likewise special, with an offset register used to make
-   packets appear at the shared memory base.  Both modes use a base and bounds
-   page register to hide the Rx ring buffer wrap -- a packet that spans the
-   end of physical buffer memory appears continuous to the driver. (c.f. the
-   3c503 and Cabletron E2100)
-
-   A special note: the internal buffer of the board is only 8 bits wide.
-   This lays several nasty traps for the unaware:
-   - the 8390 must be programmed for byte-wide operations
-   - all I/O and memory operations must work on whole words (the access
-     latches are serially preloaded and have no byte-swapping ability).
-
-   This board is laid out in I/O space much like the earlier HP boards:
-   the first 16 locations are for the board registers, and the second 16 are
-   for the 8390.  The board is easy to identify, with both a dedicated 16 bit
-   ID register and a constant 0x530* value in the upper bits of the paging
-   register.
-*/
-
-#define HP_ID                  0x00    /* ID register, always 0x4850. */
-#define HP_PAGING              0x02    /* Registers visible @ 8-f, see PageName. */
-#define HPP_OPTION             0x04    /* Bitmapped options, see HP_Option.    */
-#define HPP_OUT_ADDR   0x08    /* I/O output location in Perf_Page.    */
-#define HPP_IN_ADDR            0x0A    /* I/O input location in Perf_Page.             */
-#define HP_DATAPORT            0x0c    /* I/O data transfer in Perf_Page.              */
-#define NIC_OFFSET             0x10    /* Offset to the 8390 registers.                */
-#define HP_IO_EXTENT   32
-
-#define HP_START_PG            0x00    /* First page of TX buffer */
-#define HP_STOP_PG             0x80    /* Last page +1 of RX ring */
-
-/* The register set selected in HP_PAGING. */
-enum PageName {
-       Perf_Page = 0,                          /* Normal operation. */
-       MAC_Page = 1,                           /* The ethernet address (+checksum). */
-       HW_Page = 2,                            /* EEPROM-loaded hardware parameters. */
-       LAN_Page = 4,                           /* Transceiver selection, testing, etc. */
-       ID_Page = 6 };
-
-/* The bit definitions for the HPP_OPTION register. */
-enum HP_Option {
-       NICReset = 1, ChipReset = 2,    /* Active low, really UNreset. */
-       EnableIRQ = 4, FakeIntr = 8, BootROMEnb = 0x10, IOEnb = 0x20,
-       MemEnable = 0x40, ZeroWait = 0x80, MemDisable = 0x1000, };
-
-static int hpp_probe1(struct net_device *dev, int ioaddr);
-
-static void hpp_reset_8390(struct net_device *dev);
-static int hpp_open(struct net_device *dev);
-static int hpp_close(struct net_device *dev);
-static void hpp_mem_block_input(struct net_device *dev, int count,
-                                                 struct sk_buff *skb, int ring_offset);
-static void hpp_mem_block_output(struct net_device *dev, int count,
-                                                       const unsigned char *buf, int start_page);
-static void hpp_mem_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                                 int ring_page);
-static void hpp_io_block_input(struct net_device *dev, int count,
-                                                 struct sk_buff *skb, int ring_offset);
-static void hpp_io_block_output(struct net_device *dev, int count,
-                                                       const unsigned char *buf, int start_page);
-static void hpp_io_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                                 int ring_page);
-
-
-/*     Probe a list of addresses for an HP LAN+ adaptor.
-       This routine is almost boilerplate. */
-
-static int __init do_hpp_probe(struct net_device *dev)
-{
-       int i;
-       int base_addr = dev->base_addr;
-       int irq = dev->irq;
-
-       if (base_addr > 0x1ff)          /* Check a single specified location. */
-               return hpp_probe1(dev, base_addr);
-       else if (base_addr != 0)        /* Don't probe at all. */
-               return -ENXIO;
-
-       for (i = 0; hpplus_portlist[i]; i++) {
-               if (hpp_probe1(dev, hpplus_portlist[i]) == 0)
-                       return 0;
-               dev->irq = irq;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init hp_plus_probe(int unit)
-{
-       struct net_device *dev = alloc_eip_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_hpp_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static const struct net_device_ops hpp_netdev_ops = {
-       .ndo_open               = hpp_open,
-       .ndo_stop               = hpp_close,
-       .ndo_start_xmit         = eip_start_xmit,
-       .ndo_tx_timeout         = eip_tx_timeout,
-       .ndo_get_stats          = eip_get_stats,
-       .ndo_set_rx_mode        = eip_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = eip_poll,
-#endif
-};
-
-
-/* Do the interesting part of the probe at a single address. */
-static int __init hpp_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, retval;
-       unsigned char checksum = 0;
-       const char name[] = "HP-PC-LAN+";
-       int mem_start;
-       static unsigned version_printed;
-
-       if (!request_region(ioaddr, HP_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       /* Check for the HP+ signature, 50 48 0x 53. */
-       if (inw(ioaddr + HP_ID) != 0x4850 ||
-           (inw(ioaddr + HP_PAGING) & 0xfff0) != 0x5300) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       if (ei_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       printk("%s: %s at %#3x, ", dev->name, name, ioaddr);
-
-       /* Retrieve and checksum the station address. */
-       outw(MAC_Page, ioaddr + HP_PAGING);
-
-       for(i = 0; i < ETH_ALEN; i++) {
-               unsigned char inval = inb(ioaddr + 8 + i);
-               dev->dev_addr[i] = inval;
-               checksum += inval;
-       }
-       checksum += inb(ioaddr + 14);
-
-       printk("%pM", dev->dev_addr);
-
-       if (checksum != 0xff) {
-               printk(" bad checksum %2.2x.\n", checksum);
-               retval = -ENODEV;
-               goto out;
-       } else {
-               /* Point at the Software Configuration Flags. */
-               outw(ID_Page, ioaddr + HP_PAGING);
-               printk(" ID %4.4x", inw(ioaddr + 12));
-       }
-
-       /* Read the IRQ line. */
-       outw(HW_Page, ioaddr + HP_PAGING);
-       {
-               int irq = inb(ioaddr + 13) & 0x0f;
-               int option = inw(ioaddr + HPP_OPTION);
-
-               dev->irq = irq;
-               if (option & MemEnable) {
-                       mem_start = inw(ioaddr + 9) << 8;
-                       printk(", IRQ %d, memory address %#x.\n", irq, mem_start);
-               } else {
-                       mem_start = 0;
-                       printk(", IRQ %d, programmed-I/O mode.\n", irq);
-               }
-       }
-
-       /* Set the wrap registers for string I/O reads.   */
-       outw((HP_START_PG + TX_PAGES/2) | ((HP_STOP_PG - 1) << 8), ioaddr + 14);
-
-       /* Set the base address to point to the NIC, not the "real" base! */
-       dev->base_addr = ioaddr + NIC_OFFSET;
-
-       dev->netdev_ops = &hpp_netdev_ops;
-
-       ei_status.name = name;
-       ei_status.word16 = 0;           /* Agggghhhhh! Debug time: 2 days! */
-       ei_status.tx_start_page = HP_START_PG;
-       ei_status.rx_start_page = HP_START_PG + TX_PAGES/2;
-       ei_status.stop_page = HP_STOP_PG;
-
-       ei_status.reset_8390 = &hpp_reset_8390;
-       ei_status.block_input = &hpp_io_block_input;
-       ei_status.block_output = &hpp_io_block_output;
-       ei_status.get_8390_hdr = &hpp_io_get_8390_hdr;
-
-       /* Check if the memory_enable flag is set in the option register. */
-       if (mem_start) {
-               ei_status.block_input = &hpp_mem_block_input;
-               ei_status.block_output = &hpp_mem_block_output;
-               ei_status.get_8390_hdr = &hpp_mem_get_8390_hdr;
-               dev->mem_start = mem_start;
-               ei_status.mem = ioremap(mem_start,
-                                       (HP_STOP_PG - HP_START_PG)*256);
-               if (!ei_status.mem) {
-                       retval = -ENOMEM;
-                       goto out;
-               }
-               ei_status.rmem_start = dev->mem_start + TX_PAGES/2*256;
-               dev->mem_end = ei_status.rmem_end
-                       = dev->mem_start + (HP_STOP_PG - HP_START_PG)*256;
-       }
-
-       outw(Perf_Page, ioaddr + HP_PAGING);
-       NS8390p_init(dev, 0);
-       /* Leave the 8390 and HP chip reset. */
-       outw(inw(ioaddr + HPP_OPTION) & ~EnableIRQ, ioaddr + HPP_OPTION);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out1;
-       return 0;
-out1:
-       iounmap(ei_status.mem);
-out:
-       release_region(ioaddr, HP_IO_EXTENT);
-       return retval;
-}
-
-static int
-hpp_open(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg;
-       int retval;
-
-       if ((retval = request_irq(dev->irq, eip_interrupt, 0, dev->name, dev))) {
-           return retval;
-       }
-
-       /* Reset the 8390 and HP chip. */
-       option_reg = inw(ioaddr + HPP_OPTION);
-       outw(option_reg & ~(NICReset + ChipReset), ioaddr + HPP_OPTION);
-       udelay(5);
-       /* Unreset the board and enable interrupts. */
-       outw(option_reg | (EnableIRQ + NICReset + ChipReset), ioaddr + HPP_OPTION);
-
-       /* Set the wrap registers for programmed-I/O operation.   */
-       outw(HW_Page, ioaddr + HP_PAGING);
-       outw((HP_START_PG + TX_PAGES/2) | ((HP_STOP_PG - 1) << 8), ioaddr + 14);
-
-       /* Select the operational page. */
-       outw(Perf_Page, ioaddr + HP_PAGING);
-
-       return eip_open(dev);
-}
-
-static int
-hpp_close(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       free_irq(dev->irq, dev);
-       eip_close(dev);
-       outw((option_reg & ~EnableIRQ) | MemDisable | NICReset | ChipReset,
-                ioaddr + HPP_OPTION);
-
-       return 0;
-}
-
-static void
-hpp_reset_8390(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       if (ei_debug > 1) printk("resetting the 8390 time=%ld...", jiffies);
-
-       outw(option_reg & ~(NICReset + ChipReset), ioaddr + HPP_OPTION);
-       /* Pause a few cycles for the hardware reset to take place. */
-       udelay(5);
-       ei_status.txing = 0;
-       outw(option_reg | (EnableIRQ + NICReset + ChipReset), ioaddr + HPP_OPTION);
-
-       udelay(5);
-
-
-       if ((inb_p(ioaddr+NIC_OFFSET+EN0_ISR) & ENISR_RESET) == 0)
-               printk("%s: hp_reset_8390() did not complete.\n", dev->name);
-
-       if (ei_debug > 1) printk("8390 reset done (%ld).", jiffies);
-}
-
-/* The programmed-I/O version of reading the 4 byte 8390 specific header.
-   Note that transfer with the EtherTwist+ must be on word boundaries. */
-
-static void
-hpp_io_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-
-       outw((ring_page<<8), ioaddr + HPP_IN_ADDR);
-       insw(ioaddr + HP_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
-}
-
-/* Block input and output, similar to the Crynwr packet driver. */
-
-static void
-hpp_io_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       char *buf = skb->data;
-
-       outw(ring_offset, ioaddr + HPP_IN_ADDR);
-       insw(ioaddr + HP_DATAPORT, buf, count>>1);
-       if (count & 0x01)
-        buf[count-1] = inw(ioaddr + HP_DATAPORT);
-}
-
-/* The corresponding shared memory versions of the above 2 functions. */
-
-static void
-hpp_mem_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       outw((ring_page<<8), ioaddr + HPP_IN_ADDR);
-       outw(option_reg & ~(MemDisable + BootROMEnb), ioaddr + HPP_OPTION);
-       memcpy_fromio(hdr, ei_status.mem, sizeof(struct e8390_pkt_hdr));
-       outw(option_reg, ioaddr + HPP_OPTION);
-       hdr->count = (le16_to_cpu(hdr->count) + 3) & ~3;        /* Round up allocation. */
-}
-
-static void
-hpp_mem_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       outw(ring_offset, ioaddr + HPP_IN_ADDR);
-
-       outw(option_reg & ~(MemDisable + BootROMEnb), ioaddr + HPP_OPTION);
-
-       /* Caution: this relies on get_8390_hdr() rounding up count!
-          Also note that we *can't* use eth_io_copy_and_sum() because
-          it will not always copy "count" bytes (e.g. padded IP).  */
-
-       memcpy_fromio(skb->data, ei_status.mem, count);
-       outw(option_reg, ioaddr + HPP_OPTION);
-}
-
-/* A special note: we *must* always transfer >=16 bit words.
-   It's always safe to round up, so we do. */
-static void
-hpp_io_block_output(struct net_device *dev, int count,
-                                       const unsigned char *buf, int start_page)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       outw(start_page << 8, ioaddr + HPP_OUT_ADDR);
-       outsl(ioaddr + HP_DATAPORT, buf, (count+3)>>2);
-}
-
-static void
-hpp_mem_block_output(struct net_device *dev, int count,
-                               const unsigned char *buf, int start_page)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       outw(start_page << 8, ioaddr + HPP_OUT_ADDR);
-       outw(option_reg & ~(MemDisable + BootROMEnb), ioaddr + HPP_OPTION);
-       memcpy_toio(ei_status.mem, buf, (count + 3) & ~3);
-       outw(option_reg, ioaddr + HPP_OPTION);
-}
-
-
-#ifdef MODULE
-#define MAX_HPP_CARDS  4       /* Max number of HPP cards per module */
-static struct net_device *dev_hpp[MAX_HPP_CARDS];
-static int io[MAX_HPP_CARDS];
-static int irq[MAX_HPP_CARDS];
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O port address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s); ignored if properly detected");
-MODULE_DESCRIPTION("HP PC-LAN+ ISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-/* This is set up so that only a single autoprobe takes place per call.
-ISA device autoprobes on a running machine are not recommended. */
-int __init
-init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_HPP_CARDS; this_dev++) {
-               if (io[this_dev] == 0)  {
-                       if (this_dev != 0) break; /* only autoprobe 1st one */
-                       printk(KERN_NOTICE "hp-plus.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-               dev = alloc_eip_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               if (do_hpp_probe(dev) == 0) {
-                       dev_hpp[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "hp-plus.c: No HP-Plus card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       /* NB: hpp_close() handles free_irq */
-       iounmap(ei_status.mem);
-       release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_HPP_CARDS; this_dev++) {
-               struct net_device *dev = dev_hpp[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/8390/hp.c b/drivers/net/ethernet/8390/hp.c
deleted file mode 100644 (file)
index 37fa89a..0000000
+++ /dev/null
@@ -1,438 +0,0 @@
-/* hp.c: A HP LAN ethernet driver for linux. */
-/*
-       Written 1993-94 by Donald Becker.
-
-       Copyright 1993 United States Government as represented by the
-       Director, National Security Agency.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-       This is a driver for the HP PC-LAN adaptors.
-
-       Sources:
-         The Crynwr packet driver.
-*/
-
-static const char version[] =
-       "hp.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
-
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "hp"
-
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int hppclan_portlist[] __initdata =
-{ 0x300, 0x320, 0x340, 0x280, 0x2C0, 0x200, 0x240, 0};
-
-#define HP_IO_EXTENT   32
-
-#define HP_DATAPORT            0x0c    /* "Remote DMA" data port. */
-#define HP_ID                  0x07
-#define HP_CONFIGURE   0x08    /* Configuration register. */
-#define         HP_RUN                 0x01    /* 1 == Run, 0 == reset. */
-#define         HP_IRQ                 0x0E    /* Mask for software-configured IRQ line. */
-#define         HP_DATAON              0x10    /* Turn on dataport */
-#define NIC_OFFSET             0x10    /* Offset the 8390 registers. */
-
-#define HP_START_PG            0x00    /* First page of TX buffer */
-#define HP_8BSTOP_PG   0x80    /* Last page +1 of RX ring */
-#define HP_16BSTOP_PG  0xFF    /* Same, for 16 bit cards. */
-
-static int hp_probe1(struct net_device *dev, int ioaddr);
-
-static void hp_reset_8390(struct net_device *dev);
-static void hp_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                       int ring_page);
-static void hp_block_input(struct net_device *dev, int count,
-                                       struct sk_buff *skb , int ring_offset);
-static void hp_block_output(struct net_device *dev, int count,
-                                                       const unsigned char *buf, int start_page);
-
-static void hp_init_card(struct net_device *dev);
-
-/* The map from IRQ number to HP_CONFIGURE register setting. */
-/* My default is IRQ5               0  1  2  3  4  5  6  7  8  9 10 11 */
-static char irqmap[16] __initdata= { 0, 0, 4, 6, 8,10, 0,14, 0, 4, 2,12,0,0,0,0};
-
-
-/*     Probe for an HP LAN adaptor.
-       Also initialize the card and fill in STATION_ADDR with the station
-       address. */
-
-static int __init do_hp_probe(struct net_device *dev)
-{
-       int i;
-       int base_addr = dev->base_addr;
-       int irq = dev->irq;
-
-       if (base_addr > 0x1ff)          /* Check a single specified location. */
-               return hp_probe1(dev, base_addr);
-       else if (base_addr != 0)        /* Don't probe at all. */
-               return -ENXIO;
-
-       for (i = 0; hppclan_portlist[i]; i++) {
-               if (hp_probe1(dev, hppclan_portlist[i]) == 0)
-                       return 0;
-               dev->irq = irq;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init hp_probe(int unit)
-{
-       struct net_device *dev = alloc_eip_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_hp_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static int __init hp_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, retval, board_id, wordmode;
-       const char *name;
-       static unsigned version_printed;
-
-       if (!request_region(ioaddr, HP_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       /* Check for the HP physical address, 08 00 09 xx xx xx. */
-       /* This really isn't good enough: we may pick up HP LANCE boards
-          also!  Avoid the lance 0x5757 signature. */
-       if (inb(ioaddr) != 0x08
-               || inb(ioaddr+1) != 0x00
-               || inb(ioaddr+2) != 0x09
-               || inb(ioaddr+14) == 0x57) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /* Set up the parameters based on the board ID.
-          If you have additional mappings, please mail them to me -djb. */
-       if ((board_id = inb(ioaddr + HP_ID)) & 0x80) {
-               name = "HP27247";
-               wordmode = 1;
-       } else {
-               name = "HP27250";
-               wordmode = 0;
-       }
-
-       if (ei_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       printk("%s: %s (ID %02x) at %#3x,", dev->name, name, board_id, ioaddr);
-
-       for(i = 0; i < ETH_ALEN; i++)
-               dev->dev_addr[i] = inb(ioaddr + i);
-
-       printk(" %pM", dev->dev_addr);
-
-       /* Snarf the interrupt now.  Someday this could be moved to open(). */
-       if (dev->irq < 2) {
-               static const int irq_16list[] = { 11, 10, 5, 3, 4, 7, 9, 0};
-               static const int irq_8list[] = { 7, 5, 3, 4, 9, 0};
-               const int *irqp = wordmode ? irq_16list : irq_8list;
-               do {
-                       int irq = *irqp;
-                       if (request_irq (irq, NULL, 0, "bogus", NULL) != -EBUSY) {
-                               unsigned long cookie = probe_irq_on();
-                               /* Twinkle the interrupt, and check if it's seen. */
-                               outb_p(irqmap[irq] | HP_RUN, ioaddr + HP_CONFIGURE);
-                               outb_p( 0x00 | HP_RUN, ioaddr + HP_CONFIGURE);
-                               if (irq == probe_irq_off(cookie)                 /* It's a good IRQ line! */
-                                       && request_irq (irq, eip_interrupt, 0, DRV_NAME, dev) == 0) {
-                                       printk(" selecting IRQ %d.\n", irq);
-                                       dev->irq = *irqp;
-                                       break;
-                               }
-                       }
-               } while (*++irqp);
-               if (*irqp == 0) {
-                       printk(" no free IRQ lines.\n");
-                       retval = -EBUSY;
-                       goto out;
-               }
-       } else {
-               if (dev->irq == 2)
-                       dev->irq = 9;
-               if ((retval = request_irq(dev->irq, eip_interrupt, 0, DRV_NAME, dev))) {
-                       printk (" unable to get IRQ %d.\n", dev->irq);
-                       goto out;
-               }
-       }
-
-       /* Set the base address to point to the NIC, not the "real" base! */
-       dev->base_addr = ioaddr + NIC_OFFSET;
-       dev->netdev_ops = &eip_netdev_ops;
-
-       ei_status.name = name;
-       ei_status.word16 = wordmode;
-       ei_status.tx_start_page = HP_START_PG;
-       ei_status.rx_start_page = HP_START_PG + TX_PAGES;
-       ei_status.stop_page = wordmode ? HP_16BSTOP_PG : HP_8BSTOP_PG;
-
-       ei_status.reset_8390 = hp_reset_8390;
-       ei_status.get_8390_hdr = hp_get_8390_hdr;
-       ei_status.block_input = hp_block_input;
-       ei_status.block_output = hp_block_output;
-       hp_init_card(dev);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out1;
-       return 0;
-out1:
-       free_irq(dev->irq, dev);
-out:
-       release_region(ioaddr, HP_IO_EXTENT);
-       return retval;
-}
-
-static void
-hp_reset_8390(struct net_device *dev)
-{
-       int hp_base = dev->base_addr - NIC_OFFSET;
-       int saved_config = inb_p(hp_base + HP_CONFIGURE);
-
-       if (ei_debug > 1) printk("resetting the 8390 time=%ld...", jiffies);
-       outb_p(0x00, hp_base + HP_CONFIGURE);
-       ei_status.txing = 0;
-       /* Pause just a few cycles for the hardware reset to take place. */
-       udelay(5);
-
-       outb_p(saved_config, hp_base + HP_CONFIGURE);
-       udelay(5);
-
-       if ((inb_p(hp_base+NIC_OFFSET+EN0_ISR) & ENISR_RESET) == 0)
-               printk("%s: hp_reset_8390() did not complete.\n", dev->name);
-
-       if (ei_debug > 1) printk("8390 reset done (%ld).", jiffies);
-}
-
-static void
-hp_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       int nic_base = dev->base_addr;
-       int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
-
-       outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
-       outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base);
-       outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
-       outb_p(0, nic_base + EN0_RCNTHI);
-       outb_p(0, nic_base + EN0_RSARLO);       /* On page boundary */
-       outb_p(ring_page, nic_base + EN0_RSARHI);
-       outb_p(E8390_RREAD+E8390_START, nic_base);
-
-       if (ei_status.word16)
-         insw(nic_base - NIC_OFFSET + HP_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
-       else
-         insb(nic_base - NIC_OFFSET + HP_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
-
-       outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
-}
-
-/* Block input and output, similar to the Crynwr packet driver. If you are
-   porting to a new ethercard look at the packet driver source for hints.
-   The HP LAN doesn't use shared memory -- we put the packet
-   out through the "remote DMA" dataport. */
-
-static void
-hp_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-       int nic_base = dev->base_addr;
-       int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
-       int xfer_count = count;
-       char *buf = skb->data;
-
-       outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
-       outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base);
-       outb_p(count & 0xff, nic_base + EN0_RCNTLO);
-       outb_p(count >> 8, nic_base + EN0_RCNTHI);
-       outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
-       outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
-       outb_p(E8390_RREAD+E8390_START, nic_base);
-       if (ei_status.word16) {
-         insw(nic_base - NIC_OFFSET + HP_DATAPORT,buf,count>>1);
-         if (count & 0x01)
-               buf[count-1] = inb(nic_base - NIC_OFFSET + HP_DATAPORT), xfer_count++;
-       } else {
-               insb(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count);
-       }
-       /* This is for the ALPHA version only, remove for later releases. */
-       if (ei_debug > 0) {                     /* DMA termination address check... */
-         int high = inb_p(nic_base + EN0_RSARHI);
-         int low = inb_p(nic_base + EN0_RSARLO);
-         int addr = (high << 8) + low;
-         /* Check only the lower 8 bits so we can ignore ring wrap. */
-         if (((ring_offset + xfer_count) & 0xff) != (addr & 0xff))
-               printk("%s: RX transfer address mismatch, %#4.4x vs. %#4.4x (actual).\n",
-                          dev->name, ring_offset + xfer_count, addr);
-       }
-       outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
-}
-
-static void
-hp_block_output(struct net_device *dev, int count,
-                               const unsigned char *buf, int start_page)
-{
-       int nic_base = dev->base_addr;
-       int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
-
-       outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
-       /* Round the count up for word writes.  Do we need to do this?
-          What effect will an odd byte count have on the 8390?
-          I should check someday. */
-       if (ei_status.word16 && (count & 0x01))
-         count++;
-       /* We should already be in page 0, but to be safe... */
-       outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base);
-
-#ifdef NE8390_RW_BUGFIX
-       /* Handle the read-before-write bug the same way as the
-          Crynwr packet driver -- the NatSemi method doesn't work. */
-       outb_p(0x42, nic_base + EN0_RCNTLO);
-       outb_p(0,       nic_base + EN0_RCNTHI);
-       outb_p(0xff, nic_base + EN0_RSARLO);
-       outb_p(0x00, nic_base + EN0_RSARHI);
-#define NE_CMD         0x00
-       outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
-       /* Make certain that the dummy read has occurred. */
-       inb_p(0x61);
-       inb_p(0x61);
-#endif
-
-       outb_p(count & 0xff, nic_base + EN0_RCNTLO);
-       outb_p(count >> 8,       nic_base + EN0_RCNTHI);
-       outb_p(0x00, nic_base + EN0_RSARLO);
-       outb_p(start_page, nic_base + EN0_RSARHI);
-
-       outb_p(E8390_RWRITE+E8390_START, nic_base);
-       if (ei_status.word16) {
-               /* Use the 'rep' sequence for 16 bit boards. */
-               outsw(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count>>1);
-       } else {
-               outsb(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count);
-       }
-
-       /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here -- it's broken! */
-
-       /* This is for the ALPHA version only, remove for later releases. */
-       if (ei_debug > 0) {                     /* DMA termination address check... */
-         int high = inb_p(nic_base + EN0_RSARHI);
-         int low  = inb_p(nic_base + EN0_RSARLO);
-         int addr = (high << 8) + low;
-         if ((start_page << 8) + count != addr)
-               printk("%s: TX Transfer address mismatch, %#4.4x vs. %#4.4x.\n",
-                          dev->name, (start_page << 8) + count, addr);
-       }
-       outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
-}
-
-/* This function resets the ethercard if something screws up. */
-static void __init
-hp_init_card(struct net_device *dev)
-{
-       int irq = dev->irq;
-       NS8390p_init(dev, 0);
-       outb_p(irqmap[irq&0x0f] | HP_RUN,
-                  dev->base_addr - NIC_OFFSET + HP_CONFIGURE);
-}
-
-#ifdef MODULE
-#define MAX_HP_CARDS   4       /* Max number of HP cards per module */
-static struct net_device *dev_hp[MAX_HP_CARDS];
-static int io[MAX_HP_CARDS];
-static int irq[MAX_HP_CARDS];
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
-MODULE_DESCRIPTION("HP PC-LAN ISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-/* This is set up so that only a single autoprobe takes place per call.
-ISA device autoprobes on a running machine are not recommended. */
-int __init
-init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) {
-               if (io[this_dev] == 0)  {
-                       if (this_dev != 0) break; /* only autoprobe 1st one */
-                       printk(KERN_NOTICE "hp.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-               dev = alloc_eip_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               if (do_hp_probe(dev) == 0) {
-                       dev_hp[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "hp.c: No HP card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       free_irq(dev->irq, dev);
-       release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) {
-               struct net_device *dev = dev_hp[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/8390/lne390.c b/drivers/net/ethernet/8390/lne390.c
deleted file mode 100644 (file)
index 479409b..0000000
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
-       lne390.c
-
-       Linux driver for Mylex LNE390 EISA Network Adapter
-
-       Copyright (C) 1996-1998, Paul Gortmaker.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       Information and Code Sources:
-
-       1) Based upon framework of es3210 driver.
-       2) The existing myriad of other Linux 8390 drivers by Donald Becker.
-       3) Russ Nelson's asm packet driver provided additional info.
-       4) Info for getting IRQ and sh-mem gleaned from the EISA cfg files.
-
-       The LNE390 is an EISA shared memory NS8390 implementation. Note
-       that all memory copies to/from the board must be 32bit transfers.
-       There are two versions of the card: the lne390a and the lne390b.
-       Going by the EISA cfg files, the "a" has jumpers to select between
-       BNC/AUI, but the "b" also has RJ-45 and selection is via the SCU.
-       The shared memory address selection is also slightly different.
-       Note that shared memory address > 1MB are supported with this driver.
-
-       You can try <http://www.mylex.com> if you want more info, as I've
-       never even seen one of these cards.  :)
-
-       Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 2000/09/01
-       - get rid of check_region
-       - no need to check if dev == NULL in lne390_probe1
-*/
-
-static const char *version =
-       "lne390.c: Driver revision v0.99.1, 01/09/2000\n";
-
-#include <linux/module.h>
-#include <linux/eisa.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "lne390"
-
-static int lne390_probe1(struct net_device *dev, int ioaddr);
-
-static void lne390_reset_8390(struct net_device *dev);
-
-static void lne390_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page);
-static void lne390_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset);
-static void lne390_block_output(struct net_device *dev, int count, const unsigned char *buf, const int start_page);
-
-#define LNE390_START_PG                0x00    /* First page of TX buffer      */
-#define LNE390_STOP_PG         0x80    /* Last page +1 of RX ring      */
-
-#define LNE390_ID_PORT         0xc80   /* Same for all EISA cards      */
-#define LNE390_IO_EXTENT       0x20
-#define LNE390_SA_PROM         0x16    /* Start of e'net addr.         */
-#define LNE390_RESET_PORT      0xc84   /* From the pkt driver source   */
-#define LNE390_NIC_OFFSET      0x00    /* Hello, the 8390 is *here*    */
-
-#define LNE390_ADDR0           0x00    /* 3 byte vendor prefix         */
-#define LNE390_ADDR1           0x80
-#define LNE390_ADDR2           0xe5
-
-#define LNE390_ID0     0x10009835      /* 0x3598 = 01101 01100 11000 = mlx */
-#define LNE390_ID1     0x11009835      /* above is the 390A, this is 390B  */
-
-#define LNE390_CFG1            0xc84   /* NB: 0xc84 is also "reset" port. */
-#define LNE390_CFG2            0xc90
-
-/*
- *     You can OR any of the following bits together and assign it
- *     to LNE390_DEBUG to get verbose driver info during operation.
- *     Currently only the probe one is implemented.
- */
-
-#define LNE390_D_PROBE 0x01
-#define LNE390_D_RX_PKT        0x02
-#define LNE390_D_TX_PKT        0x04
-#define LNE390_D_IRQ   0x08
-
-#define LNE390_DEBUG   0
-
-static unsigned char irq_map[] __initdata = {15, 12, 11, 10, 9, 7, 5, 3};
-static unsigned int shmem_mapA[] __initdata = {0xff, 0xfe, 0xfd, 0xfff, 0xffe, 0xffc, 0x0d, 0x0};
-static unsigned int shmem_mapB[] __initdata = {0xff, 0xfe, 0x0e, 0xfff, 0xffe, 0xffc, 0x0d, 0x0};
-
-/*
- *     Probe for the card. The best way is to read the EISA ID if it
- *     is known. Then we can check the prefix of the station address
- *     PROM for a match against the value assigned to Mylex.
- */
-
-static int __init do_lne390_probe(struct net_device *dev)
-{
-       unsigned short ioaddr = dev->base_addr;
-       int irq = dev->irq;
-       int mem_start = dev->mem_start;
-       int ret;
-
-       if (ioaddr > 0x1ff) {           /* Check a single specified location. */
-               if (!request_region(ioaddr, LNE390_IO_EXTENT, DRV_NAME))
-                       return -EBUSY;
-               ret = lne390_probe1(dev, ioaddr);
-               if (ret)
-                       release_region(ioaddr, LNE390_IO_EXTENT);
-               return ret;
-       }
-       else if (ioaddr > 0)            /* Don't probe at all. */
-               return -ENXIO;
-
-       if (!EISA_bus) {
-#if LNE390_DEBUG & LNE390_D_PROBE
-               printk("lne390-debug: Not an EISA bus. Not probing high ports.\n");
-#endif
-               return -ENXIO;
-       }
-
-       /* EISA spec allows for up to 16 slots, but 8 is typical. */
-       for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
-               if (!request_region(ioaddr, LNE390_IO_EXTENT, DRV_NAME))
-                       continue;
-               if (lne390_probe1(dev, ioaddr) == 0)
-                       return 0;
-               release_region(ioaddr, LNE390_IO_EXTENT);
-               dev->irq = irq;
-               dev->mem_start = mem_start;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init lne390_probe(int unit)
-{
-       struct net_device *dev = alloc_ei_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_lne390_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static int __init lne390_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, revision, ret;
-       unsigned long eisa_id;
-
-       if (inb_p(ioaddr + LNE390_ID_PORT) == 0xff) return -ENODEV;
-
-#if LNE390_DEBUG & LNE390_D_PROBE
-       printk("lne390-debug: probe at %#x, ID %#8x\n", ioaddr, inl(ioaddr + LNE390_ID_PORT));
-       printk("lne390-debug: config regs: %#x %#x\n",
-               inb(ioaddr + LNE390_CFG1), inb(ioaddr + LNE390_CFG2));
-#endif
-
-
-/*     Check the EISA ID of the card. */
-       eisa_id = inl(ioaddr + LNE390_ID_PORT);
-       if ((eisa_id != LNE390_ID0) && (eisa_id != LNE390_ID1)) {
-               return -ENODEV;
-       }
-
-       revision = (eisa_id >> 24) & 0x01;      /* 0 = rev A, 1 rev B */
-
-#if 0
-/*     Check the Mylex vendor ID as well. Not really required. */
-       if (inb(ioaddr + LNE390_SA_PROM + 0) != LNE390_ADDR0
-               || inb(ioaddr + LNE390_SA_PROM + 1) != LNE390_ADDR1
-               || inb(ioaddr + LNE390_SA_PROM + 2) != LNE390_ADDR2 ) {
-               printk("lne390.c: card not found");
-               for (i = 0; i < ETH_ALEN; i++)
-                       printk(" %02x", inb(ioaddr + LNE390_SA_PROM + i));
-               printk(" (invalid prefix).\n");
-               return -ENODEV;
-       }
-#endif
-
-       for (i = 0; i < ETH_ALEN; i++)
-               dev->dev_addr[i] = inb(ioaddr + LNE390_SA_PROM + i);
-       printk("lne390.c: LNE390%X in EISA slot %d, address %pM.\n",
-              0xa+revision, ioaddr/0x1000, dev->dev_addr);
-
-       printk("lne390.c: ");
-
-       /* Snarf the interrupt now. CFG file has them all listed as `edge' with share=NO */
-       if (dev->irq == 0) {
-               unsigned char irq_reg = inb(ioaddr + LNE390_CFG2) >> 3;
-               dev->irq = irq_map[irq_reg & 0x07];
-               printk("using");
-       } else {
-               /* This is useless unless we reprogram the card here too */
-               if (dev->irq == 2) dev->irq = 9;        /* Doh! */
-               printk("assigning");
-       }
-       printk(" IRQ %d,", dev->irq);
-
-       if ((ret = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev))) {
-               printk (" unable to get IRQ %d.\n", dev->irq);
-               return ret;
-       }
-
-       if (dev->mem_start == 0) {
-               unsigned char mem_reg = inb(ioaddr + LNE390_CFG2) & 0x07;
-
-               if (revision)   /* LNE390B */
-                       dev->mem_start = shmem_mapB[mem_reg] * 0x10000;
-               else            /* LNE390A */
-                       dev->mem_start = shmem_mapA[mem_reg] * 0x10000;
-               printk(" using ");
-       } else {
-               /* Should check for value in shmem_map and reprogram the card to use it */
-               dev->mem_start &= 0xfff0000;
-               printk(" assigning ");
-       }
-
-       printk("%dkB memory at physical address %#lx\n",
-                       LNE390_STOP_PG/4, dev->mem_start);
-
-       /*
-          BEWARE!! Some dain-bramaged EISA SCUs will allow you to put
-          the card mem within the region covered by `normal' RAM  !!!
-
-          ioremap() will fail in that case.
-       */
-       ei_status.mem = ioremap(dev->mem_start, LNE390_STOP_PG*0x100);
-       if (!ei_status.mem) {
-               printk(KERN_ERR "lne390.c: Unable to remap card memory above 1MB !!\n");
-               printk(KERN_ERR "lne390.c: Try using EISA SCU to set memory below 1MB.\n");
-               printk(KERN_ERR "lne390.c: Driver NOT installed.\n");
-               ret = -EAGAIN;
-               goto cleanup;
-       }
-       printk("lne390.c: remapped %dkB card memory to virtual address %p\n",
-                       LNE390_STOP_PG/4, ei_status.mem);
-
-       dev->mem_start = (unsigned long)ei_status.mem;
-       dev->mem_end = dev->mem_start + (LNE390_STOP_PG - LNE390_START_PG)*256;
-
-       /* The 8390 offset is zero for the LNE390 */
-       dev->base_addr = ioaddr;
-
-       ei_status.name = "LNE390";
-       ei_status.tx_start_page = LNE390_START_PG;
-       ei_status.rx_start_page = LNE390_START_PG + TX_PAGES;
-       ei_status.stop_page = LNE390_STOP_PG;
-       ei_status.word16 = 1;
-
-       if (ei_debug > 0)
-               printk(version);
-
-       ei_status.reset_8390 = &lne390_reset_8390;
-       ei_status.block_input = &lne390_block_input;
-       ei_status.block_output = &lne390_block_output;
-       ei_status.get_8390_hdr = &lne390_get_8390_hdr;
-
-       dev->netdev_ops = &ei_netdev_ops;
-       NS8390_init(dev, 0);
-
-       ret = register_netdev(dev);
-       if (ret)
-               goto unmap;
-       return 0;
-unmap:
-       if (ei_status.reg0)
-               iounmap(ei_status.mem);
-cleanup:
-       free_irq(dev->irq, dev);
-       return ret;
-}
-
-/*
- *     Reset as per the packet driver method. Judging by the EISA cfg
- *     file, this just toggles the "Board Enable" bits (bit 2 and 0).
- */
-
-static void lne390_reset_8390(struct net_device *dev)
-{
-       unsigned short ioaddr = dev->base_addr;
-
-       outb(0x04, ioaddr + LNE390_RESET_PORT);
-       if (ei_debug > 1) printk("%s: resetting the LNE390...", dev->name);
-
-       mdelay(2);
-
-       ei_status.txing = 0;
-       outb(0x01, ioaddr + LNE390_RESET_PORT);
-       if (ei_debug > 1) printk("reset done\n");
-}
-
-/*
- *     Note: In the following three functions is the implicit assumption
- *     that the associated memcpy will only use "rep; movsl" as long as
- *     we keep the counts as some multiple of doublewords. This is a
- *     requirement of the hardware, and also prevents us from using
- *     eth_io_copy_and_sum() since we can't guarantee it will limit
- *     itself to doubleword access.
- */
-
-/*
- *     Grab the 8390 specific header. Similar to the block_input routine, but
- *     we don't need to be concerned with ring wrap as the header will be at
- *     the start of a page, so we optimize accordingly. (A single doubleword.)
- */
-
-static void
-lne390_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       void __iomem *hdr_start = ei_status.mem + ((ring_page - LNE390_START_PG)<<8);
-       memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
-       hdr->count = (hdr->count + 3) & ~3;     /* Round up allocation. */
-}
-
-/*
- *     Block input and output are easy on shared memory ethercards, the only
- *     complication is when the ring buffer wraps. The count will already
- *     be rounded up to a doubleword value via lne390_get_8390_hdr() above.
- */
-
-static void lne390_block_input(struct net_device *dev, int count, struct sk_buff *skb,
-                                                 int ring_offset)
-{
-       void __iomem *xfer_start = ei_status.mem + ring_offset - (LNE390_START_PG<<8);
-
-       if (ring_offset + count > (LNE390_STOP_PG<<8)) {
-               /* Packet wraps over end of ring buffer. */
-               int semi_count = (LNE390_STOP_PG<<8) - ring_offset;
-               memcpy_fromio(skb->data, xfer_start, semi_count);
-               count -= semi_count;
-               memcpy_fromio(skb->data + semi_count,
-                       ei_status.mem + (TX_PAGES<<8), count);
-       } else {
-               /* Packet is in one chunk. */
-               memcpy_fromio(skb->data, xfer_start, count);
-       }
-}
-
-static void lne390_block_output(struct net_device *dev, int count,
-                               const unsigned char *buf, int start_page)
-{
-       void __iomem *shmem = ei_status.mem + ((start_page - LNE390_START_PG)<<8);
-
-       count = (count + 3) & ~3;     /* Round up to doubleword */
-       memcpy_toio(shmem, buf, count);
-}
-
-
-#ifdef MODULE
-#define MAX_LNE_CARDS  4       /* Max number of LNE390 cards per module */
-static struct net_device *dev_lne[MAX_LNE_CARDS];
-static int io[MAX_LNE_CARDS];
-static int irq[MAX_LNE_CARDS];
-static int mem[MAX_LNE_CARDS];
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(mem, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s)");
-MODULE_PARM_DESC(mem, "memory base address(es)");
-MODULE_DESCRIPTION("Mylex LNE390A/B EISA Ethernet driver");
-MODULE_LICENSE("GPL");
-
-int __init init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_LNE_CARDS; this_dev++) {
-               if (io[this_dev] == 0 && this_dev != 0)
-                       break;
-               dev = alloc_ei_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               dev->mem_start = mem[this_dev];
-               if (do_lne390_probe(dev) == 0) {
-                       dev_lne[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "lne390.c: No LNE390 card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       free_irq(dev->irq, dev);
-       release_region(dev->base_addr, LNE390_IO_EXTENT);
-       iounmap(ei_status.mem);
-}
-
-void __exit cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_LNE_CARDS; this_dev++) {
-               struct net_device *dev = dev_lne[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
-
index c0c127913dec6d471d75ae42be7d9e139329b867..587a885de259064cb2c07d25a5b12a1d8b9c08bf 100644 (file)
@@ -374,7 +374,6 @@ static int ne2k_pci_init_one(struct pci_dev *pdev,
        NS8390_init(dev, 0);
 
        memcpy(dev->dev_addr, SA_prom, dev->addr_len);
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        i = register_netdev(dev);
        if (i)
diff --git a/drivers/net/ethernet/8390/ne3210.c b/drivers/net/ethernet/8390/ne3210.c
deleted file mode 100644 (file)
index ebcdb52..0000000
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
-       ne3210.c
-
-       Linux driver for Novell NE3210 EISA Network Adapter
-
-       Copyright (C) 1998, Paul Gortmaker.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       Information and Code Sources:
-
-       1) Based upon my other EISA 8390 drivers (lne390, es3210, smc-ultra32)
-       2) The existing myriad of other Linux 8390 drivers by Donald Becker.
-       3) Info for getting IRQ and sh-mem gleaned from the EISA cfg file
-
-       The NE3210 is an EISA shared memory NS8390 implementation.  Shared
-       memory address > 1MB should work with this driver.
-
-       Note that the .cfg file (3/11/93, v1.0) has AUI and BNC switched
-       around (or perhaps there are some defective/backwards cards ???)
-
-       This driver WILL NOT WORK FOR THE NE3200 - it is completely different
-       and does not use an 8390 at all.
-
-       Updated to EISA probing API 5/2003 by Marc Zyngier.
-*/
-
-#include <linux/module.h>
-#include <linux/eisa.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/mm.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "ne3210"
-
-static void ne3210_reset_8390(struct net_device *dev);
-
-static void ne3210_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page);
-static void ne3210_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset);
-static void ne3210_block_output(struct net_device *dev, int count, const unsigned char *buf, const int start_page);
-
-#define NE3210_START_PG                0x00    /* First page of TX buffer      */
-#define NE3210_STOP_PG         0x80    /* Last page +1 of RX ring      */
-
-#define NE3210_IO_EXTENT       0x20
-#define NE3210_SA_PROM         0x16    /* Start of e'net addr.         */
-#define NE3210_RESET_PORT      0xc84
-#define NE3210_NIC_OFFSET      0x00    /* Hello, the 8390 is *here*    */
-
-#define NE3210_ADDR0           0x00    /* 3 byte vendor prefix         */
-#define NE3210_ADDR1           0x00
-#define NE3210_ADDR2           0x1b
-
-#define NE3210_CFG1            0xc84   /* NB: 0xc84 is also "reset" port. */
-#define NE3210_CFG2            0xc90
-#define NE3210_CFG_EXTENT       (NE3210_CFG2 - NE3210_CFG1 + 1)
-
-/*
- *     You can OR any of the following bits together and assign it
- *     to NE3210_DEBUG to get verbose driver info during operation.
- *     Currently only the probe one is implemented.
- */
-
-#define NE3210_D_PROBE 0x01
-#define NE3210_D_RX_PKT        0x02
-#define NE3210_D_TX_PKT        0x04
-#define NE3210_D_IRQ   0x08
-
-#define NE3210_DEBUG   0x0
-
-static unsigned char irq_map[] __initdata = {15, 12, 11, 10, 9, 7, 5, 3};
-static unsigned int shmem_map[] __initdata = {0xff0, 0xfe0, 0xfff0, 0xd8, 0xffe0, 0xffc0, 0xd0, 0x0};
-static const char * const ifmap[] __initconst = {"UTP", "?", "BNC", "AUI"};
-static int ifmap_val[] __initdata = {
-               IF_PORT_10BASET,
-               IF_PORT_UNKNOWN,
-               IF_PORT_10BASE2,
-               IF_PORT_AUI,
-};
-
-static int __init ne3210_eisa_probe (struct device *device)
-{
-       unsigned long ioaddr, phys_mem;
-       int i, retval, port_index;
-       struct eisa_device *edev = to_eisa_device (device);
-       struct net_device *dev;
-
-       /* Allocate dev->priv and fill in 8390 specific dev fields. */
-       if (!(dev = alloc_ei_netdev ())) {
-               printk ("ne3210.c: unable to allocate memory for dev!\n");
-               return -ENOMEM;
-       }
-
-       SET_NETDEV_DEV(dev, device);
-       dev_set_drvdata(device, dev);
-       ioaddr = edev->base_addr;
-
-       if (!request_region(ioaddr, NE3210_IO_EXTENT, DRV_NAME)) {
-               retval = -EBUSY;
-               goto out;
-       }
-
-       if (!request_region(ioaddr + NE3210_CFG1,
-                           NE3210_CFG_EXTENT, DRV_NAME)) {
-               retval = -EBUSY;
-               goto out1;
-       }
-
-#if NE3210_DEBUG & NE3210_D_PROBE
-       printk("ne3210-debug: probe at %#x, ID %s\n", ioaddr, edev->id.sig);
-       printk("ne3210-debug: config regs: %#x %#x\n",
-               inb(ioaddr + NE3210_CFG1), inb(ioaddr + NE3210_CFG2));
-#endif
-
-       port_index = inb(ioaddr + NE3210_CFG2) >> 6;
-       for (i = 0; i < ETH_ALEN; i++)
-               dev->dev_addr[i] = inb(ioaddr + NE3210_SA_PROM + i);
-       printk("ne3210.c: NE3210 in EISA slot %d, media: %s, addr: %pM.\n",
-               edev->slot, ifmap[port_index], dev->dev_addr);
-
-       /* Snarf the interrupt now. CFG file has them all listed as `edge' with share=NO */
-       dev->irq = irq_map[(inb(ioaddr + NE3210_CFG2) >> 3) & 0x07];
-       printk("ne3210.c: using IRQ %d, ", dev->irq);
-
-       retval = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev);
-       if (retval) {
-               printk (" unable to get IRQ %d.\n", dev->irq);
-               goto out2;
-       }
-
-       phys_mem = shmem_map[inb(ioaddr + NE3210_CFG2) & 0x07] * 0x1000;
-
-       /*
-          BEWARE!! Some dain-bramaged EISA SCUs will allow you to put
-          the card mem within the region covered by `normal' RAM  !!!
-       */
-       if (phys_mem > 1024*1024) {     /* phys addr > 1MB */
-               if (phys_mem < virt_to_phys(high_memory)) {
-                       printk(KERN_CRIT "ne3210.c: Card RAM overlaps with normal memory!!!\n");
-                       printk(KERN_CRIT "ne3210.c: Use EISA SCU to set card memory below 1MB,\n");
-                       printk(KERN_CRIT "ne3210.c: or to an address above 0x%llx.\n",
-                               (u64)virt_to_phys(high_memory));
-                       printk(KERN_CRIT "ne3210.c: Driver NOT installed.\n");
-                       retval = -EINVAL;
-                       goto out3;
-               }
-       }
-
-       if (!request_mem_region (phys_mem, NE3210_STOP_PG*0x100, DRV_NAME)) {
-               printk ("ne3210.c: Unable to request shared memory at physical address %#lx\n",
-                       phys_mem);
-               goto out3;
-       }
-
-       printk("%dkB memory at physical address %#lx\n",
-              NE3210_STOP_PG/4, phys_mem);
-
-       ei_status.mem = ioremap(phys_mem, NE3210_STOP_PG*0x100);
-       if (!ei_status.mem) {
-               printk(KERN_ERR "ne3210.c: Unable to remap card memory !!\n");
-               printk(KERN_ERR "ne3210.c: Driver NOT installed.\n");
-               retval = -EAGAIN;
-               goto out4;
-       }
-       printk("ne3210.c: remapped %dkB card memory to virtual address %p\n",
-              NE3210_STOP_PG/4, ei_status.mem);
-       dev->mem_start = (unsigned long)ei_status.mem;
-       dev->mem_end = dev->mem_start + (NE3210_STOP_PG - NE3210_START_PG)*256;
-
-       /* The 8390 offset is zero for the NE3210 */
-       dev->base_addr = ioaddr;
-
-       ei_status.name = "NE3210";
-       ei_status.tx_start_page = NE3210_START_PG;
-       ei_status.rx_start_page = NE3210_START_PG + TX_PAGES;
-       ei_status.stop_page = NE3210_STOP_PG;
-       ei_status.word16 = 1;
-       ei_status.priv = phys_mem;
-
-       if (ei_debug > 0)
-               printk("ne3210 loaded.\n");
-
-       ei_status.reset_8390 = &ne3210_reset_8390;
-       ei_status.block_input = &ne3210_block_input;
-       ei_status.block_output = &ne3210_block_output;
-       ei_status.get_8390_hdr = &ne3210_get_8390_hdr;
-
-       dev->netdev_ops = &ei_netdev_ops;
-
-       dev->if_port = ifmap_val[port_index];
-
-       if ((retval = register_netdev (dev)))
-               goto out5;
-
-       NS8390_init(dev, 0);
-       return 0;
-
- out5:
-       iounmap(ei_status.mem);
- out4:
-       release_mem_region (phys_mem, NE3210_STOP_PG*0x100);
- out3:
-       free_irq (dev->irq, dev);
- out2:
-       release_region (ioaddr + NE3210_CFG1, NE3210_CFG_EXTENT);
- out1:
-       release_region (ioaddr, NE3210_IO_EXTENT);
- out:
-       free_netdev (dev);
-
-       return retval;
-}
-
-static int ne3210_eisa_remove(struct device *device)
-{
-       struct net_device  *dev    = dev_get_drvdata(device);
-       unsigned long       ioaddr = to_eisa_device (device)->base_addr;
-
-       unregister_netdev (dev);
-       iounmap(ei_status.mem);
-       release_mem_region (ei_status.priv, NE3210_STOP_PG*0x100);
-       free_irq (dev->irq, dev);
-       release_region (ioaddr + NE3210_CFG1, NE3210_CFG_EXTENT);
-       release_region (ioaddr, NE3210_IO_EXTENT);
-       free_netdev (dev);
-
-       return 0;
-}
-
-/*
- *     Reset by toggling the "Board Enable" bits (bit 2 and 0).
- */
-
-static void ne3210_reset_8390(struct net_device *dev)
-{
-       unsigned short ioaddr = dev->base_addr;
-
-       outb(0x04, ioaddr + NE3210_RESET_PORT);
-       if (ei_debug > 1) printk("%s: resetting the NE3210...", dev->name);
-
-       mdelay(2);
-
-       ei_status.txing = 0;
-       outb(0x01, ioaddr + NE3210_RESET_PORT);
-       if (ei_debug > 1) printk("reset done\n");
-}
-
-/*
- *     Note: In the following three functions is the implicit assumption
- *     that the associated memcpy will only use "rep; movsl" as long as
- *     we keep the counts as some multiple of doublewords. This is a
- *     requirement of the hardware, and also prevents us from using
- *     eth_io_copy_and_sum() since we can't guarantee it will limit
- *     itself to doubleword access.
- */
-
-/*
- *     Grab the 8390 specific header. Similar to the block_input routine, but
- *     we don't need to be concerned with ring wrap as the header will be at
- *     the start of a page, so we optimize accordingly. (A single doubleword.)
- */
-
-static void
-ne3210_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       void __iomem *hdr_start = ei_status.mem + ((ring_page - NE3210_START_PG)<<8);
-       memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
-       hdr->count = (hdr->count + 3) & ~3;     /* Round up allocation. */
-}
-
-/*
- *     Block input and output are easy on shared memory ethercards, the only
- *     complication is when the ring buffer wraps. The count will already
- *     be rounded up to a doubleword value via ne3210_get_8390_hdr() above.
- */
-
-static void ne3210_block_input(struct net_device *dev, int count, struct sk_buff *skb,
-                                                 int ring_offset)
-{
-       void __iomem *start = ei_status.mem + ring_offset - NE3210_START_PG*256;
-
-       if (ring_offset + count > NE3210_STOP_PG*256) {
-               /* Packet wraps over end of ring buffer. */
-               int semi_count = NE3210_STOP_PG*256 - ring_offset;
-               memcpy_fromio(skb->data, start, semi_count);
-               count -= semi_count;
-               memcpy_fromio(skb->data + semi_count,
-                               ei_status.mem + TX_PAGES*256, count);
-       } else {
-               /* Packet is in one chunk. */
-               memcpy_fromio(skb->data, start, count);
-       }
-}
-
-static void ne3210_block_output(struct net_device *dev, int count,
-                               const unsigned char *buf, int start_page)
-{
-       void __iomem *shmem = ei_status.mem + ((start_page - NE3210_START_PG)<<8);
-
-       count = (count + 3) & ~3;     /* Round up to doubleword */
-       memcpy_toio(shmem, buf, count);
-}
-
-static struct eisa_device_id ne3210_ids[] = {
-       { "EGL0101" },
-       { "NVL1801" },
-       { "" },
-};
-MODULE_DEVICE_TABLE(eisa, ne3210_ids);
-
-static struct eisa_driver ne3210_eisa_driver = {
-       .id_table = ne3210_ids,
-       .driver   = {
-               .name   = "ne3210",
-               .probe  = ne3210_eisa_probe,
-               .remove = ne3210_eisa_remove,
-       },
-};
-
-MODULE_DESCRIPTION("NE3210 EISA Ethernet driver");
-MODULE_LICENSE("GPL");
-MODULE_DEVICE_TABLE(eisa, ne3210_ids);
-
-static int ne3210_init(void)
-{
-       return eisa_driver_register (&ne3210_eisa_driver);
-}
-
-static void ne3210_cleanup(void)
-{
-       eisa_driver_unregister (&ne3210_eisa_driver);
-}
-
-module_init (ne3210_init);
-module_exit (ne3210_cleanup);
diff --git a/drivers/net/ethernet/8390/smc-ultra32.c b/drivers/net/ethernet/8390/smc-ultra32.c
deleted file mode 100644 (file)
index 923e42a..0000000
+++ /dev/null
@@ -1,463 +0,0 @@
-/*     smc-ultra32.c: An SMC Ultra32 EISA ethernet driver for linux.
-
-Sources:
-
-       This driver is based on (cloned from) the ISA SMC Ultra driver
-       written by Donald Becker. Modifications to support the EISA
-       version of the card by Paul Gortmaker and Leonard N. Zubkoff.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-Theory of Operation:
-
-       The SMC Ultra32C card uses the SMC 83c790 chip which is also
-       found on the ISA SMC Ultra cards. It has a shared memory mode of
-       operation that makes it similar to the ISA version of the card.
-       The main difference is that the EISA card has 32KB of RAM, but
-       only an 8KB window into that memory. The EISA card also can be
-       set for a bus-mastering mode of operation via the ECU, but that
-       is not (and probably will never be) supported by this driver.
-       The ECU should be run to enable shared memory and to disable the
-       bus-mastering feature for use with linux.
-
-       By programming the 8390 to use only 8KB RAM, the modifications
-       to the ISA driver can be limited to the probe and initialization
-       code. This allows easy integration of EISA support into the ISA
-       driver. However, the driver development kit from SMC provided the
-       register information for sliding the 8KB window, and hence the 8390
-       is programmed to use the full 32KB RAM.
-
-       Unfortunately this required code changes outside the probe/init
-       routines, and thus we decided to separate the EISA driver from
-       the ISA one. In this way, ISA users don't end up with a larger
-       driver due to the EISA code, and EISA users don't end up with a
-       larger driver due to the ISA EtherEZ PIO code. The driver is
-       similar to the 3c503/16 driver, in that the window must be set
-       back to the 1st 8KB of space for access to the two 8390 Tx slots.
-
-       In testing, using only 8KB RAM (3 Tx / 5 Rx) didn't appear to
-       be a limiting factor, since the EISA bus could get packets off
-       the card fast enough, but having the use of lots of RAM as Rx
-       space is extra insurance if interrupt latencies become excessive.
-
-*/
-
-static const char *version = "smc-ultra32.c: 06/97 v1.00\n";
-
-
-#include <linux/module.h>
-#include <linux/eisa.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "smc-ultra32"
-
-static int ultra32_probe1(struct net_device *dev, int ioaddr);
-static int ultra32_open(struct net_device *dev);
-static void ultra32_reset_8390(struct net_device *dev);
-static void ultra32_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                int ring_page);
-static void ultra32_block_input(struct net_device *dev, int count,
-                               struct sk_buff *skb, int ring_offset);
-static void ultra32_block_output(struct net_device *dev, int count,
-                                const unsigned char *buf,
-                                const int start_page);
-static int ultra32_close(struct net_device *dev);
-
-#define ULTRA32_CMDREG 0       /* Offset to ASIC command register. */
-#define         ULTRA32_RESET  0x80    /* Board reset, in ULTRA32_CMDREG. */
-#define         ULTRA32_MEMENB 0x40    /* Enable the shared memory. */
-#define ULTRA32_NIC_OFFSET 16  /* NIC register offset from the base_addr. */
-#define ULTRA32_IO_EXTENT 32
-#define EN0_ERWCNT             0x08    /* Early receive warning count. */
-
-/*
- * Defines that apply only to the Ultra32 EISA card. Note that
- * "smc" = 10011 01101 00011 = 0x4da3, and hence !smc8010.cfg translates
- * into an EISA ID of 0x1080A34D
- */
-#define ULTRA32_BASE   0xca0
-#define ULTRA32_ID     0x1080a34d
-#define ULTRA32_IDPORT (-0x20) /* 0xc80 */
-/* Config regs 1->7 from the EISA !SMC8010.CFG file. */
-#define ULTRA32_CFG1   0x04    /* 0xca4 */
-#define ULTRA32_CFG2   0x05    /* 0xca5 */
-#define ULTRA32_CFG3   (-0x18) /* 0xc88 */
-#define ULTRA32_CFG4   (-0x17) /* 0xc89 */
-#define ULTRA32_CFG5   (-0x16) /* 0xc8a */
-#define ULTRA32_CFG6   (-0x15) /* 0xc8b */
-#define ULTRA32_CFG7   0x0d    /* 0xcad */
-
-static void cleanup_card(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET;
-       /* NB: ultra32_close_card() does free_irq */
-       release_region(ioaddr, ULTRA32_IO_EXTENT);
-       iounmap(ei_status.mem);
-}
-
-/*     Probe for the Ultra32.  This looks like a 8013 with the station
-       address PROM at I/O ports <base>+8 to <base>+13, with a checksum
-       following.
-*/
-
-struct net_device * __init ultra32_probe(int unit)
-{
-       struct net_device *dev;
-       int base;
-       int irq;
-       int err = -ENODEV;
-
-       if (!EISA_bus)
-               return ERR_PTR(-ENODEV);
-
-       dev = alloc_ei_netdev();
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-       }
-
-       irq = dev->irq;
-
-       /* EISA spec allows for up to 16 slots, but 8 is typical. */
-       for (base = 0x1000 + ULTRA32_BASE; base < 0x9000; base += 0x1000) {
-               if (ultra32_probe1(dev, base) == 0)
-                       break;
-               dev->irq = irq;
-       }
-       if (base >= 0x9000)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-       cleanup_card(dev);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-
-static const struct net_device_ops ultra32_netdev_ops = {
-       .ndo_open               = ultra32_open,
-       .ndo_stop               = ultra32_close,
-       .ndo_start_xmit         = ei_start_xmit,
-       .ndo_tx_timeout         = ei_tx_timeout,
-       .ndo_get_stats          = ei_get_stats,
-       .ndo_set_rx_mode        = ei_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = ei_poll,
-#endif
-};
-
-static int __init ultra32_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, edge, media, retval;
-       int checksum = 0;
-       const char *model_name;
-       static unsigned version_printed;
-       /* Values from various config regs. */
-       unsigned char idreg;
-       unsigned char reg4;
-       const char *ifmap[] = {"UTP No Link", "", "UTP/AUI", "UTP/BNC"};
-
-       if (!request_region(ioaddr, ULTRA32_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       if (inb(ioaddr + ULTRA32_IDPORT) == 0xff ||
-           inl(ioaddr + ULTRA32_IDPORT) != ULTRA32_ID) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       media = inb(ioaddr + ULTRA32_CFG7) & 0x03;
-       edge = inb(ioaddr + ULTRA32_CFG5) & 0x08;
-       printk("SMC Ultra32 in EISA Slot %d, Media: %s, %s IRQs.\n",
-               ioaddr >> 12, ifmap[media],
-               (edge ? "Edge Triggered" : "Level Sensitive"));
-
-       idreg = inb(ioaddr + 7);
-       reg4 = inb(ioaddr + 4) & 0x7f;
-
-       /* Check the ID nibble. */
-       if ((idreg & 0xf0) != 0x20) {                   /* SMC Ultra */
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /* Select the station address register set. */
-       outb(reg4, ioaddr + 4);
-
-       for (i = 0; i < 8; i++)
-               checksum += inb(ioaddr + 8 + i);
-       if ((checksum & 0xff) != 0xff) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       if (ei_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       model_name = "SMC Ultra32";
-
-       for (i = 0; i < 6; i++)
-               dev->dev_addr[i] = inb(ioaddr + 8 + i);
-
-       printk("%s: %s at 0x%X, %pM",
-              dev->name, model_name, ioaddr, dev->dev_addr);
-
-       /* Switch from the station address to the alternate register set and
-          read the useful registers there. */
-       outb(0x80 | reg4, ioaddr + 4);
-
-       /* Enable FINE16 mode to avoid BIOS ROM width mismatches @ reboot. */
-       outb(0x80 | inb(ioaddr + 0x0c), ioaddr + 0x0c);
-
-       /* Reset RAM addr. */
-       outb(0x00, ioaddr + 0x0b);
-
-       /* Switch back to the station address register set so that the
-          MS-DOS driver can find the card after a warm boot. */
-       outb(reg4, ioaddr + 4);
-
-       if ((inb(ioaddr + ULTRA32_CFG5) & 0x40) == 0) {
-               printk("\nsmc-ultra32: Card RAM is disabled!  "
-                      "Run EISA config utility.\n");
-               retval = -ENODEV;
-               goto out;
-       }
-       if ((inb(ioaddr + ULTRA32_CFG2) & 0x04) == 0)
-               printk("\nsmc-ultra32: Ignoring Bus-Master enable bit.  "
-                      "Run EISA config utility.\n");
-
-       if (dev->irq < 2) {
-               unsigned char irqmap[] = {0, 9, 3, 5, 7, 10, 11, 15};
-               int irq = irqmap[inb(ioaddr + ULTRA32_CFG5) & 0x07];
-               if (irq == 0) {
-                       printk(", failed to detect IRQ line.\n");
-                       retval = -EAGAIN;
-                       goto out;
-               }
-               dev->irq = irq;
-       }
-
-       /* The 8390 isn't at the base address, so fake the offset */
-       dev->base_addr = ioaddr + ULTRA32_NIC_OFFSET;
-
-       /* Save RAM address in the unused reg0 to avoid excess inb's. */
-       ei_status.reg0 = inb(ioaddr + ULTRA32_CFG3) & 0xfc;
-
-       dev->mem_start =  0xc0000 + ((ei_status.reg0 & 0x7c) << 11);
-
-       ei_status.name = model_name;
-       ei_status.word16 = 1;
-       ei_status.tx_start_page = 0;
-       ei_status.rx_start_page = TX_PAGES;
-       /* All Ultra32 cards have 32KB memory with an 8KB window. */
-       ei_status.stop_page = 128;
-
-       ei_status.mem = ioremap(dev->mem_start, 0x2000);
-       if (!ei_status.mem) {
-               printk(", failed to ioremap.\n");
-               retval = -ENOMEM;
-               goto out;
-       }
-       dev->mem_end = dev->mem_start + 0x1fff;
-
-       printk(", IRQ %d, 32KB memory, 8KB window at 0x%lx-0x%lx.\n",
-              dev->irq, dev->mem_start, dev->mem_end);
-       ei_status.block_input = &ultra32_block_input;
-       ei_status.block_output = &ultra32_block_output;
-       ei_status.get_8390_hdr = &ultra32_get_8390_hdr;
-       ei_status.reset_8390 = &ultra32_reset_8390;
-
-       dev->netdev_ops = &ultra32_netdev_ops;
-       NS8390_init(dev, 0);
-
-       return 0;
-out:
-       release_region(ioaddr, ULTRA32_IO_EXTENT);
-       return retval;
-}
-
-static int ultra32_open(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET; /* ASIC addr */
-       int irq_flags = (inb(ioaddr + ULTRA32_CFG5) & 0x08) ? 0 : IRQF_SHARED;
-       int retval;
-
-       retval = request_irq(dev->irq, ei_interrupt, irq_flags, dev->name, dev);
-       if (retval)
-               return retval;
-
-       outb(ULTRA32_MEMENB, ioaddr); /* Enable Shared Memory. */
-       outb(0x80, ioaddr + ULTRA32_CFG6); /* Enable Interrupts. */
-       outb(0x84, ioaddr + 5); /* Enable MEM16 & Disable Bus Master. */
-       outb(0x01, ioaddr + 6); /* Enable Interrupts. */
-       /* Set the early receive warning level in window 0 high enough not
-          to receive ERW interrupts. */
-       outb_p(E8390_NODMA+E8390_PAGE0, dev->base_addr);
-       outb(0xff, dev->base_addr + EN0_ERWCNT);
-       ei_open(dev);
-       return 0;
-}
-
-static int ultra32_close(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET; /* CMDREG */
-
-       netif_stop_queue(dev);
-
-       if (ei_debug > 1)
-               printk("%s: Shutting down ethercard.\n", dev->name);
-
-       outb(0x00, ioaddr + ULTRA32_CFG6); /* Disable Interrupts. */
-       outb(0x00, ioaddr + 6);         /* Disable interrupts. */
-       free_irq(dev->irq, dev);
-
-       NS8390_init(dev, 0);
-
-       return 0;
-}
-
-static void ultra32_reset_8390(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET; /* ASIC base addr */
-
-       outb(ULTRA32_RESET, ioaddr);
-       if (ei_debug > 1) printk("resetting Ultra32, t=%ld...", jiffies);
-       ei_status.txing = 0;
-
-       outb(ULTRA32_MEMENB, ioaddr); /* Enable Shared Memory. */
-       outb(0x80, ioaddr + ULTRA32_CFG6); /* Enable Interrupts. */
-       outb(0x84, ioaddr + 5); /* Enable MEM16 & Disable Bus Master. */
-       outb(0x01, ioaddr + 6); /* Enable Interrupts. */
-       if (ei_debug > 1) printk("reset done\n");
-}
-
-/* Grab the 8390 specific header. Similar to the block_input routine, but
-   we don't need to be concerned with ring wrap as the header will be at
-   the start of a page, so we optimize accordingly. */
-
-static void ultra32_get_8390_hdr(struct net_device *dev,
-                                struct e8390_pkt_hdr *hdr,
-                                int ring_page)
-{
-       void __iomem *hdr_start = ei_status.mem + ((ring_page & 0x1f) << 8);
-       unsigned int RamReg = dev->base_addr - ULTRA32_NIC_OFFSET + ULTRA32_CFG3;
-
-       /* Select correct 8KB Window. */
-       outb(ei_status.reg0 | ((ring_page & 0x60) >> 5), RamReg);
-
-#ifdef __BIG_ENDIAN
-       /* Officially this is what we are doing, but the readl() is faster */
-       /* unfortunately it isn't endian aware of the struct               */
-       memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
-       hdr->count = le16_to_cpu(hdr->count);
-#else
-       ((unsigned int*)hdr)[0] = readl(hdr_start);
-#endif
-}
-
-/* Block input and output are easy on shared memory ethercards, the only
-   complication is when the ring buffer wraps, or in this case, when a
-   packet spans an 8KB boundary. Note that the current 8KB segment is
-   already set by the get_8390_hdr routine. */
-
-static void ultra32_block_input(struct net_device *dev,
-                               int count,
-                               struct sk_buff *skb,
-                               int ring_offset)
-{
-       void __iomem *xfer_start = ei_status.mem + (ring_offset & 0x1fff);
-       unsigned int RamReg = dev->base_addr - ULTRA32_NIC_OFFSET + ULTRA32_CFG3;
-
-       if ((ring_offset & ~0x1fff) != ((ring_offset + count - 1) & ~0x1fff)) {
-               int semi_count = 8192 - (ring_offset & 0x1FFF);
-               memcpy_fromio(skb->data, xfer_start, semi_count);
-               count -= semi_count;
-               if (ring_offset < 96*256) {
-                       /* Select next 8KB Window. */
-                       ring_offset += semi_count;
-                       outb(ei_status.reg0 | ((ring_offset & 0x6000) >> 13), RamReg);
-                       memcpy_fromio(skb->data + semi_count, ei_status.mem, count);
-               } else {
-                       /* Select first 8KB Window. */
-                       outb(ei_status.reg0, RamReg);
-                       memcpy_fromio(skb->data + semi_count, ei_status.mem + TX_PAGES * 256, count);
-               }
-       } else {
-               memcpy_fromio(skb->data, xfer_start, count);
-       }
-}
-
-static void ultra32_block_output(struct net_device *dev,
-                                int count,
-                                const unsigned char *buf,
-                                int start_page)
-{
-       void __iomem *xfer_start = ei_status.mem + (start_page<<8);
-       unsigned int RamReg = dev->base_addr - ULTRA32_NIC_OFFSET + ULTRA32_CFG3;
-
-       /* Select first 8KB Window. */
-       outb(ei_status.reg0, RamReg);
-
-       memcpy_toio(xfer_start, buf, count);
-}
-
-#ifdef MODULE
-#define MAX_ULTRA32_CARDS   4  /* Max number of Ultra cards per module */
-static struct net_device *dev_ultra[MAX_ULTRA32_CARDS];
-
-MODULE_DESCRIPTION("SMC Ultra32 EISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-int __init init_module(void)
-{
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_ULTRA32_CARDS; this_dev++) {
-               struct net_device *dev = ultra32_probe(-1);
-               if (IS_ERR(dev))
-                       break;
-               dev_ultra[found++] = dev;
-       }
-       if (found)
-               return 0;
-       printk(KERN_WARNING "smc-ultra32.c: No SMC Ultra32 found.\n");
-       return -ENXIO;
-}
-
-void __exit cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_ULTRA32_CARDS; this_dev++) {
-               struct net_device *dev = dev_ultra[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
-
index e4ff38949112d8f245df2e481c28ba0ac7ede17c..ed956e08d38b1d835f233b4f1ba7698f75447c1b 100644 (file)
@@ -135,7 +135,6 @@ config ETHOC
 source "drivers/net/ethernet/packetengines/Kconfig"
 source "drivers/net/ethernet/pasemi/Kconfig"
 source "drivers/net/ethernet/qlogic/Kconfig"
-source "drivers/net/ethernet/racal/Kconfig"
 source "drivers/net/ethernet/realtek/Kconfig"
 source "drivers/net/ethernet/renesas/Kconfig"
 source "drivers/net/ethernet/rdc/Kconfig"
index d4473072654abcf0da782651a76c8d036f1fca9a..8268d85f944849b904ca44b749d3b5eb72b6e363 100644 (file)
@@ -53,7 +53,6 @@ obj-$(CONFIG_ETHOC) += ethoc.o
 obj-$(CONFIG_NET_PACKET_ENGINE) += packetengines/
 obj-$(CONFIG_NET_VENDOR_PASEMI) += pasemi/
 obj-$(CONFIG_NET_VENDOR_QLOGIC) += qlogic/
-obj-$(CONFIG_NET_VENDOR_RACAL) += racal/
 obj-$(CONFIG_NET_VENDOR_REALTEK) += realtek/
 obj-$(CONFIG_SH_ETH) += renesas/
 obj-$(CONFIG_NET_VENDOR_RDC) += rdc/
index e49c0eff040b50a95bdacc050f8ff3a83f172a8e..a9481606bbcd713f6fa446325521b2309b64c856 100644 (file)
@@ -61,6 +61,7 @@ config BFIN_RX_DESC_NUM
 
 config BFIN_MAC_USE_HWSTAMP
        bool "Use IEEE 1588 hwstamp"
+       depends on BFIN_MAC && BF518
        select PTP_1588_CLOCK
        default y
        ---help---
index c7a83f6f2382cf7f8095e99f2af24af23da5cf94..a175d0be1ae1a23e1c2f0fc920efd039a65b02ba 100644 (file)
@@ -425,8 +425,8 @@ static int mii_probe(struct net_device *dev, int phy_mode)
                return -EINVAL;
        }
 
-       phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link,
-                       0, phy_mode);
+       phydev = phy_connect(dev, dev_name(&phydev->dev),
+                            &bfin_mac_adjust_link, phy_mode);
 
        if (IS_ERR(phydev)) {
                netdev_err(dev, "could not attach PHY\n");
index 480662ba5227a44588f0e4ef05f35767548cf084..0be2195e50340c24c5c2f5403b2f32b12c403c8e 100644 (file)
@@ -1288,9 +1288,7 @@ static int greth_mdio_probe(struct net_device *dev)
        }
 
        ret = phy_connect_direct(dev, phy, &greth_link_change,
-                       0, greth->gbit_mac ?
-                       PHY_INTERFACE_MODE_GMII :
-                       PHY_INTERFACE_MODE_MII);
+                                greth->gbit_mac ? PHY_INTERFACE_MODE_GMII : PHY_INTERFACE_MODE_MII);
        if (ret) {
                if (netif_msg_ifup(greth))
                        dev_err(&dev->dev, "could not attach to PHY\n");
index 304613302f0102274040b5fecf80cef7cca077ef..13d74aa4033dd44164dada90d0173efe526f9c16 100644 (file)
@@ -105,19 +105,6 @@ config DECLANCE
          DEC (now Compaq) based on the AMD LANCE chipset, including the
          DEPCA series.  (This chipset is better known via the NE2100 cards.)
 
-config DEPCA
-       tristate "DEPCA, DE10x, DE200, DE201, DE202, DE422 support"
-       depends on (ISA || EISA)
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto> as well as
-         <file:drivers/net/ethernet/amd/depca.c>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called depca.
-
 config HPLANCE
        bool "HP on-board LANCE support"
        depends on DIO
index 175caa5328c96b389476cdb5da99511b14dac810..cdd4301a973dc388a6d7f1d2a7ed5325f87d6e6b 100644 (file)
@@ -8,7 +8,6 @@ obj-$(CONFIG_ARM_AM79C961A) += am79c961a.o
 obj-$(CONFIG_ARIADNE) += ariadne.o
 obj-$(CONFIG_ATARILANCE) += atarilance.o
 obj-$(CONFIG_DECLANCE) += declance.o
-obj-$(CONFIG_DEPCA) += depca.o
 obj-$(CONFIG_HPLANCE) += hplance.o 7990.o
 obj-$(CONFIG_LANCE) += lance.o
 obj-$(CONFIG_MIPS_AU1X00_ENET) += au1000_eth.o
index 65b865a0cc78f2bb2e8ee0bb4d2103a08aa67b64..de774d419144c1fb86ea558b087a627f9f04a6dc 100644 (file)
@@ -437,8 +437,8 @@ static int au1000_mii_probe(struct net_device *dev)
        /* now we are supposed to have a proper phydev, to attach to... */
        BUG_ON(phydev->attached_dev);
 
-       phydev = phy_connect(dev, dev_name(&phydev->dev), &au1000_adjust_link,
-                       0, PHY_INTERFACE_MODE_MII);
+       phydev = phy_connect(dev, dev_name(&phydev->dev),
+                            &au1000_adjust_link, PHY_INTERFACE_MODE_MII);
 
        if (IS_ERR(phydev)) {
                netdev_err(dev, "Could not attach to PHY\n");
diff --git a/drivers/net/ethernet/amd/depca.c b/drivers/net/ethernet/amd/depca.c
deleted file mode 100644 (file)
index 34a4853..0000000
+++ /dev/null
@@ -1,1910 +0,0 @@
-/*  depca.c: A DIGITAL DEPCA & EtherWORKS ethernet driver for linux.
-
-    Written 1994, 1995 by David C. Davies.
-
-
-                      Copyright 1994 David C. Davies
-                                  and
-                        United States Government
-        (as represented by the Director, National Security Agency).
-
-               Copyright 1995  Digital Equipment Corporation.
-
-
-    This software may be used and distributed according to the terms of
-    the GNU General Public License, incorporated herein by reference.
-
-    This driver is written for the Digital Equipment Corporation series
-    of DEPCA and EtherWORKS ethernet cards:
-
-        DEPCA       (the original)
-       DE100
-       DE101
-       DE200 Turbo
-       DE201 Turbo
-       DE202 Turbo (TP BNC)
-       DE210
-       DE422       (EISA)
-
-    The  driver has been tested on DE100, DE200 and DE202 cards  in  a
-    relatively busy network. The DE422 has been tested a little.
-
-    This  driver will NOT work   for the DE203,  DE204  and DE205 series  of
-    cards,  since they have  a  new custom ASIC in   place of the AMD  LANCE
-    chip.  See the 'ewrk3.c'   driver in the  Linux  source tree for running
-    those cards.
-
-    I have benchmarked the driver with a  DE100 at 595kB/s to (542kB/s from)
-    a DECstation 5000/200.
-
-    The author may be reached at davies@maniac.ultranet.com
-
-    =========================================================================
-
-    The  driver was originally based  on   the 'lance.c' driver from  Donald
-    Becker   which  is included with  the  standard  driver distribution for
-    linux.  V0.4  is  a complete  re-write  with only  the kernel  interface
-    remaining from the original code.
-
-    1) Lance.c code in /linux/drivers/net/
-    2) "Ethernet/IEEE 802.3 Family. 1992 World Network Data Book/Handbook",
-       AMD, 1992 [(800) 222-9323].
-    3) "Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE)",
-       AMD, Pub. #17881, May 1993.
-    4) "Am79C960 PCnet-ISA(tm), Single-Chip Ethernet Controller for ISA",
-       AMD, Pub. #16907, May 1992
-    5) "DEC EtherWORKS LC Ethernet Controller Owners Manual",
-       Digital Equipment corporation, 1990, Pub. #EK-DE100-OM.003
-    6) "DEC EtherWORKS Turbo Ethernet Controller Owners Manual",
-       Digital Equipment corporation, 1990, Pub. #EK-DE200-OM.003
-    7) "DEPCA Hardware Reference Manual", Pub. #EK-DEPCA-PR
-       Digital Equipment Corporation, 1989
-    8) "DEC EtherWORKS Turbo_(TP BNC) Ethernet Controller Owners Manual",
-       Digital Equipment corporation, 1991, Pub. #EK-DE202-OM.001
-
-
-    Peter Bauer's depca.c (V0.5) was referred to when debugging V0.1 of this
-    driver.
-
-    The original DEPCA  card requires that the  ethernet ROM address counter
-    be enabled to count and has an 8 bit NICSR.  The ROM counter enabling is
-    only  done when a  0x08 is read as the  first address octet (to minimise
-    the chances  of writing over some  other hardware's  I/O register).  The
-    NICSR accesses   have been changed  to  byte accesses  for all the cards
-    supported by this driver, since there is only one  useful bit in the MSB
-    (remote boot timeout) and it  is not used.  Also, there  is a maximum of
-    only 48kB network  RAM for this  card.  My thanks  to Torbjorn Lindh for
-    help debugging all this (and holding my feet to  the fire until I got it
-    right).
-
-    The DE200  series  boards have  on-board 64kB  RAM for  use  as a shared
-    memory network  buffer. Only the DE100  cards make use  of a  2kB buffer
-    mode which has not  been implemented in  this driver (only the 32kB  and
-    64kB modes are supported [16kB/48kB for the original DEPCA]).
-
-    At the most only 2 DEPCA cards can  be supported on  the ISA bus because
-    there is only provision  for two I/O base addresses  on each card (0x300
-    and 0x200). The I/O address is detected by searching for a byte sequence
-    in the Ethernet station address PROM at the expected I/O address for the
-    Ethernet  PROM.   The shared memory  base   address  is 'autoprobed'  by
-    looking  for the self  test PROM  and detecting the  card name.   When a
-    second  DEPCA is  detected,  information  is   placed in the   base_addr
-    variable of the  next device structure (which  is created if necessary),
-    thus  enabling ethif_probe  initialization  for the device.  More than 2
-    EISA cards can  be  supported, but  care will  be  needed assigning  the
-    shared memory to ensure that each slot has the  correct IRQ, I/O address
-    and shared memory address assigned.
-
-    ************************************************************************
-
-    NOTE: If you are using two  ISA DEPCAs, it is  important that you assign
-    the base memory addresses correctly.   The  driver autoprobes I/O  0x300
-    then 0x200.  The  base memory address for  the first device must be less
-    than that of the second so that the auto probe will correctly assign the
-    I/O and memory addresses on the same card.  I can't think of a way to do
-    this unambiguously at the moment, since there is nothing on the cards to
-    tie I/O and memory information together.
-
-    I am unable  to  test  2 cards   together for now,    so this  code   is
-    unchecked. All reports, good or bad, are welcome.
-
-    ************************************************************************
-
-    The board IRQ   setting must be  at an  unused IRQ which  is auto-probed
-    using Donald Becker's autoprobe routines. DEPCA and DE100 board IRQs are
-    {2,3,4,5,7}, whereas the  DE200 is at {5,9,10,11,15}.  Note that IRQ2 is
-    really IRQ9 in machines with 16 IRQ lines.
-
-    No 16MB memory  limitation should exist with this  driver as DMA is  not
-    used and the common memory area is in low memory on the network card (my
-    current system has 20MB and I've not had problems yet).
-
-    The ability to load this driver as a loadable module has been added. To
-    utilise this ability, you have to do <8 things:
-
-    0) have a copy of the loadable modules code installed on your system.
-    1) copy depca.c from the  /linux/drivers/net directory to your favourite
-    temporary directory.
-    2) if you wish, edit the  source code near  line 1530 to reflect the I/O
-    address and IRQ you're using (see also 5).
-    3) compile  depca.c, but include -DMODULE in  the command line to ensure
-    that the correct bits are compiled (see end of source code).
-    4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
-    kernel with the depca configuration turned off and reboot.
-    5) insmod depca.o [irq=7] [io=0x200] [mem=0xd0000] [adapter_name=DE100]
-       [Alan Cox: Changed the code to allow command line irq/io assignments]
-       [Dave Davies: Changed the code to allow command line mem/name
-                                                                assignments]
-    6) run the net startup bits for your eth?? interface manually
-    (usually /etc/rc.inet[12] at boot time).
-    7) enjoy!
-
-    Note that autoprobing is not allowed in loadable modules - the system is
-    already up and running and you're messing with interrupts.
-
-    To unload a module, turn off the associated interface
-    'ifconfig eth?? down' then 'rmmod depca'.
-
-    To assign a base memory address for the shared memory  when running as a
-    loadable module, see 5 above.  To include the adapter  name (if you have
-    no PROM  but know the card name)  also see 5  above. Note that this last
-    option  will not work  with kernel  built-in  depca's.
-
-    The shared memory assignment for a loadable module  makes sense to avoid
-    the 'memory autoprobe' picking the wrong shared memory  (for the case of
-    2 depca's in a PC).
-
-    ************************************************************************
-    Support for MCA EtherWORKS cards added 11-3-98. (MCA since deleted)
-    Verified to work with up to 2 DE212 cards in a system (although not
-      fully stress-tested).
-
-    Revision History
-    ----------------
-
-    Version   Date        Description
-
-      0.1     25-jan-94   Initial writing.
-      0.2     27-jan-94   Added LANCE TX hardware buffer chaining.
-      0.3      1-feb-94   Added multiple DEPCA support.
-      0.31     4-feb-94   Added DE202 recognition.
-      0.32    19-feb-94   Tidy up. Improve multi-DEPCA support.
-      0.33    25-feb-94   Fix DEPCA ethernet ROM counter enable.
-                          Add jabber packet fix from murf@perftech.com
-                         and becker@super.org
-      0.34     7-mar-94   Fix DEPCA max network memory RAM & NICSR access.
-      0.35     8-mar-94   Added DE201 recognition. Tidied up.
-      0.351   30-apr-94   Added EISA support. Added DE422 recognition.
-      0.36    16-may-94   DE422 fix released.
-      0.37    22-jul-94   Added MODULE support
-      0.38    15-aug-94   Added DBR ROM switch in depca_close().
-                          Multi DEPCA bug fix.
-      0.38axp 15-sep-94   Special version for Alpha AXP Linux V1.0.
-      0.381   12-dec-94   Added DE101 recognition, fix multicast bug.
-      0.382    9-feb-95   Fix recognition bug reported by <bkm@star.rl.ac.uk>.
-      0.383   22-feb-95   Fix for conflict with VESA SCSI reported by
-                          <stromain@alf.dec.com>
-      0.384   17-mar-95   Fix a ring full bug reported by <bkm@star.rl.ac.uk>
-      0.385    3-apr-95   Fix a recognition bug reported by
-                                                <ryan.niemi@lastfrontier.com>
-      0.386   21-apr-95   Fix the last fix...sorry, must be galloping senility
-      0.40    25-May-95   Rewrite for portability & updated.
-                          ALPHA support from <jestabro@amt.tay1.dec.com>
-      0.41    26-Jun-95   Added verify_area() calls in depca_ioctl() from
-                          suggestion by <heiko@colossus.escape.de>
-      0.42    27-Dec-95   Add 'mem' shared memory assignment for loadable
-                          modules.
-                          Add 'adapter_name' for loadable modules when no PROM.
-                         Both above from a suggestion by
-                         <pchen@woodruffs121.residence.gatech.edu>.
-                         Add new multicasting code.
-      0.421   22-Apr-96          Fix alloc_device() bug <jari@markkus2.fimr.fi>
-      0.422   29-Apr-96          Fix depca_hw_init() bug <jari@markkus2.fimr.fi>
-      0.423    7-Jun-96   Fix module load bug <kmg@barco.be>
-      0.43    16-Aug-96   Update alloc_device() to conform to de4x5.c
-      0.44     1-Sep-97   Fix *_probe() to test check_region() first - bug
-                           reported by <mmogilvi@elbert.uccs.edu>
-      0.45     3-Nov-98   Added support for MCA EtherWORKS (DE210/DE212) cards
-                           by <tymm@computer.org>
-      0.451    5-Nov-98   Fixed mca stuff cuz I'm a dummy. <tymm@computer.org>
-      0.5     14-Nov-98   Re-spin for 2.1.x kernels.
-      0.51    27-Jun-99   Correct received packet length for CRC from
-                           report by <worm@dkik.dk>
-      0.52    16-Oct-00   Fixes for 2.3 io memory accesses
-                          Fix show-stopper (ints left masked) in depca_interrupt
-                          by <peterd@pnd-pc.demon.co.uk>
-      0.53    12-Jan-01          Release resources on failure, bss tidbits
-                          by acme@conectiva.com.br
-      0.54    08-Nov-01          use library crc32 functions
-                          by Matt_Domsch@dell.com
-      0.55    01-Mar-03   Use EISA/sysfs framework <maz@wild-wind.fr.eu.org>
-
-    =========================================================================
-*/
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/crc32.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/time.h>
-#include <linux/types.h>
-#include <linux/unistd.h>
-#include <linux/ctype.h>
-#include <linux/moduleparam.h>
-#include <linux/platform_device.h>
-#include <linux/bitops.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#ifdef CONFIG_EISA
-#include <linux/eisa.h>
-#endif
-
-#include "depca.h"
-
-static char version[] __initdata = "depca.c:v0.53 2001/1/12 davies@maniac.ultranet.com\n";
-
-#ifdef DEPCA_DEBUG
-static int depca_debug = DEPCA_DEBUG;
-#else
-static int depca_debug = 1;
-#endif
-
-#define DEPCA_NDA 0xffe0       /* No Device Address */
-
-#define TX_TIMEOUT (1*HZ)
-
-/*
-** Ethernet PROM defines
-*/
-#define PROBE_LENGTH    32
-#define ETH_PROM_SIG    0xAA5500FFUL
-
-/*
-** Set the number of Tx and Rx buffers. Ensure that the memory requested
-** here is <= to the amount of shared memory set up by the board switches.
-** The number of descriptors MUST BE A POWER OF 2.
-**
-** total_memory = NUM_RX_DESC*(8+RX_BUFF_SZ) + NUM_TX_DESC*(8+TX_BUFF_SZ)
-*/
-#define NUM_RX_DESC     8      /* Number of RX descriptors */
-#define NUM_TX_DESC     8      /* Number of TX descriptors */
-#define RX_BUFF_SZ     1536    /* Buffer size for each Rx buffer */
-#define TX_BUFF_SZ     1536    /* Buffer size for each Tx buffer */
-
-/*
-** EISA bus defines
-*/
-#define DEPCA_EISA_IO_PORTS 0x0c00     /* I/O port base address, slot 0 */
-
-/*
-** ISA Bus defines
-*/
-#define DEPCA_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0xe0000,0x00000}
-#define DEPCA_TOTAL_SIZE 0x10
-
-static struct {
-       u_long iobase;
-       struct platform_device *device;
-} depca_io_ports[] = {
-       { 0x300, NULL },
-       { 0x200, NULL },
-       { 0    , NULL },
-};
-
-/*
-** Name <-> Adapter mapping
-*/
-#define DEPCA_SIGNATURE {"DEPCA",\
-                        "DE100","DE101",\
-                         "DE200","DE201","DE202",\
-                        "DE210","DE212",\
-                         "DE422",\
-                         ""}
-
-static char* __initdata depca_signature[] = DEPCA_SIGNATURE;
-
-enum depca_type {
-       DEPCA, de100, de101, de200, de201, de202, de210, de212, de422, unknown
-};
-
-static char depca_string[] = "depca";
-
-static int depca_device_remove (struct device *device);
-
-#ifdef CONFIG_EISA
-static struct eisa_device_id depca_eisa_ids[] = {
-       { "DEC4220", de422 },
-       { "" }
-};
-MODULE_DEVICE_TABLE(eisa, depca_eisa_ids);
-
-static int depca_eisa_probe  (struct device *device);
-
-static struct eisa_driver depca_eisa_driver = {
-       .id_table = depca_eisa_ids,
-       .driver   = {
-               .name    = depca_string,
-               .probe   = depca_eisa_probe,
-               .remove  = depca_device_remove
-       }
-};
-#endif
-
-static int depca_isa_probe (struct platform_device *);
-
-static int depca_isa_remove(struct platform_device *pdev)
-{
-       return depca_device_remove(&pdev->dev);
-}
-
-static struct platform_driver depca_isa_driver = {
-       .probe  = depca_isa_probe,
-       .remove = depca_isa_remove,
-       .driver = {
-               .name   = depca_string,
-       },
-};
-
-/*
-** Miscellaneous info...
-*/
-#define DEPCA_STRLEN 16
-
-/*
-** Memory Alignment. Each descriptor is 4 longwords long. To force a
-** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
-** DESC_ALIGN. DEPCA_ALIGN aligns the start address of the private memory area
-** and hence the RX descriptor ring's first entry.
-*/
-#define DEPCA_ALIGN4      ((u_long)4 - 1)      /* 1 longword align */
-#define DEPCA_ALIGN8      ((u_long)8 - 1)      /* 2 longword (quadword) align */
-#define DEPCA_ALIGN         DEPCA_ALIGN8       /* Keep the LANCE happy... */
-
-/*
-** The DEPCA Rx and Tx ring descriptors.
-*/
-struct depca_rx_desc {
-       volatile s32 base;
-       s16 buf_length;         /* This length is negative 2's complement! */
-       s16 msg_length;         /* This length is "normal". */
-};
-
-struct depca_tx_desc {
-       volatile s32 base;
-       s16 length;             /* This length is negative 2's complement! */
-       s16 misc;               /* Errors and TDR info */
-};
-
-#define LA_MASK 0x0000ffff     /* LANCE address mask for mapping network RAM
-                                  to LANCE memory address space */
-
-/*
-** The Lance initialization block, described in databook, in common memory.
-*/
-struct depca_init {
-       u16 mode;               /* Mode register */
-       u8 phys_addr[ETH_ALEN]; /* Physical ethernet address */
-       u8 mcast_table[8];      /* Multicast Hash Table. */
-       u32 rx_ring;            /* Rx ring base pointer & ring length */
-       u32 tx_ring;            /* Tx ring base pointer & ring length */
-};
-
-#define DEPCA_PKT_STAT_SZ 16
-#define DEPCA_PKT_BIN_SZ  128  /* Should be >=100 unless you
-                                  increase DEPCA_PKT_STAT_SZ */
-struct depca_private {
-       char adapter_name[DEPCA_STRLEN];        /* /proc/ioports string                  */
-       enum depca_type adapter;                /* Adapter type */
-       enum {
-                DEPCA_BUS_ISA = 1,
-                DEPCA_BUS_EISA,
-        } depca_bus;           /* type of bus */
-       struct depca_init init_block;   /* Shadow Initialization block            */
-/* CPU address space fields */
-       struct depca_rx_desc __iomem *rx_ring;  /* Pointer to start of RX descriptor ring */
-       struct depca_tx_desc __iomem *tx_ring;  /* Pointer to start of TX descriptor ring */
-       void __iomem *rx_buff[NUM_RX_DESC];     /* CPU virt address of sh'd memory buffs  */
-       void __iomem *tx_buff[NUM_TX_DESC];     /* CPU virt address of sh'd memory buffs  */
-       void __iomem *sh_mem;   /* CPU mapped virt address of device RAM  */
-       u_long mem_start;       /* Bus address of device RAM (before remap) */
-       u_long mem_len;         /* device memory size */
-/* Device address space fields */
-       u_long device_ram_start;        /* Start of RAM in device addr space      */
-/* Offsets used in both address spaces */
-       u_long rx_ring_offset;  /* Offset from start of RAM to rx_ring    */
-       u_long tx_ring_offset;  /* Offset from start of RAM to tx_ring    */
-       u_long buffs_offset;    /* LANCE Rx and Tx buffers start address. */
-/* Kernel-only (not device) fields */
-       int rx_new, tx_new;     /* The next free ring entry               */
-       int rx_old, tx_old;     /* The ring entries to be free()ed.       */
-       spinlock_t lock;
-       struct {                /* Private stats counters                 */
-               u32 bins[DEPCA_PKT_STAT_SZ];
-               u32 unicast;
-               u32 multicast;
-               u32 broadcast;
-               u32 excessive_collisions;
-               u32 tx_underruns;
-               u32 excessive_underruns;
-       } pktStats;
-       int txRingMask;         /* TX ring mask                           */
-       int rxRingMask;         /* RX ring mask                           */
-       s32 rx_rlen;            /* log2(rxRingMask+1) for the descriptors */
-       s32 tx_rlen;            /* log2(txRingMask+1) for the descriptors */
-};
-
-/*
-** The transmit ring full condition is described by the tx_old and tx_new
-** pointers by:
-**    tx_old            = tx_new    Empty ring
-**    tx_old            = tx_new+1  Full ring
-**    tx_old+txRingMask = tx_new    Full ring  (wrapped condition)
-*/
-#define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?\
-                        lp->tx_old+lp->txRingMask-lp->tx_new:\
-                         lp->tx_old               -lp->tx_new-1)
-
-/*
-** Public Functions
-*/
-static int depca_open(struct net_device *dev);
-static netdev_tx_t depca_start_xmit(struct sk_buff *skb,
-                                   struct net_device *dev);
-static irqreturn_t depca_interrupt(int irq, void *dev_id);
-static int depca_close(struct net_device *dev);
-static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
-static void depca_tx_timeout(struct net_device *dev);
-static void set_multicast_list(struct net_device *dev);
-
-/*
-** Private functions
-*/
-static void depca_init_ring(struct net_device *dev);
-static int depca_rx(struct net_device *dev);
-static int depca_tx(struct net_device *dev);
-
-static void LoadCSRs(struct net_device *dev);
-static int InitRestartDepca(struct net_device *dev);
-static int DepcaSignature(char *name, u_long paddr);
-static int DevicePresent(u_long ioaddr);
-static int get_hw_addr(struct net_device *dev);
-static void SetMulticastFilter(struct net_device *dev);
-static int load_packet(struct net_device *dev, struct sk_buff *skb);
-static void depca_dbg_open(struct net_device *dev);
-
-static u_char de1xx_irq[] __initdata = { 2, 3, 4, 5, 7, 9, 0 };
-static u_char de2xx_irq[] __initdata = { 5, 9, 10, 11, 15, 0 };
-static u_char de422_irq[] __initdata = { 5, 9, 10, 11, 0 };
-static u_char *depca_irq;
-
-static int irq;
-static int io;
-static char *adapter_name;
-static int mem;                        /* For loadable module assignment
-                                  use insmod mem=0x????? .... */
-module_param (irq, int, 0);
-module_param (io, int, 0);
-module_param (adapter_name, charp, 0);
-module_param (mem, int, 0);
-MODULE_PARM_DESC(irq, "DEPCA IRQ number");
-MODULE_PARM_DESC(io, "DEPCA I/O base address");
-MODULE_PARM_DESC(adapter_name, "DEPCA adapter name");
-MODULE_PARM_DESC(mem, "DEPCA shared memory address");
-MODULE_LICENSE("GPL");
-
-/*
-** Miscellaneous defines...
-*/
-#define STOP_DEPCA \
-    outw(CSR0, DEPCA_ADDR);\
-    outw(STOP, DEPCA_DATA)
-
-static const struct net_device_ops depca_netdev_ops = {
-       .ndo_open               = depca_open,
-       .ndo_start_xmit         = depca_start_xmit,
-       .ndo_stop               = depca_close,
-       .ndo_set_rx_mode        = set_multicast_list,
-       .ndo_do_ioctl           = depca_ioctl,
-       .ndo_tx_timeout         = depca_tx_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-static int __init depca_hw_init (struct net_device *dev, struct device *device)
-{
-       struct depca_private *lp;
-       int i, j, offset, netRAM, mem_len, status = 0;
-       s16 nicsr;
-       u_long ioaddr;
-       u_long mem_start;
-
-       /*
-        * We are now supposed to enter this function with the
-        * following fields filled with proper values :
-        *
-        * dev->base_addr
-        * lp->mem_start
-        * lp->depca_bus
-        * lp->adapter
-        *
-        * dev->irq can be set if known from device configuration (on
-        * MCA or EISA) or module option. Otherwise, it will be auto
-        * detected.
-        */
-
-       ioaddr = dev->base_addr;
-
-       STOP_DEPCA;
-
-       nicsr = inb(DEPCA_NICSR);
-       nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
-       outb(nicsr, DEPCA_NICSR);
-
-       if (inw(DEPCA_DATA) != STOP) {
-               return -ENXIO;
-       }
-
-       lp = netdev_priv(dev);
-       mem_start = lp->mem_start;
-
-       if (!mem_start || lp->adapter < DEPCA || lp->adapter >=unknown)
-               return -ENXIO;
-
-       printk("%s: %s at 0x%04lx",
-              dev_name(device), depca_signature[lp->adapter], ioaddr);
-
-       switch (lp->depca_bus) {
-#ifdef CONFIG_EISA
-       case DEPCA_BUS_EISA:
-               printk(" (EISA slot %d)", to_eisa_device(device)->slot);
-               break;
-#endif
-
-       case DEPCA_BUS_ISA:
-               break;
-
-       default:
-               printk("Unknown DEPCA bus %d\n", lp->depca_bus);
-               return -ENXIO;
-       }
-
-       printk(", h/w address ");
-       status = get_hw_addr(dev);
-       printk("%pM", dev->dev_addr);
-       if (status != 0) {
-               printk("      which has an Ethernet PROM CRC error.\n");
-               return -ENXIO;
-       }
-
-       /* Set up the maximum amount of network RAM(kB) */
-       netRAM = ((lp->adapter != DEPCA) ? 64 : 48);
-       if ((nicsr & _128KB) && (lp->adapter == de422))
-               netRAM = 128;
-
-       /* Shared Memory Base Address */
-       if (nicsr & BUF) {
-               nicsr &= ~BS;   /* DEPCA RAM in top 32k */
-               netRAM -= 32;
-               mem_start += 0x8000;
-       }
-
-       if ((mem_len = (NUM_RX_DESC * (sizeof(struct depca_rx_desc) + RX_BUFF_SZ) + NUM_TX_DESC * (sizeof(struct depca_tx_desc) + TX_BUFF_SZ) + sizeof(struct depca_init)))
-           > (netRAM << 10)) {
-               printk(",\n       requests %dkB RAM: only %dkB is available!\n", (mem_len >> 10), netRAM);
-               return -ENXIO;
-       }
-
-       printk(",\n      has %dkB RAM at 0x%.5lx", netRAM, mem_start);
-
-       /* Enable the shadow RAM. */
-       if (lp->adapter != DEPCA) {
-               nicsr |= SHE;
-               outb(nicsr, DEPCA_NICSR);
-       }
-
-       spin_lock_init(&lp->lock);
-       sprintf(lp->adapter_name, "%s (%s)",
-               depca_signature[lp->adapter], dev_name(device));
-       status = -EBUSY;
-
-       /* Initialisation Block */
-       if (!request_mem_region (mem_start, mem_len, lp->adapter_name)) {
-               printk(KERN_ERR "depca: cannot request ISA memory, aborting\n");
-               goto out_priv;
-       }
-
-       status = -EIO;
-       lp->sh_mem = ioremap(mem_start, mem_len);
-       if (lp->sh_mem == NULL) {
-               printk(KERN_ERR "depca: cannot remap ISA memory, aborting\n");
-               goto out1;
-       }
-
-       lp->mem_start = mem_start;
-       lp->mem_len   = mem_len;
-       lp->device_ram_start = mem_start & LA_MASK;
-
-       offset = 0;
-       offset += sizeof(struct depca_init);
-
-       /* Tx & Rx descriptors (aligned to a quadword boundary) */
-       offset = (offset + DEPCA_ALIGN) & ~DEPCA_ALIGN;
-       lp->rx_ring = lp->sh_mem + offset;
-       lp->rx_ring_offset = offset;
-
-       offset += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
-       lp->tx_ring = lp->sh_mem + offset;
-       lp->tx_ring_offset = offset;
-
-       offset += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
-
-       lp->buffs_offset = offset;
-
-       /* Finish initialising the ring information. */
-       lp->rxRingMask = NUM_RX_DESC - 1;
-       lp->txRingMask = NUM_TX_DESC - 1;
-
-       /* Calculate Tx/Rx RLEN size for the descriptors. */
-       for (i = 0, j = lp->rxRingMask; j > 0; i++) {
-               j >>= 1;
-       }
-       lp->rx_rlen = (s32) (i << 29);
-       for (i = 0, j = lp->txRingMask; j > 0; i++) {
-               j >>= 1;
-       }
-       lp->tx_rlen = (s32) (i << 29);
-
-       /* Load the initialisation block */
-       depca_init_ring(dev);
-
-       /* Initialise the control and status registers */
-       LoadCSRs(dev);
-
-       /* Enable DEPCA board interrupts for autoprobing */
-       nicsr = ((nicsr & ~IM) | IEN);
-       outb(nicsr, DEPCA_NICSR);
-
-       /* To auto-IRQ we enable the initialization-done and DMA err,
-          interrupts. For now we will always get a DMA error. */
-       if (dev->irq < 2) {
-               unsigned char irqnum;
-               unsigned long irq_mask, delay;
-
-               irq_mask = probe_irq_on();
-
-               /* Assign the correct irq list */
-               switch (lp->adapter) {
-               case DEPCA:
-               case de100:
-               case de101:
-                       depca_irq = de1xx_irq;
-                       break;
-               case de200:
-               case de201:
-               case de202:
-               case de210:
-               case de212:
-                       depca_irq = de2xx_irq;
-                       break;
-               case de422:
-                       depca_irq = de422_irq;
-                       break;
-
-               default:
-                       break;  /* Not reached */
-               }
-
-               /* Trigger an initialization just for the interrupt. */
-               outw(INEA | INIT, DEPCA_DATA);
-
-               delay = jiffies + HZ/50;
-               while (time_before(jiffies, delay))
-                       yield();
-
-               irqnum = probe_irq_off(irq_mask);
-
-               status = -ENXIO;
-               if (!irqnum) {
-                       printk(" and failed to detect IRQ line.\n");
-                       goto out2;
-               } else {
-                       for (dev->irq = 0, i = 0; (depca_irq[i]) && (!dev->irq); i++)
-                               if (irqnum == depca_irq[i]) {
-                                       dev->irq = irqnum;
-                                       printk(" and uses IRQ%d.\n", dev->irq);
-                               }
-
-                       if (!dev->irq) {
-                               printk(" but incorrect IRQ line detected.\n");
-                               goto out2;
-                       }
-               }
-       } else {
-               printk(" and assigned IRQ%d.\n", dev->irq);
-       }
-
-       if (depca_debug > 1) {
-               printk(version);
-       }
-
-       /* The DEPCA-specific entries in the device structure. */
-       dev->netdev_ops = &depca_netdev_ops;
-       dev->watchdog_timeo = TX_TIMEOUT;
-
-       dev->mem_start = 0;
-
-       dev_set_drvdata(device, dev);
-       SET_NETDEV_DEV (dev, device);
-
-       status = register_netdev(dev);
-       if (status == 0)
-               return 0;
-out2:
-       iounmap(lp->sh_mem);
-out1:
-       release_mem_region (mem_start, mem_len);
-out_priv:
-       return status;
-}
-
-
-static int depca_open(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       u_long ioaddr = dev->base_addr;
-       s16 nicsr;
-       int status = 0;
-
-       STOP_DEPCA;
-       nicsr = inb(DEPCA_NICSR);
-
-       /* Make sure the shadow RAM is enabled */
-       if (lp->adapter != DEPCA) {
-               nicsr |= SHE;
-               outb(nicsr, DEPCA_NICSR);
-       }
-
-       /* Re-initialize the DEPCA... */
-       depca_init_ring(dev);
-       LoadCSRs(dev);
-
-       depca_dbg_open(dev);
-
-       if (request_irq(dev->irq, depca_interrupt, 0, lp->adapter_name, dev)) {
-               printk("depca_open(): Requested IRQ%d is busy\n", dev->irq);
-               status = -EAGAIN;
-       } else {
-
-               /* Enable DEPCA board interrupts and turn off LED */
-               nicsr = ((nicsr & ~IM & ~LED) | IEN);
-               outb(nicsr, DEPCA_NICSR);
-               outw(CSR0, DEPCA_ADDR);
-
-               netif_start_queue(dev);
-
-               status = InitRestartDepca(dev);
-
-               if (depca_debug > 1) {
-                       printk("CSR0: 0x%4.4x\n", inw(DEPCA_DATA));
-                       printk("nicsr: 0x%02x\n", inb(DEPCA_NICSR));
-               }
-       }
-       return status;
-}
-
-/* Initialize the lance Rx and Tx descriptor rings. */
-static void depca_init_ring(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       u_int i;
-       u_long offset;
-
-       /* Lock out other processes whilst setting up the hardware */
-       netif_stop_queue(dev);
-
-       lp->rx_new = lp->tx_new = 0;
-       lp->rx_old = lp->tx_old = 0;
-
-       /* Initialize the base address and length of each buffer in the ring */
-       for (i = 0; i <= lp->rxRingMask; i++) {
-               offset = lp->buffs_offset + i * RX_BUFF_SZ;
-               writel((lp->device_ram_start + offset) | R_OWN, &lp->rx_ring[i].base);
-               writew(-RX_BUFF_SZ, &lp->rx_ring[i].buf_length);
-               lp->rx_buff[i] = lp->sh_mem + offset;
-       }
-
-       for (i = 0; i <= lp->txRingMask; i++) {
-               offset = lp->buffs_offset + (i + lp->rxRingMask + 1) * TX_BUFF_SZ;
-               writel((lp->device_ram_start + offset) & 0x00ffffff, &lp->tx_ring[i].base);
-               lp->tx_buff[i] = lp->sh_mem + offset;
-       }
-
-       /* Set up the initialization block */
-       lp->init_block.rx_ring = (lp->device_ram_start + lp->rx_ring_offset) | lp->rx_rlen;
-       lp->init_block.tx_ring = (lp->device_ram_start + lp->tx_ring_offset) | lp->tx_rlen;
-
-       SetMulticastFilter(dev);
-
-       for (i = 0; i < ETH_ALEN; i++) {
-               lp->init_block.phys_addr[i] = dev->dev_addr[i];
-       }
-
-       lp->init_block.mode = 0x0000;   /* Enable the Tx and Rx */
-}
-
-
-static void depca_tx_timeout(struct net_device *dev)
-{
-       u_long ioaddr = dev->base_addr;
-
-       printk("%s: transmit timed out, status %04x, resetting.\n", dev->name, inw(DEPCA_DATA));
-
-       STOP_DEPCA;
-       depca_init_ring(dev);
-       LoadCSRs(dev);
-       dev->trans_start = jiffies; /* prevent tx timeout */
-       netif_wake_queue(dev);
-       InitRestartDepca(dev);
-}
-
-
-/*
-** Writes a socket buffer to TX descriptor ring and starts transmission
-*/
-static netdev_tx_t depca_start_xmit(struct sk_buff *skb,
-                                   struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       u_long ioaddr = dev->base_addr;
-       int status = 0;
-
-       /* Transmitter timeout, serious problems. */
-       if (skb->len < 1)
-               goto out;
-
-       if (skb_padto(skb, ETH_ZLEN))
-               goto out;
-
-       netif_stop_queue(dev);
-
-       if (TX_BUFFS_AVAIL) {   /* Fill in a Tx ring entry */
-               status = load_packet(dev, skb);
-
-               if (!status) {
-                       /* Trigger an immediate send demand. */
-                       outw(CSR0, DEPCA_ADDR);
-                       outw(INEA | TDMD, DEPCA_DATA);
-
-                       dev_kfree_skb(skb);
-               }
-               if (TX_BUFFS_AVAIL)
-                       netif_start_queue(dev);
-       } else
-               status = NETDEV_TX_LOCKED;
-
-      out:
-       return status;
-}
-
-/*
-** The DEPCA interrupt handler.
-*/
-static irqreturn_t depca_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct depca_private *lp;
-       s16 csr0, nicsr;
-       u_long ioaddr;
-
-       if (dev == NULL) {
-               printk("depca_interrupt(): irq %d for unknown device.\n", irq);
-               return IRQ_NONE;
-       }
-
-       lp = netdev_priv(dev);
-       ioaddr = dev->base_addr;
-
-       spin_lock(&lp->lock);
-
-       /* mask the DEPCA board interrupts and turn on the LED */
-       nicsr = inb(DEPCA_NICSR);
-       nicsr |= (IM | LED);
-       outb(nicsr, DEPCA_NICSR);
-
-       outw(CSR0, DEPCA_ADDR);
-       csr0 = inw(DEPCA_DATA);
-
-       /* Acknowledge all of the current interrupt sources ASAP. */
-       outw(csr0 & INTE, DEPCA_DATA);
-
-       if (csr0 & RINT)        /* Rx interrupt (packet arrived) */
-               depca_rx(dev);
-
-       if (csr0 & TINT)        /* Tx interrupt (packet sent) */
-               depca_tx(dev);
-
-       /* Any resources available? */
-       if ((TX_BUFFS_AVAIL >= 0) && netif_queue_stopped(dev)) {
-               netif_wake_queue(dev);
-       }
-
-       /* Unmask the DEPCA board interrupts and turn off the LED */
-       nicsr = (nicsr & ~IM & ~LED);
-       outb(nicsr, DEPCA_NICSR);
-
-       spin_unlock(&lp->lock);
-       return IRQ_HANDLED;
-}
-
-/* Called with lp->lock held */
-static int depca_rx(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       int i, entry;
-       s32 status;
-
-       for (entry = lp->rx_new; !(readl(&lp->rx_ring[entry].base) & R_OWN); entry = lp->rx_new) {
-               status = readl(&lp->rx_ring[entry].base) >> 16;
-               if (status & R_STP) {   /* Remember start of frame */
-                       lp->rx_old = entry;
-               }
-               if (status & R_ENP) {   /* Valid frame status */
-                       if (status & R_ERR) {   /* There was an error. */
-                               dev->stats.rx_errors++; /* Update the error stats. */
-                               if (status & R_FRAM)
-                                       dev->stats.rx_frame_errors++;
-                               if (status & R_OFLO)
-                                       dev->stats.rx_over_errors++;
-                               if (status & R_CRC)
-                                       dev->stats.rx_crc_errors++;
-                               if (status & R_BUFF)
-                                       dev->stats.rx_fifo_errors++;
-                       } else {
-                               short len, pkt_len = readw(&lp->rx_ring[entry].msg_length) - 4;
-                               struct sk_buff *skb;
-
-                               skb = netdev_alloc_skb(dev, pkt_len + 2);
-                               if (skb != NULL) {
-                                       unsigned char *buf;
-                                       skb_reserve(skb, 2);    /* 16 byte align the IP header */
-                                       buf = skb_put(skb, pkt_len);
-                                       if (entry < lp->rx_old) {       /* Wrapped buffer */
-                                               len = (lp->rxRingMask - lp->rx_old + 1) * RX_BUFF_SZ;
-                                               memcpy_fromio(buf, lp->rx_buff[lp->rx_old], len);
-                                               memcpy_fromio(buf + len, lp->rx_buff[0], pkt_len - len);
-                                       } else {        /* Linear buffer */
-                                               memcpy_fromio(buf, lp->rx_buff[lp->rx_old], pkt_len);
-                                       }
-
-                                       /*
-                                          ** Notify the upper protocol layers that there is another
-                                          ** packet to handle
-                                        */
-                                       skb->protocol = eth_type_trans(skb, dev);
-                                       netif_rx(skb);
-
-                                       /*
-                                          ** Update stats
-                                        */
-                                       dev->stats.rx_packets++;
-                                       dev->stats.rx_bytes += pkt_len;
-                                       for (i = 1; i < DEPCA_PKT_STAT_SZ - 1; i++) {
-                                               if (pkt_len < (i * DEPCA_PKT_BIN_SZ)) {
-                                                       lp->pktStats.bins[i]++;
-                                                       i = DEPCA_PKT_STAT_SZ;
-                                               }
-                                       }
-                                       if (is_multicast_ether_addr(buf)) {
-                                               if (is_broadcast_ether_addr(buf)) {
-                                                       lp->pktStats.broadcast++;
-                                               } else {
-                                                       lp->pktStats.multicast++;
-                                               }
-                                       } else if (ether_addr_equal(buf,
-                                                                   dev->dev_addr)) {
-                                               lp->pktStats.unicast++;
-                                       }
-
-                                       lp->pktStats.bins[0]++; /* Duplicates stats.rx_packets */
-                                       if (lp->pktStats.bins[0] == 0) {        /* Reset counters */
-                                               memset((char *) &lp->pktStats, 0, sizeof(lp->pktStats));
-                                       }
-                               } else {
-                                       printk("%s: Memory squeeze, deferring packet.\n", dev->name);
-                                       dev->stats.rx_dropped++;        /* Really, deferred. */
-                                       break;
-                               }
-                       }
-                       /* Change buffer ownership for this last frame, back to the adapter */
-                       for (; lp->rx_old != entry; lp->rx_old = (lp->rx_old + 1) & lp->rxRingMask) {
-                               writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN, &lp->rx_ring[lp->rx_old].base);
-                       }
-                       writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base);
-               }
-
-               /*
-                  ** Update entry information
-                */
-               lp->rx_new = (lp->rx_new + 1) & lp->rxRingMask;
-       }
-
-       return 0;
-}
-
-/*
-** Buffer sent - check for buffer errors.
-** Called with lp->lock held
-*/
-static int depca_tx(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       int entry;
-       s32 status;
-       u_long ioaddr = dev->base_addr;
-
-       for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) {
-               status = readl(&lp->tx_ring[entry].base) >> 16;
-
-               if (status < 0) {       /* Packet not yet sent! */
-                       break;
-               } else if (status & T_ERR) {    /* An error occurred. */
-                       status = readl(&lp->tx_ring[entry].misc);
-                       dev->stats.tx_errors++;
-                       if (status & TMD3_RTRY)
-                               dev->stats.tx_aborted_errors++;
-                       if (status & TMD3_LCAR)
-                               dev->stats.tx_carrier_errors++;
-                       if (status & TMD3_LCOL)
-                               dev->stats.tx_window_errors++;
-                       if (status & TMD3_UFLO)
-                               dev->stats.tx_fifo_errors++;
-                       if (status & (TMD3_BUFF | TMD3_UFLO)) {
-                               /* Trigger an immediate send demand. */
-                               outw(CSR0, DEPCA_ADDR);
-                               outw(INEA | TDMD, DEPCA_DATA);
-                       }
-               } else if (status & (T_MORE | T_ONE)) {
-                       dev->stats.collisions++;
-               } else {
-                       dev->stats.tx_packets++;
-               }
-
-               /* Update all the pointers */
-               lp->tx_old = (lp->tx_old + 1) & lp->txRingMask;
-       }
-
-       return 0;
-}
-
-static int depca_close(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       s16 nicsr;
-       u_long ioaddr = dev->base_addr;
-
-       netif_stop_queue(dev);
-
-       outw(CSR0, DEPCA_ADDR);
-
-       if (depca_debug > 1) {
-               printk("%s: Shutting down ethercard, status was %2.2x.\n", dev->name, inw(DEPCA_DATA));
-       }
-
-       /*
-          ** We stop the DEPCA here -- it occasionally polls
-          ** memory if we don't.
-        */
-       outw(STOP, DEPCA_DATA);
-
-       /*
-          ** Give back the ROM in case the user wants to go to DOS
-        */
-       if (lp->adapter != DEPCA) {
-               nicsr = inb(DEPCA_NICSR);
-               nicsr &= ~SHE;
-               outb(nicsr, DEPCA_NICSR);
-       }
-
-       /*
-          ** Free the associated irq
-        */
-       free_irq(dev->irq, dev);
-       return 0;
-}
-
-static void LoadCSRs(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       u_long ioaddr = dev->base_addr;
-
-       outw(CSR1, DEPCA_ADDR); /* initialisation block address LSW */
-       outw((u16) lp->device_ram_start, DEPCA_DATA);
-       outw(CSR2, DEPCA_ADDR); /* initialisation block address MSW */
-       outw((u16) (lp->device_ram_start >> 16), DEPCA_DATA);
-       outw(CSR3, DEPCA_ADDR); /* ALE control */
-       outw(ACON, DEPCA_DATA);
-
-       outw(CSR0, DEPCA_ADDR); /* Point back to CSR0 */
-}
-
-static int InitRestartDepca(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       u_long ioaddr = dev->base_addr;
-       int i, status = 0;
-
-       /* Copy the shadow init_block to shared memory */
-       memcpy_toio(lp->sh_mem, &lp->init_block, sizeof(struct depca_init));
-
-       outw(CSR0, DEPCA_ADDR); /* point back to CSR0 */
-       outw(INIT, DEPCA_DATA); /* initialize DEPCA */
-
-       /* wait for lance to complete initialisation */
-       for (i = 0; (i < 100) && !(inw(DEPCA_DATA) & IDON); i++);
-
-       if (i != 100) {
-               /* clear IDON by writing a "1", enable interrupts and start lance */
-               outw(IDON | INEA | STRT, DEPCA_DATA);
-               if (depca_debug > 2) {
-                       printk("%s: DEPCA open after %d ticks, init block 0x%08lx csr0 %4.4x.\n", dev->name, i, lp->mem_start, inw(DEPCA_DATA));
-               }
-       } else {
-               printk("%s: DEPCA unopen after %d ticks, init block 0x%08lx csr0 %4.4x.\n", dev->name, i, lp->mem_start, inw(DEPCA_DATA));
-               status = -1;
-       }
-
-       return status;
-}
-
-/*
-** Set or clear the multicast filter for this adaptor.
-*/
-static void set_multicast_list(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       u_long ioaddr = dev->base_addr;
-
-       netif_stop_queue(dev);
-       while (lp->tx_old != lp->tx_new);       /* Wait for the ring to empty */
-
-       STOP_DEPCA;     /* Temporarily stop the depca.  */
-       depca_init_ring(dev);   /* Initialize the descriptor rings */
-
-       if (dev->flags & IFF_PROMISC) { /* Set promiscuous mode */
-               lp->init_block.mode |= PROM;
-       } else {
-               SetMulticastFilter(dev);
-               lp->init_block.mode &= ~PROM;   /* Unset promiscuous mode */
-       }
-
-       LoadCSRs(dev);  /* Reload CSR3 */
-       InitRestartDepca(dev);  /* Resume normal operation. */
-       netif_start_queue(dev); /* Unlock the TX ring */
-}
-
-/*
-** Calculate the hash code and update the logical address filter
-** from a list of ethernet multicast addresses.
-** Big endian crc one liner is mine, all mine, ha ha ha ha!
-** LANCE calculates its hash codes big endian.
-*/
-static void SetMulticastFilter(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       struct netdev_hw_addr *ha;
-       int i, j, bit, byte;
-       u16 hashcode;
-       u32 crc;
-
-       if (dev->flags & IFF_ALLMULTI) {        /* Set all multicast bits */
-               for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {
-                       lp->init_block.mcast_table[i] = (char) 0xff;
-               }
-       } else {
-               for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {   /* Clear the multicast table */
-                       lp->init_block.mcast_table[i] = 0;
-               }
-               /* Add multicast addresses */
-               netdev_for_each_mc_addr(ha, dev) {
-                       crc = ether_crc(ETH_ALEN, ha->addr);
-                       hashcode = (crc & 1);   /* hashcode is 6 LSb of CRC ... */
-                       for (j = 0; j < 5; j++) {       /* ... in reverse order. */
-                               hashcode = (hashcode << 1) | ((crc >>= 1) & 1);
-                       }
-
-                       byte = hashcode >> 3;   /* bit[3-5] -> byte in filter */
-                       bit = 1 << (hashcode & 0x07);   /* bit[0-2] -> bit in byte */
-                       lp->init_block.mcast_table[byte] |= bit;
-               }
-       }
-}
-
-static int __init depca_common_init (u_long ioaddr, struct net_device **devp)
-{
-       int status = 0;
-
-       if (!request_region (ioaddr, DEPCA_TOTAL_SIZE, depca_string)) {
-               status = -EBUSY;
-               goto out;
-       }
-
-       if (DevicePresent(ioaddr)) {
-               status = -ENODEV;
-               goto out_release;
-       }
-
-       if (!(*devp = alloc_etherdev (sizeof (struct depca_private)))) {
-               status = -ENOMEM;
-               goto out_release;
-       }
-
-       return 0;
-
- out_release:
-       release_region (ioaddr, DEPCA_TOTAL_SIZE);
- out:
-       return status;
-}
-
-/*
-** ISA bus I/O device probe
-*/
-
-static void __init depca_platform_probe (void)
-{
-       int i;
-       struct platform_device *pldev;
-
-       for (i = 0; depca_io_ports[i].iobase; i++) {
-               depca_io_ports[i].device = NULL;
-
-               /* if an address has been specified on the command
-                * line, use it (if valid) */
-               if (io && io != depca_io_ports[i].iobase)
-                       continue;
-
-               pldev = platform_device_alloc(depca_string, i);
-               if (!pldev)
-                       continue;
-
-               pldev->dev.platform_data = (void *) depca_io_ports[i].iobase;
-               depca_io_ports[i].device = pldev;
-
-               if (platform_device_add(pldev)) {
-                       depca_io_ports[i].device = NULL;
-                       pldev->dev.platform_data = NULL;
-                       platform_device_put(pldev);
-                       continue;
-               }
-
-               if (!pldev->dev.driver) {
-               /* The driver was not bound to this device, there was
-                * no hardware at this address. Unregister it, as the
-                * release function will take care of freeing the
-                * allocated structure */
-
-                       depca_io_ports[i].device = NULL;
-                       pldev->dev.platform_data = NULL;
-                       platform_device_unregister (pldev);
-               }
-       }
-}
-
-static enum depca_type __init depca_shmem_probe (ulong *mem_start)
-{
-       u_long mem_base[] = DEPCA_RAM_BASE_ADDRESSES;
-       enum depca_type adapter = unknown;
-       int i;
-
-       for (i = 0; mem_base[i]; i++) {
-               *mem_start = mem ? mem : mem_base[i];
-               adapter = DepcaSignature (adapter_name, *mem_start);
-               if (adapter != unknown)
-                       break;
-       }
-
-       return adapter;
-}
-
-static int depca_isa_probe(struct platform_device *device)
-{
-       struct net_device *dev;
-       struct depca_private *lp;
-       u_long ioaddr, mem_start = 0;
-       enum depca_type adapter = unknown;
-       int status = 0;
-
-       ioaddr = (u_long) device->dev.platform_data;
-
-       if ((status = depca_common_init (ioaddr, &dev)))
-               goto out;
-
-       adapter = depca_shmem_probe (&mem_start);
-
-       if (adapter == unknown) {
-               status = -ENODEV;
-               goto out_free;
-       }
-
-       dev->base_addr = ioaddr;
-       dev->irq = irq;         /* Use whatever value the user gave
-                                * us, and 0 if he didn't. */
-       lp = netdev_priv(dev);
-       lp->depca_bus = DEPCA_BUS_ISA;
-       lp->adapter = adapter;
-       lp->mem_start = mem_start;
-
-       if ((status = depca_hw_init(dev, &device->dev)))
-               goto out_free;
-
-       return 0;
-
- out_free:
-       free_netdev (dev);
-       release_region (ioaddr, DEPCA_TOTAL_SIZE);
- out:
-       return status;
-}
-
-/*
-** EISA callbacks from sysfs.
-*/
-
-#ifdef CONFIG_EISA
-static int __init depca_eisa_probe (struct device *device)
-{
-       enum depca_type adapter = unknown;
-       struct eisa_device *edev;
-       struct net_device *dev;
-       struct depca_private *lp;
-       u_long ioaddr, mem_start;
-       int status = 0;
-
-       edev = to_eisa_device (device);
-       ioaddr = edev->base_addr + DEPCA_EISA_IO_PORTS;
-
-       if ((status = depca_common_init (ioaddr, &dev)))
-               goto out;
-
-       /* It would have been nice to get card configuration from the
-        * card. Unfortunately, this register is write-only (shares
-        * it's address with the ethernet prom)... As we don't parse
-        * the EISA configuration structures (yet... :-), just rely on
-        * the ISA probing to sort it out... */
-
-       adapter = depca_shmem_probe (&mem_start);
-       if (adapter == unknown) {
-               status = -ENODEV;
-               goto out_free;
-       }
-
-       dev->base_addr = ioaddr;
-       dev->irq = irq;
-       lp = netdev_priv(dev);
-       lp->depca_bus = DEPCA_BUS_EISA;
-       lp->adapter = edev->id.driver_data;
-       lp->mem_start = mem_start;
-
-       if ((status = depca_hw_init(dev, device)))
-               goto out_free;
-
-       return 0;
-
- out_free:
-       free_netdev (dev);
-       release_region (ioaddr, DEPCA_TOTAL_SIZE);
- out:
-       return status;
-}
-#endif
-
-static int depca_device_remove(struct device *device)
-{
-       struct net_device *dev;
-       struct depca_private *lp;
-       int bus;
-
-       dev  = dev_get_drvdata(device);
-       lp   = netdev_priv(dev);
-
-       unregister_netdev (dev);
-       iounmap (lp->sh_mem);
-       release_mem_region (lp->mem_start, lp->mem_len);
-       release_region (dev->base_addr, DEPCA_TOTAL_SIZE);
-       bus = lp->depca_bus;
-       free_netdev (dev);
-
-       return 0;
-}
-
-/*
-** Look for a particular board name in the on-board Remote Diagnostics
-** and Boot (readb) ROM. This will also give us a clue to the network RAM
-** base address.
-*/
-static int __init DepcaSignature(char *name, u_long base_addr)
-{
-       u_int i, j, k;
-       void __iomem *ptr;
-       char tmpstr[16];
-       u_long prom_addr = base_addr + 0xc000;
-       u_long mem_addr = base_addr + 0x8000; /* 32KB */
-
-       /* Can't reserve the prom region, it is already marked as
-        * used, at least on x86. Instead, reserve a memory region a
-        * board would certainly use. If it works, go ahead. If not,
-        * run like hell... */
-
-       if (!request_mem_region (mem_addr, 16, depca_string))
-               return unknown;
-
-       /* Copy the first 16 bytes of ROM */
-
-       ptr = ioremap(prom_addr, 16);
-       if (ptr == NULL) {
-               printk(KERN_ERR "depca: I/O remap failed at %lx\n", prom_addr);
-               return unknown;
-       }
-       for (i = 0; i < 16; i++) {
-               tmpstr[i] = readb(ptr + i);
-       }
-       iounmap(ptr);
-
-       release_mem_region (mem_addr, 16);
-
-       /* Check if PROM contains a valid string */
-       for (i = 0; *depca_signature[i] != '\0'; i++) {
-               for (j = 0, k = 0; j < 16 && k < strlen(depca_signature[i]); j++) {
-                       if (depca_signature[i][k] == tmpstr[j]) {       /* track signature */
-                               k++;
-                       } else {        /* lost signature; begin search again */
-                               k = 0;
-                       }
-               }
-               if (k == strlen(depca_signature[i]))
-                       break;
-       }
-
-       /* Check if name string is valid, provided there's no PROM */
-       if (name && *name && (i == unknown)) {
-               for (i = 0; *depca_signature[i] != '\0'; i++) {
-                       if (strcmp(name, depca_signature[i]) == 0)
-                               break;
-               }
-       }
-
-       return i;
-}
-
-/*
-** Look for a special sequence in the Ethernet station address PROM that
-** is common across all DEPCA products. Note that the original DEPCA needs
-** its ROM address counter to be initialized and enabled. Only enable
-** if the first address octet is a 0x08 - this minimises the chances of
-** messing around with some other hardware, but it assumes that this DEPCA
-** card initialized itself correctly.
-**
-** Search the Ethernet address ROM for the signature. Since the ROM address
-** counter can start at an arbitrary point, the search must include the entire
-** probe sequence length plus the (length_of_the_signature - 1).
-** Stop the search IMMEDIATELY after the signature is found so that the
-** PROM address counter is correctly positioned at the start of the
-** ethernet address for later read out.
-*/
-static int __init DevicePresent(u_long ioaddr)
-{
-       union {
-               struct {
-                       u32 a;
-                       u32 b;
-               } llsig;
-               char Sig[sizeof(u32) << 1];
-       }
-       dev;
-       short sigLength = 0;
-       s8 data;
-       s16 nicsr;
-       int i, j, status = 0;
-
-       data = inb(DEPCA_PROM); /* clear counter on DEPCA */
-       data = inb(DEPCA_PROM); /* read data */
-
-       if (data == 0x08) {     /* Enable counter on DEPCA */
-               nicsr = inb(DEPCA_NICSR);
-               nicsr |= AAC;
-               outb(nicsr, DEPCA_NICSR);
-       }
-
-       dev.llsig.a = ETH_PROM_SIG;
-       dev.llsig.b = ETH_PROM_SIG;
-       sigLength = sizeof(u32) << 1;
-
-       for (i = 0, j = 0; j < sigLength && i < PROBE_LENGTH + sigLength - 1; i++) {
-               data = inb(DEPCA_PROM);
-               if (dev.Sig[j] == data) {       /* track signature */
-                       j++;
-               } else {        /* lost signature; begin search again */
-                       if (data == dev.Sig[0]) {       /* rare case.... */
-                               j = 1;
-                       } else {
-                               j = 0;
-                       }
-               }
-       }
-
-       if (j != sigLength) {
-               status = -ENODEV;       /* search failed */
-       }
-
-       return status;
-}
-
-/*
-** The DE100 and DE101 PROM accesses were made non-standard for some bizarre
-** reason: access the upper half of the PROM with x=0; access the lower half
-** with x=1.
-*/
-static int __init get_hw_addr(struct net_device *dev)
-{
-       u_long ioaddr = dev->base_addr;
-       struct depca_private *lp = netdev_priv(dev);
-       int i, k, tmp, status = 0;
-       u_short j, x, chksum;
-
-       x = (((lp->adapter == de100) || (lp->adapter == de101)) ? 1 : 0);
-
-       for (i = 0, k = 0, j = 0; j < 3; j++) {
-               k <<= 1;
-               if (k > 0xffff)
-                       k -= 0xffff;
-
-               k += (u_char) (tmp = inb(DEPCA_PROM + x));
-               dev->dev_addr[i++] = (u_char) tmp;
-               k += (u_short) ((tmp = inb(DEPCA_PROM + x)) << 8);
-               dev->dev_addr[i++] = (u_char) tmp;
-
-               if (k > 0xffff)
-                       k -= 0xffff;
-       }
-       if (k == 0xffff)
-               k = 0;
-
-       chksum = (u_char) inb(DEPCA_PROM + x);
-       chksum |= (u_short) (inb(DEPCA_PROM + x) << 8);
-       if (k != chksum)
-               status = -1;
-
-       return status;
-}
-
-/*
-** Load a packet into the shared memory
-*/
-static int load_packet(struct net_device *dev, struct sk_buff *skb)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       int i, entry, end, len, status = NETDEV_TX_OK;
-
-       entry = lp->tx_new;     /* Ring around buffer number. */
-       end = (entry + (skb->len - 1) / TX_BUFF_SZ) & lp->txRingMask;
-       if (!(readl(&lp->tx_ring[end].base) & T_OWN)) { /* Enough room? */
-               /*
-                  ** Caution: the write order is important here... don't set up the
-                  ** ownership rights until all the other information is in place.
-                */
-               if (end < entry) {      /* wrapped buffer */
-                       len = (lp->txRingMask - entry + 1) * TX_BUFF_SZ;
-                       memcpy_toio(lp->tx_buff[entry], skb->data, len);
-                       memcpy_toio(lp->tx_buff[0], skb->data + len, skb->len - len);
-               } else {        /* linear buffer */
-                       memcpy_toio(lp->tx_buff[entry], skb->data, skb->len);
-               }
-
-               /* set up the buffer descriptors */
-               len = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
-               for (i = entry; i != end; i = (i+1) & lp->txRingMask) {
-                       /* clean out flags */
-                       writel(readl(&lp->tx_ring[i].base) & ~T_FLAGS, &lp->tx_ring[i].base);
-                       writew(0x0000, &lp->tx_ring[i].misc);   /* clears other error flags */
-                       writew(-TX_BUFF_SZ, &lp->tx_ring[i].length);    /* packet length in buffer */
-                       len -= TX_BUFF_SZ;
-               }
-               /* clean out flags */
-               writel(readl(&lp->tx_ring[end].base) & ~T_FLAGS, &lp->tx_ring[end].base);
-               writew(0x0000, &lp->tx_ring[end].misc); /* clears other error flags */
-               writew(-len, &lp->tx_ring[end].length); /* packet length in last buff */
-
-               /* start of packet */
-               writel(readl(&lp->tx_ring[entry].base) | T_STP, &lp->tx_ring[entry].base);
-               /* end of packet */
-               writel(readl(&lp->tx_ring[end].base) | T_ENP, &lp->tx_ring[end].base);
-
-               for (i = end; i != entry; --i) {
-                       /* ownership of packet */
-                       writel(readl(&lp->tx_ring[i].base) | T_OWN, &lp->tx_ring[i].base);
-                       if (i == 0)
-                               i = lp->txRingMask + 1;
-               }
-               writel(readl(&lp->tx_ring[entry].base) | T_OWN, &lp->tx_ring[entry].base);
-
-               lp->tx_new = (++end) & lp->txRingMask;  /* update current pointers */
-       } else {
-               status = NETDEV_TX_LOCKED;
-       }
-
-       return status;
-}
-
-static void depca_dbg_open(struct net_device *dev)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       u_long ioaddr = dev->base_addr;
-       struct depca_init *p = &lp->init_block;
-       int i;
-
-       if (depca_debug > 1) {
-               /* Do not copy the shadow init block into shared memory */
-               /* Debugging should not affect normal operation! */
-               /* The shadow init block will get copied across during InitRestartDepca */
-               printk("%s: depca open with irq %d\n", dev->name, dev->irq);
-               printk("Descriptor head addresses (CPU):\n");
-               printk("        0x%lx  0x%lx\n", (u_long) lp->rx_ring, (u_long) lp->tx_ring);
-               printk("Descriptor addresses (CPU):\nRX: ");
-               for (i = 0; i < lp->rxRingMask; i++) {
-                       if (i < 3) {
-                               printk("%p ", &lp->rx_ring[i].base);
-                       }
-               }
-               printk("...%p\n", &lp->rx_ring[i].base);
-               printk("TX: ");
-               for (i = 0; i < lp->txRingMask; i++) {
-                       if (i < 3) {
-                               printk("%p ", &lp->tx_ring[i].base);
-                       }
-               }
-               printk("...%p\n", &lp->tx_ring[i].base);
-               printk("\nDescriptor buffers (Device):\nRX: ");
-               for (i = 0; i < lp->rxRingMask; i++) {
-                       if (i < 3) {
-                               printk("0x%8.8x  ", readl(&lp->rx_ring[i].base));
-                       }
-               }
-               printk("...0x%8.8x\n", readl(&lp->rx_ring[i].base));
-               printk("TX: ");
-               for (i = 0; i < lp->txRingMask; i++) {
-                       if (i < 3) {
-                               printk("0x%8.8x  ", readl(&lp->tx_ring[i].base));
-                       }
-               }
-               printk("...0x%8.8x\n", readl(&lp->tx_ring[i].base));
-               printk("Initialisation block at 0x%8.8lx(Phys)\n", lp->mem_start);
-               printk("        mode: 0x%4.4x\n", p->mode);
-               printk("        physical address: %pM\n", p->phys_addr);
-               printk("        multicast hash table: ");
-               for (i = 0; i < (HASH_TABLE_LEN >> 3) - 1; i++) {
-                       printk("%2.2x:", p->mcast_table[i]);
-               }
-               printk("%2.2x\n", p->mcast_table[i]);
-               printk("        rx_ring at: 0x%8.8x\n", p->rx_ring);
-               printk("        tx_ring at: 0x%8.8x\n", p->tx_ring);
-               printk("buffers (Phys): 0x%8.8lx\n", lp->mem_start + lp->buffs_offset);
-               printk("Ring size:\nRX: %d  Log2(rxRingMask): 0x%8.8x\n", (int) lp->rxRingMask + 1, lp->rx_rlen);
-               printk("TX: %d  Log2(txRingMask): 0x%8.8x\n", (int) lp->txRingMask + 1, lp->tx_rlen);
-               outw(CSR2, DEPCA_ADDR);
-               printk("CSR2&1: 0x%4.4x", inw(DEPCA_DATA));
-               outw(CSR1, DEPCA_ADDR);
-               printk("%4.4x\n", inw(DEPCA_DATA));
-               outw(CSR3, DEPCA_ADDR);
-               printk("CSR3: 0x%4.4x\n", inw(DEPCA_DATA));
-       }
-}
-
-/*
-** Perform IOCTL call functions here. Some are privileged operations and the
-** effective uid is checked in those cases.
-** All multicast IOCTLs will not work here and are for testing purposes only.
-*/
-static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-{
-       struct depca_private *lp = netdev_priv(dev);
-       struct depca_ioctl *ioc = (struct depca_ioctl *) &rq->ifr_ifru;
-       int i, status = 0;
-       u_long ioaddr = dev->base_addr;
-       union {
-               u8 addr[(HASH_TABLE_LEN * ETH_ALEN)];
-               u16 sval[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
-               u32 lval[(HASH_TABLE_LEN * ETH_ALEN) >> 2];
-       } tmp;
-       unsigned long flags;
-       void *buf;
-
-       switch (ioc->cmd) {
-       case DEPCA_GET_HWADDR:  /* Get the hardware address */
-               for (i = 0; i < ETH_ALEN; i++) {
-                       tmp.addr[i] = dev->dev_addr[i];
-               }
-               ioc->len = ETH_ALEN;
-               if (copy_to_user(ioc->data, tmp.addr, ioc->len))
-                       return -EFAULT;
-               break;
-
-       case DEPCA_SET_HWADDR:  /* Set the hardware address */
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN))
-                       return -EFAULT;
-               for (i = 0; i < ETH_ALEN; i++) {
-                       dev->dev_addr[i] = tmp.addr[i];
-               }
-               netif_stop_queue(dev);
-               while (lp->tx_old != lp->tx_new)
-                       cpu_relax();    /* Wait for the ring to empty */
-
-               STOP_DEPCA;     /* Temporarily stop the depca.  */
-               depca_init_ring(dev);   /* Initialize the descriptor rings */
-               LoadCSRs(dev);  /* Reload CSR3 */
-               InitRestartDepca(dev);  /* Resume normal operation. */
-               netif_start_queue(dev); /* Unlock the TX ring */
-               break;
-
-       case DEPCA_SET_PROM:    /* Set Promiscuous Mode */
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               netif_stop_queue(dev);
-               while (lp->tx_old != lp->tx_new)
-                       cpu_relax();    /* Wait for the ring to empty */
-
-               STOP_DEPCA;     /* Temporarily stop the depca.  */
-               depca_init_ring(dev);   /* Initialize the descriptor rings */
-               lp->init_block.mode |= PROM;    /* Set promiscuous mode */
-
-               LoadCSRs(dev);  /* Reload CSR3 */
-               InitRestartDepca(dev);  /* Resume normal operation. */
-               netif_start_queue(dev); /* Unlock the TX ring */
-               break;
-
-       case DEPCA_CLR_PROM:    /* Clear Promiscuous Mode */
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               netif_stop_queue(dev);
-               while (lp->tx_old != lp->tx_new)
-                       cpu_relax();    /* Wait for the ring to empty */
-
-               STOP_DEPCA;     /* Temporarily stop the depca.  */
-               depca_init_ring(dev);   /* Initialize the descriptor rings */
-               lp->init_block.mode &= ~PROM;   /* Clear promiscuous mode */
-
-               LoadCSRs(dev);  /* Reload CSR3 */
-               InitRestartDepca(dev);  /* Resume normal operation. */
-               netif_start_queue(dev); /* Unlock the TX ring */
-               break;
-
-       case DEPCA_SAY_BOO:     /* Say "Boo!" to the kernel log file */
-               if(!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               printk("%s: Boo!\n", dev->name);
-               break;
-
-       case DEPCA_GET_MCA:     /* Get the multicast address table */
-               ioc->len = (HASH_TABLE_LEN >> 3);
-               if (copy_to_user(ioc->data, lp->init_block.mcast_table, ioc->len))
-                       return -EFAULT;
-               break;
-
-       case DEPCA_SET_MCA:     /* Set a multicast address */
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               if (ioc->len >= HASH_TABLE_LEN)
-                       return -EINVAL;
-               if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN * ioc->len))
-                       return -EFAULT;
-               set_multicast_list(dev);
-               break;
-
-       case DEPCA_CLR_MCA:     /* Clear all multicast addresses */
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               set_multicast_list(dev);
-               break;
-
-       case DEPCA_MCA_EN:      /* Enable pass all multicast addressing */
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               set_multicast_list(dev);
-               break;
-
-       case DEPCA_GET_STATS:   /* Get the driver statistics */
-               ioc->len = sizeof(lp->pktStats);
-               buf = kmalloc(ioc->len, GFP_KERNEL);
-               if(!buf)
-                       return -ENOMEM;
-               spin_lock_irqsave(&lp->lock, flags);
-               memcpy(buf, &lp->pktStats, ioc->len);
-               spin_unlock_irqrestore(&lp->lock, flags);
-               if (copy_to_user(ioc->data, buf, ioc->len))
-                       status = -EFAULT;
-               kfree(buf);
-               break;
-
-       case DEPCA_CLR_STATS:   /* Zero out the driver statistics */
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
-               spin_lock_irqsave(&lp->lock, flags);
-               memset(&lp->pktStats, 0, sizeof(lp->pktStats));
-               spin_unlock_irqrestore(&lp->lock, flags);
-               break;
-
-       case DEPCA_GET_REG:     /* Get the DEPCA Registers */
-               i = 0;
-               tmp.sval[i++] = inw(DEPCA_NICSR);
-               outw(CSR0, DEPCA_ADDR); /* status register */
-               tmp.sval[i++] = inw(DEPCA_DATA);
-               memcpy(&tmp.sval[i], &lp->init_block, sizeof(struct depca_init));
-               ioc->len = i + sizeof(struct depca_init);
-               if (copy_to_user(ioc->data, tmp.addr, ioc->len))
-                       return -EFAULT;
-               break;
-
-       default:
-               return -EOPNOTSUPP;
-       }
-
-       return status;
-}
-
-static int __init depca_module_init (void)
-{
-       int err = 0;
-
-#ifdef CONFIG_EISA
-       err = eisa_driver_register(&depca_eisa_driver);
-       if (err)
-               goto err_eisa;
-#endif
-       err = platform_driver_register(&depca_isa_driver);
-       if (err)
-               goto err_eisa;
-
-       depca_platform_probe();
-       return 0;
-
-err_eisa:
-#ifdef CONFIG_EISA
-       eisa_driver_unregister(&depca_eisa_driver);
-#endif
-       return err;
-}
-
-static void __exit depca_module_exit (void)
-{
-       int i;
-#ifdef CONFIG_EISA
-        eisa_driver_unregister (&depca_eisa_driver);
-#endif
-       platform_driver_unregister (&depca_isa_driver);
-
-       for (i = 0; depca_io_ports[i].iobase; i++) {
-               if (depca_io_ports[i].device) {
-                       depca_io_ports[i].device->dev.platform_data = NULL;
-                       platform_device_unregister (depca_io_ports[i].device);
-                       depca_io_ports[i].device = NULL;
-               }
-       }
-}
-
-module_init (depca_module_init);
-module_exit (depca_module_exit);
diff --git a/drivers/net/ethernet/amd/depca.h b/drivers/net/ethernet/amd/depca.h
deleted file mode 100644 (file)
index cdcfe42..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
-    Written 1994 by David C. Davies.
-
-    Copyright 1994 David C. Davies. This software may be used and distributed
-    according to the terms of the GNU General Public License, incorporated herein by
-    reference.
-*/
-
-/*
-** I/O addresses. Note that the 2k buffer option is not supported in
-** this driver.
-*/
-#define DEPCA_NICSR ioaddr+0x00   /* Network interface CSR */
-#define DEPCA_RBI   ioaddr+0x02   /* RAM buffer index (2k buffer mode) */
-#define DEPCA_DATA  ioaddr+0x04   /* LANCE registers' data port */
-#define DEPCA_ADDR  ioaddr+0x06   /* LANCE registers' address port */
-#define DEPCA_HBASE ioaddr+0x08   /* EISA high memory base address reg. */
-#define DEPCA_PROM  ioaddr+0x0c   /* Ethernet address ROM data port */
-#define DEPCA_CNFG  ioaddr+0x0c   /* EISA Configuration port */
-#define DEPCA_RBSA  ioaddr+0x0e   /* RAM buffer starting address (2k buff.) */
-
-/*
-** These are LANCE registers addressable through DEPCA_ADDR
-*/
-#define CSR0       0
-#define CSR1       1
-#define CSR2       2
-#define CSR3       3
-
-/*
-** NETWORK INTERFACE CSR (NI_CSR) bit definitions
-*/
-
-#define TO             0x0100  /* Time Out for remote boot */
-#define SHE            0x0080  /* SHadow memory Enable */
-#define BS             0x0040  /* Bank Select */
-#define BUF            0x0020  /* BUFfer size (1->32k, 0->64k) */
-#define RBE            0x0010  /* Remote Boot Enable (1->net boot) */
-#define AAC            0x0008  /* Address ROM Address Counter (1->enable) */
-#define _128KB         0x0008  /* 128kB Network RAM (1->enable) */
-#define IM             0x0004  /* Interrupt Mask (1->mask) */
-#define IEN            0x0002  /* Interrupt tristate ENable (1->enable) */
-#define LED            0x0001  /* LED control */
-
-/*
-** Control and Status Register 0 (CSR0) bit definitions
-*/
-
-#define ERR            0x8000  /* Error summary */
-#define BABL           0x4000  /* Babble transmitter timeout error  */
-#define CERR           0x2000  /* Collision Error */
-#define MISS           0x1000  /* Missed packet */
-#define MERR           0x0800  /* Memory Error */
-#define RINT           0x0400  /* Receiver Interrupt */
-#define TINT           0x0200  /* Transmit Interrupt */
-#define IDON           0x0100  /* Initialization Done */
-#define INTR           0x0080  /* Interrupt Flag */
-#define INEA           0x0040  /* Interrupt Enable */
-#define RXON           0x0020  /* Receiver on */
-#define TXON           0x0010  /* Transmitter on */
-#define TDMD           0x0008  /* Transmit Demand */
-#define STOP           0x0004  /* Stop */
-#define STRT           0x0002  /* Start */
-#define INIT           0x0001  /* Initialize */
-#define INTM            0xff00  /* Interrupt Mask */
-#define INTE            0xfff0  /* Interrupt Enable */
-
-/*
-** CONTROL AND STATUS REGISTER 3 (CSR3)
-*/
-
-#define BSWP           0x0004  /* Byte SWaP */
-#define ACON           0x0002  /* ALE control */
-#define BCON           0x0001  /* Byte CONtrol */
-
-/*
-** Initialization Block Mode Register
-*/
-
-#define PROM           0x8000  /* Promiscuous Mode */
-#define EMBA           0x0080  /* Enable Modified Back-off Algorithm */
-#define INTL           0x0040  /* Internal Loopback */
-#define DRTY           0x0020  /* Disable Retry */
-#define COLL           0x0010  /* Force Collision */
-#define DTCR           0x0008  /* Disable Transmit CRC */
-#define LOOP           0x0004  /* Loopback */
-#define DTX            0x0002  /* Disable the Transmitter */
-#define DRX            0x0001  /* Disable the Receiver */
-
-/*
-** Receive Message Descriptor 1 (RMD1) bit definitions.
-*/
-
-#define R_OWN       0x80000000         /* Owner bit 0 = host, 1 = lance */
-#define R_ERR          0x4000  /* Error Summary */
-#define R_FRAM         0x2000  /* Framing Error */
-#define R_OFLO         0x1000  /* Overflow Error */
-#define R_CRC          0x0800  /* CRC Error */
-#define R_BUFF         0x0400  /* Buffer Error */
-#define R_STP          0x0200  /* Start of Packet */
-#define R_ENP          0x0100  /* End of Packet */
-
-/*
-** Transmit Message Descriptor 1 (TMD1) bit definitions.
-*/
-
-#define T_OWN       0x80000000         /* Owner bit 0 = host, 1 = lance */
-#define T_ERR          0x4000  /* Error Summary */
-#define T_ADD_FCS      0x2000  /* More the 1 retry needed to Xmit */
-#define T_MORE         0x1000  /* >1 retry to transmit packet */
-#define T_ONE          0x0800  /* 1 try needed to transmit the packet */
-#define T_DEF          0x0400  /* Deferred */
-#define T_STP       0x02000000         /* Start of Packet */
-#define T_ENP       0x01000000 /* End of Packet */
-#define T_FLAGS     0xff000000  /* TX Flags Field */
-
-/*
-** Transmit Message Descriptor 3 (TMD3) bit definitions.
-*/
-
-#define TMD3_BUFF    0x8000    /* BUFFer error */
-#define TMD3_UFLO    0x4000    /* UnderFLOw error */
-#define TMD3_RES     0x2000    /* REServed */
-#define TMD3_LCOL    0x1000    /* Late COLlision */
-#define TMD3_LCAR    0x0800    /* Loss of CARrier */
-#define TMD3_RTRY    0x0400    /* ReTRY error */
-
-/*
-** EISA configuration Register (CNFG) bit definitions
-*/
-
-#define TIMEOUT        0x0100  /* 0:2.5 mins, 1: 30 secs */
-#define REMOTE         0x0080  /* Remote Boot Enable -> 1 */
-#define IRQ11          0x0040  /* Enable -> 1 */
-#define IRQ10          0x0020  /* Enable -> 1 */
-#define IRQ9           0x0010  /* Enable -> 1 */
-#define IRQ5           0x0008  /* Enable -> 1 */
-#define BUFF           0x0004  /* 0: 64kB or 128kB, 1: 32kB */
-#define PADR16         0x0002  /* RAM on 64kB boundary */
-#define PADR17         0x0001  /* RAM on 128kB boundary */
-
-/*
-** Miscellaneous
-*/
-#define HASH_TABLE_LEN   64           /* Bits */
-#define HASH_BITS        0x003f       /* 6 LS bits */
-
-#define MASK_INTERRUPTS   1
-#define UNMASK_INTERRUPTS 0
-
-#define EISA_EN         0x0001        /* Enable EISA bus buffers */
-#define EISA_ID         iobase+0x0080 /* ID long word for EISA card */
-#define EISA_CTRL       iobase+0x0084 /* Control word for EISA card */
-
-/*
-** Include the IOCTL stuff
-*/
-#include <linux/sockios.h>
-
-struct depca_ioctl {
-       unsigned short cmd;                /* Command to run */
-       unsigned short len;                /* Length of the data buffer */
-       unsigned char  __user *data;       /* Pointer to the data buffer */
-};
-
-/*
-** Recognised commands for the driver
-*/
-#define DEPCA_GET_HWADDR       0x01 /* Get the hardware address */
-#define DEPCA_SET_HWADDR       0x02 /* Get the hardware address */
-#define DEPCA_SET_PROM         0x03 /* Set Promiscuous Mode */
-#define DEPCA_CLR_PROM         0x04 /* Clear Promiscuous Mode */
-#define DEPCA_SAY_BOO          0x05 /* Say "Boo!" to the kernel log file */
-#define DEPCA_GET_MCA          0x06 /* Get a multicast address */
-#define DEPCA_SET_MCA          0x07 /* Set a multicast address */
-#define DEPCA_CLR_MCA          0x08 /* Clear a multicast address */
-#define DEPCA_MCA_EN           0x09 /* Enable a multicast address group */
-#define DEPCA_GET_STATS        0x0a /* Get the driver statistics */
-#define DEPCA_CLR_STATS        0x0b /* Zero out the driver statistics */
-#define DEPCA_GET_REG          0x0c /* Get the Register contents */
-#define DEPCA_SET_REG          0x0d /* Set the Register contents */
-#define DEPCA_DUMP              0x0f /* Dump the DEPCA Status */
-
index a227ccdcb9b5e94447a5cd3c23c9ebef94b08932..74cfc017adcf036160d2a868046b1ddf117c360b 100644 (file)
@@ -1688,10 +1688,9 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
                        memcpy(dev->dev_addr, promaddr, 6);
                }
        }
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        /* if the ethernet address is not valid, force to 00:00:00:00:00:00 */
-       if (!is_valid_ether_addr(dev->perm_addr))
+       if (!is_valid_ether_addr(dev->dev_addr))
                memset(dev->dev_addr, 0, ETH_ALEN);
 
        if (pcnet32_debug & NETIF_MSG_PROBE) {
index 7af95ce971eca6a4be84a87335d6e9675443076f..8df02ba2ce46fbda01d0c43539b26b8565a33db3 100644 (file)
@@ -2542,7 +2542,6 @@ static int atl1c_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                netdev->addr_assign_type = NET_ADDR_RANDOM;
        }
        memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
-       memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);
        if (netif_msg_probe(adapter))
                dev_dbg(&pdev->dev, "mac address : %pM\n",
                        adapter->hw.mac_addr);
index e4466a36d1063b38c71b3937ba5cc055482ab82a..cf79d932fa3570512a208514ce9638bd947f7500 100644 (file)
@@ -2342,7 +2342,6 @@ static int atl1e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
-       memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);
        netdev_dbg(netdev, "mac address : %pM\n", adapter->hw.mac_addr);
 
        INIT_WORK(&adapter->reset_task, atl1e_reset_task);
index aab83a2d4e0770a2cb781c5e6062bdb42360e413..1278b47022e0d2cf2b406e7adbefa7168c25274b 100644 (file)
@@ -1433,14 +1433,7 @@ static int atl2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* copy the MAC address out of the EEPROM */
        atl2_read_mac_addr(&adapter->hw);
        memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
-/* FIXME: do we still need this? */
-#ifdef ETHTOOL_GPERMADDR
-       memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);
-
-       if (!is_valid_ether_addr(netdev->perm_addr)) {
-#else
        if (!is_valid_ether_addr(netdev->dev_addr)) {
-#endif
                err = -EIO;
                goto err_eeprom;
        }
index f55267363f355d1238dfecf9eb8df1367f53aad1..3e69b3f88099ba931c9f6b18f4a71da82d182bdc 100644 (file)
@@ -121,4 +121,22 @@ config BNX2X
          To compile this driver as a module, choose M here: the module
          will be called bnx2x.  This is recommended.
 
+config BNX2X_SRIOV
+       bool "Broadcom 578xx and 57712 SR-IOV support"
+       depends on BNX2X && PCI_IOV
+       default y
+       ---help---
+         This configuration parameter enables Single Root Input Output
+         Virtualization support in the 578xx and 57712 products. This
+         allows for virtual function acceleration in virtual environments.
+
+config BGMAC
+       tristate "BCMA bus GBit core support"
+       depends on BCMA_HOST_SOC && HAS_DMA
+       ---help---
+         This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
+         They can be found on BCM47xx SoCs and provide gigabit ethernet.
+         In case of using this driver on BCM4706 it's also requires to enable
+         BCMA_DRIVER_GMAC_CMN to make it work.
+
 endif # NET_VENDOR_BROADCOM
index b7896051d54e215e2d8966c3c178853663cc691d..68efa1a3fb8820ed71ca1e565cf08c9f243bc55e 100644 (file)
@@ -9,3 +9,4 @@ obj-$(CONFIG_CNIC) += cnic.o
 obj-$(CONFIG_BNX2X) += bnx2x/
 obj-$(CONFIG_SB1250_MAC) += sb1250-mac.o
 obj-$(CONFIG_TIGON3) += tg3.o
+obj-$(CONFIG_BGMAC) += bgmac.o
index 219f6226fcb139a50795da6af0f4daa5a8ceb12a..3ba6be689e7dff8a40ce3368d2b4b0fa39de7772 100644 (file)
@@ -2111,8 +2111,6 @@ static int b44_get_invariants(struct b44 *bp)
                return -EINVAL;
        }
 
-       memcpy(bp->dev->perm_addr, bp->dev->dev_addr, bp->dev->addr_len);
-
        bp->imask = IMASK_DEF;
 
        /* XXX - really required?
index d8a151046728c55a41076502caf5b5682c1de9f8..f5b6b4715d455c167717ae94521f4bdc6b7bf369 100644 (file)
@@ -799,7 +799,7 @@ static int bcm_enet_open(struct net_device *dev)
                snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT,
                         priv->mii_bus->id, priv->phy_id);
 
-               phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0,
+               phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link,
                                     PHY_INTERFACE_MODE_MII);
 
                if (IS_ERR(phydev)) {
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
new file mode 100644 (file)
index 0000000..9bd33db
--- /dev/null
@@ -0,0 +1,1422 @@
+/*
+ * Driver for (BCM4706)? GBit MAC core on BCMA bus.
+ *
+ * Copyright (C) 2012 RafaÅ‚ MiÅ‚ecki <zajec5@gmail.com>
+ *
+ * Licensed under the GNU/GPL. See COPYING for details.
+ */
+
+#include "bgmac.h"
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/etherdevice.h>
+#include <linux/mii.h>
+#include <linux/interrupt.h>
+#include <linux/dma-mapping.h>
+#include <asm/mach-bcm47xx/nvram.h>
+
+static const struct bcma_device_id bgmac_bcma_tbl[] = {
+       BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_4706_MAC_GBIT, BCMA_ANY_REV, BCMA_ANY_CLASS),
+       BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_MAC_GBIT, BCMA_ANY_REV, BCMA_ANY_CLASS),
+       BCMA_CORETABLE_END
+};
+MODULE_DEVICE_TABLE(bcma, bgmac_bcma_tbl);
+
+static bool bgmac_wait_value(struct bcma_device *core, u16 reg, u32 mask,
+                            u32 value, int timeout)
+{
+       u32 val;
+       int i;
+
+       for (i = 0; i < timeout / 10; i++) {
+               val = bcma_read32(core, reg);
+               if ((val & mask) == value)
+                       return true;
+               udelay(10);
+       }
+       pr_err("Timeout waiting for reg 0x%X\n", reg);
+       return false;
+}
+
+/**************************************************
+ * DMA
+ **************************************************/
+
+static void bgmac_dma_tx_reset(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
+{
+       u32 val;
+       int i;
+
+       if (!ring->mmio_base)
+               return;
+
+       /* Suspend DMA TX ring first.
+        * bgmac_wait_value doesn't support waiting for any of few values, so
+        * implement whole loop here.
+        */
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL,
+                   BGMAC_DMA_TX_SUSPEND);
+       for (i = 0; i < 10000 / 10; i++) {
+               val = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
+               val &= BGMAC_DMA_TX_STAT;
+               if (val == BGMAC_DMA_TX_STAT_DISABLED ||
+                   val == BGMAC_DMA_TX_STAT_IDLEWAIT ||
+                   val == BGMAC_DMA_TX_STAT_STOPPED) {
+                       i = 0;
+                       break;
+               }
+               udelay(10);
+       }
+       if (i)
+               bgmac_err(bgmac, "Timeout suspending DMA TX ring 0x%X (BGMAC_DMA_TX_STAT: 0x%08X)\n",
+                         ring->mmio_base, val);
+
+       /* Remove SUSPEND bit */
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, 0);
+       if (!bgmac_wait_value(bgmac->core,
+                             ring->mmio_base + BGMAC_DMA_TX_STATUS,
+                             BGMAC_DMA_TX_STAT, BGMAC_DMA_TX_STAT_DISABLED,
+                             10000)) {
+               bgmac_warn(bgmac, "DMA TX ring 0x%X wasn't disabled on time, waiting additional 300us\n",
+                          ring->mmio_base);
+               udelay(300);
+               val = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
+               if ((val & BGMAC_DMA_TX_STAT) != BGMAC_DMA_TX_STAT_DISABLED)
+                       bgmac_err(bgmac, "Reset of DMA TX ring 0x%X failed\n",
+                                 ring->mmio_base);
+       }
+}
+
+static void bgmac_dma_tx_enable(struct bgmac *bgmac,
+                               struct bgmac_dma_ring *ring)
+{
+       u32 ctl;
+
+       ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL);
+       ctl |= BGMAC_DMA_TX_ENABLE;
+       ctl |= BGMAC_DMA_TX_PARITY_DISABLE;
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, ctl);
+}
+
+static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac,
+                                   struct bgmac_dma_ring *ring,
+                                   struct sk_buff *skb)
+{
+       struct device *dma_dev = bgmac->core->dma_dev;
+       struct net_device *net_dev = bgmac->net_dev;
+       struct bgmac_dma_desc *dma_desc;
+       struct bgmac_slot_info *slot;
+       u32 ctl0, ctl1;
+       int free_slots;
+
+       if (skb->len > BGMAC_DESC_CTL1_LEN) {
+               bgmac_err(bgmac, "Too long skb (%d)\n", skb->len);
+               goto err_stop_drop;
+       }
+
+       if (ring->start <= ring->end)
+               free_slots = ring->start - ring->end + BGMAC_TX_RING_SLOTS;
+       else
+               free_slots = ring->start - ring->end;
+       if (free_slots == 1) {
+               bgmac_err(bgmac, "TX ring is full, queue should be stopped!\n");
+               netif_stop_queue(net_dev);
+               return NETDEV_TX_BUSY;
+       }
+
+       slot = &ring->slots[ring->end];
+       slot->skb = skb;
+       slot->dma_addr = dma_map_single(dma_dev, skb->data, skb->len,
+                                       DMA_TO_DEVICE);
+       if (dma_mapping_error(dma_dev, slot->dma_addr)) {
+               bgmac_err(bgmac, "Mapping error of skb on ring 0x%X\n",
+                         ring->mmio_base);
+               goto err_stop_drop;
+       }
+
+       ctl0 = BGMAC_DESC_CTL0_IOC | BGMAC_DESC_CTL0_SOF | BGMAC_DESC_CTL0_EOF;
+       if (ring->end == ring->num_slots - 1)
+               ctl0 |= BGMAC_DESC_CTL0_EOT;
+       ctl1 = skb->len & BGMAC_DESC_CTL1_LEN;
+
+       dma_desc = ring->cpu_base;
+       dma_desc += ring->end;
+       dma_desc->addr_low = cpu_to_le32(lower_32_bits(slot->dma_addr));
+       dma_desc->addr_high = cpu_to_le32(upper_32_bits(slot->dma_addr));
+       dma_desc->ctl0 = cpu_to_le32(ctl0);
+       dma_desc->ctl1 = cpu_to_le32(ctl1);
+
+       wmb();
+
+       /* Increase ring->end to point empty slot. We tell hardware the first
+        * slot it should *not* read.
+        */
+       if (++ring->end >= BGMAC_TX_RING_SLOTS)
+               ring->end = 0;
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX,
+                   ring->end * sizeof(struct bgmac_dma_desc));
+
+       /* Always keep one slot free to allow detecting bugged calls. */
+       if (--free_slots == 1)
+               netif_stop_queue(net_dev);
+
+       return NETDEV_TX_OK;
+
+err_stop_drop:
+       netif_stop_queue(net_dev);
+       dev_kfree_skb(skb);
+       return NETDEV_TX_OK;
+}
+
+/* Free transmitted packets */
+static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
+{
+       struct device *dma_dev = bgmac->core->dma_dev;
+       int empty_slot;
+       bool freed = false;
+
+       /* The last slot that hardware didn't consume yet */
+       empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
+       empty_slot &= BGMAC_DMA_TX_STATDPTR;
+       empty_slot /= sizeof(struct bgmac_dma_desc);
+
+       while (ring->start != empty_slot) {
+               struct bgmac_slot_info *slot = &ring->slots[ring->start];
+
+               if (slot->skb) {
+                       /* Unmap no longer used buffer */
+                       dma_unmap_single(dma_dev, slot->dma_addr,
+                                        slot->skb->len, DMA_TO_DEVICE);
+                       slot->dma_addr = 0;
+
+                       /* Free memory! :) */
+                       dev_kfree_skb(slot->skb);
+                       slot->skb = NULL;
+               } else {
+                       bgmac_err(bgmac, "Hardware reported transmission for empty TX ring slot %d! End of ring: %d\n",
+                                 ring->start, ring->end);
+               }
+
+               if (++ring->start >= BGMAC_TX_RING_SLOTS)
+                       ring->start = 0;
+               freed = true;
+       }
+
+       if (freed && netif_queue_stopped(bgmac->net_dev))
+               netif_wake_queue(bgmac->net_dev);
+}
+
+static void bgmac_dma_rx_reset(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
+{
+       if (!ring->mmio_base)
+               return;
+
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL, 0);
+       if (!bgmac_wait_value(bgmac->core,
+                             ring->mmio_base + BGMAC_DMA_RX_STATUS,
+                             BGMAC_DMA_RX_STAT, BGMAC_DMA_RX_STAT_DISABLED,
+                             10000))
+               bgmac_err(bgmac, "Reset of ring 0x%X RX failed\n",
+                         ring->mmio_base);
+}
+
+static void bgmac_dma_rx_enable(struct bgmac *bgmac,
+                               struct bgmac_dma_ring *ring)
+{
+       u32 ctl;
+
+       ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL);
+       ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
+       ctl |= BGMAC_DMA_RX_ENABLE;
+       ctl |= BGMAC_DMA_RX_PARITY_DISABLE;
+       ctl |= BGMAC_DMA_RX_OVERFLOW_CONT;
+       ctl |= BGMAC_RX_FRAME_OFFSET << BGMAC_DMA_RX_FRAME_OFFSET_SHIFT;
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL, ctl);
+}
+
+static int bgmac_dma_rx_skb_for_slot(struct bgmac *bgmac,
+                                    struct bgmac_slot_info *slot)
+{
+       struct device *dma_dev = bgmac->core->dma_dev;
+       struct bgmac_rx_header *rx;
+
+       /* Alloc skb */
+       slot->skb = netdev_alloc_skb(bgmac->net_dev, BGMAC_RX_BUF_SIZE);
+       if (!slot->skb) {
+               bgmac_err(bgmac, "Allocation of skb failed!\n");
+               return -ENOMEM;
+       }
+
+       /* Poison - if everything goes fine, hardware will overwrite it */
+       rx = (struct bgmac_rx_header *)slot->skb->data;
+       rx->len = cpu_to_le16(0xdead);
+       rx->flags = cpu_to_le16(0xbeef);
+
+       /* Map skb for the DMA */
+       slot->dma_addr = dma_map_single(dma_dev, slot->skb->data,
+                                       BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
+       if (dma_mapping_error(dma_dev, slot->dma_addr)) {
+               bgmac_err(bgmac, "DMA mapping error\n");
+               return -ENOMEM;
+       }
+       if (slot->dma_addr & 0xC0000000)
+               bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
+
+       return 0;
+}
+
+static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
+                            int weight)
+{
+       u32 end_slot;
+       int handled = 0;
+
+       end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS);
+       end_slot &= BGMAC_DMA_RX_STATDPTR;
+       end_slot /= sizeof(struct bgmac_dma_desc);
+
+       ring->end = end_slot;
+
+       while (ring->start != ring->end) {
+               struct device *dma_dev = bgmac->core->dma_dev;
+               struct bgmac_slot_info *slot = &ring->slots[ring->start];
+               struct sk_buff *skb = slot->skb;
+               struct sk_buff *new_skb;
+               struct bgmac_rx_header *rx;
+               u16 len, flags;
+
+               /* Unmap buffer to make it accessible to the CPU */
+               dma_sync_single_for_cpu(dma_dev, slot->dma_addr,
+                                       BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
+
+               /* Get info from the header */
+               rx = (struct bgmac_rx_header *)skb->data;
+               len = le16_to_cpu(rx->len);
+               flags = le16_to_cpu(rx->flags);
+
+               /* Check for poison and drop or pass the packet */
+               if (len == 0xdead && flags == 0xbeef) {
+                       bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
+                                 ring->start);
+               } else {
+                       new_skb = netdev_alloc_skb(bgmac->net_dev, len);
+                       if (new_skb) {
+                               skb_put(new_skb, len);
+                               skb_copy_from_linear_data_offset(skb, BGMAC_RX_FRAME_OFFSET,
+                                                                new_skb->data,
+                                                                len);
+                               new_skb->protocol =
+                                       eth_type_trans(new_skb, bgmac->net_dev);
+                               netif_receive_skb(new_skb);
+                               handled++;
+                       } else {
+                               bgmac->net_dev->stats.rx_dropped++;
+                               bgmac_err(bgmac, "Allocation of skb for copying packet failed!\n");
+                       }
+
+                       /* Poison the old skb */
+                       rx->len = cpu_to_le16(0xdead);
+                       rx->flags = cpu_to_le16(0xbeef);
+               }
+
+               /* Make it back accessible to the hardware */
+               dma_sync_single_for_device(dma_dev, slot->dma_addr,
+                                          BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
+
+               if (++ring->start >= BGMAC_RX_RING_SLOTS)
+                       ring->start = 0;
+
+               if (handled >= weight) /* Should never be greater */
+                       break;
+       }
+
+       return handled;
+}
+
+/* Does ring support unaligned addressing? */
+static bool bgmac_dma_unaligned(struct bgmac *bgmac,
+                               struct bgmac_dma_ring *ring,
+                               enum bgmac_dma_ring_type ring_type)
+{
+       switch (ring_type) {
+       case BGMAC_DMA_RING_TX:
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO,
+                           0xff0);
+               if (bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO))
+                       return true;
+               break;
+       case BGMAC_DMA_RING_RX:
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO,
+                           0xff0);
+               if (bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO))
+                       return true;
+               break;
+       }
+       return false;
+}
+
+static void bgmac_dma_ring_free(struct bgmac *bgmac,
+                               struct bgmac_dma_ring *ring)
+{
+       struct device *dma_dev = bgmac->core->dma_dev;
+       struct bgmac_slot_info *slot;
+       int size;
+       int i;
+
+       for (i = 0; i < ring->num_slots; i++) {
+               slot = &ring->slots[i];
+               if (slot->skb) {
+                       if (slot->dma_addr)
+                               dma_unmap_single(dma_dev, slot->dma_addr,
+                                                slot->skb->len, DMA_TO_DEVICE);
+                       dev_kfree_skb(slot->skb);
+               }
+       }
+
+       if (ring->cpu_base) {
+               /* Free ring of descriptors */
+               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
+               dma_free_coherent(dma_dev, size, ring->cpu_base,
+                                 ring->dma_base);
+       }
+}
+
+static void bgmac_dma_free(struct bgmac *bgmac)
+{
+       int i;
+
+       for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
+               bgmac_dma_ring_free(bgmac, &bgmac->tx_ring[i]);
+       for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
+               bgmac_dma_ring_free(bgmac, &bgmac->rx_ring[i]);
+}
+
+static int bgmac_dma_alloc(struct bgmac *bgmac)
+{
+       struct device *dma_dev = bgmac->core->dma_dev;
+       struct bgmac_dma_ring *ring;
+       static const u16 ring_base[] = { BGMAC_DMA_BASE0, BGMAC_DMA_BASE1,
+                                        BGMAC_DMA_BASE2, BGMAC_DMA_BASE3, };
+       int size; /* ring size: different for Tx and Rx */
+       int err;
+       int i;
+
+       BUILD_BUG_ON(BGMAC_MAX_TX_RINGS > ARRAY_SIZE(ring_base));
+       BUILD_BUG_ON(BGMAC_MAX_RX_RINGS > ARRAY_SIZE(ring_base));
+
+       if (!(bcma_aread32(bgmac->core, BCMA_IOST) & BCMA_IOST_DMA64)) {
+               bgmac_err(bgmac, "Core does not report 64-bit DMA\n");
+               return -ENOTSUPP;
+       }
+
+       for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
+               ring = &bgmac->tx_ring[i];
+               ring->num_slots = BGMAC_TX_RING_SLOTS;
+               ring->mmio_base = ring_base[i];
+               if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX))
+                       bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
+                                  ring->mmio_base);
+
+               /* Alloc ring of descriptors */
+               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
+               ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
+                                                    &ring->dma_base,
+                                                    GFP_KERNEL);
+               if (!ring->cpu_base) {
+                       bgmac_err(bgmac, "Allocation of TX ring 0x%X failed\n",
+                                 ring->mmio_base);
+                       goto err_dma_free;
+               }
+               if (ring->dma_base & 0xC0000000)
+                       bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
+
+               /* No need to alloc TX slots yet */
+       }
+
+       for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
+               ring = &bgmac->rx_ring[i];
+               ring->num_slots = BGMAC_RX_RING_SLOTS;
+               ring->mmio_base = ring_base[i];
+               if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX))
+                       bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n",
+                                  ring->mmio_base);
+
+               /* Alloc ring of descriptors */
+               size = ring->num_slots * sizeof(struct bgmac_dma_desc);
+               ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
+                                                    &ring->dma_base,
+                                                    GFP_KERNEL);
+               if (!ring->cpu_base) {
+                       bgmac_err(bgmac, "Allocation of RX ring 0x%X failed\n",
+                                 ring->mmio_base);
+                       err = -ENOMEM;
+                       goto err_dma_free;
+               }
+               if (ring->dma_base & 0xC0000000)
+                       bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
+
+               /* Alloc RX slots */
+               for (i = 0; i < ring->num_slots; i++) {
+                       err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[i]);
+                       if (err) {
+                               bgmac_err(bgmac, "Can't allocate skb for slot in RX ring\n");
+                               goto err_dma_free;
+                       }
+               }
+       }
+
+       return 0;
+
+err_dma_free:
+       bgmac_dma_free(bgmac);
+       return -ENOMEM;
+}
+
+static void bgmac_dma_init(struct bgmac *bgmac)
+{
+       struct bgmac_dma_ring *ring;
+       struct bgmac_dma_desc *dma_desc;
+       u32 ctl0, ctl1;
+       int i;
+
+       for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
+               ring = &bgmac->tx_ring[i];
+
+               /* We don't implement unaligned addressing, so enable first */
+               bgmac_dma_tx_enable(bgmac, ring);
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO,
+                           lower_32_bits(ring->dma_base));
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI,
+                           upper_32_bits(ring->dma_base));
+
+               ring->start = 0;
+               ring->end = 0;  /* Points the slot that should *not* be read */
+       }
+
+       for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
+               ring = &bgmac->rx_ring[i];
+
+               /* We don't implement unaligned addressing, so enable first */
+               bgmac_dma_rx_enable(bgmac, ring);
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO,
+                           lower_32_bits(ring->dma_base));
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI,
+                           upper_32_bits(ring->dma_base));
+
+               for (i = 0, dma_desc = ring->cpu_base; i < ring->num_slots;
+                    i++, dma_desc++) {
+                       ctl0 = ctl1 = 0;
+
+                       if (i == ring->num_slots - 1)
+                               ctl0 |= BGMAC_DESC_CTL0_EOT;
+                       ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
+                       /* Is there any BGMAC device that requires extension? */
+                       /* ctl1 |= (addrext << B43_DMA64_DCTL1_ADDREXT_SHIFT) &
+                        * B43_DMA64_DCTL1_ADDREXT_MASK;
+                        */
+
+                       dma_desc->addr_low = cpu_to_le32(lower_32_bits(ring->slots[i].dma_addr));
+                       dma_desc->addr_high = cpu_to_le32(upper_32_bits(ring->slots[i].dma_addr));
+                       dma_desc->ctl0 = cpu_to_le32(ctl0);
+                       dma_desc->ctl1 = cpu_to_le32(ctl1);
+               }
+
+               bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX,
+                           ring->num_slots * sizeof(struct bgmac_dma_desc));
+
+               ring->start = 0;
+               ring->end = 0;
+       }
+}
+
+/**************************************************
+ * PHY ops
+ **************************************************/
+
+u16 bgmac_phy_read(struct bgmac *bgmac, u8 phyaddr, u8 reg)
+{
+       struct bcma_device *core;
+       u16 phy_access_addr;
+       u16 phy_ctl_addr;
+       u32 tmp;
+
+       BUILD_BUG_ON(BGMAC_PA_DATA_MASK != BCMA_GMAC_CMN_PA_DATA_MASK);
+       BUILD_BUG_ON(BGMAC_PA_ADDR_MASK != BCMA_GMAC_CMN_PA_ADDR_MASK);
+       BUILD_BUG_ON(BGMAC_PA_ADDR_SHIFT != BCMA_GMAC_CMN_PA_ADDR_SHIFT);
+       BUILD_BUG_ON(BGMAC_PA_REG_MASK != BCMA_GMAC_CMN_PA_REG_MASK);
+       BUILD_BUG_ON(BGMAC_PA_REG_SHIFT != BCMA_GMAC_CMN_PA_REG_SHIFT);
+       BUILD_BUG_ON(BGMAC_PA_WRITE != BCMA_GMAC_CMN_PA_WRITE);
+       BUILD_BUG_ON(BGMAC_PA_START != BCMA_GMAC_CMN_PA_START);
+       BUILD_BUG_ON(BGMAC_PC_EPA_MASK != BCMA_GMAC_CMN_PC_EPA_MASK);
+       BUILD_BUG_ON(BGMAC_PC_MCT_MASK != BCMA_GMAC_CMN_PC_MCT_MASK);
+       BUILD_BUG_ON(BGMAC_PC_MCT_SHIFT != BCMA_GMAC_CMN_PC_MCT_SHIFT);
+       BUILD_BUG_ON(BGMAC_PC_MTE != BCMA_GMAC_CMN_PC_MTE);
+
+       if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
+               core = bgmac->core->bus->drv_gmac_cmn.core;
+               phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
+               phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
+       } else {
+               core = bgmac->core;
+               phy_access_addr = BGMAC_PHY_ACCESS;
+               phy_ctl_addr = BGMAC_PHY_CNTL;
+       }
+
+       tmp = bcma_read32(core, phy_ctl_addr);
+       tmp &= ~BGMAC_PC_EPA_MASK;
+       tmp |= phyaddr;
+       bcma_write32(core, phy_ctl_addr, tmp);
+
+       tmp = BGMAC_PA_START;
+       tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
+       tmp |= reg << BGMAC_PA_REG_SHIFT;
+       bcma_write32(core, phy_access_addr, tmp);
+
+       if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
+               bgmac_err(bgmac, "Reading PHY %d register 0x%X failed\n",
+                         phyaddr, reg);
+               return 0xffff;
+       }
+
+       return bcma_read32(core, phy_access_addr) & BGMAC_PA_DATA_MASK;
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphywr */
+void bgmac_phy_write(struct bgmac *bgmac, u8 phyaddr, u8 reg, u16 value)
+{
+       struct bcma_device *core;
+       u16 phy_access_addr;
+       u16 phy_ctl_addr;
+       u32 tmp;
+
+       if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
+               core = bgmac->core->bus->drv_gmac_cmn.core;
+               phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
+               phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
+       } else {
+               core = bgmac->core;
+               phy_access_addr = BGMAC_PHY_ACCESS;
+               phy_ctl_addr = BGMAC_PHY_CNTL;
+       }
+
+       tmp = bcma_read32(core, phy_ctl_addr);
+       tmp &= ~BGMAC_PC_EPA_MASK;
+       tmp |= phyaddr;
+       bcma_write32(core, phy_ctl_addr, tmp);
+
+       bgmac_write(bgmac, BGMAC_INT_STATUS, BGMAC_IS_MDIO);
+       if (bgmac_read(bgmac, BGMAC_INT_STATUS) & BGMAC_IS_MDIO)
+               bgmac_warn(bgmac, "Error setting MDIO int\n");
+
+       tmp = BGMAC_PA_START;
+       tmp |= BGMAC_PA_WRITE;
+       tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
+       tmp |= reg << BGMAC_PA_REG_SHIFT;
+       tmp |= value;
+       bcma_write32(core, phy_access_addr, tmp);
+
+       if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000))
+               bgmac_err(bgmac, "Writing to PHY %d register 0x%X failed\n",
+                         phyaddr, reg);
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyforce */
+static void bgmac_phy_force(struct bgmac *bgmac)
+{
+       u16 ctl;
+       u16 mask = ~(BGMAC_PHY_CTL_SPEED | BGMAC_PHY_CTL_SPEED_MSB |
+                    BGMAC_PHY_CTL_ANENAB | BGMAC_PHY_CTL_DUPLEX);
+
+       if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
+               return;
+
+       if (bgmac->autoneg)
+               return;
+
+       ctl = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL);
+       ctl &= mask;
+       if (bgmac->full_duplex)
+               ctl |= BGMAC_PHY_CTL_DUPLEX;
+       if (bgmac->speed == BGMAC_SPEED_100)
+               ctl |= BGMAC_PHY_CTL_SPEED_100;
+       else if (bgmac->speed == BGMAC_SPEED_1000)
+               ctl |= BGMAC_PHY_CTL_SPEED_1000;
+       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL, ctl);
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyadvertise */
+static void bgmac_phy_advertise(struct bgmac *bgmac)
+{
+       u16 adv;
+
+       if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
+               return;
+
+       if (!bgmac->autoneg)
+               return;
+
+       /* Adv selected 10/100 speeds */
+       adv = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV);
+       adv &= ~(BGMAC_PHY_ADV_10HALF | BGMAC_PHY_ADV_10FULL |
+                BGMAC_PHY_ADV_100HALF | BGMAC_PHY_ADV_100FULL);
+       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_10)
+               adv |= BGMAC_PHY_ADV_10HALF;
+       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_100)
+               adv |= BGMAC_PHY_ADV_100HALF;
+       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_10)
+               adv |= BGMAC_PHY_ADV_10FULL;
+       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_100)
+               adv |= BGMAC_PHY_ADV_100FULL;
+       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV, adv);
+
+       /* Adv selected 1000 speeds */
+       adv = bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV2);
+       adv &= ~(BGMAC_PHY_ADV2_1000HALF | BGMAC_PHY_ADV2_1000FULL);
+       if (!bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_1000)
+               adv |= BGMAC_PHY_ADV2_1000HALF;
+       if (bgmac->full_duplex && bgmac->speed & BGMAC_SPEED_1000)
+               adv |= BGMAC_PHY_ADV2_1000FULL;
+       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_ADV2, adv);
+
+       /* Restart */
+       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL,
+                       bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL) |
+                       BGMAC_PHY_CTL_RESTART);
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyinit */
+static void bgmac_phy_init(struct bgmac *bgmac)
+{
+       struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
+       struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
+       u8 i;
+
+       if (ci->id == BCMA_CHIP_ID_BCM5356) {
+               for (i = 0; i < 5; i++) {
+                       bgmac_phy_write(bgmac, i, 0x1f, 0x008b);
+                       bgmac_phy_write(bgmac, i, 0x15, 0x0100);
+                       bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
+                       bgmac_phy_write(bgmac, i, 0x12, 0x2aaa);
+                       bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
+               }
+       }
+       if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg != 10) ||
+           (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg != 10) ||
+           (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg != 9)) {
+               bcma_chipco_chipctl_maskset(cc, 2, ~0xc0000000, 0);
+               bcma_chipco_chipctl_maskset(cc, 4, ~0x80000000, 0);
+               for (i = 0; i < 5; i++) {
+                       bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
+                       bgmac_phy_write(bgmac, i, 0x16, 0x5284);
+                       bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
+                       bgmac_phy_write(bgmac, i, 0x17, 0x0010);
+                       bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
+                       bgmac_phy_write(bgmac, i, 0x16, 0x5296);
+                       bgmac_phy_write(bgmac, i, 0x17, 0x1073);
+                       bgmac_phy_write(bgmac, i, 0x17, 0x9073);
+                       bgmac_phy_write(bgmac, i, 0x16, 0x52b6);
+                       bgmac_phy_write(bgmac, i, 0x17, 0x9273);
+                       bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
+               }
+       }
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyreset */
+static void bgmac_phy_reset(struct bgmac *bgmac)
+{
+       if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
+               return;
+
+       bgmac_phy_write(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL,
+                       BGMAC_PHY_CTL_RESET);
+       udelay(100);
+       if (bgmac_phy_read(bgmac, bgmac->phyaddr, BGMAC_PHY_CTL) &
+           BGMAC_PHY_CTL_RESET)
+               bgmac_err(bgmac, "PHY reset failed\n");
+       bgmac_phy_init(bgmac);
+}
+
+/**************************************************
+ * Chip ops
+ **************************************************/
+
+/* TODO: can we just drop @force? Can we don't reset MAC at all if there is
+ * nothing to change? Try if after stabilizng driver.
+ */
+static void bgmac_cmdcfg_maskset(struct bgmac *bgmac, u32 mask, u32 set,
+                                bool force)
+{
+       u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
+       u32 new_val = (cmdcfg & mask) | set;
+
+       bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR);
+       udelay(2);
+
+       if (new_val != cmdcfg || force)
+               bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
+
+       bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR);
+       udelay(2);
+}
+
+#if 0 /* We don't use that regs yet */
+static void bgmac_chip_stats_update(struct bgmac *bgmac)
+{
+       int i;
+
+       if (bgmac->core->id.id != BCMA_CORE_4706_MAC_GBIT) {
+               for (i = 0; i < BGMAC_NUM_MIB_TX_REGS; i++)
+                       bgmac->mib_tx_regs[i] =
+                               bgmac_read(bgmac,
+                                          BGMAC_TX_GOOD_OCTETS + (i * 4));
+               for (i = 0; i < BGMAC_NUM_MIB_RX_REGS; i++)
+                       bgmac->mib_rx_regs[i] =
+                               bgmac_read(bgmac,
+                                          BGMAC_RX_GOOD_OCTETS + (i * 4));
+       }
+
+       /* TODO: what else? how to handle BCM4706? Specs are needed */
+}
+#endif
+
+static void bgmac_clear_mib(struct bgmac *bgmac)
+{
+       int i;
+
+       if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT)
+               return;
+
+       bgmac_set(bgmac, BGMAC_DEV_CTL, BGMAC_DC_MROR);
+       for (i = 0; i < BGMAC_NUM_MIB_TX_REGS; i++)
+               bgmac_read(bgmac, BGMAC_TX_GOOD_OCTETS + (i * 4));
+       for (i = 0; i < BGMAC_NUM_MIB_RX_REGS; i++)
+               bgmac_read(bgmac, BGMAC_RX_GOOD_OCTETS + (i * 4));
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_speed */
+static void bgmac_speed(struct bgmac *bgmac, int speed)
+{
+       u32 mask = ~(BGMAC_CMDCFG_ES_MASK | BGMAC_CMDCFG_HD);
+       u32 set = 0;
+
+       if (speed & BGMAC_SPEED_10)
+               set |= BGMAC_CMDCFG_ES_10;
+       if (speed & BGMAC_SPEED_100)
+               set |= BGMAC_CMDCFG_ES_100;
+       if (speed & BGMAC_SPEED_1000)
+               set |= BGMAC_CMDCFG_ES_1000;
+       if (!bgmac->full_duplex)
+               set |= BGMAC_CMDCFG_HD;
+       bgmac_cmdcfg_maskset(bgmac, mask, set, true);
+}
+
+static void bgmac_miiconfig(struct bgmac *bgmac)
+{
+       u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
+                       BGMAC_DS_MM_SHIFT;
+       if (imode == 0 || imode == 1) {
+               if (bgmac->autoneg)
+                       bgmac_speed(bgmac, BGMAC_SPEED_100);
+               else
+                       bgmac_speed(bgmac, bgmac->speed);
+       }
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipreset */
+static void bgmac_chip_reset(struct bgmac *bgmac)
+{
+       struct bcma_device *core = bgmac->core;
+       struct bcma_bus *bus = core->bus;
+       struct bcma_chipinfo *ci = &bus->chipinfo;
+       u32 flags = 0;
+       u32 iost;
+       int i;
+
+       if (bcma_core_is_enabled(core)) {
+               if (!bgmac->stats_grabbed) {
+                       /* bgmac_chip_stats_update(bgmac); */
+                       bgmac->stats_grabbed = true;
+               }
+
+               for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
+                       bgmac_dma_tx_reset(bgmac, &bgmac->tx_ring[i]);
+
+               bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_ML, false);
+               udelay(1);
+
+               for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
+                       bgmac_dma_rx_reset(bgmac, &bgmac->rx_ring[i]);
+
+               /* TODO: Clear software multicast filter list */
+       }
+
+       iost = bcma_aread32(core, BCMA_IOST);
+       if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 10) ||
+           (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
+           (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9))
+               iost &= ~BGMAC_BCMA_IOST_ATTACHED;
+
+       if (iost & BGMAC_BCMA_IOST_ATTACHED) {
+               flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
+               if (!bgmac->has_robosw)
+                       flags |= BGMAC_BCMA_IOCTL_SW_RESET;
+       }
+
+       bcma_core_enable(core, flags);
+
+       if (core->id.rev > 2) {
+               bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8);
+               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24,
+                                1000);
+       }
+
+       if (ci->id == BCMA_CHIP_ID_BCM5357 || ci->id == BCMA_CHIP_ID_BCM4749 ||
+           ci->id == BCMA_CHIP_ID_BCM53572) {
+               struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
+               u8 et_swtype = 0;
+               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
+                            BGMAC_CHIPCTL_1_IF_TYPE_RMII;
+               char buf[2];
+
+               if (nvram_getenv("et_swtype", buf, 1) > 0) {
+                       if (kstrtou8(buf, 0, &et_swtype))
+                               bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n",
+                                         buf);
+                       et_swtype &= 0x0f;
+                       et_swtype <<= 4;
+                       sw_type = et_swtype;
+               } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 9) {
+                       sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
+               } else if (0) {
+                       /* TODO */
+               }
+               bcma_chipco_chipctl_maskset(cc, 1,
+                                           ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK |
+                                             BGMAC_CHIPCTL_1_SW_TYPE_MASK),
+                                           sw_type);
+       }
+
+       if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
+               bcma_awrite32(core, BCMA_IOCTL,
+                             bcma_aread32(core, BCMA_IOCTL) &
+                             ~BGMAC_BCMA_IOCTL_SW_RESET);
+
+       /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_reset
+        * Specs don't say about using BGMAC_CMDCFG_SR, but in this routine
+        * BGMAC_CMDCFG is read _after_ putting chip in a reset. So it has to
+        * be keps until taking MAC out of the reset.
+        */
+       bgmac_cmdcfg_maskset(bgmac,
+                            ~(BGMAC_CMDCFG_TE |
+                              BGMAC_CMDCFG_RE |
+                              BGMAC_CMDCFG_RPI |
+                              BGMAC_CMDCFG_TAI |
+                              BGMAC_CMDCFG_HD |
+                              BGMAC_CMDCFG_ML |
+                              BGMAC_CMDCFG_CFE |
+                              BGMAC_CMDCFG_RL |
+                              BGMAC_CMDCFG_RED |
+                              BGMAC_CMDCFG_PE |
+                              BGMAC_CMDCFG_TPI |
+                              BGMAC_CMDCFG_PAD_EN |
+                              BGMAC_CMDCFG_PF),
+                            BGMAC_CMDCFG_PROM |
+                            BGMAC_CMDCFG_NLC |
+                            BGMAC_CMDCFG_CFE |
+                            BGMAC_CMDCFG_SR,
+                            false);
+
+       bgmac_clear_mib(bgmac);
+       if (core->id.id == BCMA_CORE_4706_MAC_GBIT)
+               bcma_maskset32(bgmac->cmn, BCMA_GMAC_CMN_PHY_CTL, ~0,
+                              BCMA_GMAC_CMN_PC_MTE);
+       else
+               bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE);
+       bgmac_miiconfig(bgmac);
+       bgmac_phy_init(bgmac);
+
+       bgmac->int_status = 0;
+}
+
+static void bgmac_chip_intrs_on(struct bgmac *bgmac)
+{
+       bgmac_write(bgmac, BGMAC_INT_MASK, bgmac->int_mask);
+}
+
+static void bgmac_chip_intrs_off(struct bgmac *bgmac)
+{
+       bgmac_write(bgmac, BGMAC_INT_MASK, 0);
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_enable */
+static void bgmac_enable(struct bgmac *bgmac)
+{
+       struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
+       u32 cmdcfg;
+       u32 mode;
+       u32 rxq_ctl;
+       u32 fl_ctl;
+       u16 bp_clk;
+       u8 mdp;
+
+       cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
+       bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
+                            BGMAC_CMDCFG_SR, true);
+       udelay(2);
+       cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
+       bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
+
+       mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
+               BGMAC_DS_MM_SHIFT;
+       if (ci->id != BCMA_CHIP_ID_BCM47162 || mode != 0)
+               bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
+       if (ci->id == BCMA_CHIP_ID_BCM47162 && mode == 2)
+               bcma_chipco_chipctl_maskset(&bgmac->core->bus->drv_cc, 1, ~0,
+                                           BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
+
+       switch (ci->id) {
+       case BCMA_CHIP_ID_BCM5357:
+       case BCMA_CHIP_ID_BCM4749:
+       case BCMA_CHIP_ID_BCM53572:
+       case BCMA_CHIP_ID_BCM4716:
+       case BCMA_CHIP_ID_BCM47162:
+               fl_ctl = 0x03cb04cb;
+               if (ci->id == BCMA_CHIP_ID_BCM5357 ||
+                   ci->id == BCMA_CHIP_ID_BCM4749 ||
+                   ci->id == BCMA_CHIP_ID_BCM53572)
+                       fl_ctl = 0x2300e1;
+               bgmac_write(bgmac, BGMAC_FLOW_CTL_THRESH, fl_ctl);
+               bgmac_write(bgmac, BGMAC_PAUSE_CTL, 0x27fff);
+               break;
+       }
+
+       rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
+       rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
+       bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000;
+       mdp = (bp_clk * 128 / 1000) - 3;
+       rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
+       bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
+}
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */
+static void bgmac_chip_init(struct bgmac *bgmac, bool full_init)
+{
+       struct bgmac_dma_ring *ring;
+       u8 *mac = bgmac->net_dev->dev_addr;
+       u32 tmp;
+       int i;
+
+       /* 1 interrupt per received frame */
+       bgmac_write(bgmac, BGMAC_INT_RECV_LAZY, 1 << BGMAC_IRL_FC_SHIFT);
+
+       /* Enable 802.3x tx flow control (honor received PAUSE frames) */
+       bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_RPI, 0, true);
+
+       if (bgmac->net_dev->flags & IFF_PROMISC)
+               bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_PROM, false);
+       else
+               bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_PROM, 0, false);
+
+       /* Set MAC addr */
+       tmp = (mac[0] << 24) | (mac[1] << 16) | (mac[2] << 8) | mac[3];
+       bgmac_write(bgmac, BGMAC_MACADDR_HIGH, tmp);
+       tmp = (mac[4] << 8) | mac[5];
+       bgmac_write(bgmac, BGMAC_MACADDR_LOW, tmp);
+
+       if (bgmac->loopback)
+               bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_ML, true);
+       else
+               bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_ML, 0, true);
+
+       bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + ETHER_MAX_LEN);
+
+       if (!bgmac->autoneg) {
+               bgmac_speed(bgmac, bgmac->speed);
+               bgmac_phy_force(bgmac);
+       } else if (bgmac->speed) { /* if there is anything to adv */
+               bgmac_phy_advertise(bgmac);
+       }
+
+       if (full_init) {
+               bgmac_dma_init(bgmac);
+               if (1) /* FIXME: is there any case we don't want IRQs? */
+                       bgmac_chip_intrs_on(bgmac);
+       } else {
+               for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
+                       ring = &bgmac->rx_ring[i];
+                       bgmac_dma_rx_enable(bgmac, ring);
+               }
+       }
+
+       bgmac_enable(bgmac);
+}
+
+static irqreturn_t bgmac_interrupt(int irq, void *dev_id)
+{
+       struct bgmac *bgmac = netdev_priv(dev_id);
+
+       u32 int_status = bgmac_read(bgmac, BGMAC_INT_STATUS);
+       int_status &= bgmac->int_mask;
+
+       if (!int_status)
+               return IRQ_NONE;
+
+       /* Ack */
+       bgmac_write(bgmac, BGMAC_INT_STATUS, int_status);
+
+       /* Disable new interrupts until handling existing ones */
+       bgmac_chip_intrs_off(bgmac);
+
+       bgmac->int_status = int_status;
+
+       napi_schedule(&bgmac->napi);
+
+       return IRQ_HANDLED;
+}
+
+static int bgmac_poll(struct napi_struct *napi, int weight)
+{
+       struct bgmac *bgmac = container_of(napi, struct bgmac, napi);
+       struct bgmac_dma_ring *ring;
+       int handled = 0;
+
+       if (bgmac->int_status & BGMAC_IS_TX0) {
+               ring = &bgmac->tx_ring[0];
+               bgmac_dma_tx_free(bgmac, ring);
+               bgmac->int_status &= ~BGMAC_IS_TX0;
+       }
+
+       if (bgmac->int_status & BGMAC_IS_RX) {
+               ring = &bgmac->rx_ring[0];
+               handled += bgmac_dma_rx_read(bgmac, ring, weight);
+               bgmac->int_status &= ~BGMAC_IS_RX;
+       }
+
+       if (bgmac->int_status) {
+               bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", bgmac->int_status);
+               bgmac->int_status = 0;
+       }
+
+       if (handled < weight)
+               napi_complete(napi);
+
+       bgmac_chip_intrs_on(bgmac);
+
+       return handled;
+}
+
+/**************************************************
+ * net_device_ops
+ **************************************************/
+
+static int bgmac_open(struct net_device *net_dev)
+{
+       struct bgmac *bgmac = netdev_priv(net_dev);
+       int err = 0;
+
+       bgmac_chip_reset(bgmac);
+       /* Specs say about reclaiming rings here, but we do that in DMA init */
+       bgmac_chip_init(bgmac, true);
+
+       err = request_irq(bgmac->core->irq, bgmac_interrupt, IRQF_SHARED,
+                         KBUILD_MODNAME, net_dev);
+       if (err < 0) {
+               bgmac_err(bgmac, "IRQ request error: %d!\n", err);
+               goto err_out;
+       }
+       napi_enable(&bgmac->napi);
+
+       netif_carrier_on(net_dev);
+
+err_out:
+       return err;
+}
+
+static int bgmac_stop(struct net_device *net_dev)
+{
+       struct bgmac *bgmac = netdev_priv(net_dev);
+
+       netif_carrier_off(net_dev);
+
+       napi_disable(&bgmac->napi);
+       bgmac_chip_intrs_off(bgmac);
+       free_irq(bgmac->core->irq, net_dev);
+
+       bgmac_chip_reset(bgmac);
+
+       return 0;
+}
+
+static netdev_tx_t bgmac_start_xmit(struct sk_buff *skb,
+                                   struct net_device *net_dev)
+{
+       struct bgmac *bgmac = netdev_priv(net_dev);
+       struct bgmac_dma_ring *ring;
+
+       /* No QOS support yet */
+       ring = &bgmac->tx_ring[0];
+       return bgmac_dma_tx_add(bgmac, ring, skb);
+}
+
+static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
+{
+       struct bgmac *bgmac = netdev_priv(net_dev);
+       struct mii_ioctl_data *data = if_mii(ifr);
+
+       switch (cmd) {
+       case SIOCGMIIPHY:
+               data->phy_id = bgmac->phyaddr;
+               /* fallthru */
+       case SIOCGMIIREG:
+               if (!netif_running(net_dev))
+                       return -EAGAIN;
+               data->val_out = bgmac_phy_read(bgmac, data->phy_id,
+                                              data->reg_num & 0x1f);
+               return 0;
+       case SIOCSMIIREG:
+               if (!netif_running(net_dev))
+                       return -EAGAIN;
+               bgmac_phy_write(bgmac, data->phy_id, data->reg_num & 0x1f,
+                               data->val_in);
+               return 0;
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
+static const struct net_device_ops bgmac_netdev_ops = {
+       .ndo_open               = bgmac_open,
+       .ndo_stop               = bgmac_stop,
+       .ndo_start_xmit         = bgmac_start_xmit,
+       .ndo_set_mac_address    = eth_mac_addr, /* generic, sets dev_addr */
+       .ndo_do_ioctl           = bgmac_ioctl,
+};
+
+/**************************************************
+ * ethtool_ops
+ **************************************************/
+
+static int bgmac_get_settings(struct net_device *net_dev,
+                             struct ethtool_cmd *cmd)
+{
+       struct bgmac *bgmac = netdev_priv(net_dev);
+
+       cmd->supported = SUPPORTED_10baseT_Half |
+                        SUPPORTED_10baseT_Full |
+                        SUPPORTED_100baseT_Half |
+                        SUPPORTED_100baseT_Full |
+                        SUPPORTED_1000baseT_Half |
+                        SUPPORTED_1000baseT_Full |
+                        SUPPORTED_Autoneg;
+
+       if (bgmac->autoneg) {
+               WARN_ON(cmd->advertising);
+               if (bgmac->full_duplex) {
+                       if (bgmac->speed & BGMAC_SPEED_10)
+                               cmd->advertising |= ADVERTISED_10baseT_Full;
+                       if (bgmac->speed & BGMAC_SPEED_100)
+                               cmd->advertising |= ADVERTISED_100baseT_Full;
+                       if (bgmac->speed & BGMAC_SPEED_1000)
+                               cmd->advertising |= ADVERTISED_1000baseT_Full;
+               } else {
+                       if (bgmac->speed & BGMAC_SPEED_10)
+                               cmd->advertising |= ADVERTISED_10baseT_Half;
+                       if (bgmac->speed & BGMAC_SPEED_100)
+                               cmd->advertising |= ADVERTISED_100baseT_Half;
+                       if (bgmac->speed & BGMAC_SPEED_1000)
+                               cmd->advertising |= ADVERTISED_1000baseT_Half;
+               }
+       } else {
+               switch (bgmac->speed) {
+               case BGMAC_SPEED_10:
+                       ethtool_cmd_speed_set(cmd, SPEED_10);
+                       break;
+               case BGMAC_SPEED_100:
+                       ethtool_cmd_speed_set(cmd, SPEED_100);
+                       break;
+               case BGMAC_SPEED_1000:
+                       ethtool_cmd_speed_set(cmd, SPEED_1000);
+                       break;
+               }
+       }
+
+       cmd->duplex = bgmac->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
+
+       cmd->autoneg = bgmac->autoneg;
+
+       return 0;
+}
+
+#if 0
+static int bgmac_set_settings(struct net_device *net_dev,
+                             struct ethtool_cmd *cmd)
+{
+       struct bgmac *bgmac = netdev_priv(net_dev);
+
+       return -1;
+}
+#endif
+
+static void bgmac_get_drvinfo(struct net_device *net_dev,
+                             struct ethtool_drvinfo *info)
+{
+       strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
+       strlcpy(info->bus_info, "BCMA", sizeof(info->bus_info));
+}
+
+static const struct ethtool_ops bgmac_ethtool_ops = {
+       .get_settings           = bgmac_get_settings,
+       .get_drvinfo            = bgmac_get_drvinfo,
+};
+
+/**************************************************
+ * BCMA bus ops
+ **************************************************/
+
+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipattach */
+static int bgmac_probe(struct bcma_device *core)
+{
+       struct net_device *net_dev;
+       struct bgmac *bgmac;
+       struct ssb_sprom *sprom = &core->bus->sprom;
+       u8 *mac = core->core_unit ? sprom->et1mac : sprom->et0mac;
+       int err;
+
+       /* We don't support 2nd, 3rd, ... units, SPROM has to be adjusted */
+       if (core->core_unit > 1) {
+               pr_err("Unsupported core_unit %d\n", core->core_unit);
+               return -ENOTSUPP;
+       }
+
+       /* Allocation and references */
+       net_dev = alloc_etherdev(sizeof(*bgmac));
+       if (!net_dev)
+               return -ENOMEM;
+       net_dev->netdev_ops = &bgmac_netdev_ops;
+       net_dev->irq = core->irq;
+       SET_ETHTOOL_OPS(net_dev, &bgmac_ethtool_ops);
+       bgmac = netdev_priv(net_dev);
+       bgmac->net_dev = net_dev;
+       bgmac->core = core;
+       bcma_set_drvdata(core, bgmac);
+
+       /* Defaults */
+       bgmac->autoneg = true;
+       bgmac->full_duplex = true;
+       bgmac->speed = BGMAC_SPEED_10 | BGMAC_SPEED_100 | BGMAC_SPEED_1000;
+       memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN);
+
+       /* On BCM4706 we need common core to access PHY */
+       if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
+           !core->bus->drv_gmac_cmn.core) {
+               bgmac_err(bgmac, "GMAC CMN core not found (required for BCM4706)\n");
+               err = -ENODEV;
+               goto err_netdev_free;
+       }
+       bgmac->cmn = core->bus->drv_gmac_cmn.core;
+
+       bgmac->phyaddr = core->core_unit ? sprom->et1phyaddr :
+                        sprom->et0phyaddr;
+       bgmac->phyaddr &= BGMAC_PHY_MASK;
+       if (bgmac->phyaddr == BGMAC_PHY_MASK) {
+               bgmac_err(bgmac, "No PHY found\n");
+               err = -ENODEV;
+               goto err_netdev_free;
+       }
+       bgmac_info(bgmac, "Found PHY addr: %d%s\n", bgmac->phyaddr,
+                  bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
+
+       if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
+               bgmac_err(bgmac, "PCI setup not implemented\n");
+               err = -ENOTSUPP;
+               goto err_netdev_free;
+       }
+
+       bgmac_chip_reset(bgmac);
+
+       err = bgmac_dma_alloc(bgmac);
+       if (err) {
+               bgmac_err(bgmac, "Unable to alloc memory for DMA\n");
+               goto err_netdev_free;
+       }
+
+       bgmac->int_mask = BGMAC_IS_ERRMASK | BGMAC_IS_RX | BGMAC_IS_TX_MASK;
+       if (nvram_getenv("et0_no_txint", NULL, 0) == 0)
+               bgmac->int_mask &= ~BGMAC_IS_TX_MASK;
+
+       /* TODO: reset the external phy. Specs are needed */
+       bgmac_phy_reset(bgmac);
+
+       bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
+                              BGMAC_BFL_ENETROBO);
+       if (bgmac->has_robosw)
+               bgmac_warn(bgmac, "Support for Roboswitch not implemented\n");
+
+       if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
+               bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n");
+
+       err = register_netdev(bgmac->net_dev);
+       if (err) {
+               bgmac_err(bgmac, "Cannot register net device\n");
+               err = -ENOTSUPP;
+               goto err_dma_free;
+       }
+
+       netif_carrier_off(net_dev);
+
+       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
+
+       return 0;
+
+err_dma_free:
+       bgmac_dma_free(bgmac);
+
+err_netdev_free:
+       bcma_set_drvdata(core, NULL);
+       free_netdev(net_dev);
+
+       return err;
+}
+
+static void bgmac_remove(struct bcma_device *core)
+{
+       struct bgmac *bgmac = bcma_get_drvdata(core);
+
+       netif_napi_del(&bgmac->napi);
+       unregister_netdev(bgmac->net_dev);
+       bgmac_dma_free(bgmac);
+       bcma_set_drvdata(core, NULL);
+       free_netdev(bgmac->net_dev);
+}
+
+static struct bcma_driver bgmac_bcma_driver = {
+       .name           = KBUILD_MODNAME,
+       .id_table       = bgmac_bcma_tbl,
+       .probe          = bgmac_probe,
+       .remove         = bgmac_remove,
+};
+
+static int __init bgmac_init(void)
+{
+       int err;
+
+       err = bcma_driver_register(&bgmac_bcma_driver);
+       if (err)
+               return err;
+       pr_info("Broadcom 47xx GBit MAC driver loaded\n");
+
+       return 0;
+}
+
+static void __exit bgmac_exit(void)
+{
+       bcma_driver_unregister(&bgmac_bcma_driver);
+}
+
+module_init(bgmac_init)
+module_exit(bgmac_exit)
+
+MODULE_AUTHOR("RafaÅ‚ MiÅ‚ecki");
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/broadcom/bgmac.h b/drivers/net/ethernet/broadcom/bgmac.h
new file mode 100644 (file)
index 0000000..1299470
--- /dev/null
@@ -0,0 +1,456 @@
+#ifndef _BGMAC_H
+#define _BGMAC_H
+
+#define pr_fmt(fmt)            KBUILD_MODNAME ": " fmt
+
+#define bgmac_err(bgmac, fmt, ...) \
+       dev_err(&(bgmac)->core->dev, fmt, ##__VA_ARGS__)
+#define bgmac_warn(bgmac, fmt, ...) \
+       dev_warn(&(bgmac)->core->dev, fmt,  ##__VA_ARGS__)
+#define bgmac_info(bgmac, fmt, ...) \
+       dev_info(&(bgmac)->core->dev, fmt,  ##__VA_ARGS__)
+#define bgmac_dbg(bgmac, fmt, ...) \
+       dev_dbg(&(bgmac)->core->dev, fmt, ##__VA_ARGS__)
+
+#include <linux/bcma/bcma.h>
+#include <linux/netdevice.h>
+
+#define BGMAC_DEV_CTL                          0x000
+#define  BGMAC_DC_TSM                          0x00000002
+#define  BGMAC_DC_CFCO                         0x00000004
+#define  BGMAC_DC_RLSS                         0x00000008
+#define  BGMAC_DC_MROR                         0x00000010
+#define  BGMAC_DC_FCM_MASK                     0x00000060
+#define  BGMAC_DC_FCM_SHIFT                    5
+#define  BGMAC_DC_NAE                          0x00000080
+#define  BGMAC_DC_TF                           0x00000100
+#define  BGMAC_DC_RDS_MASK                     0x00030000
+#define  BGMAC_DC_RDS_SHIFT                    16
+#define  BGMAC_DC_TDS_MASK                     0x000c0000
+#define  BGMAC_DC_TDS_SHIFT                    18
+#define BGMAC_DEV_STATUS                       0x004           /* Configuration of the interface */
+#define  BGMAC_DS_RBF                          0x00000001
+#define  BGMAC_DS_RDF                          0x00000002
+#define  BGMAC_DS_RIF                          0x00000004
+#define  BGMAC_DS_TBF                          0x00000008
+#define  BGMAC_DS_TDF                          0x00000010
+#define  BGMAC_DS_TIF                          0x00000020
+#define  BGMAC_DS_PO                           0x00000040
+#define  BGMAC_DS_MM_MASK                      0x00000300      /* Mode of the interface */
+#define  BGMAC_DS_MM_SHIFT                     8
+#define BGMAC_BIST_STATUS                      0x00c
+#define BGMAC_INT_STATUS                       0x020           /* Interrupt status */
+#define  BGMAC_IS_MRO                          0x00000001
+#define  BGMAC_IS_MTO                          0x00000002
+#define  BGMAC_IS_TFD                          0x00000004
+#define  BGMAC_IS_LS                           0x00000008
+#define  BGMAC_IS_MDIO                         0x00000010
+#define  BGMAC_IS_MR                           0x00000020
+#define  BGMAC_IS_MT                           0x00000040
+#define  BGMAC_IS_TO                           0x00000080
+#define  BGMAC_IS_DESC_ERR                     0x00000400      /* Descriptor error */
+#define  BGMAC_IS_DATA_ERR                     0x00000800      /* Data error */
+#define  BGMAC_IS_DESC_PROT_ERR                        0x00001000      /* Descriptor protocol error */
+#define  BGMAC_IS_RX_DESC_UNDERF               0x00002000      /* Receive descriptor underflow */
+#define  BGMAC_IS_RX_F_OVERF                   0x00004000      /* Receive FIFO overflow */
+#define  BGMAC_IS_TX_F_UNDERF                  0x00008000      /* Transmit FIFO underflow */
+#define  BGMAC_IS_RX                           0x00010000      /* Interrupt for RX queue 0 */
+#define  BGMAC_IS_TX0                          0x01000000      /* Interrupt for TX queue 0 */
+#define  BGMAC_IS_TX1                          0x02000000      /* Interrupt for TX queue 1 */
+#define  BGMAC_IS_TX2                          0x04000000      /* Interrupt for TX queue 2 */
+#define  BGMAC_IS_TX3                          0x08000000      /* Interrupt for TX queue 3 */
+#define  BGMAC_IS_TX_MASK                      0x0f000000
+#define  BGMAC_IS_INTMASK                      0x0f01fcff
+#define  BGMAC_IS_ERRMASK                      0x0000fc00
+#define BGMAC_INT_MASK                         0x024           /* Interrupt mask */
+#define BGMAC_GP_TIMER                         0x028
+#define BGMAC_INT_RECV_LAZY                    0x100
+#define  BGMAC_IRL_TO_MASK                     0x00ffffff
+#define  BGMAC_IRL_FC_MASK                     0xff000000
+#define  BGMAC_IRL_FC_SHIFT                    24              /* Shift the number of interrupts triggered per received frame */
+#define BGMAC_FLOW_CTL_THRESH                  0x104           /* Flow control thresholds */
+#define BGMAC_WRRTHRESH                                0x108
+#define BGMAC_GMAC_IDLE_CNT_THRESH             0x10c
+#define BGMAC_PHY_ACCESS                       0x180           /* PHY access address */
+#define  BGMAC_PA_DATA_MASK                    0x0000ffff
+#define  BGMAC_PA_ADDR_MASK                    0x001f0000
+#define  BGMAC_PA_ADDR_SHIFT                   16
+#define  BGMAC_PA_REG_MASK                     0x1f000000
+#define  BGMAC_PA_REG_SHIFT                    24
+#define  BGMAC_PA_WRITE                                0x20000000
+#define  BGMAC_PA_START                                0x40000000
+#define BGMAC_PHY_CNTL                         0x188           /* PHY control address */
+#define  BGMAC_PC_EPA_MASK                     0x0000001f
+#define  BGMAC_PC_MCT_MASK                     0x007f0000
+#define  BGMAC_PC_MCT_SHIFT                    16
+#define  BGMAC_PC_MTE                          0x00800000
+#define BGMAC_TXQ_CTL                          0x18c
+#define  BGMAC_TXQ_CTL_DBT_MASK                        0x00000fff
+#define  BGMAC_TXQ_CTL_DBT_SHIFT               0
+#define BGMAC_RXQ_CTL                          0x190
+#define  BGMAC_RXQ_CTL_DBT_MASK                        0x00000fff
+#define  BGMAC_RXQ_CTL_DBT_SHIFT               0
+#define  BGMAC_RXQ_CTL_PTE                     0x00001000
+#define  BGMAC_RXQ_CTL_MDP_MASK                        0x3f000000
+#define  BGMAC_RXQ_CTL_MDP_SHIFT               24
+#define BGMAC_GPIO_SELECT                      0x194
+#define BGMAC_GPIO_OUTPUT_EN                   0x198
+/* For 0x1e0 see BCMA_CLKCTLST */
+#define BGMAC_HW_WAR                           0x1e4
+#define BGMAC_PWR_CTL                          0x1e8
+#define BGMAC_DMA_BASE0                                0x200           /* Tx and Rx controller */
+#define BGMAC_DMA_BASE1                                0x240           /* Tx controller only */
+#define BGMAC_DMA_BASE2                                0x280           /* Tx controller only */
+#define BGMAC_DMA_BASE3                                0x2C0           /* Tx controller only */
+#define BGMAC_TX_GOOD_OCTETS                   0x300
+#define BGMAC_TX_GOOD_OCTETS_HIGH              0x304
+#define BGMAC_TX_GOOD_PKTS                     0x308
+#define BGMAC_TX_OCTETS                                0x30c
+#define BGMAC_TX_OCTETS_HIGH                   0x310
+#define BGMAC_TX_PKTS                          0x314
+#define BGMAC_TX_BROADCAST_PKTS                        0x318
+#define BGMAC_TX_MULTICAST_PKTS                        0x31c
+#define BGMAC_TX_LEN_64                                0x320
+#define BGMAC_TX_LEN_65_TO_127                 0x324
+#define BGMAC_TX_LEN_128_TO_255                        0x328
+#define BGMAC_TX_LEN_256_TO_511                        0x32c
+#define BGMAC_TX_LEN_512_TO_1023               0x330
+#define BGMAC_TX_LEN_1024_TO_1522              0x334
+#define BGMAC_TX_LEN_1523_TO_2047              0x338
+#define BGMAC_TX_LEN_2048_TO_4095              0x33c
+#define BGMAC_TX_LEN_4095_TO_8191              0x340
+#define BGMAC_TX_LEN_8192_TO_MAX               0x344
+#define BGMAC_TX_JABBER_PKTS                   0x348           /* Error */
+#define BGMAC_TX_OVERSIZE_PKTS                 0x34c           /* Error */
+#define BGMAC_TX_FRAGMENT_PKTS                 0x350
+#define BGMAC_TX_UNDERRUNS                     0x354           /* Error */
+#define BGMAC_TX_TOTAL_COLS                    0x358
+#define BGMAC_TX_SINGLE_COLS                   0x35c
+#define BGMAC_TX_MULTIPLE_COLS                 0x360
+#define BGMAC_TX_EXCESSIVE_COLS                        0x364           /* Error */
+#define BGMAC_TX_LATE_COLS                     0x368           /* Error */
+#define BGMAC_TX_DEFERED                       0x36c
+#define BGMAC_TX_CARRIER_LOST                  0x370
+#define BGMAC_TX_PAUSE_PKTS                    0x374
+#define BGMAC_TX_UNI_PKTS                      0x378
+#define BGMAC_TX_Q0_PKTS                       0x37c
+#define BGMAC_TX_Q0_OCTETS                     0x380
+#define BGMAC_TX_Q0_OCTETS_HIGH                        0x384
+#define BGMAC_TX_Q1_PKTS                       0x388
+#define BGMAC_TX_Q1_OCTETS                     0x38c
+#define BGMAC_TX_Q1_OCTETS_HIGH                        0x390
+#define BGMAC_TX_Q2_PKTS                       0x394
+#define BGMAC_TX_Q2_OCTETS                     0x398
+#define BGMAC_TX_Q2_OCTETS_HIGH                        0x39c
+#define BGMAC_TX_Q3_PKTS                       0x3a0
+#define BGMAC_TX_Q3_OCTETS                     0x3a4
+#define BGMAC_TX_Q3_OCTETS_HIGH                        0x3a8
+#define BGMAC_RX_GOOD_OCTETS                   0x3b0
+#define BGMAC_RX_GOOD_OCTETS_HIGH              0x3b4
+#define BGMAC_RX_GOOD_PKTS                     0x3b8
+#define BGMAC_RX_OCTETS                                0x3bc
+#define BGMAC_RX_OCTETS_HIGH                   0x3c0
+#define BGMAC_RX_PKTS                          0x3c4
+#define BGMAC_RX_BROADCAST_PKTS                        0x3c8
+#define BGMAC_RX_MULTICAST_PKTS                        0x3cc
+#define BGMAC_RX_LEN_64                                0x3d0
+#define BGMAC_RX_LEN_65_TO_127                 0x3d4
+#define BGMAC_RX_LEN_128_TO_255                        0x3d8
+#define BGMAC_RX_LEN_256_TO_511                        0x3dc
+#define BGMAC_RX_LEN_512_TO_1023               0x3e0
+#define BGMAC_RX_LEN_1024_TO_1522              0x3e4
+#define BGMAC_RX_LEN_1523_TO_2047              0x3e8
+#define BGMAC_RX_LEN_2048_TO_4095              0x3ec
+#define BGMAC_RX_LEN_4095_TO_8191              0x3f0
+#define BGMAC_RX_LEN_8192_TO_MAX               0x3f4
+#define BGMAC_RX_JABBER_PKTS                   0x3f8           /* Error */
+#define BGMAC_RX_OVERSIZE_PKTS                 0x3fc           /* Error */
+#define BGMAC_RX_FRAGMENT_PKTS                 0x400
+#define BGMAC_RX_MISSED_PKTS                   0x404           /* Error */
+#define BGMAC_RX_CRC_ALIGN_ERRS                        0x408           /* Error */
+#define BGMAC_RX_UNDERSIZE                     0x40c           /* Error */
+#define BGMAC_RX_CRC_ERRS                      0x410           /* Error */
+#define BGMAC_RX_ALIGN_ERRS                    0x414           /* Error */
+#define BGMAC_RX_SYMBOL_ERRS                   0x418           /* Error */
+#define BGMAC_RX_PAUSE_PKTS                    0x41c
+#define BGMAC_RX_NONPAUSE_PKTS                 0x420
+#define BGMAC_RX_SACHANGES                     0x424
+#define BGMAC_RX_UNI_PKTS                      0x428
+#define BGMAC_UNIMAC_VERSION                   0x800
+#define BGMAC_HDBKP_CTL                                0x804
+#define BGMAC_CMDCFG                           0x808           /* Configuration */
+#define  BGMAC_CMDCFG_TE                       0x00000001      /* Set to activate TX */
+#define  BGMAC_CMDCFG_RE                       0x00000002      /* Set to activate RX */
+#define  BGMAC_CMDCFG_ES_MASK                  0x0000000c      /* Ethernet speed see gmac_speed */
+#define   BGMAC_CMDCFG_ES_10                   0x00000000
+#define   BGMAC_CMDCFG_ES_100                  0x00000004
+#define   BGMAC_CMDCFG_ES_1000                 0x00000008
+#define  BGMAC_CMDCFG_PROM                     0x00000010      /* Set to activate promiscuous mode */
+#define  BGMAC_CMDCFG_PAD_EN                   0x00000020
+#define  BGMAC_CMDCFG_CF                       0x00000040
+#define  BGMAC_CMDCFG_PF                       0x00000080
+#define  BGMAC_CMDCFG_RPI                      0x00000100      /* Unset to enable 802.3x tx flow control */
+#define  BGMAC_CMDCFG_TAI                      0x00000200
+#define  BGMAC_CMDCFG_HD                       0x00000400      /* Set if in half duplex mode */
+#define  BGMAC_CMDCFG_HD_SHIFT                 10
+#define  BGMAC_CMDCFG_SR                       0x00000800      /* Set to reset mode */
+#define  BGMAC_CMDCFG_ML                       0x00008000      /* Set to activate mac loopback mode */
+#define  BGMAC_CMDCFG_AE                       0x00400000
+#define  BGMAC_CMDCFG_CFE                      0x00800000
+#define  BGMAC_CMDCFG_NLC                      0x01000000
+#define  BGMAC_CMDCFG_RL                       0x02000000
+#define  BGMAC_CMDCFG_RED                      0x04000000
+#define  BGMAC_CMDCFG_PE                       0x08000000
+#define  BGMAC_CMDCFG_TPI                      0x10000000
+#define  BGMAC_CMDCFG_AT                       0x20000000
+#define BGMAC_MACADDR_HIGH                     0x80c           /* High 4 octets of own mac address */
+#define BGMAC_MACADDR_LOW                      0x810           /* Low 2 octets of own mac address */
+#define BGMAC_RXMAX_LENGTH                     0x814           /* Max receive frame length with vlan tag */
+#define BGMAC_PAUSEQUANTA                      0x818
+#define BGMAC_MAC_MODE                         0x844
+#define BGMAC_OUTERTAG                         0x848
+#define BGMAC_INNERTAG                         0x84c
+#define BGMAC_TXIPG                            0x85c
+#define BGMAC_PAUSE_CTL                                0xb30
+#define BGMAC_TX_FLUSH                         0xb34
+#define BGMAC_RX_STATUS                                0xb38
+#define BGMAC_TX_STATUS                                0xb3c
+
+#define BGMAC_PHY_CTL                          0x00
+#define  BGMAC_PHY_CTL_SPEED_MSB               0x0040
+#define  BGMAC_PHY_CTL_DUPLEX                  0x0100          /* duplex mode */
+#define  BGMAC_PHY_CTL_RESTART                 0x0200          /* restart autonegotiation */
+#define  BGMAC_PHY_CTL_ANENAB                  0x1000          /* enable autonegotiation */
+#define  BGMAC_PHY_CTL_SPEED                   0x2000
+#define  BGMAC_PHY_CTL_LOOP                    0x4000          /* loopback */
+#define  BGMAC_PHY_CTL_RESET                   0x8000          /* reset */
+/* Helpers */
+#define  BGMAC_PHY_CTL_SPEED_10                        0
+#define  BGMAC_PHY_CTL_SPEED_100               BGMAC_PHY_CTL_SPEED
+#define  BGMAC_PHY_CTL_SPEED_1000              BGMAC_PHY_CTL_SPEED_MSB
+#define BGMAC_PHY_ADV                          0x04
+#define  BGMAC_PHY_ADV_10HALF                  0x0020          /* advertise 10MBits/s half duplex */
+#define  BGMAC_PHY_ADV_10FULL                  0x0040          /* advertise 10MBits/s full duplex */
+#define  BGMAC_PHY_ADV_100HALF                 0x0080          /* advertise 100MBits/s half duplex */
+#define  BGMAC_PHY_ADV_100FULL                 0x0100          /* advertise 100MBits/s full duplex */
+#define BGMAC_PHY_ADV2                         0x09
+#define  BGMAC_PHY_ADV2_1000HALF               0x0100          /* advertise 1000MBits/s half duplex */
+#define  BGMAC_PHY_ADV2_1000FULL               0x0200          /* advertise 1000MBits/s full duplex */
+
+/* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */
+#define BGMAC_BCMA_IOCTL_SW_CLKEN              0x00000004      /* PHY Clock Enable */
+#define BGMAC_BCMA_IOCTL_SW_RESET              0x00000008      /* PHY Reset */
+
+/* BCMA GMAC core specific IO status (BCMA_IOST) flags */
+#define BGMAC_BCMA_IOST_ATTACHED               0x00000800
+
+#define BGMAC_NUM_MIB_TX_REGS  \
+               (((BGMAC_TX_Q3_OCTETS_HIGH - BGMAC_TX_GOOD_OCTETS) / 4) + 1)
+#define BGMAC_NUM_MIB_RX_REGS  \
+               (((BGMAC_RX_UNI_PKTS - BGMAC_RX_GOOD_OCTETS) / 4) + 1)
+
+#define BGMAC_DMA_TX_CTL                       0x00
+#define  BGMAC_DMA_TX_ENABLE                   0x00000001
+#define  BGMAC_DMA_TX_SUSPEND                  0x00000002
+#define  BGMAC_DMA_TX_LOOPBACK                 0x00000004
+#define  BGMAC_DMA_TX_FLUSH                    0x00000010
+#define  BGMAC_DMA_TX_PARITY_DISABLE           0x00000800
+#define  BGMAC_DMA_TX_ADDREXT_MASK             0x00030000
+#define  BGMAC_DMA_TX_ADDREXT_SHIFT            16
+#define BGMAC_DMA_TX_INDEX                     0x04
+#define BGMAC_DMA_TX_RINGLO                    0x08
+#define BGMAC_DMA_TX_RINGHI                    0x0C
+#define BGMAC_DMA_TX_STATUS                    0x10
+#define  BGMAC_DMA_TX_STATDPTR                 0x00001FFF
+#define  BGMAC_DMA_TX_STAT                     0xF0000000
+#define   BGMAC_DMA_TX_STAT_DISABLED           0x00000000
+#define   BGMAC_DMA_TX_STAT_ACTIVE             0x10000000
+#define   BGMAC_DMA_TX_STAT_IDLEWAIT           0x20000000
+#define   BGMAC_DMA_TX_STAT_STOPPED            0x30000000
+#define   BGMAC_DMA_TX_STAT_SUSP               0x40000000
+#define BGMAC_DMA_TX_ERROR                     0x14
+#define  BGMAC_DMA_TX_ERRDPTR                  0x0001FFFF
+#define  BGMAC_DMA_TX_ERR                      0xF0000000
+#define   BGMAC_DMA_TX_ERR_NOERR               0x00000000
+#define   BGMAC_DMA_TX_ERR_PROT                        0x10000000
+#define   BGMAC_DMA_TX_ERR_UNDERRUN            0x20000000
+#define   BGMAC_DMA_TX_ERR_TRANSFER            0x30000000
+#define   BGMAC_DMA_TX_ERR_DESCREAD            0x40000000
+#define   BGMAC_DMA_TX_ERR_CORE                        0x50000000
+#define BGMAC_DMA_RX_CTL                       0x20
+#define  BGMAC_DMA_RX_ENABLE                   0x00000001
+#define  BGMAC_DMA_RX_FRAME_OFFSET_MASK                0x000000FE
+#define  BGMAC_DMA_RX_FRAME_OFFSET_SHIFT       1
+#define  BGMAC_DMA_RX_DIRECT_FIFO              0x00000100
+#define  BGMAC_DMA_RX_OVERFLOW_CONT            0x00000400
+#define  BGMAC_DMA_RX_PARITY_DISABLE           0x00000800
+#define  BGMAC_DMA_RX_ADDREXT_MASK             0x00030000
+#define  BGMAC_DMA_RX_ADDREXT_SHIFT            16
+#define BGMAC_DMA_RX_INDEX                     0x24
+#define BGMAC_DMA_RX_RINGLO                    0x28
+#define BGMAC_DMA_RX_RINGHI                    0x2C
+#define BGMAC_DMA_RX_STATUS                    0x30
+#define  BGMAC_DMA_RX_STATDPTR                 0x00001FFF
+#define  BGMAC_DMA_RX_STAT                     0xF0000000
+#define   BGMAC_DMA_RX_STAT_DISABLED           0x00000000
+#define   BGMAC_DMA_RX_STAT_ACTIVE             0x10000000
+#define   BGMAC_DMA_RX_STAT_IDLEWAIT           0x20000000
+#define   BGMAC_DMA_RX_STAT_STOPPED            0x30000000
+#define   BGMAC_DMA_RX_STAT_SUSP               0x40000000
+#define BGMAC_DMA_RX_ERROR                     0x34
+#define  BGMAC_DMA_RX_ERRDPTR                  0x0001FFFF
+#define  BGMAC_DMA_RX_ERR                      0xF0000000
+#define   BGMAC_DMA_RX_ERR_NOERR               0x00000000
+#define   BGMAC_DMA_RX_ERR_PROT                        0x10000000
+#define   BGMAC_DMA_RX_ERR_UNDERRUN            0x20000000
+#define   BGMAC_DMA_RX_ERR_TRANSFER            0x30000000
+#define   BGMAC_DMA_RX_ERR_DESCREAD            0x40000000
+#define   BGMAC_DMA_RX_ERR_CORE                        0x50000000
+
+#define BGMAC_DESC_CTL0_EOT                    0x10000000      /* End of ring */
+#define BGMAC_DESC_CTL0_IOC                    0x20000000      /* IRQ on complete */
+#define BGMAC_DESC_CTL0_SOF                    0x40000000      /* Start of frame */
+#define BGMAC_DESC_CTL0_EOF                    0x80000000      /* End of frame */
+#define BGMAC_DESC_CTL1_LEN                    0x00001FFF
+
+#define BGMAC_PHY_NOREGS                       0x1E
+#define BGMAC_PHY_MASK                         0x1F
+
+#define BGMAC_MAX_TX_RINGS                     4
+#define BGMAC_MAX_RX_RINGS                     1
+
+#define BGMAC_TX_RING_SLOTS                    128
+#define BGMAC_RX_RING_SLOTS                    512 - 1         /* Why -1? Well, Broadcom does that... */
+
+#define BGMAC_RX_HEADER_LEN                    28              /* Last 24 bytes are unused. Well... */
+#define BGMAC_RX_FRAME_OFFSET                  30              /* There are 2 unused bytes between header and real data */
+#define BGMAC_RX_MAX_FRAME_SIZE                        1536            /* Copied from b44/tg3 */
+#define BGMAC_RX_BUF_SIZE                      (BGMAC_RX_FRAME_OFFSET + BGMAC_RX_MAX_FRAME_SIZE)
+
+#define BGMAC_BFL_ENETROBO                     0x0010          /* has ephy roboswitch spi */
+#define BGMAC_BFL_ENETADM                      0x0080          /* has ADMtek switch */
+#define BGMAC_BFL_ENETVLAN                     0x0100          /* can do vlan */
+
+#define BGMAC_CHIPCTL_1_IF_TYPE_MASK           0x00000030
+#define BGMAC_CHIPCTL_1_IF_TYPE_RMII           0x00000000
+#define BGMAC_CHIPCTL_1_IF_TYPE_MI             0x00000010
+#define BGMAC_CHIPCTL_1_IF_TYPE_RGMII          0x00000020
+#define BGMAC_CHIPCTL_1_SW_TYPE_MASK           0x000000C0
+#define BGMAC_CHIPCTL_1_SW_TYPE_EPHY           0x00000000
+#define BGMAC_CHIPCTL_1_SW_TYPE_EPHYMII                0x00000040
+#define BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII       0x00000080
+#define BGMAC_CHIPCTL_1_SW_TYPE_RGMI           0x000000C0
+#define BGMAC_CHIPCTL_1_RXC_DLL_BYPASS         0x00010000
+
+#define BGMAC_SPEED_10                         0x0001
+#define BGMAC_SPEED_100                                0x0002
+#define BGMAC_SPEED_1000                       0x0004
+
+#define BGMAC_WEIGHT   64
+
+#define ETHER_MAX_LEN   1518
+
+struct bgmac_slot_info {
+       struct sk_buff *skb;
+       dma_addr_t dma_addr;
+};
+
+struct bgmac_dma_desc {
+       __le32 ctl0;
+       __le32 ctl1;
+       __le32 addr_low;
+       __le32 addr_high;
+} __packed;
+
+enum bgmac_dma_ring_type {
+       BGMAC_DMA_RING_TX,
+       BGMAC_DMA_RING_RX,
+};
+
+/**
+ * bgmac_dma_ring - contains info about DMA ring (either TX or RX one)
+ * @start: index of the first slot containing data
+ * @end: index of a slot that can *not* be read (yet)
+ *
+ * Be really aware of the specific @end meaning. It's an index of a slot *after*
+ * the one containing data that can be read. If @start equals @end the ring is
+ * empty.
+ */
+struct bgmac_dma_ring {
+       u16 num_slots;
+       u16 start;
+       u16 end;
+
+       u16 mmio_base;
+       struct bgmac_dma_desc *cpu_base;
+       dma_addr_t dma_base;
+
+       struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS];
+};
+
+struct bgmac_rx_header {
+       __le16 len;
+       __le16 flags;
+       __le16 pad[12];
+};
+
+struct bgmac {
+       struct bcma_device *core;
+       struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
+       struct net_device *net_dev;
+       struct napi_struct napi;
+
+       /* DMA */
+       struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];
+       struct bgmac_dma_ring rx_ring[BGMAC_MAX_RX_RINGS];
+
+       /* Stats */
+       bool stats_grabbed;
+       u32 mib_tx_regs[BGMAC_NUM_MIB_TX_REGS];
+       u32 mib_rx_regs[BGMAC_NUM_MIB_RX_REGS];
+
+       /* Int */
+       u32 int_mask;
+       u32 int_status;
+
+       /* Speed-related */
+       int speed;
+       bool autoneg;
+       bool full_duplex;
+
+       u8 phyaddr;
+       bool has_robosw;
+
+       bool loopback;
+};
+
+static inline u32 bgmac_read(struct bgmac *bgmac, u16 offset)
+{
+       return bcma_read32(bgmac->core, offset);
+}
+
+static inline void bgmac_write(struct bgmac *bgmac, u16 offset, u32 value)
+{
+       bcma_write32(bgmac->core, offset, value);
+}
+
+static inline void bgmac_maskset(struct bgmac *bgmac, u16 offset, u32 mask,
+                                  u32 set)
+{
+       bgmac_write(bgmac, offset, (bgmac_read(bgmac, offset) & mask) | set);
+}
+
+static inline void bgmac_mask(struct bgmac *bgmac, u16 offset, u32 mask)
+{
+       bgmac_maskset(bgmac, offset, mask, 0);
+}
+
+static inline void bgmac_set(struct bgmac *bgmac, u16 offset, u32 set)
+{
+       bgmac_maskset(bgmac, offset, ~0, set);
+}
+
+u16 bgmac_phy_read(struct bgmac *bgmac, u8 phyaddr, u8 reg);
+void bgmac_phy_write(struct bgmac *bgmac, u8 phyaddr, u8 reg, u16 value);
+
+#endif /* _BGMAC_H */
index a1adfaf87f499bc84a77dbc714abf8eba3adb4ef..2f0ba8f2fd6c08f85547c11eb9744c831caea23c 100644 (file)
@@ -8543,7 +8543,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        pci_set_drvdata(pdev, dev);
 
        memcpy(dev->dev_addr, bp->mac_addr, 6);
-       memcpy(dev->perm_addr, bp->mac_addr, 6);
 
        dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
                NETIF_F_TSO | NETIF_F_TSO_ECN |
index 2ef6803a0fa7a51829743a7c09d927c7e4171b2e..116762daae09e3f15223b4482560d71d4ea1f62f 100644 (file)
@@ -4,4 +4,5 @@
 
 obj-$(CONFIG_BNX2X) += bnx2x.o
 
-bnx2x-objs := bnx2x_main.o bnx2x_link.o bnx2x_cmn.o bnx2x_ethtool.o bnx2x_stats.o bnx2x_dcb.o bnx2x_sp.o bnx2x_vfpf.o bnx2x_sriov.o
+bnx2x-y := bnx2x_main.o bnx2x_link.o bnx2x_cmn.o bnx2x_ethtool.o bnx2x_stats.o bnx2x_dcb.o bnx2x_sp.o
+bnx2x-$(CONFIG_BNX2X_SRIOV) += bnx2x_vfpf.o bnx2x_sriov.o
index 85969170eb06e1921526b5d310521dec4d9e7b5b..e4605a965084d18d65de70ab46c8ccbc7debe907 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,8 +26,8 @@
  * (you will need to reboot afterwards) */
 /* #define BNX2X_STOP_ON_ERROR */
 
-#define DRV_MODULE_VERSION      "1.78.01-0"
-#define DRV_MODULE_RELDATE      "2012/10/30"
+#define DRV_MODULE_VERSION      "1.78.02-0"
+#define DRV_MODULE_RELDATE      "2013/01/14"
 #define BNX2X_BC_VER            0x040200
 
 #if defined(CONFIG_DCB)
@@ -122,29 +122,29 @@ do {                                                               \
                dev_info(&bp->pdev->dev, fmt, ##__VA_ARGS__);    \
 } while (0)
 
+/* Error handling */
+void bnx2x_panic_dump(struct bnx2x *bp, bool disable_int);
 #ifdef BNX2X_STOP_ON_ERROR
-void bnx2x_int_disable(struct bnx2x *bp);
 #define bnx2x_panic()                          \
 do {                                           \
        bp->panic = 1;                          \
        BNX2X_ERR("driver assert\n");           \
-       bnx2x_int_disable(bp);                  \
-       bnx2x_panic_dump(bp);                   \
+       bnx2x_panic_dump(bp, true);             \
 } while (0)
 #else
 #define bnx2x_panic()                          \
 do {                                           \
        bp->panic = 1;                          \
        BNX2X_ERR("driver assert\n");           \
-       bnx2x_panic_dump(bp);                   \
+       bnx2x_panic_dump(bp, false);            \
 } while (0)
 #endif
 
 #define bnx2x_mc_addr(ha)      ((ha)->addr)
 #define bnx2x_uc_addr(ha)      ((ha)->addr)
 
-#define U64_LO(x)                      (u32)(((u64)(x)) & 0xffffffff)
-#define U64_HI(x)                      (u32)(((u64)(x)) >> 32)
+#define U64_LO(x)                      ((u32)(((u64)(x)) & 0xffffffff))
+#define U64_HI(x)                      ((u32)(((u64)(x)) >> 32))
 #define HILO_U64(hi, lo)               ((((u64)(hi)) << 32) + (lo))
 
 
@@ -814,7 +814,7 @@ struct bnx2x_common {
 #define CHIP_NUM_57811                 0x163d
 #define CHIP_NUM_57811_MF              0x163e
 #define CHIP_NUM_57811_VF              0x163f
-#define CHIP_NUM_57840_OBSOLETE        0x168d
+#define CHIP_NUM_57840_OBSOLETE                0x168d
 #define CHIP_NUM_57840_MF_OBSOLETE     0x16ab
 #define CHIP_NUM_57840_4_10            0x16a1
 #define CHIP_NUM_57840_2_20            0x16a2
@@ -845,9 +845,11 @@ struct bnx2x_common {
 #define CHIP_IS_E1H(bp)                        (CHIP_IS_57711(bp) || \
                                         CHIP_IS_57711E(bp))
 #define CHIP_IS_E2(bp)                 (CHIP_IS_57712(bp) || \
-                                        CHIP_IS_57712_MF(bp))
+                                        CHIP_IS_57712_MF(bp) || \
+                                        CHIP_IS_57712_VF(bp))
 #define CHIP_IS_E3(bp)                 (CHIP_IS_57800(bp) || \
                                         CHIP_IS_57800_MF(bp) || \
+                                        CHIP_IS_57800_VF(bp) || \
                                         CHIP_IS_57810(bp) || \
                                         CHIP_IS_57810_MF(bp) || \
                                         CHIP_IS_57810_VF(bp) || \
@@ -1197,11 +1199,11 @@ struct bnx2x_fw_stats_req {
 };
 
 struct bnx2x_fw_stats_data {
-       struct stats_counter    storm_counters;
-       struct per_port_stats   port;
-       struct per_pf_stats     pf;
+       struct stats_counter            storm_counters;
+       struct per_port_stats           port;
+       struct per_pf_stats             pf;
        struct fcoe_statistics_params   fcoe;
-       struct per_queue_stats  queue_stats[1];
+       struct per_queue_stats          queue_stats[1];
 };
 
 /* Public slow path states */
@@ -1266,6 +1268,7 @@ struct bnx2x {
          (vn) * ((CHIP_IS_E1x(bp) || (CHIP_MODE_IS_4_PORT(bp))) ? 2  : 1))
 #define BP_FW_MB_IDX(bp)               BP_FW_MB_IDX_VN(bp, BP_VN(bp))
 
+#ifdef CONFIG_BNX2X_SRIOV
        /* vf pf channel mailbox contains request and response buffers */
        struct bnx2x_vf_mbx_msg *vf2pf_mbox;
        dma_addr_t              vf2pf_mbox_mapping;
@@ -1278,6 +1281,7 @@ struct bnx2x {
        dma_addr_t              pf2vf_bulletin_mapping;
 
        struct pf_vf_bulletin_content   old_bulletin;
+#endif /* CONFIG_BNX2X_SRIOV */
 
        struct net_device       *dev;
        struct pci_dev          *pdev;
@@ -1343,8 +1347,6 @@ struct bnx2x {
        __le16                  *eq_cons_sb;
        atomic_t                eq_spq_left; /* COMMON_XXX ramrods credit */
 
-
-
        /* Counter for marking that there is a STAT_QUERY ramrod pending */
        u16                     stats_pending;
        /*  Counter for completed statistics ramrods */
@@ -1379,8 +1381,14 @@ struct bnx2x {
 #define IS_VF_FLAG                     (1 << 22)
 
 #define BP_NOMCP(bp)                   ((bp)->flags & NO_MCP_FLAG)
+
+#ifdef CONFIG_BNX2X_SRIOV
 #define IS_VF(bp)                      ((bp)->flags & IS_VF_FLAG)
 #define IS_PF(bp)                      (!((bp)->flags & IS_VF_FLAG))
+#else
+#define IS_VF(bp)                      false
+#define IS_PF(bp)                      true
+#endif
 
 #define NO_ISCSI(bp)           ((bp)->flags & NO_ISCSI_FLAG)
 #define NO_ISCSI_OOO(bp)       ((bp)->flags & NO_ISCSI_OOO_FLAG)
@@ -1696,6 +1704,9 @@ struct bnx2x {
 
        /* priority to cos mapping */
        u8                                      prio_to_cos[8];
+
+       int fp_array_size;
+       u32 dump_preset_idx;
 };
 
 /* Tx queues may be less or equal to Rx queues */
@@ -2069,10 +2080,8 @@ void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, u8 idu_sb_id,
 #define BNX2X_LOOPBACK_FAILED          (BNX2X_MAC_LOOPBACK_FAILED | \
                                         BNX2X_PHY_LOOPBACK_FAILED)
 
-
 #define STROM_ASSERT_ARRAY_SIZE                50
 
-
 /* must be used on a CID before placing it on a HW ring */
 #define HW_CID(bp, x)                  ((BP_PORT(bp) << 23) | \
                                         (BP_VN(bp) << BNX2X_SWCID_SHIFT) | \
@@ -2103,7 +2112,6 @@ void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, u8 idu_sb_id,
 /* Memory of fairness algorithm . 2 cycles */
 #define FAIR_MEM                                       2
 
-
 #define ATTN_NIG_FOR_FUNC              (1L << 8)
 #define ATTN_SW_TIMER_4_FUNC           (1L << 9)
 #define GPIO_2_FUNC                    (1L << 10)
@@ -2146,6 +2154,7 @@ void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, u8 idu_sb_id,
                                (AEU_INPUTS_ATTN_BITS_TSDM_HW_INTERRUPT | \
                                 AEU_INPUTS_ATTN_BITS_TCM_HW_INTERRUPT | \
                                 AEU_INPUTS_ATTN_BITS_TSEMI_HW_INTERRUPT | \
+                                AEU_INPUTS_ATTN_BITS_BRB_HW_INTERRUPT | \
                                 AEU_INPUTS_ATTN_BITS_PBCLIENT_HW_INTERRUPT)
 #define HW_PRTY_ASSERT_SET_0   (AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR | \
                                 AEU_INPUTS_ATTN_BITS_PARSER_PARITY_ERROR | \
@@ -2207,7 +2216,6 @@ void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, u8 idu_sb_id,
 
 #define MULTI_MASK                     0x7f
 
-
 #define DEF_USB_FUNC_OFF       offsetof(struct cstorm_def_status_block_u, func)
 #define DEF_CSB_FUNC_OFF       offsetof(struct cstorm_def_status_block_c, func)
 #define DEF_XSB_FUNC_OFF       offsetof(struct xstorm_def_status_block, func)
@@ -2235,18 +2243,6 @@ void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, u8 idu_sb_id,
                (&bp->def_status_blk->sp_sb.\
                                        index_values[HC_SP_INDEX_ETH_DEF_CONS])
 
-#define SET_FLAG(value, mask, flag) \
-       do {\
-               (value) &= ~(mask);\
-               (value) |= ((flag) << (mask##_SHIFT));\
-       } while (0)
-
-#define GET_FLAG(value, mask) \
-       (((value) & (mask)) >> (mask##_SHIFT))
-
-#define GET_FIELD(value, fname) \
-       (((value) & (fname##_MASK)) >> (fname##_SHIFT))
-
 #define CAM_IS_INVALID(x) \
        (GET_FLAG(x.flags, \
        MAC_CONFIGURATION_ENTRY_ACTION_TYPE) == \
@@ -2257,7 +2253,6 @@ void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, u8 idu_sb_id,
 #define MC_HASH_OFFSET(bp, i)          (BAR_TSTRORM_INTMEM + \
        TSTORM_APPROXIMATE_MATCH_MULTICAST_FILTERING_OFFSET(BP_FUNC(bp)) + i*4)
 
-
 #ifndef PXP2_REG_PXP2_INT_STS
 #define PXP2_REG_PXP2_INT_STS          PXP2_REG_PXP2_INT_STS_0
 #endif
@@ -2275,22 +2270,10 @@ void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, u8 idu_sb_id,
 
 #define GOOD_ME_REG(me_reg) (((me_reg) & ME_REG_VF_VALID) && \
                            (!((me_reg) & ME_REG_VF_ERR)))
-int bnx2x_get_vf_id(struct bnx2x *bp, u32 *vf_id);
-int bnx2x_send_msg2pf(struct bnx2x *bp, u8 *done, dma_addr_t msg_mapping);
-int bnx2x_vfpf_acquire(struct bnx2x *bp, u8 tx_count, u8 rx_count);
-int bnx2x_vfpf_release(struct bnx2x *bp);
-int bnx2x_vfpf_init(struct bnx2x *bp);
-void bnx2x_vfpf_close_vf(struct bnx2x *bp);
-int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx);
-int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx);
-int bnx2x_vfpf_set_mac(struct bnx2x *bp);
-int bnx2x_vfpf_set_mcast(struct net_device *dev);
-int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp);
-
 int bnx2x_nic_load_analyze_req(struct bnx2x *bp, u32 load_code);
 /* Congestion management fairness mode */
-#define CMNG_FNS_NONE          0
-#define CMNG_FNS_MINMAX                1
+#define CMNG_FNS_NONE                  0
+#define CMNG_FNS_MINMAX                        1
 
 #define HC_SEG_ACCESS_DEF              0   /*Driver decision 0-3*/
 #define HC_SEG_ACCESS_ATTN             4
@@ -2306,7 +2289,6 @@ static const u32 dmae_reg_go_c[] = {
 void bnx2x_set_ethtool_ops(struct net_device *netdev);
 void bnx2x_notify_link_changed(struct bnx2x *bp);
 
-
 #define BNX2X_MF_SD_PROTOCOL(bp) \
        ((bp)->mf_config[BP_VN(bp)] & FUNC_MF_CFG_PROTOCOL_MASK)
 
@@ -2327,6 +2309,18 @@ void bnx2x_notify_link_changed(struct bnx2x *bp);
                                (BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp) || \
                                 BNX2X_IS_MF_SD_PROTOCOL_FCOE(bp)))
 
+#define SET_FLAG(value, mask, flag) \
+       do {\
+               (value) &= ~(mask);\
+               (value) |= ((flag) << (mask##_SHIFT));\
+       } while (0)
+
+#define GET_FLAG(value, mask) \
+       (((value) & (mask)) >> (mask##_SHIFT))
+
+#define GET_FIELD(value, fname) \
+       (((value) & (fname##_MASK)) >> (fname##_SHIFT))
+
 enum {
        SWITCH_UPDATE,
        AFEX_UPDATE,
index d17fa5ab15a80b728d249db92df0292bb907f95d..ecac04a3687c6b2967ccc3e8e1ab78bf2107e4e9 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_cmn.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include <linux/if_vlan.h>
 #include <linux/interrupt.h>
 #include <linux/ip.h>
+#include <net/tcp.h>
 #include <net/ipv6.h>
 #include <net/ip6_checksum.h>
 #include <linux/prefetch.h>
 #include "bnx2x_cmn.h"
 #include "bnx2x_init.h"
 #include "bnx2x_sp.h"
-#include "bnx2x_sriov.h"
 
 /**
  * bnx2x_move_fp - move content of the fastpath structure.
@@ -79,8 +79,8 @@ static inline void bnx2x_move_fp(struct bnx2x *bp, int from, int to)
                new_txdata_index = new_max_eth_txqs + FCOE_TXQ_IDX_OFFSET;
        }
 
-       memcpy(&bp->bnx2x_txq[old_txdata_index],
-              &bp->bnx2x_txq[new_txdata_index],
+       memcpy(&bp->bnx2x_txq[new_txdata_index],
+              &bp->bnx2x_txq[old_txdata_index],
               sizeof(struct bnx2x_fp_txdata));
        to_fp->txdata_ptr[0] = &bp->bnx2x_txq[new_txdata_index];
 }
@@ -109,7 +109,32 @@ void bnx2x_fill_fw_str(struct bnx2x *bp, char *buf, size_t buf_len)
                         (bp->common.bc_ver & 0xff),
                         ((phy_fw_ver[0] != '\0') ? " phy " : ""), phy_fw_ver);
        } else {
-               strlcpy(buf, bp->acquire_resp.pfdev_info.fw_ver, buf_len);
+               bnx2x_vf_fill_fw_str(bp, buf, buf_len);
+       }
+}
+
+/**
+ * bnx2x_shrink_eth_fp - guarantees fastpath structures stay intact
+ *
+ * @bp:        driver handle
+ * @delta:     number of eth queues which were not allocated
+ */
+static void bnx2x_shrink_eth_fp(struct bnx2x *bp, int delta)
+{
+       int i, cos, old_eth_num = BNX2X_NUM_ETH_QUEUES(bp);
+
+       /* Queue pointer cannot be re-set on an fp-basis, as moving pointer
+        * backward along the array could cause memory to be overriden
+        */
+       for (cos = 1; cos < bp->max_cos; cos++) {
+               for (i = 0; i < old_eth_num - delta; i++) {
+                       struct bnx2x_fastpath *fp = &bp->fp[i];
+                       int new_idx = cos * (old_eth_num - delta) + i;
+
+                       memcpy(&bp->bnx2x_txq[new_idx], fp->txdata_ptr[cos],
+                              sizeof(struct bnx2x_fp_txdata));
+                       fp->txdata_ptr[cos] = &bp->bnx2x_txq[new_idx];
+               }
        }
 }
 
@@ -212,7 +237,7 @@ int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata)
                   txdata->txq_index, hw_cons, sw_cons, pkt_cons);
 
                bd_cons = bnx2x_free_tx_pkt(bp, txdata, pkt_cons,
-                   &pkts_compl, &bytes_compl);
+                                           &pkts_compl, &bytes_compl);
 
                sw_cons++;
        }
@@ -318,14 +343,14 @@ static inline void bnx2x_update_sge_prod(struct bnx2x_fastpath *fp,
           fp->last_max_sge, fp->rx_sge_prod);
 }
 
-/* Set Toeplitz hash value in the skb using the value from the
+/* Get Toeplitz hash value in the skb using the value from the
  * CQE (calculated by HW).
  */
 static u32 bnx2x_get_rxhash(const struct bnx2x *bp,
                            const struct eth_fast_path_rx_cqe *cqe,
                            bool *l4_rxhash)
 {
-       /* Set Toeplitz hash from CQE */
+       /* Get Toeplitz hash from CQE */
        if ((bp->dev->features & NETIF_F_RXHASH) &&
            (cqe->status_flags & ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG)) {
                enum eth_rss_hash_type htype;
@@ -392,8 +417,7 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue,
        tpa_info->rxhash = bnx2x_get_rxhash(bp, cqe, &tpa_info->l4_rxhash);
        if (fp->mode == TPA_MODE_GRO) {
                u16 gro_size = le16_to_cpu(cqe->pkt_len_or_gro_seg_len);
-               tpa_info->full_page =
-                       SGE_PAGE_SIZE * PAGES_PER_SGE / gro_size * gro_size;
+               tpa_info->full_page = SGE_PAGES / gro_size * gro_size;
                tpa_info->gro_size = gro_size;
        }
 
@@ -414,31 +438,34 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue,
  */
 #define TPA_TSTAMP_OPT_LEN     12
 /**
- * bnx2x_set_lro_mss - calculate the approximate value of the MSS
+ * bnx2x_set_gro_params - compute GRO values
  *
- * @bp:                        driver handle
+ * @skb:               packet skb
  * @parsing_flags:     parsing flags from the START CQE
  * @len_on_bd:         total length of the first packet for the
  *                     aggregation.
+ * @pkt_len:           length of all segments
  *
  * Approximate value of the MSS for this aggregation calculated using
  * the first packet of it.
+ * Compute number of aggregated segments, and gso_type.
  */
-static u16 bnx2x_set_lro_mss(struct bnx2x *bp, u16 parsing_flags,
-                            u16 len_on_bd)
+static void bnx2x_set_gro_params(struct sk_buff *skb, u16 parsing_flags,
+                                u16 len_on_bd, unsigned int pkt_len)
 {
-       /*
-        * TPA arrgregation won't have either IP options or TCP options
+       /* TPA aggregation won't have either IP options or TCP options
         * other than timestamp or IPv6 extension headers.
         */
        u16 hdrs_len = ETH_HLEN + sizeof(struct tcphdr);
 
        if (GET_FLAG(parsing_flags, PARSING_FLAGS_OVER_ETHERNET_PROTOCOL) ==
-           PRS_FLAG_OVERETH_IPV6)
+           PRS_FLAG_OVERETH_IPV6) {
                hdrs_len += sizeof(struct ipv6hdr);
-       else /* IPv4 */
+               skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
+       } else {
                hdrs_len += sizeof(struct iphdr);
-
+               skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
+       }
 
        /* Check if there was a TCP timestamp, if there is it's will
         * always be 12 bytes length: nop nop kind length echo val.
@@ -448,7 +475,13 @@ static u16 bnx2x_set_lro_mss(struct bnx2x *bp, u16 parsing_flags,
        if (parsing_flags & PARSING_FLAGS_TIME_STAMP_EXIST_FLAG)
                hdrs_len += TPA_TSTAMP_OPT_LEN;
 
-       return len_on_bd - hdrs_len;
+       skb_shinfo(skb)->gso_size = len_on_bd - hdrs_len;
+
+       /* tcp_gro_complete() will copy NAPI_GRO_CB(skb)->count
+        * to skb_shinfo(skb)->gso_segs
+        */
+       NAPI_GRO_CB(skb)->count = DIV_ROUND_UP(pkt_len - hdrs_len,
+                                              skb_shinfo(skb)->gso_size);
 }
 
 static int bnx2x_alloc_rx_sge(struct bnx2x *bp,
@@ -465,7 +498,7 @@ static int bnx2x_alloc_rx_sge(struct bnx2x *bp,
        }
 
        mapping = dma_map_page(&bp->pdev->dev, page, 0,
-                              SGE_PAGE_SIZE*PAGES_PER_SGE, DMA_FROM_DEVICE);
+                              SGE_PAGES, DMA_FROM_DEVICE);
        if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) {
                __free_pages(page, PAGES_PER_SGE_SHIFT);
                BNX2X_ERR("Can't map sge\n");
@@ -502,22 +535,12 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
        }
 
        /* This is needed in order to enable forwarding support */
-       if (frag_size) {
-               skb_shinfo(skb)->gso_size = bnx2x_set_lro_mss(bp,
-                                       tpa_info->parsing_flags, len_on_bd);
-
-               /* set for GRO */
-               if (fp->mode == TPA_MODE_GRO)
-                       skb_shinfo(skb)->gso_type =
-                           (GET_FLAG(tpa_info->parsing_flags,
-                                     PARSING_FLAGS_OVER_ETHERNET_PROTOCOL) ==
-                                               PRS_FLAG_OVERETH_IPV6) ?
-                               SKB_GSO_TCPV6 : SKB_GSO_TCPV4;
-       }
-
+       if (frag_size)
+               bnx2x_set_gro_params(skb, tpa_info->parsing_flags, len_on_bd,
+                                    le16_to_cpu(cqe->pkt_len));
 
 #ifdef BNX2X_STOP_ON_ERROR
-       if (pages > min_t(u32, 8, MAX_SKB_FRAGS)*SGE_PAGE_SIZE*PAGES_PER_SGE) {
+       if (pages > min_t(u32, 8, MAX_SKB_FRAGS) * SGE_PAGES) {
                BNX2X_ERR("SGL length is too long: %d. CQE index is %d\n",
                          pages, cqe_idx);
                BNX2X_ERR("cqe->pkt_len = %d\n", cqe->pkt_len);
@@ -535,8 +558,7 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                if (fp->mode == TPA_MODE_GRO)
                        frag_len = min_t(u32, frag_size, (u32)full_page);
                else /* LRO */
-                       frag_len = min_t(u32, frag_size,
-                                        (u32)(SGE_PAGE_SIZE * PAGES_PER_SGE));
+                       frag_len = min_t(u32, frag_size, (u32)SGE_PAGES);
 
                rx_pg = &fp->rx_page_ring[sge_idx];
                old_rx_pg = *rx_pg;
@@ -552,7 +574,7 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                /* Unmap the page as we r going to pass it to the stack */
                dma_unmap_page(&bp->pdev->dev,
                               dma_unmap_addr(&old_rx_pg, mapping),
-                              SGE_PAGE_SIZE*PAGES_PER_SGE, DMA_FROM_DEVICE);
+                              SGE_PAGES, DMA_FROM_DEVICE);
                /* Add one frag and update the appropriate fields in the skb */
                if (fp->mode == TPA_MODE_LRO)
                        skb_fill_page_desc(skb, j, old_rx_pg.page, 0, frag_len);
@@ -570,7 +592,7 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                }
 
                skb->data_len += frag_len;
-               skb->truesize += SGE_PAGE_SIZE * PAGES_PER_SGE;
+               skb->truesize += SGE_PAGES;
                skb->len += frag_len;
 
                frag_size -= frag_len;
@@ -595,6 +617,54 @@ static void *bnx2x_frag_alloc(const struct bnx2x_fastpath *fp)
        return kmalloc(fp->rx_buf_size + NET_SKB_PAD, GFP_ATOMIC);
 }
 
+#ifdef CONFIG_INET
+static void bnx2x_gro_ip_csum(struct bnx2x *bp, struct sk_buff *skb)
+{
+       const struct iphdr *iph = ip_hdr(skb);
+       struct tcphdr *th;
+
+       skb_set_transport_header(skb, sizeof(struct iphdr));
+       th = tcp_hdr(skb);
+
+       th->check = ~tcp_v4_check(skb->len - skb_transport_offset(skb),
+                                 iph->saddr, iph->daddr, 0);
+}
+
+static void bnx2x_gro_ipv6_csum(struct bnx2x *bp, struct sk_buff *skb)
+{
+       struct ipv6hdr *iph = ipv6_hdr(skb);
+       struct tcphdr *th;
+
+       skb_set_transport_header(skb, sizeof(struct ipv6hdr));
+       th = tcp_hdr(skb);
+
+       th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb),
+                                 &iph->saddr, &iph->daddr, 0);
+}
+#endif
+
+static void bnx2x_gro_receive(struct bnx2x *bp, struct bnx2x_fastpath *fp,
+                              struct sk_buff *skb)
+{
+#ifdef CONFIG_INET
+       if (skb_shinfo(skb)->gso_size) {
+               skb_set_network_header(skb, 0);
+               switch (be16_to_cpu(skb->protocol)) {
+               case ETH_P_IP:
+                       bnx2x_gro_ip_csum(bp, skb);
+                       break;
+               case ETH_P_IPV6:
+                       bnx2x_gro_ipv6_csum(bp, skb);
+                       break;
+               default:
+                       BNX2X_ERR("FW GRO supports only IPv4/IPv6, not 0x%04x\n",
+                                 be16_to_cpu(skb->protocol));
+               }
+               tcp_gro_complete(skb);
+       }
+#endif
+       napi_gro_receive(&fp->napi, skb);
+}
 
 static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                           struct bnx2x_agg_info *tpa_info,
@@ -649,7 +719,7 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
                                         skb, cqe, cqe_idx)) {
                        if (tpa_info->parsing_flags & PARSING_FLAGS_VLAN)
                                __vlan_hwaccel_put_tag(skb, tpa_info->vlan_tag);
-                       napi_gro_receive(&fp->napi, skb);
+                       bnx2x_gro_receive(bp, fp, skb);
                } else {
                        DP(NETIF_MSG_RX_STATUS,
                           "Failed to allocate new pages - dropping packet!\n");
@@ -1657,7 +1727,6 @@ static int bnx2x_setup_irqs(struct bnx2x *bp)
                if (rc)
                        return rc;
        } else {
-               bnx2x_ack_int(bp);
                rc = bnx2x_req_irq(bp);
                if (rc) {
                        BNX2X_ERR("IRQ request failed  rc %d, aborting\n", rc);
@@ -1755,7 +1824,6 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb)
        return __skb_tx_hash(dev, skb, BNX2X_NUM_ETH_QUEUES(bp));
 }
 
-
 void bnx2x_set_num_queues(struct bnx2x *bp)
 {
        /* RSS queues */
@@ -2048,7 +2116,7 @@ static int bnx2x_alloc_fw_stats_mem(struct bnx2x *bp)
         * request struct
         */
        if (IS_SRIOV(bp))
-               vf_headroom = bp->vfdb->sriov.nr_virtfn * BNX2X_CLIENTS_PER_VF;
+               vf_headroom = bnx2x_vf_headroom(bp);
 
        /* Request is built from stats_query_header and an array of
         * stats_query_cmd_group each of which contains
@@ -2240,49 +2308,15 @@ static void bnx2x_nic_load_afex_dcc(struct bnx2x *bp, int load_code)
 static void bnx2x_bz_fp(struct bnx2x *bp, int index)
 {
        struct bnx2x_fastpath *fp = &bp->fp[index];
-       struct bnx2x_fp_stats *fp_stats = &bp->fp_stats[index];
 
        int cos;
        struct napi_struct orig_napi = fp->napi;
        struct bnx2x_agg_info *orig_tpa_info = fp->tpa_info;
        /* bzero bnx2x_fastpath contents */
-       if (bp->stats_init) {
-               memset(fp->tpa_info, 0, sizeof(*fp->tpa_info));
-               memset(fp, 0, sizeof(*fp));
-       } else {
-               /* Keep Queue statistics */
-               struct bnx2x_eth_q_stats *tmp_eth_q_stats;
-               struct bnx2x_eth_q_stats_old *tmp_eth_q_stats_old;
-
-               tmp_eth_q_stats = kzalloc(sizeof(struct bnx2x_eth_q_stats),
-                                         GFP_KERNEL);
-               if (tmp_eth_q_stats)
-                       memcpy(tmp_eth_q_stats, &fp_stats->eth_q_stats,
-                              sizeof(struct bnx2x_eth_q_stats));
-
-               tmp_eth_q_stats_old =
-                       kzalloc(sizeof(struct bnx2x_eth_q_stats_old),
-                               GFP_KERNEL);
-               if (tmp_eth_q_stats_old)
-                       memcpy(tmp_eth_q_stats_old, &fp_stats->eth_q_stats_old,
-                              sizeof(struct bnx2x_eth_q_stats_old));
-
-               memset(fp->tpa_info, 0, sizeof(*fp->tpa_info));
-               memset(fp, 0, sizeof(*fp));
-
-               if (tmp_eth_q_stats) {
-                       memcpy(&fp_stats->eth_q_stats, tmp_eth_q_stats,
-                              sizeof(struct bnx2x_eth_q_stats));
-                       kfree(tmp_eth_q_stats);
-               }
-
-               if (tmp_eth_q_stats_old) {
-                       memcpy(&fp_stats->eth_q_stats_old, tmp_eth_q_stats_old,
-                              sizeof(struct bnx2x_eth_q_stats_old));
-                       kfree(tmp_eth_q_stats_old);
-               }
-
-       }
+       if (fp->tpa_info)
+               memset(fp->tpa_info, 0, ETH_MAX_AGGREGATION_QUEUES_E1H_E2 *
+                      sizeof(struct bnx2x_agg_info));
+       memset(fp, 0, sizeof(*fp));
 
        /* Restore the NAPI object as it has been already initialized */
        fp->napi = orig_napi;
@@ -2411,7 +2445,6 @@ load_error_cnic0:
 #endif /* ! BNX2X_STOP_ON_ERROR */
 }
 
-
 /* must be called with rtnl_lock */
 int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
 {
@@ -2431,12 +2464,9 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
 
        bp->state = BNX2X_STATE_OPENING_WAIT4_LOAD;
 
-       /* Set the initial link reported state to link down */
-       bnx2x_acquire_phy_lock(bp);
        memset(&bp->last_reported_link, 0, sizeof(bp->last_reported_link));
        __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
                &bp->last_reported_link.link_report_flags);
-       bnx2x_release_phy_lock(bp);
 
        if (IS_PF(bp))
                /* must be called before memory allocation and HW init */
@@ -2775,7 +2805,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
                          val & ~DRV_FLAGS_CAPABILITIES_LOADED_L2);
        }
 
-       if (IS_PF(bp) &&
+       if (IS_PF(bp) && bp->recovery_state != BNX2X_RECOVERY_DONE &&
            (bp->state == BNX2X_STATE_CLOSED ||
             bp->state == BNX2X_STATE_ERROR)) {
                /* We can get here if the driver has been unloaded
@@ -2795,8 +2825,16 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
                return -EINVAL;
        }
 
-       /*
-        * It's important to set the bp->state to the value different from
+       /* Nothing to do during unload if previous bnx2x_nic_load()
+        * have not completed succesfully - all resourses are released.
+        *
+        * we can get here only after unsuccessful ndo_* callback, during which
+        * dev->IFF_UP flag is still on.
+        */
+       if (bp->state == BNX2X_STATE_CLOSED || bp->state == BNX2X_STATE_ERROR)
+               return 0;
+
+       /* It's important to set the bp->state to the value different from
         * BNX2X_STATE_OPEN and only then stop the Tx. Otherwise bnx2x_tx_int()
         * may restart the Tx from the NAPI context (see bnx2x_tx_int()).
         */
@@ -2992,7 +3030,6 @@ int bnx2x_poll(struct napi_struct *napi, int budget)
                        if (bnx2x_tx_queue_has_work(fp->txdata_ptr[cos]))
                                bnx2x_tx_int(bp, fp->txdata_ptr[cos]);
 
-
                if (bnx2x_has_rx_work(fp)) {
                        work_done += bnx2x_rx_int(fp, budget - work_done);
 
@@ -3091,17 +3128,21 @@ static noinline u16 bnx2x_tx_split(struct bnx2x *bp,
        return bd_prod;
 }
 
-static inline u16 bnx2x_csum_fix(unsigned char *t_header, u16 csum, s8 fix)
+#define bswab32(b32) ((__force __le32) swab32((__force __u32) (b32)))
+#define bswab16(b16) ((__force __le16) swab16((__force __u16) (b16)))
+static inline __le16 bnx2x_csum_fix(unsigned char *t_header, u16 csum, s8 fix)
 {
+       __sum16 tsum = (__force __sum16) csum;
+
        if (fix > 0)
-               csum = (u16) ~csum_fold(csum_sub(csum,
-                               csum_partial(t_header - fix, fix, 0)));
+               tsum = ~csum_fold(csum_sub((__force __wsum) csum,
+                                 csum_partial(t_header - fix, fix, 0)));
 
        else if (fix < 0)
-               csum = (u16) ~csum_fold(csum_add(csum,
-                               csum_partial(t_header, -fix, 0)));
+               tsum = ~csum_fold(csum_add((__force __wsum) csum,
+                                 csum_partial(t_header, -fix, 0)));
 
-       return swab16(csum);
+       return bswab16(csum);
 }
 
 static inline u32 bnx2x_xmit_type(struct bnx2x *bp, struct sk_buff *skb)
@@ -3235,23 +3276,24 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb,
                                     u32 xmit_type)
 {
        pbd->lso_mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
-       pbd->tcp_send_seq = swab32(tcp_hdr(skb)->seq);
+       pbd->tcp_send_seq = bswab32(tcp_hdr(skb)->seq);
        pbd->tcp_flags = pbd_tcp_flags(skb);
 
        if (xmit_type & XMIT_GSO_V4) {
-               pbd->ip_id = swab16(ip_hdr(skb)->id);
+               pbd->ip_id = bswab16(ip_hdr(skb)->id);
                pbd->tcp_pseudo_csum =
-                       swab16(~csum_tcpudp_magic(ip_hdr(skb)->saddr,
-                                                 ip_hdr(skb)->daddr,
-                                                 0, IPPROTO_TCP, 0));
+                       bswab16(~csum_tcpudp_magic(ip_hdr(skb)->saddr,
+                                                  ip_hdr(skb)->daddr,
+                                                  0, IPPROTO_TCP, 0));
 
        } else
                pbd->tcp_pseudo_csum =
-                       swab16(~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
-                                               &ipv6_hdr(skb)->daddr,
-                                               0, IPPROTO_TCP, 0));
+                       bswab16(~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
+                                                &ipv6_hdr(skb)->daddr,
+                                                0, IPPROTO_TCP, 0));
 
-       pbd->global_data |= ETH_TX_PARSE_BD_E1X_PSEUDO_CS_WITHOUT_LEN;
+       pbd->global_data |=
+               cpu_to_le16(ETH_TX_PARSE_BD_E1X_PSEUDO_CS_WITHOUT_LEN);
 }
 
 /**
@@ -3265,12 +3307,12 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb,
  * 57712 related
  */
 static inline  u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
-       u32 *parsing_data, u32 xmit_type)
+                                       u32 *parsing_data, u32 xmit_type)
 {
        *parsing_data |=
-                       ((((u8 *)skb_transport_header(skb) - skb->data) >> 1) <<
-                       ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
-                       ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
+               ((((u8 *)skb_transport_header(skb) - skb->data) >> 1) <<
+               ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
+               ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
 
        if (xmit_type & XMIT_CSUM_TCP) {
                *parsing_data |= ((tcp_hdrlen(skb) / 4) <<
@@ -3278,12 +3320,11 @@ static inline  u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
                        ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
 
                return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
-       } else
-               /* We support checksum offload for TCP and UDP only.
-                * No need to pass the UDP header length - it's a constant.
-                */
-               return skb_transport_header(skb) +
-                               sizeof(struct udphdr) - skb->data;
+       }
+       /* We support checksum offload for TCP and UDP only.
+        * No need to pass the UDP header length - it's a constant.
+        */
+       return skb_transport_header(skb) + sizeof(struct udphdr) - skb->data;
 }
 
 static inline void bnx2x_set_sbd_csum(struct bnx2x *bp, struct sk_buff *skb,
@@ -3318,8 +3359,9 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
 
        /* for now NS flag is not used in Linux */
        pbd->global_data =
-               (hlen | ((skb->protocol == cpu_to_be16(ETH_P_8021Q)) <<
-                        ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT));
+               cpu_to_le16(hlen |
+                           ((skb->protocol == cpu_to_be16(ETH_P_8021Q)) <<
+                            ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT));
 
        pbd->ip_hlen_w = (skb_transport_header(skb) -
                        skb_network_header(skb)) >> 1;
@@ -3336,7 +3378,7 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
        hlen = hlen*2;
 
        if (xmit_type & XMIT_CSUM_TCP) {
-               pbd->tcp_pseudo_csum = swab16(tcp_hdr(skb)->check);
+               pbd->tcp_pseudo_csum = bswab16(tcp_hdr(skb)->check);
 
        } else {
                s8 fix = SKB_CS_OFF(skb); /* signed! */
@@ -3416,17 +3458,18 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
                        dev_kfree_skb(skb);
                        return NETDEV_TX_OK;
                }
-                       bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++;
-                       netif_tx_stop_queue(txq);
+               bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++;
+               netif_tx_stop_queue(txq);
                BNX2X_ERR("BUG! Tx ring full when queue awake!\n");
 
                return NETDEV_TX_BUSY;
        }
 
        DP(NETIF_MSG_TX_QUEUED,
-          "queue[%d]: SKB: summed %x  protocol %x protocol(%x,%x) gso type %x  xmit_type %x\n",
+          "queue[%d]: SKB: summed %x  protocol %x protocol(%x,%x) gso type %x  xmit_type %x len %d\n",
           txq_index, skb->ip_summed, skb->protocol, ipv6_hdr(skb)->nexthdr,
-          ip_hdr(skb)->protocol, skb_shinfo(skb)->gso_type, xmit_type);
+          ip_hdr(skb)->protocol, skb_shinfo(skb)->gso_type, xmit_type,
+          skb->len);
 
        eth = (struct ethhdr *)skb->data;
 
@@ -3511,13 +3554,17 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
                /* when transmitting in a vf, start bd must hold the ethertype
                 * for fw to enforce it
                 */
+#ifndef BNX2X_STOP_ON_ERROR
                if (IS_VF(bp)) {
+#endif
                        tx_start_bd->vlan_or_ethertype =
                                cpu_to_le16(ntohs(eth->h_proto));
+#ifndef BNX2X_STOP_ON_ERROR
                } else {
                        /* used by FW for packet accounting */
                        tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod);
                }
+#endif
        }
 
        /* turn on parsing and get a BD */
@@ -3793,93 +3840,6 @@ int bnx2x_setup_tc(struct net_device *dev, u8 num_tc)
        return 0;
 }
 
-/* New mac for VF. Consider these cases:
- * 1. VF hasn't been acquired yet - save the mac in local bulletin board and
- *    supply at acquire.
- * 2. VF has already been acquired but has not yet initialized - store in local
- *    bulletin board. mac will be posted on VF bulletin board after VF init. VF
- *    will configure this mac when it is ready.
- * 3. VF has already initialized but has not yet setup a queue - post the new
- *    mac on VF's bulletin board right now. VF will configure this mac when it
- *    is ready.
- * 4. VF has already set a queue - delete any macs already configured for this
- *    queue and manually config the new mac.
- * In any event, once this function has been called refuse any attempts by the
- * VF to configure any mac for itself except for this mac. In case of a race
- * where the VF fails to see the new post on its bulletin board before sending a
- * mac configuration request, the PF will simply fail the request and VF can try
- * again after consulting its bulletin board
- */
-int bnx2x_set_vf_mac(struct net_device *dev, int queue, u8 *mac)
-{
-       struct bnx2x *bp = netdev_priv(dev);
-       int rc, q_logical_state, vfidx = queue;
-       struct bnx2x_virtf *vf = BP_VF(bp, vfidx);
-       struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx);
-
-       /* if SRIOV is disabled there is nothing to do (and somewhere, someone
-        * has erred).
-        */
-       if (!IS_SRIOV(bp)) {
-               BNX2X_ERR("bnx2x_set_vf_mac called though sriov is disabled\n");
-               return -EINVAL;
-       }
-
-       if (!is_valid_ether_addr(mac)) {
-               BNX2X_ERR("mac address invalid\n");
-               return -EINVAL;
-       }
-
-       /* update PF's copy of the VF's bulletin. will no longer accept mac
-        * configuration requests from vf unless match this mac
-        */
-       bulletin->valid_bitmap |= 1 << MAC_ADDR_VALID;
-       memcpy(bulletin->mac, mac, ETH_ALEN);
-
-       /* Post update on VF's bulletin board */
-       rc = bnx2x_post_vf_bulletin(bp, vfidx);
-       if (rc) {
-               BNX2X_ERR("failed to update VF[%d] bulletin\n", vfidx);
-               return rc;
-       }
-
-       /* is vf initialized and queue set up? */
-       q_logical_state =
-               bnx2x_get_q_logical_state(bp, &bnx2x_vfq(vf, 0, sp_obj));
-       if (vf->state == VF_ENABLED &&
-           q_logical_state == BNX2X_Q_LOGICAL_STATE_ACTIVE) {
-               /* configure the mac in device on this vf's queue */
-               unsigned long flags = 0;
-               struct bnx2x_vlan_mac_obj *mac_obj = &bnx2x_vfq(vf, 0, mac_obj);
-
-               /* must lock vfpf channel to protect against vf flows */
-               bnx2x_lock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_MAC);
-
-               /* remove existing eth macs */
-               rc = bnx2x_del_all_macs(bp, mac_obj, BNX2X_ETH_MAC, true);
-               if (rc) {
-                       BNX2X_ERR("failed to delete eth macs\n");
-                       return -EINVAL;
-               }
-
-               /* remove existing uc list macs */
-               rc = bnx2x_del_all_macs(bp, mac_obj, BNX2X_UC_LIST_MAC, true);
-               if (rc) {
-                       BNX2X_ERR("failed to delete uc_list macs\n");
-                       return -EINVAL;
-               }
-
-               /* configure the new mac to device */
-               __set_bit(RAMROD_COMP_WAIT, &flags);
-               bnx2x_set_mac_one(bp, (u8 *)&bulletin->mac, mac_obj, true,
-                                 BNX2X_ETH_MAC, &flags);
-
-               bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_MAC);
-       }
-
-       return rc;
-}
-
 /* called with rtnl_lock */
 int bnx2x_change_mac_addr(struct net_device *dev, void *p)
 {
@@ -4099,6 +4059,8 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index)
        } else /* if rx_ring_size specified - use it */
                rx_ring_size = bp->rx_ring_size;
 
+       DP(BNX2X_MSG_SP, "calculated rx_ring_size %d\n", rx_ring_size);
+
        /* Common */
        sb = &bnx2x_fp(bp, index, status_blk);
 
@@ -4224,6 +4186,7 @@ int bnx2x_alloc_fp_mem(struct bnx2x *bp)
                int delta = BNX2X_NUM_ETH_QUEUES(bp) - i;
 
                WARN_ON(delta < 0);
+               bnx2x_shrink_eth_fp(bp, delta);
                if (CNIC_SUPPORT(bp))
                        /* move non eth FPs next to last eth FP
                         * must be done in that order
@@ -4244,7 +4207,10 @@ int bnx2x_alloc_fp_mem(struct bnx2x *bp)
 
 void bnx2x_free_mem_bp(struct bnx2x *bp)
 {
-       kfree(bp->fp->tpa_info);
+       int i;
+
+       for (i = 0; i < bp->fp_array_size; i++)
+               kfree(bp->fp[i].tpa_info);
        kfree(bp->fp);
        kfree(bp->sp_objs);
        kfree(bp->fp_stats);
@@ -4264,7 +4230,7 @@ int bnx2x_alloc_mem_bp(struct bnx2x *bp)
 
        /*
         * The biggest MSI-X table we might need is as a maximum number of fast
-        * path IGU SBs plus default SB (for PF).
+        * path IGU SBs plus default SB (for PF only).
         */
        msix_table_size = bp->igu_sb_cnt;
        if (IS_PF(bp))
@@ -4273,12 +4239,13 @@ int bnx2x_alloc_mem_bp(struct bnx2x *bp)
 
        /* fp array: RSS plus CNIC related L2 queues */
        fp_array_size = BNX2X_MAX_RSS_COUNT(bp) + CNIC_SUPPORT(bp);
-       BNX2X_DEV_INFO("fp_array_size %d", fp_array_size);
+       bp->fp_array_size = fp_array_size;
+       BNX2X_DEV_INFO("fp_array_size %d\n", bp->fp_array_size);
 
-       fp = kcalloc(fp_array_size, sizeof(*fp), GFP_KERNEL);
+       fp = kcalloc(bp->fp_array_size, sizeof(*fp), GFP_KERNEL);
        if (!fp)
                goto alloc_err;
-       for (i = 0; i < fp_array_size; i++) {
+       for (i = 0; i < bp->fp_array_size; i++) {
                fp[i].tpa_info =
                        kcalloc(ETH_MAX_AGGREGATION_QUEUES_E1H_E2,
                                sizeof(struct bnx2x_agg_info), GFP_KERNEL);
@@ -4289,13 +4256,13 @@ int bnx2x_alloc_mem_bp(struct bnx2x *bp)
        bp->fp = fp;
 
        /* allocate sp objs */
-       bp->sp_objs = kcalloc(fp_array_size, sizeof(struct bnx2x_sp_objs),
+       bp->sp_objs = kcalloc(bp->fp_array_size, sizeof(struct bnx2x_sp_objs),
                              GFP_KERNEL);
        if (!bp->sp_objs)
                goto alloc_err;
 
        /* allocate fp_stats */
-       bp->fp_stats = kcalloc(fp_array_size, sizeof(struct bnx2x_fp_stats),
+       bp->fp_stats = kcalloc(bp->fp_array_size, sizeof(struct bnx2x_fp_stats),
                               GFP_KERNEL);
        if (!bp->fp_stats)
                goto alloc_err;
@@ -4374,7 +4341,7 @@ int bnx2x_get_link_cfg_idx(struct bnx2x *bp)
 {
        u32 sel_phy_idx = bnx2x_get_cur_phy_idx(bp);
        /*
-        * The selected actived PHY is always after swapping (in case PHY
+        * The selected activated PHY is always after swapping (in case PHY
         * swapping is enabled). So when swapping is enabled, we need to reverse
         * the configuration
         */
index 23a1fa9a4cb3114c71aeaa0d8f3aca875a4ae0c2..aee7671ff4c10bd55eda3a4b93a82e083ffaeb86 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_cmn.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,6 +24,7 @@
 
 
 #include "bnx2x.h"
+#include "bnx2x_sriov.h"
 
 /* This is used as a replacement for an MCP if it's not present */
 extern int load_count[2][3]; /* per-path: 0-common, 1-port0, 2-port1 */
@@ -196,6 +197,7 @@ void bnx2x_igu_ack_sb(struct bnx2x *bp, u8 igu_sb_id, u8 segment,
 
 /* Disable transactions from chip to host */
 void bnx2x_pf_disable(struct bnx2x *bp);
+int bnx2x_pretend_func(struct bnx2x *bp, u16 pretend_func_val);
 
 /**
  * bnx2x__link_status_update - handles link status change.
@@ -401,7 +403,7 @@ void bnx2x_set_rx_mode(struct net_device *dev);
  * If bp->state is OPEN, should be called with
  * netif_addr_lock_bh().
  */
-void bnx2x_set_storm_rx_mode(struct bnx2x *bp);
+int bnx2x_set_storm_rx_mode(struct bnx2x *bp);
 
 /**
  * bnx2x_set_q_rx_mode - configures rx_mode for a single queue.
@@ -413,11 +415,11 @@ void bnx2x_set_storm_rx_mode(struct bnx2x *bp);
  * @tx_accept_flags:   tx accept configuration (tx switch)
  * @ramrod_flags:      ramrod configuration
  */
-void bnx2x_set_q_rx_mode(struct bnx2x *bp, u8 cl_id,
-                        unsigned long rx_mode_flags,
-                        unsigned long rx_accept_flags,
-                        unsigned long tx_accept_flags,
-                        unsigned long ramrod_flags);
+int bnx2x_set_q_rx_mode(struct bnx2x *bp, u8 cl_id,
+                       unsigned long rx_mode_flags,
+                       unsigned long rx_accept_flags,
+                       unsigned long tx_accept_flags,
+                       unsigned long ramrod_flags);
 
 /* Parity errors related */
 void bnx2x_set_pf_load(struct bnx2x *bp);
@@ -477,8 +479,6 @@ int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state);
  */
 void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value);
 /* Error handling */
-void bnx2x_panic_dump(struct bnx2x *bp);
-
 void bnx2x_fw_dump_lvl(struct bnx2x *bp, const char *lvl);
 
 /* validate currect fw is loaded */
@@ -819,7 +819,7 @@ static inline void bnx2x_free_rx_sge(struct bnx2x *bp,
                return;
 
        dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(sw_buf, mapping),
-                      SGE_PAGE_SIZE*PAGES_PER_SGE, DMA_FROM_DEVICE);
+                      SGE_PAGES, DMA_FROM_DEVICE);
        __free_pages(page, PAGES_PER_SGE_SHIFT);
 
        sw_buf->page = NULL;
@@ -973,7 +973,6 @@ static inline int bnx2x_func_start(struct bnx2x *bp)
        return bnx2x_func_state_change(bp, &func_params);
 }
 
-
 /**
  * bnx2x_set_fw_mac_addr - fill in a MAC address in FW format
  *
@@ -982,8 +981,8 @@ static inline int bnx2x_func_start(struct bnx2x *bp)
  * @fw_lo:     pointer to lower part
  * @mac:       pointer to MAC address
  */
-static inline void bnx2x_set_fw_mac_addr(u16 *fw_hi, u16 *fw_mid, u16 *fw_lo,
-                                        u8 *mac)
+static inline void bnx2x_set_fw_mac_addr(__le16 *fw_hi, __le16 *fw_mid,
+                                        __le16 *fw_lo, u8 *mac)
 {
        ((u8 *)fw_hi)[0]  = mac[1];
        ((u8 *)fw_hi)[1]  = mac[0];
@@ -1128,22 +1127,7 @@ static inline u8 bnx2x_fp_qzone_id(struct bnx2x_fastpath *fp)
                return fp->cl_id;
 }
 
-static inline u32 bnx2x_rx_ustorm_prods_offset(struct bnx2x_fastpath *fp)
-{
-       struct bnx2x *bp = fp->bp;
-       u32 offset = BAR_USTRORM_INTMEM;
-
-       if (IS_VF(bp))
-               return PXP_VF_ADDR_USDM_QUEUES_START +
-                       bp->acquire_resp.resc.hw_qid[fp->index] *
-                       sizeof(struct ustorm_queue_zone_data);
-       else if (!CHIP_IS_E1x(bp))
-               offset += USTORM_RX_PRODS_E2_OFFSET(fp->cl_qzone_id);
-       else
-               offset += USTORM_RX_PRODS_E1X_OFFSET(BP_PORT(bp), fp->cl_id);
-
-       return offset;
-}
+u32 bnx2x_rx_ustorm_prods_offset(struct bnx2x_fastpath *fp);
 
 static inline void bnx2x_init_txdata(struct bnx2x *bp,
                                     struct bnx2x_fp_txdata *txdata, u32 cid,
@@ -1238,7 +1222,7 @@ static inline int bnx2x_clean_tx_queue(struct bnx2x *bp,
 #endif
                }
                cnt--;
-               usleep_range(1000, 1000);
+               usleep_range(1000, 2000);
        }
 
        return 0;
@@ -1273,7 +1257,7 @@ static inline bool bnx2x_wait_sp_comp(struct bnx2x *bp, unsigned long mask)
                }
                netif_addr_unlock_bh(bp->dev);
 
-               usleep_range(1000, 1000);
+               usleep_range(1000, 2000);
        }
 
        smp_mb();
@@ -1404,7 +1388,7 @@ static inline bool bnx2x_is_valid_ether_addr(struct bnx2x *bp, u8 *addr)
 }
 
 /**
- * bnx2x_fill_fw_str - Fill buffer with FW version string.
+ * bnx2x_fill_fw_str - Fill buffer with FW version string
  *
  * @bp:        driver handle
  * @buf:       character buffer to fill with the fw name
index 10bc093d2ca43d9c0dd9ae309734279ccf1661bb..568205436a15f4d5b37528eb155df6e00ee3f07c 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_dcb.c: Broadcom Everest network driver.
  *
- * Copyright 2009-2012 Broadcom Corporation
+ * Copyright 2009-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -416,6 +416,7 @@ static void bnx2x_pfc_set_pfc(struct bnx2x *bp)
        int mfw_configured = SHMEM2_HAS(bp, drv_flags) &&
                             GET_FLAGS(SHMEM2_RD(bp, drv_flags),
                                       1 << DRV_FLAGS_DCB_MFW_CONFIGURED);
+
        if (bp->dcbx_port_params.pfc.enabled &&
            (!(bp->dcbx_error & DCBX_REMOTE_MIB_ERROR) || mfw_configured))
                /*
@@ -558,6 +559,7 @@ static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp)
        int mfw_configured = SHMEM2_HAS(bp, drv_flags) &&
                             GET_FLAGS(SHMEM2_RD(bp, drv_flags),
                                       1 << DRV_FLAGS_DCB_MFW_CONFIGURED);
+
        bnx2x_ets_disabled(&bp->link_params, &bp->link_vars);
 
        if (!bp->dcbx_port_params.ets.enabled ||
@@ -1904,11 +1906,13 @@ static u8 bnx2x_dcbnl_set_state(struct net_device *netdev, u8 state)
        struct bnx2x *bp = netdev_priv(netdev);
        DP(BNX2X_MSG_DCB, "state = %s\n", state ? "on" : "off");
 
+       /* Fail to set state to "enabled" if dcbx is disabled in nvram */
        if (state && ((bp->dcbx_enabled == BNX2X_DCBX_ENABLED_OFF) ||
                      (bp->dcbx_enabled == BNX2X_DCBX_ENABLED_INVALID))) {
                DP(BNX2X_MSG_DCB, "Can not set dcbx to enabled while it is disabled in nvm\n");
                return 1;
        }
+
        bnx2x_dcbx_set_state(bp, (state ? true : false), bp->dcbx_enabled);
        return 0;
 }
@@ -2052,7 +2056,6 @@ static void bnx2x_dcbnl_set_pfc_cfg(struct net_device *netdev, int prio,
        if (!bnx2x_dcbnl_set_valid(bp) || prio >= MAX_PFC_PRIORITIES)
                return;
 
-
        if (setting) {
                bp->dcbx_config_params.admin_pfc_bitmap |= (1 << prio);
                bp->dcbx_config_params.admin_pfc_tx_enable = 1;
index 06c7a043594809dd254f48b7a6250c662d5084d3..d153f44cf8f99540c3988a1dd76ca777c10d5fcd 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_dcb.h: Broadcom Everest network driver.
  *
- * Copyright 2009-2012 Broadcom Corporation
+ * Copyright 2009-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
index b926f58e983bbfe083e004c362df6203efb17a3e..bff5e33eaa1496bc6d9b93d58b2cfc4ef40fbbd6 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_dump.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2012 Broadcom Corporation
+ * Copyright (c) 2012-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
 #ifndef BNX2X_DUMP_H
 #define BNX2X_DUMP_H
 
+/* WaitP Definitions */
+#define DRV_DUMP_XSTORM_WAITP_ADDRESS    0x2b8a80
+#define DRV_DUMP_TSTORM_WAITP_ADDRESS    0x1b8a80
+#define DRV_DUMP_USTORM_WAITP_ADDRESS    0x338a80
+#define DRV_DUMP_CSTORM_WAITP_ADDRESS    0x238a80
 
 
-/*definitions */
-#define XSTORM_WAITP_ADDR      0x2b8a80
-#define TSTORM_WAITP_ADDR      0x1b8a80
-#define USTORM_WAITP_ADDR      0x338a80
-#define CSTORM_WAITP_ADDR      0x238a80
-#define TSTORM_CAM_MODE        0x1B1440
+/* Possible Chips */
+#define DUMP_CHIP_E1 1
+#define DUMP_CHIP_E1H 2
+#define DUMP_CHIP_E2 4
+#define DUMP_CHIP_E3A0 8
+#define DUMP_CHIP_E3B0 16
+#define DUMP_PATH_0 512
+#define DUMP_PATH_1 1024
+#define NUM_PRESETS 13
+#define NUM_CHIPS 5
 
-#define MAX_TIMER_PENDING      200
-#define TIMER_SCAN_DONT_CARE   0xFF
-#define RI_E1                          0x1
-#define RI_E1H                         0x2
-#define RI_E2                          0x4
-#define RI_E3                          0x8
-#define RI_E3B0                                0x10
-#define RI_ONLINE                      0x100
-#define RI_OFFLINE                     0x0
-#define RI_PATH0_DUMP                  0x200
-#define RI_PATH1_DUMP                  0x400
-
-#define RI_E1_ONLINE           (RI_E1 | RI_ONLINE)
-#define RI_E1H_ONLINE          (RI_E1H | RI_ONLINE)
-#define RI_E1E1H_ONLINE                (RI_E1 | RI_E1H | RI_ONLINE)
-#define RI_E2_ONLINE           (RI_E2 | RI_ONLINE)
-#define RI_E1E2_ONLINE         (RI_E1 | RI_E2 | RI_ONLINE)
-#define RI_E1HE2_ONLINE                (RI_E1H | RI_E2 | RI_ONLINE)
-#define RI_E1E1HE2_ONLINE      (RI_E1 | RI_E1H | RI_E2 | RI_ONLINE)
-#define RI_E3_ONLINE           (RI_E3 | RI_ONLINE)
-#define RI_E1E3_ONLINE         (RI_E1 | RI_E3 | RI_ONLINE)
-#define RI_E1HE3_ONLINE                (RI_E1H | RI_E3 | RI_ONLINE)
-#define RI_E1E1HE3_ONLINE      (RI_E1 | RI_E1H | RI_E3 | RI_ONLINE)
-#define RI_E2E3_ONLINE         (RI_E2 | RI_E3 | RI_ONLINE)
-#define RI_E1E2E3_ONLINE       (RI_E1 | RI_E2 | RI_E3 | RI_ONLINE)
-#define RI_E1HE2E3_ONLINE      (RI_E1H | RI_E2 | RI_E3 | RI_ONLINE)
-#define RI_E1E1HE2E3_ONLINE    (RI_E1 | RI_E1H | RI_E2 | RI_E3 | RI_ONLINE)
-#define RI_E3B0_ONLINE         (RI_E3B0 | RI_ONLINE)
-#define RI_E1E3B0_ONLINE       (RI_E1 | RI_E3B0 | RI_ONLINE)
-#define RI_E1HE3B0_ONLINE      (RI_E1H | RI_E3B0 | RI_ONLINE)
-#define RI_E1E1HE3B0_ONLINE    (RI_E1 | RI_E1H | RI_E3B0 | RI_ONLINE)
-#define RI_E2E3B0_ONLINE       (RI_E2 | RI_E3B0 | RI_ONLINE)
-#define RI_E1E2E3B0_ONLINE     (RI_E1 | RI_E2 | RI_E3B0 | RI_ONLINE)
-#define RI_E1HE2E3B0_ONLINE    (RI_E1H | RI_E2 | RI_E3B0 | RI_ONLINE)
-#define RI_E1E1HE2E3B0_ONLINE  (RI_E1 | RI_E1H | RI_E2 | RI_E3B0 | RI_ONLINE)
-#define RI_E3E3B0_ONLINE       (RI_E3 | RI_E3B0 | RI_ONLINE)
-#define RI_E1E3E3B0_ONLINE     (RI_E1 | RI_E3 | RI_E3B0 | RI_ONLINE)
-#define RI_E1HE3E3B0_ONLINE    (RI_E1H | RI_E3 | RI_E3B0 | RI_ONLINE)
-#define RI_E1E1HE3E3B0_ONLINE  (RI_E1 | RI_E1H | RI_E3 | RI_E3B0 | RI_ONLINE)
-#define RI_E2E3E3B0_ONLINE     (RI_E2 | RI_E3 | RI_E3B0 | RI_ONLINE)
-#define RI_E1E2E3E3B0_ONLINE   (RI_E1 | RI_E2 | RI_E3 | RI_E3B0 | RI_ONLINE)
-#define RI_E1HE2E3E3B0_ONLINE  (RI_E1H | RI_E2 | RI_E3 | RI_E3B0 | RI_ONLINE)
-#define RI_E1E1HE2E3E3B0_ONLINE        \
-       (RI_E1 | RI_E1H | RI_E2 | RI_E3 | RI_E3B0 | RI_ONLINE)
-#define RI_E1_OFFLINE          (RI_E1 | RI_OFFLINE)
-#define RI_E1H_OFFLINE         (RI_E1H | RI_OFFLINE)
-#define RI_E1E1H_OFFLINE       (RI_E1 | RI_E1H | RI_OFFLINE)
-#define RI_E2_OFFLINE          (RI_E2 | RI_OFFLINE)
-#define RI_E1E2_OFFLINE                (RI_E1 | RI_E2 | RI_OFFLINE)
-#define RI_E1HE2_OFFLINE       (RI_E1H | RI_E2 | RI_OFFLINE)
-#define RI_E1E1HE2_OFFLINE     (RI_E1 | RI_E1H | RI_E2 | RI_OFFLINE)
-#define RI_E3_OFFLINE          (RI_E3 | RI_OFFLINE)
-#define RI_E1E3_OFFLINE                (RI_E1 | RI_E3 | RI_OFFLINE)
-#define RI_E1HE3_OFFLINE       (RI_E1H | RI_E3 | RI_OFFLINE)
-#define RI_E1E1HE3_OFFLINE     (RI_E1 | RI_E1H | RI_E3 | RI_OFFLINE)
-#define RI_E2E3_OFFLINE                (RI_E2 | RI_E3 | RI_OFFLINE)
-#define RI_E1E2E3_OFFLINE      (RI_E1 | RI_E2 | RI_E3 | RI_OFFLINE)
-#define RI_E1HE2E3_OFFLINE     (RI_E1H | RI_E2 | RI_E3 | RI_OFFLINE)
-#define RI_E1E1HE2E3_OFFLINE   (RI_E1 | RI_E1H | RI_E2 | RI_E3 | RI_OFFLINE)
-#define RI_E3B0_OFFLINE                (RI_E3B0 | RI_OFFLINE)
-#define RI_E1E3B0_OFFLINE      (RI_E1 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1HE3B0_OFFLINE     (RI_E1H | RI_E3B0 | RI_OFFLINE)
-#define RI_E1E1HE3B0_OFFLINE   (RI_E1 | RI_E1H | RI_E3B0 | RI_OFFLINE)
-#define RI_E2E3B0_OFFLINE      (RI_E2 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1E2E3B0_OFFLINE    (RI_E1 | RI_E2 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1HE2E3B0_OFFLINE   (RI_E1H | RI_E2 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1E1HE2E3B0_OFFLINE (RI_E1 | RI_E1H | RI_E2 | RI_E3B0 | RI_OFFLINE)
-#define RI_E3E3B0_OFFLINE      (RI_E3 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1E3E3B0_OFFLINE    (RI_E1 | RI_E3 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1HE3E3B0_OFFLINE   (RI_E1H | RI_E3 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1E1HE3E3B0_OFFLINE (RI_E1 | RI_E1H | RI_E3 | RI_E3B0 | RI_OFFLINE)
-#define RI_E2E3E3B0_OFFLINE    (RI_E2 | RI_E3 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1E2E3E3B0_OFFLINE  (RI_E1 | RI_E2 | RI_E3 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1HE2E3E3B0_OFFLINE (RI_E1H | RI_E2 | RI_E3 | RI_E3B0 | RI_OFFLINE)
-#define RI_E1E1HE2E3E3B0_OFFLINE       \
-       (RI_E1 | RI_E1H | RI_E2 | RI_E3 | RI_E3B0 | RI_OFFLINE)
-#define RI_ALL_ONLINE          RI_E1E1HE2E3E3B0_ONLINE
-#define RI_ALL_OFFLINE         RI_E1E1HE2E3E3B0_OFFLINE
-
-#define DBG_DMP_TRACE_BUFFER_SIZE      0x800
-#define DBG_DMP_TRACE_BUFFER_OFFSET(shmem0_offset) \
-       ((shmem0_offset) - DBG_DMP_TRACE_BUFFER_SIZE)
-
-struct dump_sign {
-       u32 time_stamp;
-       u32 diag_ver;
-       u32 grc_dump_ver;
-};
-
-struct dump_hdr {
-       u32  hdr_size;  /* in dwords, excluding this field */
-       struct dump_sign        dump_sign;
-       u32  xstorm_waitp;
-       u32  tstorm_waitp;
-       u32  ustorm_waitp;
-       u32  cstorm_waitp;
-       u16  info;
-       u8   idle_chk;
-       u8   reserved;
+struct dump_header {
+       u32 header_size; /* Size in DWORDs excluding this field */
+       u32 version;
+       u32 preset;
+       u32 dump_meta_data; /* OR of CHIP and PATH. */
 };
 
+#define BNX2X_DUMP_VERSION 0x50acff01
 struct reg_addr {
        u32 addr;
        u32 size;
-       u16 info;
+       u32 chips;
+       u32 presets;
 };
 
 struct wreg_addr {
@@ -143,1005 +60,2168 @@ struct wreg_addr {
        u32 size;
        u32 read_regs_count;
        const u32 *read_regs;
-       u16 info;
+       u32 chips;
+       u32 presets;
+};
+
+#define PAGE_MODE_VALUES_E2 2
+#define PAGE_READ_REGS_E2 1
+#define PAGE_WRITE_REGS_E2 1
+static const u32 page_vals_e2[] = {0, 128};
+static const u32 page_write_regs_e2[] = {328476};
+static const struct reg_addr page_read_regs_e2[] = {
+       {0x58000, 4608, DUMP_CHIP_E2, 0x30}
+};
+
+#define PAGE_MODE_VALUES_E3 2
+#define PAGE_READ_REGS_E3 1
+#define PAGE_WRITE_REGS_E3 1
+static const u32 page_vals_e3[] = {0, 128};
+static const u32 page_write_regs_e3[] = {328476};
+static const struct reg_addr page_read_regs_e3[] = {
+       {0x58000, 4608, DUMP_CHIP_E3A0 | DUMP_CHIP_E3B0, 0x30}
 };
 
 static const struct reg_addr reg_addrs[] = {
-       { 0x2000, 341, RI_ALL_ONLINE },
-       { 0x2800, 103, RI_ALL_ONLINE },
-       { 0x3000, 287, RI_ALL_ONLINE },
-       { 0x3800, 331, RI_ALL_ONLINE },
-       { 0x8800, 6, RI_ALL_ONLINE },
-       { 0x8818, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x9000, 147, RI_E2E3E3B0_ONLINE },
-       { 0x924c, 1, RI_E2_ONLINE },
-       { 0x9250, 16, RI_E2E3E3B0_ONLINE },
-       { 0x9400, 33, RI_E2E3E3B0_ONLINE },
-       { 0x9484, 5, RI_E3E3B0_ONLINE },
-       { 0xa000, 27, RI_ALL_ONLINE },
-       { 0xa06c, 1, RI_E1E1H_ONLINE },
-       { 0xa070, 71, RI_ALL_ONLINE },
-       { 0xa18c, 4, RI_E1E1H_ONLINE },
-       { 0xa19c, 62, RI_ALL_ONLINE },
-       { 0xa294, 2, RI_E1E1H_ONLINE },
-       { 0xa29c, 2, RI_ALL_ONLINE },
-       { 0xa2a4, 2, RI_E1E1HE2_ONLINE },
-       { 0xa2ac, 52, RI_ALL_ONLINE },
-       { 0xa39c, 7, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa3b8, 2, RI_E3E3B0_ONLINE },
-       { 0xa3c0, 3, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa3d0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa3d8, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa3e0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa3e8, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa3f0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa3f8, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa400, 40, RI_ALL_ONLINE },
-       { 0xa4a0, 1, RI_E1E1HE2_ONLINE },
-       { 0xa4a4, 2, RI_ALL_ONLINE },
-       { 0xa4ac, 2, RI_E1E1H_ONLINE },
-       { 0xa4b4, 1, RI_E1E1HE2_ONLINE },
-       { 0xa4b8, 2, RI_E1E1H_ONLINE },
-       { 0xa4c0, 3, RI_ALL_ONLINE },
-       { 0xa4cc, 5, RI_E1E1H_ONLINE },
-       { 0xa4e0, 3, RI_ALL_ONLINE },
-       { 0xa4fc, 2, RI_ALL_ONLINE },
-       { 0xa504, 1, RI_E1E1H_ONLINE },
-       { 0xa508, 3, RI_ALL_ONLINE },
-       { 0xa518, 1, RI_ALL_ONLINE },
-       { 0xa520, 1, RI_ALL_ONLINE },
-       { 0xa528, 1, RI_ALL_ONLINE },
-       { 0xa530, 1, RI_ALL_ONLINE },
-       { 0xa538, 1, RI_ALL_ONLINE },
-       { 0xa540, 1, RI_ALL_ONLINE },
-       { 0xa548, 1, RI_E1E1H_ONLINE },
-       { 0xa550, 1, RI_E1E1H_ONLINE },
-       { 0xa558, 1, RI_E1E1H_ONLINE },
-       { 0xa560, 1, RI_E1E1H_ONLINE },
-       { 0xa568, 1, RI_E1E1H_ONLINE },
-       { 0xa570, 1, RI_ALL_ONLINE },
-       { 0xa580, 1, RI_ALL_ONLINE },
-       { 0xa590, 1, RI_ALL_ONLINE },
-       { 0xa5a0, 1, RI_E1E1HE2_ONLINE },
-       { 0xa5c0, 1, RI_ALL_ONLINE },
-       { 0xa5e0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa5e8, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa5f0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa5f8, 1, RI_E1HE2_ONLINE },
-       { 0xa5fc, 9, RI_E1HE2E3E3B0_ONLINE },
-       { 0xa620, 6, RI_E2E3E3B0_ONLINE },
-       { 0xa638, 20, RI_E2_ONLINE },
-       { 0xa688, 42, RI_E2E3E3B0_ONLINE },
-       { 0xa730, 1, RI_E2_ONLINE },
-       { 0xa734, 2, RI_E2E3E3B0_ONLINE },
-       { 0xa73c, 4, RI_E2_ONLINE },
-       { 0xa74c, 5, RI_E2E3E3B0_ONLINE },
-       { 0xa760, 5, RI_E2_ONLINE },
-       { 0xa774, 7, RI_E2E3E3B0_ONLINE },
-       { 0xa790, 15, RI_E2_ONLINE },
-       { 0xa7cc, 4, RI_E2E3E3B0_ONLINE },
-       { 0xa7e0, 6, RI_E3E3B0_ONLINE },
-       { 0xa800, 18, RI_E2_ONLINE },
-       { 0xa848, 33, RI_E2E3E3B0_ONLINE },
-       { 0xa8cc, 2, RI_E3E3B0_ONLINE },
-       { 0xa8d4, 4, RI_E2E3E3B0_ONLINE },
-       { 0xa8e4, 1, RI_E3E3B0_ONLINE },
-       { 0xa8e8, 1, RI_E2E3E3B0_ONLINE },
-       { 0xa8f0, 1, RI_E2E3E3B0_ONLINE },
-       { 0xa8f8, 30, RI_E3E3B0_ONLINE },
-       { 0xa974, 73, RI_E3E3B0_ONLINE },
-       { 0xac30, 1, RI_E3E3B0_ONLINE },
-       { 0xac40, 1, RI_E3E3B0_ONLINE },
-       { 0xac50, 1, RI_E3E3B0_ONLINE },
-       { 0xac60, 1, RI_E3B0_ONLINE },
-       { 0x10000, 9, RI_ALL_ONLINE },
-       { 0x10024, 1, RI_E1E1HE2_ONLINE },
-       { 0x10028, 5, RI_ALL_ONLINE },
-       { 0x1003c, 6, RI_E1E1HE2_ONLINE },
-       { 0x10054, 20, RI_ALL_ONLINE },
-       { 0x100a4, 4, RI_E1E1HE2_ONLINE },
-       { 0x100b4, 11, RI_ALL_ONLINE },
-       { 0x100e0, 4, RI_E1E1HE2_ONLINE },
-       { 0x100f0, 8, RI_ALL_ONLINE },
-       { 0x10110, 6, RI_E1E1HE2_ONLINE },
-       { 0x10128, 110, RI_ALL_ONLINE },
-       { 0x102e0, 4, RI_E1E1HE2_ONLINE },
-       { 0x102f0, 18, RI_ALL_ONLINE },
-       { 0x10338, 20, RI_E1E1HE2_ONLINE },
-       { 0x10388, 10, RI_ALL_ONLINE },
-       { 0x10400, 6, RI_E1E1HE2_ONLINE },
-       { 0x10418, 6, RI_ALL_ONLINE },
-       { 0x10430, 10, RI_E1E1HE2_ONLINE },
-       { 0x10458, 22, RI_ALL_ONLINE },
-       { 0x104b0, 12, RI_E1E1HE2_ONLINE },
-       { 0x104e0, 1, RI_ALL_ONLINE },
-       { 0x104e8, 2, RI_ALL_ONLINE },
-       { 0x104f4, 2, RI_ALL_ONLINE },
-       { 0x10500, 146, RI_ALL_ONLINE },
-       { 0x10750, 2, RI_E1E1HE2_ONLINE },
-       { 0x10760, 2, RI_E1E1HE2_ONLINE },
-       { 0x10770, 2, RI_E1E1HE2_ONLINE },
-       { 0x10780, 2, RI_E1E1HE2_ONLINE },
-       { 0x10790, 2, RI_ALL_ONLINE },
-       { 0x107a0, 2, RI_E1E1HE2_ONLINE },
-       { 0x107b0, 2, RI_E1E1HE2_ONLINE },
-       { 0x107c0, 2, RI_E1E1HE2_ONLINE },
-       { 0x107d0, 2, RI_E1E1HE2_ONLINE },
-       { 0x107e0, 2, RI_ALL_ONLINE },
-       { 0x10880, 2, RI_ALL_ONLINE },
-       { 0x10900, 2, RI_ALL_ONLINE },
-       { 0x16000, 1, RI_E1HE2_ONLINE },
-       { 0x16004, 25, RI_E1HE2E3E3B0_ONLINE },
-       { 0x16070, 8, RI_E1HE2E3E3B0_ONLINE },
-       { 0x16090, 4, RI_E1HE2E3_ONLINE },
-       { 0x160a0, 6, RI_E1HE2E3E3B0_ONLINE },
-       { 0x160c0, 7, RI_E1HE2E3E3B0_ONLINE },
-       { 0x160dc, 2, RI_E1HE2_ONLINE },
-       { 0x160e4, 10, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1610c, 2, RI_E1HE2_ONLINE },
-       { 0x16114, 6, RI_E1HE2E3E3B0_ONLINE },
-       { 0x16140, 48, RI_E1HE2E3E3B0_ONLINE },
-       { 0x16204, 5, RI_E1HE2E3E3B0_ONLINE },
-       { 0x18000, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x18008, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x18010, 35, RI_E2E3E3B0_ONLINE },
-       { 0x180a4, 2, RI_E2E3E3B0_ONLINE },
-       { 0x180c0, 9, RI_E2E3E3B0_ONLINE },
-       { 0x180e4, 1, RI_E2E3_ONLINE },
-       { 0x180e8, 2, RI_E2E3E3B0_ONLINE },
-       { 0x180f0, 1, RI_E2E3_ONLINE },
-       { 0x180f4, 79, RI_E2E3E3B0_ONLINE },
-       { 0x18230, 1, RI_E2E3_ONLINE },
-       { 0x18234, 2, RI_E2E3E3B0_ONLINE },
-       { 0x1823c, 1, RI_E2E3_ONLINE },
-       { 0x18240, 13, RI_E2E3E3B0_ONLINE },
-       { 0x18274, 1, RI_E2_ONLINE },
-       { 0x18278, 81, RI_E2E3E3B0_ONLINE },
-       { 0x18440, 63, RI_E2E3E3B0_ONLINE },
-       { 0x18570, 42, RI_E3E3B0_ONLINE },
-       { 0x18618, 25, RI_E3B0_ONLINE },
-       { 0x18680, 44, RI_E3B0_ONLINE },
-       { 0x18748, 12, RI_E3B0_ONLINE },
-       { 0x18788, 1, RI_E3B0_ONLINE },
-       { 0x1879c, 6, RI_E3B0_ONLINE },
-       { 0x187c4, 51, RI_E3B0_ONLINE },
-       { 0x18a00, 48, RI_E3B0_ONLINE },
-       { 0x20000, 24, RI_ALL_ONLINE },
-       { 0x20060, 8, RI_ALL_ONLINE },
-       { 0x20080, 94, RI_ALL_ONLINE },
-       { 0x201f8, 1, RI_E1E1H_ONLINE },
-       { 0x201fc, 1, RI_ALL_ONLINE },
-       { 0x20200, 1, RI_E1E1H_ONLINE },
-       { 0x20204, 1, RI_ALL_ONLINE },
-       { 0x20208, 1, RI_E1E1H_ONLINE },
-       { 0x2020c, 39, RI_ALL_ONLINE },
-       { 0x202c8, 1, RI_E2E3E3B0_ONLINE },
-       { 0x202d8, 4, RI_E2E3E3B0_ONLINE },
-       { 0x202f0, 1, RI_E3B0_ONLINE },
-       { 0x20400, 2, RI_ALL_ONLINE },
-       { 0x2040c, 8, RI_ALL_ONLINE },
-       { 0x2042c, 18, RI_E1HE2E3E3B0_ONLINE },
-       { 0x20480, 1, RI_ALL_ONLINE },
-       { 0x20500, 1, RI_ALL_ONLINE },
-       { 0x20600, 1, RI_ALL_ONLINE },
-       { 0x28000, 1, RI_ALL_ONLINE },
-       { 0x28004, 8191, RI_ALL_OFFLINE },
-       { 0x30000, 1, RI_ALL_ONLINE },
-       { 0x30004, 16383, RI_ALL_OFFLINE },
-       { 0x40000, 98, RI_ALL_ONLINE },
-       { 0x401a8, 8, RI_E1HE2E3E3B0_ONLINE },
-       { 0x401c8, 1, RI_E1H_ONLINE },
-       { 0x401cc, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x401d4, 2, RI_E2E3E3B0_ONLINE },
-       { 0x40200, 4, RI_ALL_ONLINE },
-       { 0x40220, 6, RI_E2E3E3B0_ONLINE },
-       { 0x40238, 8, RI_E2E3_ONLINE },
-       { 0x40258, 4, RI_E2E3E3B0_ONLINE },
-       { 0x40268, 2, RI_E3E3B0_ONLINE },
-       { 0x40270, 17, RI_E3B0_ONLINE },
-       { 0x40400, 43, RI_ALL_ONLINE },
-       { 0x404cc, 3, RI_E1HE2E3E3B0_ONLINE },
-       { 0x404e0, 1, RI_E2E3E3B0_ONLINE },
-       { 0x40500, 2, RI_ALL_ONLINE },
-       { 0x40510, 2, RI_ALL_ONLINE },
-       { 0x40520, 2, RI_ALL_ONLINE },
-       { 0x40530, 2, RI_ALL_ONLINE },
-       { 0x40540, 2, RI_ALL_ONLINE },
-       { 0x40550, 10, RI_E2E3E3B0_ONLINE },
-       { 0x40610, 2, RI_E2E3E3B0_ONLINE },
-       { 0x42000, 164, RI_ALL_ONLINE },
-       { 0x422c0, 4, RI_E2E3E3B0_ONLINE },
-       { 0x422d4, 5, RI_E1HE2E3E3B0_ONLINE },
-       { 0x422e8, 1, RI_E2E3E3B0_ONLINE },
-       { 0x42400, 49, RI_ALL_ONLINE },
-       { 0x424c8, 38, RI_ALL_ONLINE },
-       { 0x42568, 2, RI_ALL_ONLINE },
-       { 0x42640, 5, RI_E2E3E3B0_ONLINE },
-       { 0x42800, 1, RI_ALL_ONLINE },
-       { 0x50000, 1, RI_ALL_ONLINE },
-       { 0x50004, 19, RI_ALL_ONLINE },
-       { 0x50050, 8, RI_ALL_ONLINE },
-       { 0x50070, 88, RI_ALL_ONLINE },
-       { 0x501f0, 4, RI_E1HE2E3E3B0_ONLINE },
-       { 0x50200, 2, RI_ALL_ONLINE },
-       { 0x5020c, 7, RI_ALL_ONLINE },
-       { 0x50228, 6, RI_E1HE2E3E3B0_ONLINE },
-       { 0x50240, 1, RI_ALL_ONLINE },
-       { 0x50280, 1, RI_ALL_ONLINE },
-       { 0x50300, 1, RI_E2E3E3B0_ONLINE },
-       { 0x5030c, 1, RI_E2E3E3B0_ONLINE },
-       { 0x50318, 1, RI_E2E3E3B0_ONLINE },
-       { 0x5031c, 1, RI_E2E3E3B0_ONLINE },
-       { 0x50320, 2, RI_E2E3E3B0_ONLINE },
-       { 0x50330, 1, RI_E3B0_ONLINE },
-       { 0x52000, 1, RI_ALL_ONLINE },
-       { 0x54000, 1, RI_ALL_ONLINE },
-       { 0x54004, 3327, RI_ALL_OFFLINE },
-       { 0x58000, 1, RI_ALL_ONLINE },
-       { 0x58004, 8191, RI_E1E1H_OFFLINE },
-       { 0x60000, 26, RI_ALL_ONLINE },
-       { 0x60068, 8, RI_E1E1H_ONLINE },
-       { 0x60088, 12, RI_ALL_ONLINE },
-       { 0x600b8, 9, RI_E1E1H_ONLINE },
-       { 0x600dc, 1, RI_ALL_ONLINE },
-       { 0x600e0, 5, RI_E1E1H_ONLINE },
-       { 0x600f4, 1, RI_E1E1HE2_ONLINE },
-       { 0x600f8, 1, RI_E1E1H_ONLINE },
-       { 0x600fc, 8, RI_ALL_ONLINE },
-       { 0x6013c, 24, RI_E1H_ONLINE },
-       { 0x6019c, 2, RI_E2E3E3B0_ONLINE },
-       { 0x601ac, 18, RI_E2E3E3B0_ONLINE },
-       { 0x60200, 1, RI_ALL_ONLINE },
-       { 0x60204, 2, RI_ALL_OFFLINE },
-       { 0x60210, 13, RI_E2E3E3B0_ONLINE },
-       { 0x60244, 16, RI_E3B0_ONLINE },
-       { 0x61000, 1, RI_ALL_ONLINE },
-       { 0x61004, 511, RI_ALL_OFFLINE },
-       { 0x61800, 512, RI_E3E3B0_OFFLINE },
-       { 0x70000, 8, RI_ALL_ONLINE },
-       { 0x70020, 8184, RI_ALL_OFFLINE },
-       { 0x78000, 8192, RI_E3E3B0_OFFLINE },
-       { 0x85000, 3, RI_ALL_OFFLINE },
-       { 0x8501c, 7, RI_ALL_OFFLINE },
-       { 0x85048, 1, RI_ALL_OFFLINE },
-       { 0x85200, 32, RI_ALL_OFFLINE },
-       { 0xb0000, 16384, RI_E1H_OFFLINE },
-       { 0xc1000, 7, RI_ALL_ONLINE },
-       { 0xc103c, 2, RI_E2E3E3B0_ONLINE },
-       { 0xc1800, 2, RI_ALL_ONLINE },
-       { 0xc2000, 164, RI_ALL_ONLINE },
-       { 0xc22c0, 5, RI_E2E3E3B0_ONLINE },
-       { 0xc22d8, 4, RI_E2E3E3B0_ONLINE },
-       { 0xc2400, 49, RI_ALL_ONLINE },
-       { 0xc24c8, 38, RI_ALL_ONLINE },
-       { 0xc2568, 2, RI_ALL_ONLINE },
-       { 0xc2600, 1, RI_ALL_ONLINE },
-       { 0xc4000, 165, RI_ALL_ONLINE },
-       { 0xc42d8, 2, RI_E2E3E3B0_ONLINE },
-       { 0xc42e0, 7, RI_E1HE2E3E3B0_ONLINE },
-       { 0xc42fc, 1, RI_E2E3E3B0_ONLINE },
-       { 0xc4400, 51, RI_ALL_ONLINE },
-       { 0xc44d0, 38, RI_ALL_ONLINE },
-       { 0xc4570, 2, RI_ALL_ONLINE },
-       { 0xc4578, 5, RI_E2E3E3B0_ONLINE },
-       { 0xc4600, 1, RI_ALL_ONLINE },
-       { 0xd0000, 19, RI_ALL_ONLINE },
-       { 0xd004c, 8, RI_ALL_ONLINE },
-       { 0xd006c, 91, RI_ALL_ONLINE },
-       { 0xd01fc, 1, RI_E2E3E3B0_ONLINE },
-       { 0xd0200, 2, RI_ALL_ONLINE },
-       { 0xd020c, 7, RI_ALL_ONLINE },
-       { 0xd0228, 18, RI_E1HE2E3E3B0_ONLINE },
-       { 0xd0280, 1, RI_ALL_ONLINE },
-       { 0xd0300, 1, RI_ALL_ONLINE },
-       { 0xd0400, 1, RI_ALL_ONLINE },
-       { 0xd0818, 1, RI_E3B0_ONLINE },
-       { 0xd4000, 1, RI_ALL_ONLINE },
-       { 0xd4004, 2559, RI_ALL_OFFLINE },
-       { 0xd8000, 1, RI_ALL_ONLINE },
-       { 0xd8004, 8191, RI_ALL_OFFLINE },
-       { 0xe0000, 21, RI_ALL_ONLINE },
-       { 0xe0054, 8, RI_ALL_ONLINE },
-       { 0xe0074, 49, RI_ALL_ONLINE },
-       { 0xe0138, 1, RI_E1E1H_ONLINE },
-       { 0xe013c, 35, RI_ALL_ONLINE },
-       { 0xe01f4, 1, RI_E2_ONLINE },
-       { 0xe01f8, 1, RI_E2E3E3B0_ONLINE },
-       { 0xe0200, 2, RI_ALL_ONLINE },
-       { 0xe020c, 8, RI_ALL_ONLINE },
-       { 0xe022c, 18, RI_E1HE2E3E3B0_ONLINE },
-       { 0xe0280, 1, RI_ALL_ONLINE },
-       { 0xe0300, 1, RI_ALL_ONLINE },
-       { 0xe0400, 1, RI_E3B0_ONLINE },
-       { 0xe1000, 1, RI_ALL_ONLINE },
-       { 0xe2000, 1, RI_ALL_ONLINE },
-       { 0xe2004, 2047, RI_ALL_OFFLINE },
-       { 0xf0000, 1, RI_ALL_ONLINE },
-       { 0xf0004, 16383, RI_ALL_OFFLINE },
-       { 0x101000, 12, RI_ALL_ONLINE },
-       { 0x101050, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x101054, 3, RI_E2E3E3B0_ONLINE },
-       { 0x101100, 1, RI_ALL_ONLINE },
-       { 0x101800, 8, RI_ALL_ONLINE },
-       { 0x102000, 18, RI_ALL_ONLINE },
-       { 0x102068, 6, RI_E2E3E3B0_ONLINE },
-       { 0x102080, 17, RI_ALL_ONLINE },
-       { 0x1020c8, 8, RI_E1H_ONLINE },
-       { 0x1020e8, 9, RI_E2E3E3B0_ONLINE },
-       { 0x102400, 1, RI_ALL_ONLINE },
-       { 0x103000, 26, RI_ALL_ONLINE },
-       { 0x103098, 5, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1030ac, 2, RI_E2E3E3B0_ONLINE },
-       { 0x1030b4, 1, RI_E2_ONLINE },
-       { 0x1030b8, 7, RI_E2E3E3B0_ONLINE },
-       { 0x1030d8, 8, RI_E2E3E3B0_ONLINE },
-       { 0x103400, 1, RI_E2E3E3B0_ONLINE },
-       { 0x103404, 135, RI_E2E3E3B0_OFFLINE },
-       { 0x103800, 8, RI_ALL_ONLINE },
-       { 0x104000, 63, RI_ALL_ONLINE },
-       { 0x10411c, 16, RI_E2E3E3B0_ONLINE },
-       { 0x104200, 17, RI_ALL_ONLINE },
-       { 0x104400, 64, RI_ALL_ONLINE },
-       { 0x104500, 192, RI_ALL_OFFLINE },
-       { 0x104800, 64, RI_ALL_ONLINE },
-       { 0x104900, 192, RI_ALL_OFFLINE },
-       { 0x105000, 256, RI_ALL_ONLINE },
-       { 0x105400, 768, RI_ALL_OFFLINE },
-       { 0x107000, 7, RI_E2E3E3B0_ONLINE },
-       { 0x10701c, 1, RI_E3E3B0_ONLINE },
-       { 0x108000, 33, RI_E1E1H_ONLINE },
-       { 0x1080ac, 5, RI_E1H_ONLINE },
-       { 0x108100, 5, RI_E1E1H_ONLINE },
-       { 0x108120, 5, RI_E1E1H_ONLINE },
-       { 0x108200, 74, RI_E1E1H_ONLINE },
-       { 0x108400, 74, RI_E1E1H_ONLINE },
-       { 0x108800, 152, RI_E1E1H_ONLINE },
-       { 0x110000, 111, RI_E2E3E3B0_ONLINE },
-       { 0x1101dc, 1, RI_E3E3B0_ONLINE },
-       { 0x110200, 4, RI_E2E3E3B0_ONLINE },
-       { 0x120000, 2, RI_ALL_ONLINE },
-       { 0x120008, 4, RI_ALL_ONLINE },
-       { 0x120018, 3, RI_ALL_ONLINE },
-       { 0x120024, 4, RI_ALL_ONLINE },
-       { 0x120034, 3, RI_ALL_ONLINE },
-       { 0x120040, 4, RI_ALL_ONLINE },
-       { 0x120050, 3, RI_ALL_ONLINE },
-       { 0x12005c, 4, RI_ALL_ONLINE },
-       { 0x12006c, 3, RI_ALL_ONLINE },
-       { 0x120078, 4, RI_ALL_ONLINE },
-       { 0x120088, 3, RI_ALL_ONLINE },
-       { 0x120094, 4, RI_ALL_ONLINE },
-       { 0x1200a4, 3, RI_ALL_ONLINE },
-       { 0x1200b0, 4, RI_ALL_ONLINE },
-       { 0x1200c0, 3, RI_ALL_ONLINE },
-       { 0x1200cc, 4, RI_ALL_ONLINE },
-       { 0x1200dc, 3, RI_ALL_ONLINE },
-       { 0x1200e8, 4, RI_ALL_ONLINE },
-       { 0x1200f8, 3, RI_ALL_ONLINE },
-       { 0x120104, 4, RI_ALL_ONLINE },
-       { 0x120114, 1, RI_ALL_ONLINE },
-       { 0x120118, 22, RI_ALL_ONLINE },
-       { 0x120170, 2, RI_E1E1H_ONLINE },
-       { 0x120178, 243, RI_ALL_ONLINE },
-       { 0x120544, 4, RI_E1E1H_ONLINE },
-       { 0x120554, 6, RI_ALL_ONLINE },
-       { 0x12059c, 6, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1205b4, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1205b8, 15, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1205f4, 1, RI_E1HE2_ONLINE },
-       { 0x1205f8, 4, RI_E2E3E3B0_ONLINE },
-       { 0x120618, 1, RI_E2E3E3B0_ONLINE },
-       { 0x12061c, 20, RI_E1HE2E3E3B0_ONLINE },
-       { 0x12066c, 11, RI_E1HE2E3E3B0_ONLINE },
-       { 0x120698, 3, RI_E2E3E3B0_ONLINE },
-       { 0x1206a4, 1, RI_E2_ONLINE },
-       { 0x1206a8, 1, RI_E2E3E3B0_ONLINE },
-       { 0x1206b0, 75, RI_E2E3E3B0_ONLINE },
-       { 0x1207dc, 1, RI_E2_ONLINE },
-       { 0x1207fc, 1, RI_E2E3E3B0_ONLINE },
-       { 0x12080c, 65, RI_ALL_ONLINE },
-       { 0x120910, 7, RI_E2E3E3B0_ONLINE },
-       { 0x120930, 9, RI_E2E3E3B0_ONLINE },
-       { 0x12095c, 37, RI_E3E3B0_ONLINE },
-       { 0x120a00, 2, RI_E1E1HE2_ONLINE },
-       { 0x120b00, 1, RI_E3E3B0_ONLINE },
-       { 0x122000, 2, RI_ALL_ONLINE },
-       { 0x122008, 2046, RI_E1_OFFLINE },
-       { 0x128000, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x128008, 6142, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x130000, 35, RI_E2E3E3B0_ONLINE },
-       { 0x130100, 29, RI_E2E3E3B0_ONLINE },
-       { 0x130180, 1, RI_E2E3E3B0_ONLINE },
-       { 0x130200, 1, RI_E2E3E3B0_ONLINE },
-       { 0x130280, 1, RI_E2E3E3B0_ONLINE },
-       { 0x130300, 5, RI_E2E3E3B0_ONLINE },
-       { 0x130380, 1, RI_E2E3E3B0_ONLINE },
-       { 0x130400, 1, RI_E2E3E3B0_ONLINE },
-       { 0x130480, 5, RI_E2E3E3B0_ONLINE },
-       { 0x130800, 72, RI_E2E3E3B0_ONLINE },
-       { 0x131000, 136, RI_E2E3E3B0_ONLINE },
-       { 0x132000, 148, RI_E2E3E3B0_ONLINE },
-       { 0x134000, 544, RI_E2E3E3B0_ONLINE },
-       { 0x140000, 1, RI_ALL_ONLINE },
-       { 0x140004, 9, RI_E1E1HE2E3_ONLINE },
-       { 0x140028, 8, RI_ALL_ONLINE },
-       { 0x140048, 10, RI_E1E1HE2E3_ONLINE },
-       { 0x140070, 1, RI_ALL_ONLINE },
-       { 0x140074, 10, RI_E1E1HE2E3_ONLINE },
-       { 0x14009c, 1, RI_ALL_ONLINE },
-       { 0x1400a0, 5, RI_E1E1HE2E3_ONLINE },
-       { 0x1400b4, 7, RI_ALL_ONLINE },
-       { 0x1400d0, 10, RI_E1E1HE2E3_ONLINE },
-       { 0x1400f8, 2, RI_ALL_ONLINE },
-       { 0x140100, 5, RI_E1E1H_ONLINE },
-       { 0x140114, 5, RI_E1E1HE2E3_ONLINE },
-       { 0x140128, 7, RI_ALL_ONLINE },
-       { 0x140144, 9, RI_E1E1HE2E3_ONLINE },
-       { 0x140168, 8, RI_ALL_ONLINE },
-       { 0x140188, 3, RI_E1E1HE2E3_ONLINE },
-       { 0x140194, 13, RI_ALL_ONLINE },
-       { 0x140200, 6, RI_E1E1HE2E3_ONLINE },
-       { 0x140260, 4, RI_E2E3_ONLINE },
-       { 0x140280, 4, RI_E2E3_ONLINE },
-       { 0x1402e0, 2, RI_E2E3_ONLINE },
-       { 0x1402e8, 2, RI_E2E3E3B0_ONLINE },
-       { 0x1402f0, 9, RI_E2E3_ONLINE },
-       { 0x140314, 44, RI_E3B0_ONLINE },
-       { 0x144000, 4, RI_E1E1H_ONLINE },
-       { 0x148000, 4, RI_E1E1H_ONLINE },
-       { 0x14c000, 4, RI_E1E1H_ONLINE },
-       { 0x150000, 4, RI_E1E1H_ONLINE },
-       { 0x154000, 4, RI_E1E1H_ONLINE },
-       { 0x158000, 4, RI_E1E1H_ONLINE },
-       { 0x15c000, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x15c008, 5, RI_E1H_ONLINE },
-       { 0x15c020, 8, RI_E2E3E3B0_ONLINE },
-       { 0x15c040, 1, RI_E2E3_ONLINE },
-       { 0x15c044, 2, RI_E2E3E3B0_ONLINE },
-       { 0x15c04c, 8, RI_E2E3_ONLINE },
-       { 0x15c06c, 8, RI_E2E3E3B0_ONLINE },
-       { 0x15c090, 13, RI_E2E3E3B0_ONLINE },
-       { 0x15c0c8, 24, RI_E2E3E3B0_ONLINE },
-       { 0x15c128, 2, RI_E2E3_ONLINE },
-       { 0x15c130, 8, RI_E2E3E3B0_ONLINE },
-       { 0x15c150, 2, RI_E3E3B0_ONLINE },
-       { 0x15c158, 2, RI_E3_ONLINE },
-       { 0x15c160, 149, RI_E3B0_ONLINE },
-       { 0x161000, 7, RI_ALL_ONLINE },
-       { 0x16103c, 2, RI_E2E3E3B0_ONLINE },
-       { 0x161800, 2, RI_ALL_ONLINE },
-       { 0x162000, 54, RI_E3E3B0_ONLINE },
-       { 0x162200, 60, RI_E3E3B0_ONLINE },
-       { 0x162400, 54, RI_E3E3B0_ONLINE },
-       { 0x162600, 60, RI_E3E3B0_ONLINE },
-       { 0x162800, 54, RI_E3E3B0_ONLINE },
-       { 0x162a00, 60, RI_E3E3B0_ONLINE },
-       { 0x162c00, 54, RI_E3E3B0_ONLINE },
-       { 0x162e00, 60, RI_E3E3B0_ONLINE },
-       { 0x164000, 60, RI_ALL_ONLINE },
-       { 0x164110, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x164118, 15, RI_E2E3E3B0_ONLINE },
-       { 0x164200, 1, RI_ALL_ONLINE },
-       { 0x164208, 1, RI_ALL_ONLINE },
-       { 0x164210, 1, RI_ALL_ONLINE },
-       { 0x164218, 1, RI_ALL_ONLINE },
-       { 0x164220, 1, RI_ALL_ONLINE },
-       { 0x164228, 1, RI_ALL_ONLINE },
-       { 0x164230, 1, RI_ALL_ONLINE },
-       { 0x164238, 1, RI_ALL_ONLINE },
-       { 0x164240, 1, RI_ALL_ONLINE },
-       { 0x164248, 1, RI_ALL_ONLINE },
-       { 0x164250, 1, RI_ALL_ONLINE },
-       { 0x164258, 1, RI_ALL_ONLINE },
-       { 0x164260, 1, RI_ALL_ONLINE },
-       { 0x164270, 2, RI_ALL_ONLINE },
-       { 0x164280, 2, RI_ALL_ONLINE },
-       { 0x164800, 2, RI_ALL_ONLINE },
-       { 0x165000, 2, RI_ALL_ONLINE },
-       { 0x166000, 164, RI_ALL_ONLINE },
-       { 0x1662cc, 7, RI_E2E3E3B0_ONLINE },
-       { 0x166400, 49, RI_ALL_ONLINE },
-       { 0x1664c8, 38, RI_ALL_ONLINE },
-       { 0x166568, 2, RI_ALL_ONLINE },
-       { 0x166570, 5, RI_E2E3E3B0_ONLINE },
-       { 0x166800, 1, RI_ALL_ONLINE },
-       { 0x168000, 137, RI_ALL_ONLINE },
-       { 0x168224, 2, RI_E1E1H_ONLINE },
-       { 0x16822c, 29, RI_ALL_ONLINE },
-       { 0x1682a0, 12, RI_E1E1H_ONLINE },
-       { 0x1682d0, 12, RI_ALL_ONLINE },
-       { 0x168300, 2, RI_E1E1H_ONLINE },
-       { 0x168308, 68, RI_ALL_ONLINE },
-       { 0x168418, 2, RI_E1E1H_ONLINE },
-       { 0x168420, 6, RI_ALL_ONLINE },
-       { 0x168800, 19, RI_ALL_ONLINE },
-       { 0x168900, 1, RI_ALL_ONLINE },
-       { 0x168a00, 128, RI_ALL_ONLINE },
-       { 0x16a000, 1, RI_ALL_ONLINE },
-       { 0x16a004, 1535, RI_ALL_OFFLINE },
-       { 0x16c000, 1, RI_ALL_ONLINE },
-       { 0x16c004, 1535, RI_ALL_OFFLINE },
-       { 0x16e000, 16, RI_E1H_ONLINE },
-       { 0x16e040, 8, RI_E2E3E3B0_ONLINE },
-       { 0x16e100, 1, RI_E1H_ONLINE },
-       { 0x16e200, 2, RI_E1H_ONLINE },
-       { 0x16e400, 161, RI_E1H_ONLINE },
-       { 0x16e684, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x16e68c, 12, RI_E1H_ONLINE },
-       { 0x16e6bc, 4, RI_E1HE2E3E3B0_ONLINE },
-       { 0x16e6cc, 4, RI_E1H_ONLINE },
-       { 0x16e6e0, 2, RI_E2E3E3B0_ONLINE },
-       { 0x16e6e8, 5, RI_E2E3_ONLINE },
-       { 0x16e6fc, 5, RI_E2E3E3B0_ONLINE },
-       { 0x16e768, 17, RI_E2E3E3B0_ONLINE },
-       { 0x16e7ac, 12, RI_E3B0_ONLINE },
-       { 0x170000, 24, RI_ALL_ONLINE },
-       { 0x170060, 4, RI_E1E1H_ONLINE },
-       { 0x170070, 65, RI_ALL_ONLINE },
-       { 0x170194, 11, RI_E2E3E3B0_ONLINE },
-       { 0x1701c4, 1, RI_E2E3E3B0_ONLINE },
-       { 0x1701cc, 7, RI_E2E3E3B0_ONLINE },
-       { 0x1701e8, 1, RI_E3E3B0_ONLINE },
-       { 0x1701ec, 1, RI_E2E3E3B0_ONLINE },
-       { 0x1701f4, 1, RI_E2E3E3B0_ONLINE },
-       { 0x170200, 4, RI_ALL_ONLINE },
-       { 0x170214, 1, RI_ALL_ONLINE },
-       { 0x170218, 77, RI_E2E3E3B0_ONLINE },
-       { 0x170400, 64, RI_E2E3E3B0_ONLINE },
-       { 0x178000, 1, RI_ALL_ONLINE },
-       { 0x180000, 61, RI_ALL_ONLINE },
-       { 0x18013c, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x180200, 58, RI_ALL_ONLINE },
-       { 0x180340, 4, RI_ALL_ONLINE },
-       { 0x180380, 1, RI_E2E3E3B0_ONLINE },
-       { 0x180388, 1, RI_E2E3E3B0_ONLINE },
-       { 0x180390, 1, RI_E2E3E3B0_ONLINE },
-       { 0x180398, 1, RI_E2E3E3B0_ONLINE },
-       { 0x1803a0, 5, RI_E2E3E3B0_ONLINE },
-       { 0x1803b4, 2, RI_E3E3B0_ONLINE },
-       { 0x180404, 255, RI_E1E1H_OFFLINE },
-       { 0x181000, 4, RI_ALL_ONLINE },
-       { 0x181010, 1020, RI_ALL_OFFLINE },
-       { 0x182000, 4, RI_E3E3B0_ONLINE },
-       { 0x1a0000, 1, RI_ALL_ONLINE },
-       { 0x1a0004, 5631, RI_ALL_OFFLINE },
-       { 0x1a5800, 2560, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x1a8000, 1, RI_ALL_ONLINE },
-       { 0x1a8004, 8191, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x1b0000, 1, RI_ALL_ONLINE },
-       { 0x1b0004, 15, RI_E1H_OFFLINE },
-       { 0x1b0040, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b0044, 239, RI_E1H_OFFLINE },
-       { 0x1b0400, 1, RI_ALL_ONLINE },
-       { 0x1b0404, 255, RI_E1H_OFFLINE },
-       { 0x1b0800, 1, RI_ALL_ONLINE },
-       { 0x1b0840, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b0c00, 1, RI_ALL_ONLINE },
-       { 0x1b1000, 1, RI_ALL_ONLINE },
-       { 0x1b1040, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b1400, 1, RI_ALL_ONLINE },
-       { 0x1b1440, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b1480, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b14c0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b1800, 128, RI_ALL_OFFLINE },
-       { 0x1b1c00, 128, RI_ALL_OFFLINE },
-       { 0x1b2000, 1, RI_ALL_ONLINE },
-       { 0x1b2400, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b2404, 5631, RI_E2E3E3B0_OFFLINE },
-       { 0x1b8000, 1, RI_ALL_ONLINE },
-       { 0x1b8040, 1, RI_ALL_ONLINE },
-       { 0x1b8080, 1, RI_ALL_ONLINE },
-       { 0x1b80c0, 1, RI_ALL_ONLINE },
-       { 0x1b8100, 1, RI_ALL_ONLINE },
-       { 0x1b8140, 1, RI_ALL_ONLINE },
-       { 0x1b8180, 1, RI_ALL_ONLINE },
-       { 0x1b81c0, 1, RI_ALL_ONLINE },
-       { 0x1b8200, 1, RI_ALL_ONLINE },
-       { 0x1b8240, 1, RI_ALL_ONLINE },
-       { 0x1b8280, 1, RI_ALL_ONLINE },
-       { 0x1b82c0, 1, RI_ALL_ONLINE },
-       { 0x1b8300, 1, RI_ALL_ONLINE },
-       { 0x1b8340, 1, RI_ALL_ONLINE },
-       { 0x1b8380, 1, RI_ALL_ONLINE },
-       { 0x1b83c0, 1, RI_ALL_ONLINE },
-       { 0x1b8400, 1, RI_ALL_ONLINE },
-       { 0x1b8440, 1, RI_ALL_ONLINE },
-       { 0x1b8480, 1, RI_ALL_ONLINE },
-       { 0x1b84c0, 1, RI_ALL_ONLINE },
-       { 0x1b8500, 1, RI_ALL_ONLINE },
-       { 0x1b8540, 1, RI_ALL_ONLINE },
-       { 0x1b8580, 1, RI_ALL_ONLINE },
-       { 0x1b85c0, 19, RI_E2E3E3B0_ONLINE },
-       { 0x1b8800, 1, RI_ALL_ONLINE },
-       { 0x1b8840, 1, RI_ALL_ONLINE },
-       { 0x1b8880, 1, RI_ALL_ONLINE },
-       { 0x1b88c0, 1, RI_ALL_ONLINE },
-       { 0x1b8900, 1, RI_ALL_ONLINE },
-       { 0x1b8940, 1, RI_ALL_ONLINE },
-       { 0x1b8980, 1, RI_ALL_ONLINE },
-       { 0x1b89c0, 1, RI_ALL_ONLINE },
-       { 0x1b8a00, 1, RI_ALL_ONLINE },
-       { 0x1b8a40, 1, RI_ALL_ONLINE },
-       { 0x1b8a80, 1, RI_ALL_ONLINE },
-       { 0x1b8ac0, 1, RI_ALL_ONLINE },
-       { 0x1b8b00, 1, RI_ALL_ONLINE },
-       { 0x1b8b40, 1, RI_ALL_ONLINE },
-       { 0x1b8b80, 1, RI_ALL_ONLINE },
-       { 0x1b8bc0, 1, RI_ALL_ONLINE },
-       { 0x1b8c00, 1, RI_ALL_ONLINE },
-       { 0x1b8c40, 1, RI_ALL_ONLINE },
-       { 0x1b8c80, 1, RI_ALL_ONLINE },
-       { 0x1b8cc0, 1, RI_ALL_ONLINE },
-       { 0x1b8cc4, 1, RI_E2E3E3B0_ONLINE },
-       { 0x1b8d00, 1, RI_ALL_ONLINE },
-       { 0x1b8d40, 1, RI_ALL_ONLINE },
-       { 0x1b8d80, 1, RI_ALL_ONLINE },
-       { 0x1b8dc0, 1, RI_ALL_ONLINE },
-       { 0x1b8e00, 1, RI_ALL_ONLINE },
-       { 0x1b8e40, 1, RI_ALL_ONLINE },
-       { 0x1b8e80, 1, RI_ALL_ONLINE },
-       { 0x1b8e84, 1, RI_E2E3E3B0_ONLINE },
-       { 0x1b8ec0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b8f00, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b8f40, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b8f80, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b8fc0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x1b8fc4, 2, RI_E2E3E3B0_ONLINE },
-       { 0x1b8fd0, 6, RI_E2E3E3B0_ONLINE },
-       { 0x1b8fe8, 2, RI_E3E3B0_ONLINE },
-       { 0x1b9000, 1, RI_E2E3E3B0_ONLINE },
-       { 0x1b9040, 3, RI_E2E3E3B0_ONLINE },
-       { 0x1b905c, 1, RI_E3E3B0_ONLINE },
-       { 0x1b9064, 1, RI_E3B0_ONLINE },
-       { 0x1b9080, 10, RI_E3B0_ONLINE },
-       { 0x1b9400, 14, RI_E2E3E3B0_OFFLINE },
-       { 0x1b943c, 19, RI_E2E3E3B0_OFFLINE },
-       { 0x1b9490, 10, RI_E2E3E3B0_OFFLINE },
-       { 0x1c0000, 2, RI_ALL_ONLINE },
-       { 0x200000, 65, RI_ALL_ONLINE },
-       { 0x20014c, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x200200, 58, RI_ALL_ONLINE },
-       { 0x200340, 4, RI_ALL_ONLINE },
-       { 0x200380, 1, RI_E2E3E3B0_ONLINE },
-       { 0x200388, 1, RI_E2E3E3B0_ONLINE },
-       { 0x200390, 1, RI_E2E3E3B0_ONLINE },
-       { 0x200398, 1, RI_E2E3E3B0_ONLINE },
-       { 0x2003a0, 1, RI_E2E3E3B0_ONLINE },
-       { 0x2003a8, 2, RI_E2E3E3B0_ONLINE },
-       { 0x200404, 255, RI_E1E1H_OFFLINE },
-       { 0x202000, 4, RI_ALL_ONLINE },
-       { 0x202010, 2044, RI_ALL_OFFLINE },
-       { 0x204000, 4, RI_E3E3B0_ONLINE },
-       { 0x220000, 1, RI_ALL_ONLINE },
-       { 0x220004, 5631, RI_ALL_OFFLINE },
-       { 0x225800, 2560, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x228000, 1, RI_ALL_ONLINE },
-       { 0x228004, 8191, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x230000, 1, RI_ALL_ONLINE },
-       { 0x230004, 15, RI_E1H_OFFLINE },
-       { 0x230040, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x230044, 239, RI_E1H_OFFLINE },
-       { 0x230400, 1, RI_ALL_ONLINE },
-       { 0x230404, 255, RI_E1H_OFFLINE },
-       { 0x230800, 1, RI_ALL_ONLINE },
-       { 0x230840, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x230c00, 1, RI_ALL_ONLINE },
-       { 0x231000, 1, RI_ALL_ONLINE },
-       { 0x231040, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x231400, 1, RI_ALL_ONLINE },
-       { 0x231440, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x231480, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2314c0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x231800, 128, RI_ALL_OFFLINE },
-       { 0x231c00, 128, RI_ALL_OFFLINE },
-       { 0x232000, 1, RI_ALL_ONLINE },
-       { 0x232400, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x232404, 5631, RI_E2E3E3B0_OFFLINE },
-       { 0x238000, 1, RI_ALL_ONLINE },
-       { 0x238040, 1, RI_ALL_ONLINE },
-       { 0x238080, 1, RI_ALL_ONLINE },
-       { 0x2380c0, 1, RI_ALL_ONLINE },
-       { 0x238100, 1, RI_ALL_ONLINE },
-       { 0x238140, 1, RI_ALL_ONLINE },
-       { 0x238180, 1, RI_ALL_ONLINE },
-       { 0x2381c0, 1, RI_ALL_ONLINE },
-       { 0x238200, 1, RI_ALL_ONLINE },
-       { 0x238240, 1, RI_ALL_ONLINE },
-       { 0x238280, 1, RI_ALL_ONLINE },
-       { 0x2382c0, 1, RI_ALL_ONLINE },
-       { 0x238300, 1, RI_ALL_ONLINE },
-       { 0x238340, 1, RI_ALL_ONLINE },
-       { 0x238380, 1, RI_ALL_ONLINE },
-       { 0x2383c0, 1, RI_ALL_ONLINE },
-       { 0x238400, 1, RI_ALL_ONLINE },
-       { 0x238440, 1, RI_ALL_ONLINE },
-       { 0x238480, 1, RI_ALL_ONLINE },
-       { 0x2384c0, 1, RI_ALL_ONLINE },
-       { 0x238500, 1, RI_ALL_ONLINE },
-       { 0x238540, 1, RI_ALL_ONLINE },
-       { 0x238580, 1, RI_ALL_ONLINE },
-       { 0x2385c0, 19, RI_E2E3E3B0_ONLINE },
-       { 0x238800, 1, RI_ALL_ONLINE },
-       { 0x238840, 1, RI_ALL_ONLINE },
-       { 0x238880, 1, RI_ALL_ONLINE },
-       { 0x2388c0, 1, RI_ALL_ONLINE },
-       { 0x238900, 1, RI_ALL_ONLINE },
-       { 0x238940, 1, RI_ALL_ONLINE },
-       { 0x238980, 1, RI_ALL_ONLINE },
-       { 0x2389c0, 1, RI_ALL_ONLINE },
-       { 0x238a00, 1, RI_ALL_ONLINE },
-       { 0x238a40, 1, RI_ALL_ONLINE },
-       { 0x238a80, 1, RI_ALL_ONLINE },
-       { 0x238ac0, 1, RI_ALL_ONLINE },
-       { 0x238b00, 1, RI_ALL_ONLINE },
-       { 0x238b40, 1, RI_ALL_ONLINE },
-       { 0x238b80, 1, RI_ALL_ONLINE },
-       { 0x238bc0, 1, RI_ALL_ONLINE },
-       { 0x238c00, 1, RI_ALL_ONLINE },
-       { 0x238c40, 1, RI_ALL_ONLINE },
-       { 0x238c80, 1, RI_ALL_ONLINE },
-       { 0x238cc0, 1, RI_ALL_ONLINE },
-       { 0x238cc4, 1, RI_E2E3E3B0_ONLINE },
-       { 0x238d00, 1, RI_ALL_ONLINE },
-       { 0x238d40, 1, RI_ALL_ONLINE },
-       { 0x238d80, 1, RI_ALL_ONLINE },
-       { 0x238dc0, 1, RI_ALL_ONLINE },
-       { 0x238e00, 1, RI_ALL_ONLINE },
-       { 0x238e40, 1, RI_ALL_ONLINE },
-       { 0x238e80, 1, RI_ALL_ONLINE },
-       { 0x238e84, 1, RI_E2E3E3B0_ONLINE },
-       { 0x238ec0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x238f00, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x238f40, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x238f80, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x238fc0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x238fc4, 2, RI_E2E3E3B0_ONLINE },
-       { 0x238fd0, 6, RI_E2E3E3B0_ONLINE },
-       { 0x238fe8, 2, RI_E3E3B0_ONLINE },
-       { 0x239000, 1, RI_E2E3E3B0_ONLINE },
-       { 0x239040, 3, RI_E2E3E3B0_ONLINE },
-       { 0x23905c, 1, RI_E3E3B0_ONLINE },
-       { 0x239064, 1, RI_E3B0_ONLINE },
-       { 0x239080, 10, RI_E3B0_ONLINE },
-       { 0x240000, 2, RI_ALL_ONLINE },
-       { 0x280000, 65, RI_ALL_ONLINE },
-       { 0x28014c, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x280200, 58, RI_ALL_ONLINE },
-       { 0x280340, 4, RI_ALL_ONLINE },
-       { 0x280380, 1, RI_E2E3E3B0_ONLINE },
-       { 0x280388, 1, RI_E2E3E3B0_ONLINE },
-       { 0x280390, 1, RI_E2E3E3B0_ONLINE },
-       { 0x280398, 1, RI_E2E3E3B0_ONLINE },
-       { 0x2803a0, 1, RI_E2E3E3B0_ONLINE },
-       { 0x2803a8, 2, RI_E2E3E3B0_ONLINE },
-       { 0x280404, 255, RI_E1E1H_OFFLINE },
-       { 0x282000, 4, RI_ALL_ONLINE },
-       { 0x282010, 2044, RI_ALL_OFFLINE },
-       { 0x284000, 4, RI_E3E3B0_ONLINE },
-       { 0x2a0000, 1, RI_ALL_ONLINE },
-       { 0x2a0004, 5631, RI_ALL_OFFLINE },
-       { 0x2a5800, 2560, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x2a8000, 1, RI_ALL_ONLINE },
-       { 0x2a8004, 8191, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x2b0000, 1, RI_ALL_ONLINE },
-       { 0x2b0004, 15, RI_E1H_OFFLINE },
-       { 0x2b0040, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b0044, 239, RI_E1H_OFFLINE },
-       { 0x2b0400, 1, RI_ALL_ONLINE },
-       { 0x2b0404, 255, RI_E1H_OFFLINE },
-       { 0x2b0800, 1, RI_ALL_ONLINE },
-       { 0x2b0840, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b0c00, 1, RI_ALL_ONLINE },
-       { 0x2b1000, 1, RI_ALL_ONLINE },
-       { 0x2b1040, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b1400, 1, RI_ALL_ONLINE },
-       { 0x2b1440, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b1480, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b14c0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b1800, 128, RI_ALL_OFFLINE },
-       { 0x2b1c00, 128, RI_ALL_OFFLINE },
-       { 0x2b2000, 1, RI_ALL_ONLINE },
-       { 0x2b2400, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b2404, 5631, RI_E2E3E3B0_OFFLINE },
-       { 0x2b8000, 1, RI_ALL_ONLINE },
-       { 0x2b8040, 1, RI_ALL_ONLINE },
-       { 0x2b8080, 1, RI_ALL_ONLINE },
-       { 0x2b80c0, 1, RI_ALL_ONLINE },
-       { 0x2b8100, 1, RI_ALL_ONLINE },
-       { 0x2b8140, 1, RI_ALL_ONLINE },
-       { 0x2b8180, 1, RI_ALL_ONLINE },
-       { 0x2b81c0, 1, RI_ALL_ONLINE },
-       { 0x2b8200, 1, RI_ALL_ONLINE },
-       { 0x2b8240, 1, RI_ALL_ONLINE },
-       { 0x2b8280, 1, RI_ALL_ONLINE },
-       { 0x2b82c0, 1, RI_ALL_ONLINE },
-       { 0x2b8300, 1, RI_ALL_ONLINE },
-       { 0x2b8340, 1, RI_ALL_ONLINE },
-       { 0x2b8380, 1, RI_ALL_ONLINE },
-       { 0x2b83c0, 1, RI_ALL_ONLINE },
-       { 0x2b8400, 1, RI_ALL_ONLINE },
-       { 0x2b8440, 1, RI_ALL_ONLINE },
-       { 0x2b8480, 1, RI_ALL_ONLINE },
-       { 0x2b84c0, 1, RI_ALL_ONLINE },
-       { 0x2b8500, 1, RI_ALL_ONLINE },
-       { 0x2b8540, 1, RI_ALL_ONLINE },
-       { 0x2b8580, 1, RI_ALL_ONLINE },
-       { 0x2b85c0, 19, RI_E2E3E3B0_ONLINE },
-       { 0x2b8800, 1, RI_ALL_ONLINE },
-       { 0x2b8840, 1, RI_ALL_ONLINE },
-       { 0x2b8880, 1, RI_ALL_ONLINE },
-       { 0x2b88c0, 1, RI_ALL_ONLINE },
-       { 0x2b8900, 1, RI_ALL_ONLINE },
-       { 0x2b8940, 1, RI_ALL_ONLINE },
-       { 0x2b8980, 1, RI_ALL_ONLINE },
-       { 0x2b89c0, 1, RI_ALL_ONLINE },
-       { 0x2b8a00, 1, RI_ALL_ONLINE },
-       { 0x2b8a40, 1, RI_ALL_ONLINE },
-       { 0x2b8a80, 1, RI_ALL_ONLINE },
-       { 0x2b8ac0, 1, RI_ALL_ONLINE },
-       { 0x2b8b00, 1, RI_ALL_ONLINE },
-       { 0x2b8b40, 1, RI_ALL_ONLINE },
-       { 0x2b8b80, 1, RI_ALL_ONLINE },
-       { 0x2b8bc0, 1, RI_ALL_ONLINE },
-       { 0x2b8c00, 1, RI_ALL_ONLINE },
-       { 0x2b8c40, 1, RI_ALL_ONLINE },
-       { 0x2b8c80, 1, RI_ALL_ONLINE },
-       { 0x2b8cc0, 1, RI_ALL_ONLINE },
-       { 0x2b8cc4, 1, RI_E2E3E3B0_ONLINE },
-       { 0x2b8d00, 1, RI_ALL_ONLINE },
-       { 0x2b8d40, 1, RI_ALL_ONLINE },
-       { 0x2b8d80, 1, RI_ALL_ONLINE },
-       { 0x2b8dc0, 1, RI_ALL_ONLINE },
-       { 0x2b8e00, 1, RI_ALL_ONLINE },
-       { 0x2b8e40, 1, RI_ALL_ONLINE },
-       { 0x2b8e80, 1, RI_ALL_ONLINE },
-       { 0x2b8e84, 1, RI_E2E3E3B0_ONLINE },
-       { 0x2b8ec0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b8f00, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b8f40, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b8f80, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b8fc0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x2b8fc4, 2, RI_E2E3E3B0_ONLINE },
-       { 0x2b8fd0, 6, RI_E2E3E3B0_ONLINE },
-       { 0x2b8fe8, 2, RI_E3E3B0_ONLINE },
-       { 0x2b9000, 1, RI_E2E3E3B0_ONLINE },
-       { 0x2b9040, 3, RI_E2E3E3B0_ONLINE },
-       { 0x2b905c, 1, RI_E3E3B0_ONLINE },
-       { 0x2b9064, 1, RI_E3B0_ONLINE },
-       { 0x2b9080, 10, RI_E3B0_ONLINE },
-       { 0x2b9400, 14, RI_E2E3E3B0_ONLINE },
-       { 0x2b943c, 19, RI_E2E3E3B0_ONLINE },
-       { 0x2b9490, 10, RI_E2E3E3B0_ONLINE },
-       { 0x2c0000, 2, RI_ALL_ONLINE },
-       { 0x300000, 65, RI_ALL_ONLINE },
-       { 0x30014c, 2, RI_E1HE2E3E3B0_ONLINE },
-       { 0x300200, 58, RI_ALL_ONLINE },
-       { 0x300340, 4, RI_ALL_ONLINE },
-       { 0x300380, 1, RI_E2E3E3B0_ONLINE },
-       { 0x300388, 1, RI_E2E3E3B0_ONLINE },
-       { 0x300390, 1, RI_E2E3E3B0_ONLINE },
-       { 0x300398, 1, RI_E2E3E3B0_ONLINE },
-       { 0x3003a0, 1, RI_E2E3E3B0_ONLINE },
-       { 0x3003a8, 2, RI_E2E3E3B0_ONLINE },
-       { 0x300404, 255, RI_E1E1H_OFFLINE },
-       { 0x302000, 4, RI_ALL_ONLINE },
-       { 0x302010, 2044, RI_ALL_OFFLINE },
-       { 0x304000, 4, RI_E3E3B0_ONLINE },
-       { 0x320000, 1, RI_ALL_ONLINE },
-       { 0x320004, 5631, RI_ALL_OFFLINE },
-       { 0x325800, 2560, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x328000, 1, RI_ALL_ONLINE },
-       { 0x328004, 8191, RI_E1HE2E3E3B0_OFFLINE },
-       { 0x330000, 1, RI_ALL_ONLINE },
-       { 0x330004, 15, RI_E1H_OFFLINE },
-       { 0x330040, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x330044, 239, RI_E1H_OFFLINE },
-       { 0x330400, 1, RI_ALL_ONLINE },
-       { 0x330404, 255, RI_E1H_OFFLINE },
-       { 0x330800, 1, RI_ALL_ONLINE },
-       { 0x330840, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x330c00, 1, RI_ALL_ONLINE },
-       { 0x331000, 1, RI_ALL_ONLINE },
-       { 0x331040, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x331400, 1, RI_ALL_ONLINE },
-       { 0x331440, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x331480, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x3314c0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x331800, 128, RI_ALL_OFFLINE },
-       { 0x331c00, 128, RI_ALL_OFFLINE },
-       { 0x332000, 1, RI_ALL_ONLINE },
-       { 0x332400, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x332404, 5631, RI_E2E3E3B0_OFFLINE },
-       { 0x338000, 1, RI_ALL_ONLINE },
-       { 0x338040, 1, RI_ALL_ONLINE },
-       { 0x338080, 1, RI_ALL_ONLINE },
-       { 0x3380c0, 1, RI_ALL_ONLINE },
-       { 0x338100, 1, RI_ALL_ONLINE },
-       { 0x338140, 1, RI_ALL_ONLINE },
-       { 0x338180, 1, RI_ALL_ONLINE },
-       { 0x3381c0, 1, RI_ALL_ONLINE },
-       { 0x338200, 1, RI_ALL_ONLINE },
-       { 0x338240, 1, RI_ALL_ONLINE },
-       { 0x338280, 1, RI_ALL_ONLINE },
-       { 0x3382c0, 1, RI_ALL_ONLINE },
-       { 0x338300, 1, RI_ALL_ONLINE },
-       { 0x338340, 1, RI_ALL_ONLINE },
-       { 0x338380, 1, RI_ALL_ONLINE },
-       { 0x3383c0, 1, RI_ALL_ONLINE },
-       { 0x338400, 1, RI_ALL_ONLINE },
-       { 0x338440, 1, RI_ALL_ONLINE },
-       { 0x338480, 1, RI_ALL_ONLINE },
-       { 0x3384c0, 1, RI_ALL_ONLINE },
-       { 0x338500, 1, RI_ALL_ONLINE },
-       { 0x338540, 1, RI_ALL_ONLINE },
-       { 0x338580, 1, RI_ALL_ONLINE },
-       { 0x3385c0, 19, RI_E2E3E3B0_ONLINE },
-       { 0x338800, 1, RI_ALL_ONLINE },
-       { 0x338840, 1, RI_ALL_ONLINE },
-       { 0x338880, 1, RI_ALL_ONLINE },
-       { 0x3388c0, 1, RI_ALL_ONLINE },
-       { 0x338900, 1, RI_ALL_ONLINE },
-       { 0x338940, 1, RI_ALL_ONLINE },
-       { 0x338980, 1, RI_ALL_ONLINE },
-       { 0x3389c0, 1, RI_ALL_ONLINE },
-       { 0x338a00, 1, RI_ALL_ONLINE },
-       { 0x338a40, 1, RI_ALL_ONLINE },
-       { 0x338a80, 1, RI_ALL_ONLINE },
-       { 0x338ac0, 1, RI_ALL_ONLINE },
-       { 0x338b00, 1, RI_ALL_ONLINE },
-       { 0x338b40, 1, RI_ALL_ONLINE },
-       { 0x338b80, 1, RI_ALL_ONLINE },
-       { 0x338bc0, 1, RI_ALL_ONLINE },
-       { 0x338c00, 1, RI_ALL_ONLINE },
-       { 0x338c40, 1, RI_ALL_ONLINE },
-       { 0x338c80, 1, RI_ALL_ONLINE },
-       { 0x338cc0, 1, RI_ALL_ONLINE },
-       { 0x338cc4, 1, RI_E2E3E3B0_ONLINE },
-       { 0x338d00, 1, RI_ALL_ONLINE },
-       { 0x338d40, 1, RI_ALL_ONLINE },
-       { 0x338d80, 1, RI_ALL_ONLINE },
-       { 0x338dc0, 1, RI_ALL_ONLINE },
-       { 0x338e00, 1, RI_ALL_ONLINE },
-       { 0x338e40, 1, RI_ALL_ONLINE },
-       { 0x338e80, 1, RI_ALL_ONLINE },
-       { 0x338e84, 1, RI_E2E3E3B0_ONLINE },
-       { 0x338ec0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x338f00, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x338f40, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x338f80, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x338fc0, 1, RI_E1HE2E3E3B0_ONLINE },
-       { 0x338fc4, 2, RI_E2E3E3B0_ONLINE },
-       { 0x338fd0, 6, RI_E2E3E3B0_ONLINE },
-       { 0x338fe8, 2, RI_E3E3B0_ONLINE },
-       { 0x339000, 1, RI_E2E3E3B0_ONLINE },
-       { 0x339040, 3, RI_E2E3E3B0_ONLINE },
-       { 0x33905c, 1, RI_E3E3B0_ONLINE },
-       { 0x339064, 1, RI_E3B0_ONLINE },
-       { 0x339080, 10, RI_E3B0_ONLINE },
-       { 0x340000, 2, RI_ALL_ONLINE },
+       { 0x2000, 1, 0x1f, 0xfff},
+       { 0x2004, 1, 0x1f, 0x1fff},
+       { 0x2008, 25, 0x1f, 0xfff},
+       { 0x206c, 1, 0x1f, 0x1fff},
+       { 0x2070, 313, 0x1f, 0xfff},
+       { 0x2800, 103, 0x1f, 0xfff},
+       { 0x3000, 287, 0x1f, 0xfff},
+       { 0x3800, 331, 0x1f, 0xfff},
+       { 0x8800, 6, 0x1f, 0x924},
+       { 0x8818, 1, 0x1e, 0x924},
+       { 0x9000, 4, 0x1c, 0x924},
+       { 0x9010, 7, 0x1c, 0xfff},
+       { 0x902c, 1, 0x1c, 0x924},
+       { 0x9030, 1, 0x1c, 0xfff},
+       { 0x9034, 13, 0x1c, 0x924},
+       { 0x9068, 16, 0x1c, 0xfff},
+       { 0x90a8, 98, 0x1c, 0x924},
+       { 0x9230, 2, 0x1c, 0xfff},
+       { 0x9238, 3, 0x1c, 0x924},
+       { 0x9244, 1, 0x1c, 0xfff},
+       { 0x9248, 1, 0x1c, 0x924},
+       { 0x924c, 1, 0x4, 0x924},
+       { 0x9250, 16, 0x1c, 0x924},
+       { 0x92a8, 2, 0x1c, 0x1fff},
+       { 0x92b4, 1, 0x1c, 0x1fff},
+       { 0x9400, 33, 0x1c, 0x924},
+       { 0x9484, 5, 0x18, 0x924},
+       { 0xa000, 27, 0x1f, 0x924},
+       { 0xa06c, 1, 0x3, 0x924},
+       { 0xa070, 2, 0x1f, 0x924},
+       { 0xa078, 1, 0x1f, 0x1fff},
+       { 0xa07c, 31, 0x1f, 0x924},
+       { 0xa0f8, 1, 0x1f, 0x1fff},
+       { 0xa0fc, 3, 0x1f, 0x924},
+       { 0xa108, 1, 0x1f, 0x1fff},
+       { 0xa10c, 3, 0x1f, 0x924},
+       { 0xa118, 1, 0x1f, 0x1fff},
+       { 0xa11c, 28, 0x1f, 0x924},
+       { 0xa18c, 4, 0x3, 0x924},
+       { 0xa19c, 3, 0x1f, 0x924},
+       { 0xa1a8, 1, 0x1f, 0x1fff},
+       { 0xa1ac, 3, 0x1f, 0x924},
+       { 0xa1b8, 1, 0x1f, 0x1fff},
+       { 0xa1bc, 54, 0x1f, 0x924},
+       { 0xa294, 2, 0x3, 0x924},
+       { 0xa29c, 2, 0x1f, 0x924},
+       { 0xa2a4, 2, 0x7, 0x924},
+       { 0xa2ac, 2, 0x1f, 0x924},
+       { 0xa2b4, 1, 0x1f, 0x1fff},
+       { 0xa2b8, 49, 0x1f, 0x924},
+       { 0xa38c, 2, 0x1f, 0x1fff},
+       { 0xa398, 1, 0x1f, 0x1fff},
+       { 0xa39c, 7, 0x1e, 0x924},
+       { 0xa3b8, 2, 0x18, 0x924},
+       { 0xa3c0, 1, 0x1e, 0x924},
+       { 0xa3c4, 1, 0x1e, 0xfff},
+       { 0xa3c8, 1, 0x1e, 0x924},
+       { 0xa3d0, 1, 0x1e, 0x924},
+       { 0xa3d8, 1, 0x1e, 0x924},
+       { 0xa3e0, 1, 0x1e, 0x924},
+       { 0xa3e8, 1, 0x1e, 0x924},
+       { 0xa3f0, 1, 0x1e, 0x924},
+       { 0xa3f8, 1, 0x1e, 0x924},
+       { 0xa400, 1, 0x1f, 0x924},
+       { 0xa404, 1, 0x1f, 0xfff},
+       { 0xa408, 2, 0x1f, 0x1fff},
+       { 0xa410, 7, 0x1f, 0x924},
+       { 0xa42c, 12, 0x1f, 0xfff},
+       { 0xa45c, 1, 0x1f, 0x924},
+       { 0xa460, 1, 0x1f, 0x1924},
+       { 0xa464, 15, 0x1f, 0x924},
+       { 0xa4a0, 1, 0x7, 0x924},
+       { 0xa4a4, 2, 0x1f, 0x924},
+       { 0xa4ac, 2, 0x3, 0x924},
+       { 0xa4b4, 1, 0x7, 0x924},
+       { 0xa4b8, 2, 0x3, 0x924},
+       { 0xa4c0, 3, 0x1f, 0x924},
+       { 0xa4cc, 5, 0x3, 0x924},
+       { 0xa4e0, 3, 0x1f, 0x924},
+       { 0xa4fc, 2, 0x1f, 0x924},
+       { 0xa504, 1, 0x3, 0x924},
+       { 0xa508, 3, 0x1f, 0x924},
+       { 0xa518, 1, 0x1f, 0x924},
+       { 0xa520, 1, 0x1f, 0x924},
+       { 0xa528, 1, 0x1f, 0x924},
+       { 0xa530, 1, 0x1f, 0x924},
+       { 0xa538, 1, 0x1f, 0x924},
+       { 0xa540, 1, 0x1f, 0x924},
+       { 0xa548, 1, 0x3, 0x924},
+       { 0xa550, 1, 0x3, 0x924},
+       { 0xa558, 1, 0x3, 0x924},
+       { 0xa560, 1, 0x3, 0x924},
+       { 0xa568, 1, 0x3, 0x924},
+       { 0xa570, 1, 0x1f, 0x924},
+       { 0xa580, 1, 0x1f, 0x1fff},
+       { 0xa590, 1, 0x1f, 0x1fff},
+       { 0xa5a0, 1, 0x7, 0x924},
+       { 0xa5c0, 1, 0x1f, 0x924},
+       { 0xa5e0, 1, 0x1e, 0x924},
+       { 0xa5e8, 1, 0x1e, 0x924},
+       { 0xa5f0, 1, 0x1e, 0x924},
+       { 0xa5f8, 1, 0x6, 0x924},
+       { 0xa5fc, 1, 0x1e, 0x924},
+       { 0xa600, 5, 0x1e, 0xfff},
+       { 0xa614, 1, 0x1e, 0x924},
+       { 0xa618, 1, 0x1e, 0xfff},
+       { 0xa61c, 1, 0x1e, 0x924},
+       { 0xa620, 6, 0x1c, 0x924},
+       { 0xa638, 20, 0x4, 0x924},
+       { 0xa688, 35, 0x1c, 0x924},
+       { 0xa714, 1, 0x1c, 0xfff},
+       { 0xa718, 2, 0x1c, 0x924},
+       { 0xa720, 1, 0x1c, 0xfff},
+       { 0xa724, 3, 0x1c, 0x924},
+       { 0xa730, 1, 0x4, 0x924},
+       { 0xa734, 2, 0x1c, 0x924},
+       { 0xa73c, 4, 0x4, 0x924},
+       { 0xa74c, 1, 0x1c, 0x924},
+       { 0xa750, 1, 0x1c, 0xfff},
+       { 0xa754, 3, 0x1c, 0x924},
+       { 0xa760, 5, 0x4, 0x924},
+       { 0xa774, 7, 0x1c, 0x924},
+       { 0xa790, 15, 0x4, 0x924},
+       { 0xa7cc, 4, 0x1c, 0x924},
+       { 0xa7e0, 6, 0x18, 0x924},
+       { 0xa800, 18, 0x4, 0x924},
+       { 0xa848, 33, 0x1c, 0x924},
+       { 0xa8cc, 2, 0x18, 0x924},
+       { 0xa8d4, 4, 0x1c, 0x924},
+       { 0xa8e4, 1, 0x18, 0x924},
+       { 0xa8e8, 1, 0x1c, 0x924},
+       { 0xa8f0, 1, 0x1c, 0x924},
+       { 0xa8f8, 30, 0x18, 0x924},
+       { 0xa974, 73, 0x18, 0x924},
+       { 0xac30, 1, 0x18, 0x924},
+       { 0xac40, 1, 0x18, 0x924},
+       { 0xac50, 1, 0x18, 0x924},
+       { 0xac60, 1, 0x10, 0x924},
+       { 0x10000, 9, 0x1f, 0x924},
+       { 0x10024, 1, 0x7, 0x924},
+       { 0x10028, 5, 0x1f, 0x924},
+       { 0x1003c, 6, 0x7, 0x924},
+       { 0x10054, 20, 0x1f, 0x924},
+       { 0x100a4, 4, 0x7, 0x924},
+       { 0x100b4, 11, 0x1f, 0x924},
+       { 0x100e0, 4, 0x7, 0x924},
+       { 0x100f0, 8, 0x1f, 0x924},
+       { 0x10110, 6, 0x7, 0x924},
+       { 0x10128, 110, 0x1f, 0x924},
+       { 0x102e0, 4, 0x7, 0x924},
+       { 0x102f0, 18, 0x1f, 0x924},
+       { 0x10338, 20, 0x7, 0x924},
+       { 0x10388, 10, 0x1f, 0x924},
+       { 0x103d0, 2, 0x3, 0x1fff},
+       { 0x103dc, 1, 0x3, 0x1fff},
+       { 0x10400, 6, 0x7, 0x924},
+       { 0x10418, 1, 0x1f, 0xfff},
+       { 0x1041c, 1, 0x1f, 0x924},
+       { 0x10420, 1, 0x1f, 0xfff},
+       { 0x10424, 1, 0x1f, 0x924},
+       { 0x10428, 1, 0x1f, 0xfff},
+       { 0x1042c, 1, 0x1f, 0x924},
+       { 0x10430, 10, 0x7, 0x924},
+       { 0x10458, 2, 0x1f, 0x924},
+       { 0x10460, 1, 0x1f, 0xfff},
+       { 0x10464, 4, 0x1f, 0x924},
+       { 0x10474, 1, 0x1f, 0xfff},
+       { 0x10478, 14, 0x1f, 0x924},
+       { 0x104b0, 12, 0x7, 0x924},
+       { 0x104e0, 1, 0x1f, 0xfff},
+       { 0x104e8, 1, 0x1f, 0x924},
+       { 0x104ec, 1, 0x1f, 0xfff},
+       { 0x104f4, 1, 0x1f, 0x924},
+       { 0x104f8, 1, 0x1f, 0xfff},
+       { 0x10500, 2, 0x1f, 0x924},
+       { 0x10508, 1, 0x1f, 0xfff},
+       { 0x1050c, 9, 0x1f, 0x924},
+       { 0x10530, 1, 0x1f, 0xfff},
+       { 0x10534, 1, 0x1f, 0x924},
+       { 0x10538, 1, 0x1f, 0xfff},
+       { 0x1053c, 3, 0x1f, 0x924},
+       { 0x10548, 1, 0x1f, 0xfff},
+       { 0x1054c, 3, 0x1f, 0x924},
+       { 0x10558, 1, 0x1f, 0xfff},
+       { 0x1055c, 123, 0x1f, 0x924},
+       { 0x10750, 2, 0x7, 0x924},
+       { 0x10760, 2, 0x7, 0x924},
+       { 0x10770, 2, 0x7, 0x924},
+       { 0x10780, 2, 0x7, 0x924},
+       { 0x10790, 2, 0x1f, 0x924},
+       { 0x107a0, 2, 0x7, 0x924},
+       { 0x107b0, 2, 0x7, 0x924},
+       { 0x107c0, 2, 0x7, 0x924},
+       { 0x107d0, 2, 0x7, 0x924},
+       { 0x107e0, 2, 0x1f, 0x924},
+       { 0x10880, 2, 0x1f, 0x924},
+       { 0x10900, 2, 0x1f, 0x924},
+       { 0x16000, 1, 0x6, 0x924},
+       { 0x16004, 25, 0x1e, 0x924},
+       { 0x16070, 8, 0x1e, 0x924},
+       { 0x16090, 4, 0xe, 0x924},
+       { 0x160a0, 6, 0x1e, 0x924},
+       { 0x160c0, 7, 0x1e, 0x924},
+       { 0x160dc, 2, 0x6, 0x924},
+       { 0x160e4, 6, 0x1e, 0x924},
+       { 0x160fc, 4, 0x1e, 0x1fff},
+       { 0x1610c, 2, 0x6, 0x924},
+       { 0x16114, 6, 0x1e, 0x924},
+       { 0x16140, 48, 0x1e, 0x1fff},
+       { 0x16204, 5, 0x1e, 0x924},
+       { 0x18000, 1, 0x1e, 0x924},
+       { 0x18008, 1, 0x1e, 0x924},
+       { 0x18010, 35, 0x1c, 0x924},
+       { 0x180a4, 2, 0x1c, 0x924},
+       { 0x180c0, 9, 0x1c, 0x924},
+       { 0x180e4, 1, 0xc, 0x924},
+       { 0x180e8, 2, 0x1c, 0x924},
+       { 0x180f0, 1, 0xc, 0x924},
+       { 0x180f4, 79, 0x1c, 0x924},
+       { 0x18230, 1, 0xc, 0x924},
+       { 0x18234, 2, 0x1c, 0x924},
+       { 0x1823c, 1, 0xc, 0x924},
+       { 0x18240, 13, 0x1c, 0x924},
+       { 0x18274, 1, 0x4, 0x924},
+       { 0x18278, 12, 0x1c, 0x924},
+       { 0x182a8, 1, 0x1c, 0xfff},
+       { 0x182ac, 3, 0x1c, 0x924},
+       { 0x182b8, 1, 0x1c, 0xfff},
+       { 0x182bc, 19, 0x1c, 0x924},
+       { 0x18308, 1, 0x1c, 0xfff},
+       { 0x1830c, 3, 0x1c, 0x924},
+       { 0x18318, 1, 0x1c, 0xfff},
+       { 0x1831c, 7, 0x1c, 0x924},
+       { 0x18338, 1, 0x1c, 0xfff},
+       { 0x1833c, 3, 0x1c, 0x924},
+       { 0x18348, 1, 0x1c, 0xfff},
+       { 0x1834c, 28, 0x1c, 0x924},
+       { 0x183bc, 2, 0x1c, 0x1fff},
+       { 0x183c8, 3, 0x1c, 0x1fff},
+       { 0x183d8, 1, 0x1c, 0x1fff},
+       { 0x18440, 48, 0x1c, 0x1fff},
+       { 0x18500, 15, 0x1c, 0x924},
+       { 0x18570, 1, 0x18, 0xfff},
+       { 0x18574, 1, 0x18, 0x924},
+       { 0x18578, 1, 0x18, 0xfff},
+       { 0x1857c, 4, 0x18, 0x924},
+       { 0x1858c, 1, 0x18, 0xfff},
+       { 0x18590, 1, 0x18, 0x924},
+       { 0x18594, 1, 0x18, 0xfff},
+       { 0x18598, 32, 0x18, 0x924},
+       { 0x18618, 5, 0x10, 0x924},
+       { 0x1862c, 4, 0x10, 0xfff},
+       { 0x1863c, 16, 0x10, 0x924},
+       { 0x18680, 44, 0x10, 0x924},
+       { 0x18748, 12, 0x10, 0x924},
+       { 0x18788, 1, 0x10, 0x924},
+       { 0x1879c, 6, 0x10, 0x924},
+       { 0x187c4, 51, 0x10, 0x924},
+       { 0x18a00, 48, 0x10, 0x924},
+       { 0x20000, 24, 0x1f, 0x924},
+       { 0x20060, 8, 0x1f, 0x9e4},
+       { 0x20080, 94, 0x1f, 0x924},
+       { 0x201f8, 1, 0x3, 0x924},
+       { 0x201fc, 1, 0x1f, 0x924},
+       { 0x20200, 1, 0x3, 0x924},
+       { 0x20204, 1, 0x1f, 0x924},
+       { 0x20208, 1, 0x3, 0x924},
+       { 0x2020c, 4, 0x1f, 0x924},
+       { 0x2021c, 11, 0x1f, 0xfff},
+       { 0x20248, 24, 0x1f, 0x924},
+       { 0x202b8, 2, 0x1f, 0x1fff},
+       { 0x202c4, 1, 0x1f, 0x1fff},
+       { 0x202c8, 1, 0x1c, 0x924},
+       { 0x202d8, 4, 0x1c, 0x924},
+       { 0x202f0, 1, 0x10, 0x924},
+       { 0x20400, 1, 0x1f, 0x924},
+       { 0x20404, 1, 0x1f, 0xfff},
+       { 0x2040c, 2, 0x1f, 0xfff},
+       { 0x20414, 2, 0x1f, 0x924},
+       { 0x2041c, 2, 0x1f, 0xfff},
+       { 0x20424, 2, 0x1f, 0x924},
+       { 0x2042c, 18, 0x1e, 0x924},
+       { 0x20480, 1, 0x1f, 0x924},
+       { 0x20500, 1, 0x1f, 0x924},
+       { 0x20600, 1, 0x1f, 0x924},
+       { 0x28000, 1, 0x1f, 0x9e4},
+       { 0x28004, 255, 0x1f, 0x180},
+       { 0x28400, 1, 0x1f, 0x1c0},
+       { 0x28404, 255, 0x1f, 0x180},
+       { 0x28800, 1, 0x1f, 0x1c0},
+       { 0x28804, 255, 0x1f, 0x180},
+       { 0x28c00, 1, 0x1f, 0x1c0},
+       { 0x28c04, 255, 0x1f, 0x180},
+       { 0x29000, 1, 0x1f, 0x1c0},
+       { 0x29004, 255, 0x1f, 0x180},
+       { 0x29400, 1, 0x1f, 0x1c0},
+       { 0x29404, 255, 0x1f, 0x180},
+       { 0x29800, 1, 0x1f, 0x1c0},
+       { 0x29804, 255, 0x1f, 0x180},
+       { 0x29c00, 1, 0x1f, 0x1c0},
+       { 0x29c04, 255, 0x1f, 0x180},
+       { 0x2a000, 1, 0x1f, 0x1c0},
+       { 0x2a004, 255, 0x1f, 0x180},
+       { 0x2a400, 1, 0x1f, 0x1c0},
+       { 0x2a404, 255, 0x1f, 0x180},
+       { 0x2a800, 1, 0x1f, 0x1c0},
+       { 0x2a804, 255, 0x1f, 0x180},
+       { 0x2ac00, 1, 0x1f, 0x1c0},
+       { 0x2ac04, 255, 0x1f, 0x180},
+       { 0x2b000, 1, 0x1f, 0x1c0},
+       { 0x2b004, 255, 0x1f, 0x180},
+       { 0x2b400, 1, 0x1f, 0x1c0},
+       { 0x2b404, 255, 0x1f, 0x180},
+       { 0x2b800, 1, 0x1f, 0x1c0},
+       { 0x2b804, 255, 0x1f, 0x180},
+       { 0x2bc00, 1, 0x1f, 0x1c0},
+       { 0x2bc04, 255, 0x1f, 0x180},
+       { 0x2c000, 1, 0x1f, 0x1c0},
+       { 0x2c004, 255, 0x1f, 0x180},
+       { 0x2c400, 1, 0x1f, 0x1c0},
+       { 0x2c404, 255, 0x1f, 0x180},
+       { 0x2c800, 1, 0x1f, 0x1c0},
+       { 0x2c804, 255, 0x1f, 0x180},
+       { 0x2cc00, 1, 0x1f, 0x1c0},
+       { 0x2cc04, 255, 0x1f, 0x180},
+       { 0x2d000, 1, 0x1f, 0x1c0},
+       { 0x2d004, 255, 0x1f, 0x180},
+       { 0x2d400, 1, 0x1f, 0x1c0},
+       { 0x2d404, 255, 0x1f, 0x180},
+       { 0x2d800, 1, 0x1f, 0x1c0},
+       { 0x2d804, 255, 0x1f, 0x180},
+       { 0x2dc00, 1, 0x1f, 0x1c0},
+       { 0x2dc04, 255, 0x1f, 0x180},
+       { 0x2e000, 1, 0x1f, 0x1c0},
+       { 0x2e004, 255, 0x1f, 0x180},
+       { 0x2e400, 1, 0x1f, 0x1c0},
+       { 0x2e404, 255, 0x1f, 0x180},
+       { 0x2e800, 1, 0x1f, 0x1c0},
+       { 0x2e804, 255, 0x1f, 0x180},
+       { 0x2ec00, 1, 0x1f, 0x1c0},
+       { 0x2ec04, 255, 0x1f, 0x180},
+       { 0x2f000, 1, 0x1f, 0x1c0},
+       { 0x2f004, 255, 0x1f, 0x180},
+       { 0x2f400, 1, 0x1f, 0x1c0},
+       { 0x2f404, 255, 0x1f, 0x180},
+       { 0x2f800, 1, 0x1f, 0x1c0},
+       { 0x2f804, 255, 0x1f, 0x180},
+       { 0x2fc00, 1, 0x1f, 0x1c0},
+       { 0x2fc04, 255, 0x1f, 0x180},
+       { 0x30000, 1, 0x1f, 0x9e4},
+       { 0x30004, 255, 0x1f, 0x180},
+       { 0x30400, 1, 0x1f, 0x1c0},
+       { 0x30404, 255, 0x1f, 0x180},
+       { 0x30800, 1, 0x1f, 0x1c0},
+       { 0x30804, 255, 0x1f, 0x180},
+       { 0x30c00, 1, 0x1f, 0x1c0},
+       { 0x30c04, 255, 0x1f, 0x180},
+       { 0x31000, 1, 0x1f, 0x1c0},
+       { 0x31004, 255, 0x1f, 0x180},
+       { 0x31400, 1, 0x1f, 0x1c0},
+       { 0x31404, 255, 0x1f, 0x180},
+       { 0x31800, 1, 0x1f, 0x1c0},
+       { 0x31804, 255, 0x1f, 0x180},
+       { 0x31c00, 1, 0x1f, 0x1c0},
+       { 0x31c04, 255, 0x1f, 0x180},
+       { 0x32000, 1, 0x1f, 0x1c0},
+       { 0x32004, 255, 0x1f, 0x180},
+       { 0x32400, 1, 0x1f, 0x1c0},
+       { 0x32404, 255, 0x1f, 0x180},
+       { 0x32800, 1, 0x1f, 0x1c0},
+       { 0x32804, 255, 0x1f, 0x180},
+       { 0x32c00, 1, 0x1f, 0x1c0},
+       { 0x32c04, 255, 0x1f, 0x180},
+       { 0x33000, 1, 0x1f, 0x1c0},
+       { 0x33004, 255, 0x1f, 0x180},
+       { 0x33400, 1, 0x1f, 0x1c0},
+       { 0x33404, 255, 0x1f, 0x180},
+       { 0x33800, 1, 0x1f, 0x1c0},
+       { 0x33804, 255, 0x1f, 0x180},
+       { 0x33c00, 1, 0x1f, 0x1c0},
+       { 0x33c04, 255, 0x1f, 0x180},
+       { 0x34000, 1, 0x1f, 0x1c0},
+       { 0x34004, 255, 0x1f, 0x180},
+       { 0x34400, 1, 0x1f, 0x1c0},
+       { 0x34404, 255, 0x1f, 0x180},
+       { 0x34800, 1, 0x1f, 0x1c0},
+       { 0x34804, 255, 0x1f, 0x180},
+       { 0x34c00, 1, 0x1f, 0x1c0},
+       { 0x34c04, 255, 0x1f, 0x180},
+       { 0x35000, 1, 0x1f, 0x1c0},
+       { 0x35004, 255, 0x1f, 0x180},
+       { 0x35400, 1, 0x1f, 0x1c0},
+       { 0x35404, 255, 0x1f, 0x180},
+       { 0x35800, 1, 0x1f, 0x1c0},
+       { 0x35804, 255, 0x1f, 0x180},
+       { 0x35c00, 1, 0x1f, 0x1c0},
+       { 0x35c04, 255, 0x1f, 0x180},
+       { 0x36000, 1, 0x1f, 0x1c0},
+       { 0x36004, 255, 0x1f, 0x180},
+       { 0x36400, 1, 0x1f, 0x1c0},
+       { 0x36404, 255, 0x1f, 0x180},
+       { 0x36800, 1, 0x1f, 0x1c0},
+       { 0x36804, 255, 0x1f, 0x180},
+       { 0x36c00, 1, 0x1f, 0x1c0},
+       { 0x36c04, 255, 0x1f, 0x180},
+       { 0x37000, 1, 0x1f, 0x1c0},
+       { 0x37004, 255, 0x1f, 0x180},
+       { 0x37400, 1, 0x1f, 0x1c0},
+       { 0x37404, 255, 0x1f, 0x180},
+       { 0x37800, 1, 0x1f, 0x1c0},
+       { 0x37804, 255, 0x1f, 0x180},
+       { 0x37c00, 1, 0x1f, 0x1c0},
+       { 0x37c04, 255, 0x1f, 0x180},
+       { 0x38000, 1, 0x1f, 0x1c0},
+       { 0x38004, 255, 0x1f, 0x180},
+       { 0x38400, 1, 0x1f, 0x1c0},
+       { 0x38404, 255, 0x1f, 0x180},
+       { 0x38800, 1, 0x1f, 0x1c0},
+       { 0x38804, 255, 0x1f, 0x180},
+       { 0x38c00, 1, 0x1f, 0x1c0},
+       { 0x38c04, 255, 0x1f, 0x180},
+       { 0x39000, 1, 0x1f, 0x1c0},
+       { 0x39004, 255, 0x1f, 0x180},
+       { 0x39400, 1, 0x1f, 0x1c0},
+       { 0x39404, 255, 0x1f, 0x180},
+       { 0x39800, 1, 0x1f, 0x1c0},
+       { 0x39804, 255, 0x1f, 0x180},
+       { 0x39c00, 1, 0x1f, 0x1c0},
+       { 0x39c04, 255, 0x1f, 0x180},
+       { 0x3a000, 1, 0x1f, 0x1c0},
+       { 0x3a004, 255, 0x1f, 0x180},
+       { 0x3a400, 1, 0x1f, 0x1c0},
+       { 0x3a404, 255, 0x1f, 0x180},
+       { 0x3a800, 1, 0x1f, 0x1c0},
+       { 0x3a804, 255, 0x1f, 0x180},
+       { 0x3ac00, 1, 0x1f, 0x1c0},
+       { 0x3ac04, 255, 0x1f, 0x180},
+       { 0x3b000, 1, 0x1f, 0x1c0},
+       { 0x3b004, 255, 0x1f, 0x180},
+       { 0x3b400, 1, 0x1f, 0x1c0},
+       { 0x3b404, 255, 0x1f, 0x180},
+       { 0x3b800, 1, 0x1f, 0x1c0},
+       { 0x3b804, 255, 0x1f, 0x180},
+       { 0x3bc00, 1, 0x1f, 0x1c0},
+       { 0x3bc04, 255, 0x1f, 0x180},
+       { 0x3c000, 1, 0x1f, 0x1c0},
+       { 0x3c004, 255, 0x1f, 0x180},
+       { 0x3c400, 1, 0x1f, 0x1c0},
+       { 0x3c404, 255, 0x1f, 0x180},
+       { 0x3c800, 1, 0x1f, 0x1c0},
+       { 0x3c804, 255, 0x1f, 0x180},
+       { 0x3cc00, 1, 0x1f, 0x1c0},
+       { 0x3cc04, 255, 0x1f, 0x180},
+       { 0x3d000, 1, 0x1f, 0x1c0},
+       { 0x3d004, 255, 0x1f, 0x180},
+       { 0x3d400, 1, 0x1f, 0x1c0},
+       { 0x3d404, 255, 0x1f, 0x180},
+       { 0x3d800, 1, 0x1f, 0x1c0},
+       { 0x3d804, 255, 0x1f, 0x180},
+       { 0x3dc00, 1, 0x1f, 0x1c0},
+       { 0x3dc04, 255, 0x1f, 0x180},
+       { 0x3e000, 1, 0x1f, 0x1c0},
+       { 0x3e004, 255, 0x1f, 0x180},
+       { 0x3e400, 1, 0x1f, 0x1c0},
+       { 0x3e404, 255, 0x1f, 0x180},
+       { 0x3e800, 1, 0x1f, 0x1c0},
+       { 0x3e804, 255, 0x1f, 0x180},
+       { 0x3ec00, 1, 0x1f, 0x1c0},
+       { 0x3ec04, 255, 0x1f, 0x180},
+       { 0x3f000, 1, 0x1f, 0x1c0},
+       { 0x3f004, 255, 0x1f, 0x180},
+       { 0x3f400, 1, 0x1f, 0x1c0},
+       { 0x3f404, 255, 0x1f, 0x180},
+       { 0x3f800, 1, 0x1f, 0x1c0},
+       { 0x3f804, 255, 0x1f, 0x180},
+       { 0x3fc00, 1, 0x1f, 0x1c0},
+       { 0x3fc04, 255, 0x1f, 0x180},
+       { 0x40000, 85, 0x1f, 0x924},
+       { 0x40154, 13, 0x1f, 0xfff},
+       { 0x40198, 2, 0x1f, 0x1fff},
+       { 0x401a4, 1, 0x1f, 0x1fff},
+       { 0x401a8, 8, 0x1e, 0x924},
+       { 0x401c8, 1, 0x2, 0x924},
+       { 0x401cc, 2, 0x1e, 0x924},
+       { 0x401d4, 2, 0x1c, 0x924},
+       { 0x40200, 4, 0x1f, 0x924},
+       { 0x40220, 6, 0x1c, 0x924},
+       { 0x40238, 8, 0xc, 0x924},
+       { 0x40258, 4, 0x1c, 0x924},
+       { 0x40268, 2, 0x18, 0x924},
+       { 0x40270, 17, 0x10, 0x924},
+       { 0x40400, 43, 0x1f, 0x924},
+       { 0x404bc, 2, 0x1f, 0x1fff},
+       { 0x404c8, 1, 0x1f, 0x1fff},
+       { 0x404cc, 3, 0x1e, 0x924},
+       { 0x404e0, 1, 0x1c, 0x924},
+       { 0x40500, 2, 0x1f, 0x924},
+       { 0x40510, 2, 0x1f, 0x924},
+       { 0x40520, 2, 0x1f, 0x924},
+       { 0x40530, 2, 0x1f, 0x924},
+       { 0x40540, 2, 0x1f, 0x924},
+       { 0x40550, 10, 0x1c, 0x924},
+       { 0x40610, 2, 0x1c, 0x924},
+       { 0x42000, 164, 0x1f, 0x924},
+       { 0x422b0, 2, 0x1f, 0x1fff},
+       { 0x422bc, 1, 0x1f, 0x1fff},
+       { 0x422c0, 4, 0x1c, 0x924},
+       { 0x422d4, 5, 0x1e, 0x924},
+       { 0x422e8, 1, 0x1c, 0x924},
+       { 0x42400, 49, 0x1f, 0x924},
+       { 0x424c8, 32, 0x1f, 0x924},
+       { 0x42548, 1, 0x1f, 0xfff},
+       { 0x4254c, 1, 0x1f, 0x924},
+       { 0x42550, 1, 0x1f, 0xfff},
+       { 0x42554, 1, 0x1f, 0x924},
+       { 0x42558, 1, 0x1f, 0xfff},
+       { 0x4255c, 1, 0x1f, 0x924},
+       { 0x42568, 2, 0x1f, 0x924},
+       { 0x42640, 5, 0x1c, 0x924},
+       { 0x42800, 1, 0x1f, 0x924},
+       { 0x50000, 1, 0x1f, 0x1fff},
+       { 0x50004, 19, 0x1f, 0x924},
+       { 0x50050, 8, 0x1f, 0x93c},
+       { 0x50070, 60, 0x1f, 0x924},
+       { 0x50160, 8, 0x1f, 0xfff},
+       { 0x50180, 20, 0x1f, 0x924},
+       { 0x501e0, 2, 0x1f, 0x1fff},
+       { 0x501ec, 1, 0x1f, 0x1fff},
+       { 0x501f0, 4, 0x1e, 0x924},
+       { 0x50200, 1, 0x1f, 0x924},
+       { 0x50204, 1, 0x1f, 0xfff},
+       { 0x5020c, 2, 0x1f, 0xfff},
+       { 0x50214, 2, 0x1f, 0x924},
+       { 0x5021c, 1, 0x1f, 0xfff},
+       { 0x50220, 2, 0x1f, 0x924},
+       { 0x50228, 6, 0x1e, 0x924},
+       { 0x50240, 1, 0x1f, 0x924},
+       { 0x50280, 1, 0x1f, 0x924},
+       { 0x50300, 1, 0x1c, 0x924},
+       { 0x5030c, 1, 0x1c, 0x924},
+       { 0x50318, 1, 0x1c, 0x934},
+       { 0x5031c, 1, 0x1c, 0x924},
+       { 0x50320, 2, 0x1c, 0x934},
+       { 0x50330, 1, 0x10, 0x924},
+       { 0x52000, 1, 0x1f, 0x924},
+       { 0x54000, 1, 0x1f, 0x93c},
+       { 0x54004, 255, 0x1f, 0x30},
+       { 0x54400, 1, 0x1f, 0x38},
+       { 0x54404, 255, 0x1f, 0x30},
+       { 0x54800, 1, 0x1f, 0x38},
+       { 0x54804, 255, 0x1f, 0x30},
+       { 0x54c00, 1, 0x1f, 0x38},
+       { 0x54c04, 255, 0x1f, 0x30},
+       { 0x55000, 1, 0x1f, 0x38},
+       { 0x55004, 255, 0x1f, 0x30},
+       { 0x55400, 1, 0x1f, 0x38},
+       { 0x55404, 255, 0x1f, 0x30},
+       { 0x55800, 1, 0x1f, 0x38},
+       { 0x55804, 255, 0x1f, 0x30},
+       { 0x55c00, 1, 0x1f, 0x38},
+       { 0x55c04, 255, 0x1f, 0x30},
+       { 0x56000, 1, 0x1f, 0x38},
+       { 0x56004, 255, 0x1f, 0x30},
+       { 0x56400, 1, 0x1f, 0x38},
+       { 0x56404, 255, 0x1f, 0x30},
+       { 0x56800, 1, 0x1f, 0x38},
+       { 0x56804, 255, 0x1f, 0x30},
+       { 0x56c00, 1, 0x1f, 0x38},
+       { 0x56c04, 255, 0x1f, 0x30},
+       { 0x57000, 1, 0x1f, 0x38},
+       { 0x57004, 255, 0x1f, 0x30},
+       { 0x58000, 1, 0x1f, 0x934},
+       { 0x58004, 8191, 0x3, 0x30},
+       { 0x60000, 26, 0x1f, 0x924},
+       { 0x60068, 8, 0x3, 0x924},
+       { 0x60088, 2, 0x1f, 0x924},
+       { 0x60090, 1, 0x1f, 0xfff},
+       { 0x60094, 9, 0x1f, 0x924},
+       { 0x600b8, 9, 0x3, 0x924},
+       { 0x600dc, 1, 0x1f, 0x924},
+       { 0x600e0, 5, 0x3, 0x924},
+       { 0x600f4, 1, 0x7, 0x924},
+       { 0x600f8, 1, 0x3, 0x924},
+       { 0x600fc, 8, 0x1f, 0x924},
+       { 0x6012c, 2, 0x1f, 0x1fff},
+       { 0x60138, 1, 0x1f, 0x1fff},
+       { 0x6013c, 24, 0x2, 0x924},
+       { 0x6019c, 2, 0x1c, 0x924},
+       { 0x601ac, 18, 0x1c, 0x924},
+       { 0x60200, 1, 0x1f, 0xb6d},
+       { 0x60204, 2, 0x1f, 0x249},
+       { 0x60210, 13, 0x1c, 0x924},
+       { 0x60244, 16, 0x10, 0x924},
+       { 0x61000, 1, 0x1f, 0xb6d},
+       { 0x61004, 511, 0x1f, 0x249},
+       { 0x61800, 512, 0x18, 0x249},
+       { 0x70000, 8, 0x1f, 0xb6d},
+       { 0x70020, 8184, 0x1f, 0x249},
+       { 0x78000, 8192, 0x18, 0x249},
+       { 0x85000, 3, 0x1f, 0x1000},
+       { 0x8501c, 7, 0x1f, 0x1000},
+       { 0x85048, 1, 0x1f, 0x1000},
+       { 0x85200, 32, 0x1f, 0x1000},
+       { 0xa0000, 16384, 0x3, 0x1000},
+       { 0xb0000, 16384, 0x2, 0x1000},
+       { 0xc1000, 7, 0x1f, 0x924},
+       { 0xc102c, 2, 0x1f, 0x1fff},
+       { 0xc1038, 1, 0x1f, 0x1fff},
+       { 0xc103c, 2, 0x1c, 0x924},
+       { 0xc1800, 2, 0x1f, 0x924},
+       { 0xc2000, 164, 0x1f, 0x924},
+       { 0xc22b0, 2, 0x1f, 0x1fff},
+       { 0xc22bc, 1, 0x1f, 0x1fff},
+       { 0xc22c0, 5, 0x1c, 0x924},
+       { 0xc22d8, 4, 0x1c, 0x924},
+       { 0xc2400, 49, 0x1f, 0x924},
+       { 0xc24c8, 32, 0x1f, 0x924},
+       { 0xc2548, 1, 0x1f, 0xfff},
+       { 0xc254c, 1, 0x1f, 0x924},
+       { 0xc2550, 1, 0x1f, 0xfff},
+       { 0xc2554, 1, 0x1f, 0x924},
+       { 0xc2558, 1, 0x1f, 0xfff},
+       { 0xc255c, 1, 0x1f, 0x924},
+       { 0xc2568, 2, 0x1f, 0x924},
+       { 0xc2600, 1, 0x1f, 0x924},
+       { 0xc4000, 165, 0x1f, 0x924},
+       { 0xc42b4, 2, 0x1f, 0x1fff},
+       { 0xc42c0, 1, 0x1f, 0x1fff},
+       { 0xc42d8, 2, 0x1c, 0x924},
+       { 0xc42e0, 7, 0x1e, 0x924},
+       { 0xc42fc, 1, 0x1c, 0x924},
+       { 0xc4400, 51, 0x1f, 0x924},
+       { 0xc44d0, 32, 0x1f, 0x924},
+       { 0xc4550, 1, 0x1f, 0xfff},
+       { 0xc4554, 1, 0x1f, 0x924},
+       { 0xc4558, 1, 0x1f, 0xfff},
+       { 0xc455c, 1, 0x1f, 0x924},
+       { 0xc4560, 1, 0x1f, 0xfff},
+       { 0xc4564, 1, 0x1f, 0x924},
+       { 0xc4570, 2, 0x1f, 0x924},
+       { 0xc4578, 5, 0x1c, 0x924},
+       { 0xc4600, 1, 0x1f, 0x924},
+       { 0xd0000, 19, 0x1f, 0x924},
+       { 0xd004c, 8, 0x1f, 0x1927},
+       { 0xd006c, 64, 0x1f, 0x924},
+       { 0xd016c, 8, 0x1f, 0xfff},
+       { 0xd018c, 19, 0x1f, 0x924},
+       { 0xd01e8, 2, 0x1f, 0x1fff},
+       { 0xd01f4, 1, 0x1f, 0x1fff},
+       { 0xd01fc, 1, 0x1c, 0x924},
+       { 0xd0200, 1, 0x1f, 0x924},
+       { 0xd0204, 1, 0x1f, 0xfff},
+       { 0xd020c, 3, 0x1f, 0xfff},
+       { 0xd0218, 4, 0x1f, 0x924},
+       { 0xd0228, 18, 0x1e, 0x924},
+       { 0xd0280, 1, 0x1f, 0x924},
+       { 0xd0300, 1, 0x1f, 0x924},
+       { 0xd0400, 1, 0x1f, 0x924},
+       { 0xd0818, 1, 0x10, 0x924},
+       { 0xd4000, 1, 0x1f, 0x1927},
+       { 0xd4004, 255, 0x1f, 0x6},
+       { 0xd4400, 1, 0x1f, 0x1007},
+       { 0xd4404, 255, 0x1f, 0x6},
+       { 0xd4800, 1, 0x1f, 0x1007},
+       { 0xd4804, 255, 0x1f, 0x6},
+       { 0xd4c00, 1, 0x1f, 0x1007},
+       { 0xd4c04, 255, 0x1f, 0x6},
+       { 0xd5000, 1, 0x1f, 0x1007},
+       { 0xd5004, 255, 0x1f, 0x6},
+       { 0xd5400, 1, 0x1f, 0x1007},
+       { 0xd5404, 255, 0x1f, 0x6},
+       { 0xd5800, 1, 0x1f, 0x1007},
+       { 0xd5804, 255, 0x1f, 0x6},
+       { 0xd5c00, 1, 0x1f, 0x1007},
+       { 0xd5c04, 255, 0x1f, 0x6},
+       { 0xd6000, 1, 0x1f, 0x1007},
+       { 0xd6004, 255, 0x1f, 0x6},
+       { 0xd6400, 1, 0x1f, 0x1007},
+       { 0xd6404, 255, 0x1f, 0x6},
+       { 0xd8000, 1, 0x1f, 0x1927},
+       { 0xd8004, 255, 0x1f, 0x6},
+       { 0xd8400, 1, 0x1f, 0x1007},
+       { 0xd8404, 255, 0x1f, 0x6},
+       { 0xd8800, 1, 0x1f, 0x1007},
+       { 0xd8804, 255, 0x1f, 0x6},
+       { 0xd8c00, 1, 0x1f, 0x1007},
+       { 0xd8c04, 255, 0x1f, 0x6},
+       { 0xd9000, 1, 0x1f, 0x1007},
+       { 0xd9004, 255, 0x1f, 0x6},
+       { 0xd9400, 1, 0x1f, 0x1007},
+       { 0xd9404, 255, 0x1f, 0x6},
+       { 0xd9800, 1, 0x1f, 0x1007},
+       { 0xd9804, 255, 0x1f, 0x6},
+       { 0xd9c00, 1, 0x1f, 0x1007},
+       { 0xd9c04, 255, 0x1f, 0x6},
+       { 0xda000, 1, 0x1f, 0x1007},
+       { 0xda004, 255, 0x1f, 0x6},
+       { 0xda400, 1, 0x1f, 0x1007},
+       { 0xda404, 255, 0x1f, 0x6},
+       { 0xda800, 1, 0x1f, 0x1007},
+       { 0xda804, 255, 0x1f, 0x6},
+       { 0xdac00, 1, 0x1f, 0x1007},
+       { 0xdac04, 255, 0x1f, 0x6},
+       { 0xdb000, 1, 0x1f, 0x1007},
+       { 0xdb004, 255, 0x1f, 0x6},
+       { 0xdb400, 1, 0x1f, 0x1007},
+       { 0xdb404, 255, 0x1f, 0x6},
+       { 0xdb800, 1, 0x1f, 0x1007},
+       { 0xdb804, 255, 0x1f, 0x6},
+       { 0xdbc00, 1, 0x1f, 0x1007},
+       { 0xdbc04, 255, 0x1f, 0x6},
+       { 0xdc000, 1, 0x1f, 0x1007},
+       { 0xdc004, 255, 0x1f, 0x6},
+       { 0xdc400, 1, 0x1f, 0x1007},
+       { 0xdc404, 255, 0x1f, 0x6},
+       { 0xdc800, 1, 0x1f, 0x1007},
+       { 0xdc804, 255, 0x1f, 0x6},
+       { 0xdcc00, 1, 0x1f, 0x1007},
+       { 0xdcc04, 255, 0x1f, 0x6},
+       { 0xdd000, 1, 0x1f, 0x1007},
+       { 0xdd004, 255, 0x1f, 0x6},
+       { 0xdd400, 1, 0x1f, 0x1007},
+       { 0xdd404, 255, 0x1f, 0x6},
+       { 0xdd800, 1, 0x1f, 0x1007},
+       { 0xdd804, 255, 0x1f, 0x6},
+       { 0xddc00, 1, 0x1f, 0x1007},
+       { 0xddc04, 255, 0x1f, 0x6},
+       { 0xde000, 1, 0x1f, 0x1007},
+       { 0xde004, 255, 0x1f, 0x6},
+       { 0xde400, 1, 0x1f, 0x1007},
+       { 0xde404, 255, 0x1f, 0x6},
+       { 0xde800, 1, 0x1f, 0x1007},
+       { 0xde804, 255, 0x1f, 0x6},
+       { 0xdec00, 1, 0x1f, 0x1007},
+       { 0xdec04, 255, 0x1f, 0x6},
+       { 0xdf000, 1, 0x1f, 0x1007},
+       { 0xdf004, 255, 0x1f, 0x6},
+       { 0xdf400, 1, 0x1f, 0x1007},
+       { 0xdf404, 255, 0x1f, 0x6},
+       { 0xdf800, 1, 0x1f, 0x1007},
+       { 0xdf804, 255, 0x1f, 0x6},
+       { 0xdfc00, 1, 0x1f, 0x1007},
+       { 0xdfc04, 255, 0x1f, 0x6},
+       { 0xe0000, 21, 0x1f, 0x924},
+       { 0xe0054, 8, 0x1f, 0xf24},
+       { 0xe0074, 49, 0x1f, 0x924},
+       { 0xe0138, 1, 0x3, 0x924},
+       { 0xe013c, 6, 0x1f, 0x924},
+       { 0xe0154, 8, 0x1f, 0xfff},
+       { 0xe0174, 21, 0x1f, 0x924},
+       { 0xe01d8, 2, 0x1f, 0x1fff},
+       { 0xe01e4, 1, 0x1f, 0x1fff},
+       { 0xe01f4, 1, 0x4, 0x924},
+       { 0xe01f8, 1, 0x1c, 0x924},
+       { 0xe0200, 1, 0x1f, 0x924},
+       { 0xe0204, 1, 0x1f, 0xfff},
+       { 0xe020c, 2, 0x1f, 0xfff},
+       { 0xe0214, 2, 0x1f, 0x924},
+       { 0xe021c, 2, 0x1f, 0xfff},
+       { 0xe0224, 2, 0x1f, 0x924},
+       { 0xe022c, 18, 0x1e, 0x924},
+       { 0xe0280, 1, 0x1f, 0x924},
+       { 0xe0300, 1, 0x1f, 0x924},
+       { 0xe0400, 1, 0x10, 0x924},
+       { 0xe1000, 1, 0x1f, 0x924},
+       { 0xe2000, 1, 0x1f, 0xf24},
+       { 0xe2004, 255, 0x1f, 0xc00},
+       { 0xe2400, 1, 0x1f, 0xe00},
+       { 0xe2404, 255, 0x1f, 0xc00},
+       { 0xe2800, 1, 0x1f, 0xe00},
+       { 0xe2804, 255, 0x1f, 0xc00},
+       { 0xe2c00, 1, 0x1f, 0xe00},
+       { 0xe2c04, 255, 0x1f, 0xc00},
+       { 0xe3000, 1, 0x1f, 0xe00},
+       { 0xe3004, 255, 0x1f, 0xc00},
+       { 0xe3400, 1, 0x1f, 0xe00},
+       { 0xe3404, 255, 0x1f, 0xc00},
+       { 0xe3800, 1, 0x1f, 0xe00},
+       { 0xe3804, 255, 0x1f, 0xc00},
+       { 0xe3c00, 1, 0x1f, 0xe00},
+       { 0xe3c04, 255, 0x1f, 0xc00},
+       { 0xf0000, 1, 0x1f, 0xf24},
+       { 0xf0004, 255, 0x1f, 0xc00},
+       { 0xf0400, 1, 0x1f, 0xe00},
+       { 0xf0404, 255, 0x1f, 0xc00},
+       { 0xf0800, 1, 0x1f, 0xe00},
+       { 0xf0804, 255, 0x1f, 0xc00},
+       { 0xf0c00, 1, 0x1f, 0xe00},
+       { 0xf0c04, 255, 0x1f, 0xc00},
+       { 0xf1000, 1, 0x1f, 0xe00},
+       { 0xf1004, 255, 0x1f, 0xc00},
+       { 0xf1400, 1, 0x1f, 0xe00},
+       { 0xf1404, 255, 0x1f, 0xc00},
+       { 0xf1800, 1, 0x1f, 0xe00},
+       { 0xf1804, 255, 0x1f, 0xc00},
+       { 0xf1c00, 1, 0x1f, 0xe00},
+       { 0xf1c04, 255, 0x1f, 0xc00},
+       { 0xf2000, 1, 0x1f, 0xe00},
+       { 0xf2004, 255, 0x1f, 0xc00},
+       { 0xf2400, 1, 0x1f, 0xe00},
+       { 0xf2404, 255, 0x1f, 0xc00},
+       { 0xf2800, 1, 0x1f, 0xe00},
+       { 0xf2804, 255, 0x1f, 0xc00},
+       { 0xf2c00, 1, 0x1f, 0xe00},
+       { 0xf2c04, 255, 0x1f, 0xc00},
+       { 0xf3000, 1, 0x1f, 0xe00},
+       { 0xf3004, 255, 0x1f, 0xc00},
+       { 0xf3400, 1, 0x1f, 0xe00},
+       { 0xf3404, 255, 0x1f, 0xc00},
+       { 0xf3800, 1, 0x1f, 0xe00},
+       { 0xf3804, 255, 0x1f, 0xc00},
+       { 0xf3c00, 1, 0x1f, 0xe00},
+       { 0xf3c04, 255, 0x1f, 0xc00},
+       { 0xf4000, 1, 0x1f, 0xe00},
+       { 0xf4004, 255, 0x1f, 0xc00},
+       { 0xf4400, 1, 0x1f, 0xe00},
+       { 0xf4404, 255, 0x1f, 0xc00},
+       { 0xf4800, 1, 0x1f, 0xe00},
+       { 0xf4804, 255, 0x1f, 0xc00},
+       { 0xf4c00, 1, 0x1f, 0xe00},
+       { 0xf4c04, 255, 0x1f, 0xc00},
+       { 0xf5000, 1, 0x1f, 0xe00},
+       { 0xf5004, 255, 0x1f, 0xc00},
+       { 0xf5400, 1, 0x1f, 0xe00},
+       { 0xf5404, 255, 0x1f, 0xc00},
+       { 0xf5800, 1, 0x1f, 0xe00},
+       { 0xf5804, 255, 0x1f, 0xc00},
+       { 0xf5c00, 1, 0x1f, 0xe00},
+       { 0xf5c04, 255, 0x1f, 0xc00},
+       { 0xf6000, 1, 0x1f, 0xe00},
+       { 0xf6004, 255, 0x1f, 0xc00},
+       { 0xf6400, 1, 0x1f, 0xe00},
+       { 0xf6404, 255, 0x1f, 0xc00},
+       { 0xf6800, 1, 0x1f, 0xe00},
+       { 0xf6804, 255, 0x1f, 0xc00},
+       { 0xf6c00, 1, 0x1f, 0xe00},
+       { 0xf6c04, 255, 0x1f, 0xc00},
+       { 0xf7000, 1, 0x1f, 0xe00},
+       { 0xf7004, 255, 0x1f, 0xc00},
+       { 0xf7400, 1, 0x1f, 0xe00},
+       { 0xf7404, 255, 0x1f, 0xc00},
+       { 0xf7800, 1, 0x1f, 0xe00},
+       { 0xf7804, 255, 0x1f, 0xc00},
+       { 0xf7c00, 1, 0x1f, 0xe00},
+       { 0xf7c04, 255, 0x1f, 0xc00},
+       { 0xf8000, 1, 0x1f, 0xe00},
+       { 0xf8004, 255, 0x1f, 0xc00},
+       { 0xf8400, 1, 0x1f, 0xe00},
+       { 0xf8404, 255, 0x1f, 0xc00},
+       { 0xf8800, 1, 0x1f, 0xe00},
+       { 0xf8804, 255, 0x1f, 0xc00},
+       { 0xf8c00, 1, 0x1f, 0xe00},
+       { 0xf8c04, 255, 0x1f, 0xc00},
+       { 0xf9000, 1, 0x1f, 0xe00},
+       { 0xf9004, 255, 0x1f, 0xc00},
+       { 0xf9400, 1, 0x1f, 0xe00},
+       { 0xf9404, 255, 0x1f, 0xc00},
+       { 0xf9800, 1, 0x1f, 0xe00},
+       { 0xf9804, 255, 0x1f, 0xc00},
+       { 0xf9c00, 1, 0x1f, 0xe00},
+       { 0xf9c04, 255, 0x1f, 0xc00},
+       { 0xfa000, 1, 0x1f, 0xe00},
+       { 0xfa004, 255, 0x1f, 0xc00},
+       { 0xfa400, 1, 0x1f, 0xe00},
+       { 0xfa404, 255, 0x1f, 0xc00},
+       { 0xfa800, 1, 0x1f, 0xe00},
+       { 0xfa804, 255, 0x1f, 0xc00},
+       { 0xfac00, 1, 0x1f, 0xe00},
+       { 0xfac04, 255, 0x1f, 0xc00},
+       { 0xfb000, 1, 0x1f, 0xe00},
+       { 0xfb004, 255, 0x1f, 0xc00},
+       { 0xfb400, 1, 0x1f, 0xe00},
+       { 0xfb404, 255, 0x1f, 0xc00},
+       { 0xfb800, 1, 0x1f, 0xe00},
+       { 0xfb804, 255, 0x1f, 0xc00},
+       { 0xfbc00, 1, 0x1f, 0xe00},
+       { 0xfbc04, 255, 0x1f, 0xc00},
+       { 0xfc000, 1, 0x1f, 0xe00},
+       { 0xfc004, 255, 0x1f, 0xc00},
+       { 0xfc400, 1, 0x1f, 0xe00},
+       { 0xfc404, 255, 0x1f, 0xc00},
+       { 0xfc800, 1, 0x1f, 0xe00},
+       { 0xfc804, 255, 0x1f, 0xc00},
+       { 0xfcc00, 1, 0x1f, 0xe00},
+       { 0xfcc04, 255, 0x1f, 0xc00},
+       { 0xfd000, 1, 0x1f, 0xe00},
+       { 0xfd004, 255, 0x1f, 0xc00},
+       { 0xfd400, 1, 0x1f, 0xe00},
+       { 0xfd404, 255, 0x1f, 0xc00},
+       { 0xfd800, 1, 0x1f, 0xe00},
+       { 0xfd804, 255, 0x1f, 0xc00},
+       { 0xfdc00, 1, 0x1f, 0xe00},
+       { 0xfdc04, 255, 0x1f, 0xc00},
+       { 0xfe000, 1, 0x1f, 0xe00},
+       { 0xfe004, 255, 0x1f, 0xc00},
+       { 0xfe400, 1, 0x1f, 0xe00},
+       { 0xfe404, 255, 0x1f, 0xc00},
+       { 0xfe800, 1, 0x1f, 0xe00},
+       { 0xfe804, 255, 0x1f, 0xc00},
+       { 0xfec00, 1, 0x1f, 0xe00},
+       { 0xfec04, 255, 0x1f, 0xc00},
+       { 0xff000, 1, 0x1f, 0xe00},
+       { 0xff004, 255, 0x1f, 0xc00},
+       { 0xff400, 1, 0x1f, 0xe00},
+       { 0xff404, 255, 0x1f, 0xc00},
+       { 0xff800, 1, 0x1f, 0xe00},
+       { 0xff804, 255, 0x1f, 0xc00},
+       { 0xffc00, 1, 0x1f, 0xe00},
+       { 0xffc04, 255, 0x1f, 0xc00},
+       { 0x101000, 5, 0x1f, 0x924},
+       { 0x101014, 1, 0x1f, 0xfff},
+       { 0x101018, 6, 0x1f, 0x924},
+       { 0x101040, 2, 0x1f, 0x1fff},
+       { 0x10104c, 1, 0x1f, 0x1fff},
+       { 0x101050, 1, 0x1e, 0x924},
+       { 0x101054, 3, 0x1c, 0x924},
+       { 0x101100, 1, 0x1f, 0x924},
+       { 0x101800, 8, 0x1f, 0x924},
+       { 0x102000, 18, 0x1f, 0x924},
+       { 0x102058, 2, 0x1f, 0x1fff},
+       { 0x102064, 1, 0x1f, 0x1fff},
+       { 0x102068, 6, 0x1c, 0x924},
+       { 0x102080, 16, 0x1f, 0xfff},
+       { 0x1020c0, 1, 0x1f, 0x924},
+       { 0x1020c8, 8, 0x2, 0x924},
+       { 0x1020e8, 9, 0x1c, 0x924},
+       { 0x102400, 1, 0x1f, 0x924},
+       { 0x103000, 1, 0x1f, 0x924},
+       { 0x103004, 2, 0x1f, 0xfff},
+       { 0x10300c, 23, 0x1f, 0x924},
+       { 0x103088, 2, 0x1f, 0x1fff},
+       { 0x103094, 1, 0x1f, 0x1fff},
+       { 0x103098, 1, 0x1e, 0x924},
+       { 0x10309c, 2, 0x1e, 0xfff},
+       { 0x1030a4, 2, 0x1e, 0x924},
+       { 0x1030ac, 2, 0x1c, 0x924},
+       { 0x1030b4, 1, 0x4, 0x924},
+       { 0x1030b8, 2, 0x1c, 0xfff},
+       { 0x1030c0, 3, 0x1c, 0x924},
+       { 0x1030cc, 1, 0x1c, 0xfff},
+       { 0x1030d0, 1, 0x1c, 0x924},
+       { 0x1030d8, 2, 0x1c, 0x924},
+       { 0x1030e0, 1, 0x1c, 0xfff},
+       { 0x1030e4, 5, 0x1c, 0x924},
+       { 0x103400, 136, 0x1c, 0x1fff},
+       { 0x103800, 8, 0x1f, 0x924},
+       { 0x104000, 1, 0x1f, 0x924},
+       { 0x104004, 1, 0x1f, 0xfff},
+       { 0x104008, 4, 0x1f, 0x924},
+       { 0x104018, 1, 0x1f, 0xfff},
+       { 0x10401c, 1, 0x1f, 0x924},
+       { 0x104020, 1, 0x1f, 0xfff},
+       { 0x104024, 6, 0x1f, 0x924},
+       { 0x10403c, 1, 0x1f, 0xfff},
+       { 0x104040, 47, 0x1f, 0x924},
+       { 0x10410c, 2, 0x1f, 0x1fff},
+       { 0x104118, 1, 0x1f, 0x1fff},
+       { 0x10411c, 16, 0x1c, 0x924},
+       { 0x104200, 17, 0x1f, 0x924},
+       { 0x104400, 1, 0x1f, 0x1fff},
+       { 0x104404, 63, 0x1f, 0xfff},
+       { 0x104500, 192, 0x1f, 0xdb6},
+       { 0x104800, 1, 0x1f, 0x1fff},
+       { 0x104804, 63, 0x1f, 0xfff},
+       { 0x104900, 192, 0x1f, 0xdb6},
+       { 0x105000, 4, 0x1f, 0x1fff},
+       { 0x105010, 252, 0x1f, 0xfff},
+       { 0x105400, 768, 0x1f, 0xdb6},
+       { 0x107000, 7, 0x1c, 0x924},
+       { 0x10701c, 1, 0x18, 0x924},
+       { 0x108000, 33, 0x3, 0x924},
+       { 0x1080ac, 5, 0x2, 0x924},
+       { 0x108100, 5, 0x3, 0x924},
+       { 0x108120, 5, 0x3, 0x924},
+       { 0x108200, 74, 0x3, 0x924},
+       { 0x108400, 74, 0x3, 0x924},
+       { 0x108800, 152, 0x3, 0x924},
+       { 0x110000, 111, 0x1c, 0x924},
+       { 0x1101cc, 2, 0x1c, 0x1fff},
+       { 0x1101d8, 1, 0x1c, 0x1fff},
+       { 0x1101dc, 1, 0x18, 0x924},
+       { 0x110200, 4, 0x1c, 0x924},
+       { 0x120000, 92, 0x1f, 0x924},
+       { 0x120170, 2, 0x3, 0x924},
+       { 0x120178, 14, 0x1f, 0x924},
+       { 0x1201b0, 2, 0x1f, 0xfff},
+       { 0x1201b8, 93, 0x1f, 0x924},
+       { 0x12032c, 1, 0x1f, 0xfff},
+       { 0x120330, 15, 0x1f, 0x924},
+       { 0x12036c, 3, 0x1f, 0xfff},
+       { 0x120378, 36, 0x1f, 0x924},
+       { 0x120408, 2, 0x1f, 0xfff},
+       { 0x120410, 1, 0x1f, 0x924},
+       { 0x120414, 15, 0x1f, 0xfff},
+       { 0x120450, 10, 0x1f, 0x924},
+       { 0x120478, 2, 0x1f, 0xfff},
+       { 0x120480, 43, 0x1f, 0x924},
+       { 0x12052c, 1, 0x1f, 0xfff},
+       { 0x120530, 5, 0x1f, 0x924},
+       { 0x120544, 4, 0x3, 0x924},
+       { 0x120554, 4, 0x1f, 0x924},
+       { 0x120564, 2, 0x1f, 0xfff},
+       { 0x12057c, 2, 0x1f, 0x1fff},
+       { 0x120588, 3, 0x1f, 0x1fff},
+       { 0x120598, 1, 0x1f, 0x1fff},
+       { 0x12059c, 22, 0x1e, 0x924},
+       { 0x1205f4, 1, 0x6, 0x924},
+       { 0x1205f8, 4, 0x1c, 0x924},
+       { 0x120618, 1, 0x1c, 0x924},
+       { 0x12061c, 31, 0x1e, 0x924},
+       { 0x120698, 3, 0x1c, 0x924},
+       { 0x1206a4, 1, 0x4, 0x924},
+       { 0x1206a8, 1, 0x1c, 0x924},
+       { 0x1206b0, 38, 0x1c, 0x924},
+       { 0x120748, 1, 0x1c, 0xfff},
+       { 0x12074c, 11, 0x1c, 0x924},
+       { 0x120778, 2, 0x1c, 0xfff},
+       { 0x120780, 23, 0x1c, 0x924},
+       { 0x1207dc, 1, 0x4, 0x924},
+       { 0x1207fc, 1, 0x1c, 0x924},
+       { 0x12080c, 2, 0x1f, 0xfff},
+       { 0x120814, 1, 0x1f, 0x924},
+       { 0x120818, 1, 0x1f, 0xfff},
+       { 0x12081c, 1, 0x1f, 0x924},
+       { 0x120820, 1, 0x1f, 0xfff},
+       { 0x120824, 1, 0x1f, 0x924},
+       { 0x120828, 1, 0x1f, 0xfff},
+       { 0x12082c, 1, 0x1f, 0x924},
+       { 0x120830, 1, 0x1f, 0xfff},
+       { 0x120834, 1, 0x1f, 0x924},
+       { 0x120838, 1, 0x1f, 0xfff},
+       { 0x12083c, 1, 0x1f, 0x924},
+       { 0x120840, 1, 0x1f, 0xfff},
+       { 0x120844, 1, 0x1f, 0x924},
+       { 0x120848, 1, 0x1f, 0xfff},
+       { 0x12084c, 1, 0x1f, 0x924},
+       { 0x120850, 1, 0x1f, 0xfff},
+       { 0x120854, 1, 0x1f, 0x924},
+       { 0x120858, 1, 0x1f, 0xfff},
+       { 0x12085c, 1, 0x1f, 0x924},
+       { 0x120860, 1, 0x1f, 0xfff},
+       { 0x120864, 1, 0x1f, 0x924},
+       { 0x120868, 1, 0x1f, 0xfff},
+       { 0x12086c, 1, 0x1f, 0x924},
+       { 0x120870, 1, 0x1f, 0xfff},
+       { 0x120874, 1, 0x1f, 0x924},
+       { 0x120878, 1, 0x1f, 0xfff},
+       { 0x12087c, 1, 0x1f, 0x924},
+       { 0x120880, 1, 0x1f, 0xfff},
+       { 0x120884, 1, 0x1f, 0x924},
+       { 0x120888, 1, 0x1f, 0xfff},
+       { 0x12088c, 1, 0x1f, 0x924},
+       { 0x120890, 1, 0x1f, 0xfff},
+       { 0x120894, 1, 0x1f, 0x924},
+       { 0x120898, 1, 0x1f, 0xfff},
+       { 0x12089c, 1, 0x1f, 0x924},
+       { 0x1208a0, 1, 0x1f, 0xfff},
+       { 0x1208a4, 1, 0x1f, 0x924},
+       { 0x1208a8, 1, 0x1f, 0xfff},
+       { 0x1208ac, 1, 0x1f, 0x924},
+       { 0x1208b0, 1, 0x1f, 0xfff},
+       { 0x1208b4, 1, 0x1f, 0x924},
+       { 0x1208b8, 1, 0x1f, 0xfff},
+       { 0x1208bc, 1, 0x1f, 0x924},
+       { 0x1208c0, 1, 0x1f, 0xfff},
+       { 0x1208c4, 1, 0x1f, 0x924},
+       { 0x1208c8, 1, 0x1f, 0xfff},
+       { 0x1208cc, 1, 0x1f, 0x924},
+       { 0x1208d0, 1, 0x1f, 0xfff},
+       { 0x1208d4, 1, 0x1f, 0x924},
+       { 0x1208d8, 1, 0x1f, 0xfff},
+       { 0x1208dc, 1, 0x1f, 0x924},
+       { 0x1208e0, 1, 0x1f, 0xfff},
+       { 0x1208e4, 1, 0x1f, 0x924},
+       { 0x1208e8, 1, 0x1f, 0xfff},
+       { 0x1208ec, 1, 0x1f, 0x924},
+       { 0x1208f0, 1, 0x1f, 0xfff},
+       { 0x1208f4, 1, 0x1f, 0x924},
+       { 0x1208f8, 1, 0x1f, 0xfff},
+       { 0x1208fc, 1, 0x1f, 0x924},
+       { 0x120900, 1, 0x1f, 0xfff},
+       { 0x120904, 1, 0x1f, 0x924},
+       { 0x120908, 1, 0x1f, 0xfff},
+       { 0x12090c, 1, 0x1f, 0x924},
+       { 0x120910, 7, 0x1c, 0x924},
+       { 0x120930, 9, 0x1c, 0x924},
+       { 0x12095c, 37, 0x18, 0x924},
+       { 0x120a00, 2, 0x7, 0x924},
+       { 0x120b00, 1, 0x18, 0x924},
+       { 0x122000, 2, 0x1f, 0x924},
+       { 0x122008, 2046, 0x1, 0x924},
+       { 0x128000, 6144, 0x1e, 0x924},
+       { 0x130000, 1, 0x1c, 0x1fff},
+       { 0x130004, 11, 0x1c, 0x924},
+       { 0x130030, 1, 0x1c, 0xfff},
+       { 0x130034, 6, 0x1c, 0x924},
+       { 0x13004c, 3, 0x1c, 0xfff},
+       { 0x130058, 3, 0x1c, 0x924},
+       { 0x130064, 2, 0x1c, 0xfff},
+       { 0x13006c, 8, 0x1c, 0x924},
+       { 0x13009c, 2, 0x1c, 0x1fff},
+       { 0x1300a8, 1, 0x1c, 0x1fff},
+       { 0x130100, 12, 0x1c, 0x924},
+       { 0x130130, 1, 0x1c, 0xfff},
+       { 0x130134, 14, 0x1c, 0x924},
+       { 0x13016c, 1, 0x1c, 0xfff},
+       { 0x130170, 1, 0x1c, 0x924},
+       { 0x130180, 1, 0x1c, 0x924},
+       { 0x130200, 1, 0x1c, 0x924},
+       { 0x130280, 1, 0x1c, 0x924},
+       { 0x130300, 1, 0x1c, 0xfff},
+       { 0x130304, 4, 0x1c, 0x924},
+       { 0x130380, 1, 0x1c, 0x924},
+       { 0x130400, 1, 0x1c, 0x924},
+       { 0x130480, 1, 0x1c, 0xfff},
+       { 0x130484, 4, 0x1c, 0x924},
+       { 0x130800, 72, 0x1c, 0x924},
+       { 0x131000, 136, 0x1c, 0x924},
+       { 0x132000, 148, 0x1c, 0x924},
+       { 0x134000, 544, 0x1c, 0x924},
+       { 0x140000, 1, 0x1f, 0x924},
+       { 0x140004, 9, 0xf, 0x924},
+       { 0x140028, 8, 0x1f, 0x924},
+       { 0x140048, 5, 0xf, 0x924},
+       { 0x14005c, 2, 0xf, 0xfff},
+       { 0x140064, 3, 0xf, 0x924},
+       { 0x140070, 1, 0x1f, 0x924},
+       { 0x140074, 10, 0xf, 0x924},
+       { 0x14009c, 1, 0x1f, 0x924},
+       { 0x1400a0, 5, 0xf, 0x924},
+       { 0x1400b4, 7, 0x1f, 0x924},
+       { 0x1400d0, 2, 0xf, 0xfff},
+       { 0x1400d8, 2, 0xf, 0x924},
+       { 0x1400e0, 1, 0xf, 0xfff},
+       { 0x1400e4, 5, 0xf, 0x924},
+       { 0x1400f8, 2, 0x1f, 0x924},
+       { 0x140100, 5, 0x3, 0x924},
+       { 0x140114, 5, 0xf, 0x924},
+       { 0x140128, 7, 0x1f, 0x924},
+       { 0x140144, 9, 0xf, 0x924},
+       { 0x140168, 8, 0x1f, 0x924},
+       { 0x140188, 3, 0xf, 0x924},
+       { 0x140194, 13, 0x1f, 0x924},
+       { 0x1401d8, 2, 0x1f, 0x1fff},
+       { 0x1401e4, 1, 0x1f, 0x1fff},
+       { 0x140200, 6, 0xf, 0xfff},
+       { 0x1402e0, 2, 0xc, 0x924},
+       { 0x1402e8, 2, 0x1c, 0x924},
+       { 0x1402f0, 9, 0xc, 0x924},
+       { 0x140314, 9, 0x10, 0x924},
+       { 0x140338, 7, 0x10, 0xfff},
+       { 0x140354, 7, 0x10, 0x924},
+       { 0x140370, 7, 0x10, 0xfff},
+       { 0x14038c, 14, 0x10, 0x924},
+       { 0x1404b0, 14, 0x10, 0x924},
+       { 0x15c000, 2, 0x1e, 0x924},
+       { 0x15c008, 5, 0x2, 0x924},
+       { 0x15c020, 8, 0x1c, 0x924},
+       { 0x15c040, 1, 0xc, 0x924},
+       { 0x15c044, 2, 0x1c, 0x924},
+       { 0x15c04c, 8, 0xc, 0x924},
+       { 0x15c06c, 8, 0x1c, 0x924},
+       { 0x15c090, 13, 0x1c, 0x924},
+       { 0x15c0c8, 24, 0x1c, 0x924},
+       { 0x15c128, 2, 0xc, 0x924},
+       { 0x15c130, 1, 0x1c, 0x924},
+       { 0x15c138, 6, 0x1c, 0x924},
+       { 0x15c150, 2, 0x18, 0x924},
+       { 0x15c158, 2, 0x8, 0x924},
+       { 0x15c160, 23, 0x10, 0x924},
+       { 0x15c1bc, 6, 0x10, 0xfff},
+       { 0x15c1d4, 23, 0x10, 0x924},
+       { 0x15c230, 7, 0x10, 0xfff},
+       { 0x15c24c, 90, 0x10, 0x924},
+       { 0x160004, 6, 0x18, 0x924},
+       { 0x16003c, 1, 0x10, 0x924},
+       { 0x160040, 6, 0x18, 0x924},
+       { 0x16005c, 6, 0x18, 0x924},
+       { 0x160074, 1, 0x10, 0x924},
+       { 0x160078, 2, 0x18, 0x924},
+       { 0x160300, 8, 0x18, 0x924},
+       { 0x160330, 6, 0x18, 0x924},
+       { 0x160404, 6, 0x18, 0x924},
+       { 0x16043c, 1, 0x10, 0x924},
+       { 0x160440, 6, 0x18, 0x924},
+       { 0x16045c, 6, 0x18, 0x924},
+       { 0x160474, 1, 0x10, 0x924},
+       { 0x160478, 2, 0x18, 0x924},
+       { 0x160700, 8, 0x18, 0x924},
+       { 0x160730, 6, 0x18, 0x924},
+       { 0x161000, 7, 0x1f, 0x924},
+       { 0x16102c, 2, 0x1f, 0x1fff},
+       { 0x161038, 1, 0x1f, 0x1fff},
+       { 0x16103c, 2, 0x1c, 0x924},
+       { 0x161800, 2, 0x1f, 0x924},
+       { 0x162000, 54, 0x18, 0x924},
+       { 0x162200, 60, 0x18, 0x924},
+       { 0x162400, 54, 0x18, 0x924},
+       { 0x162600, 60, 0x18, 0x924},
+       { 0x162800, 54, 0x18, 0x924},
+       { 0x162a00, 60, 0x18, 0x924},
+       { 0x162c00, 54, 0x18, 0x924},
+       { 0x162e00, 60, 0x18, 0x924},
+       { 0x163000, 1, 0x18, 0x924},
+       { 0x163008, 1, 0x18, 0x924},
+       { 0x163010, 1, 0x18, 0x924},
+       { 0x163018, 1, 0x18, 0x924},
+       { 0x163020, 5, 0x18, 0x924},
+       { 0x163038, 3, 0x18, 0x924},
+       { 0x163048, 3, 0x18, 0x924},
+       { 0x163058, 1, 0x18, 0x924},
+       { 0x163060, 1, 0x18, 0x924},
+       { 0x163068, 1, 0x18, 0x924},
+       { 0x163070, 3, 0x18, 0x924},
+       { 0x163080, 1, 0x18, 0x924},
+       { 0x163088, 3, 0x18, 0x924},
+       { 0x163098, 1, 0x18, 0x924},
+       { 0x1630a0, 1, 0x18, 0x924},
+       { 0x1630a8, 1, 0x18, 0x924},
+       { 0x1630b0, 2, 0x10, 0x924},
+       { 0x1630c0, 1, 0x18, 0x924},
+       { 0x1630c8, 1, 0x18, 0x924},
+       { 0x1630d0, 1, 0x18, 0x924},
+       { 0x1630d8, 1, 0x18, 0x924},
+       { 0x1630e0, 2, 0x18, 0x924},
+       { 0x163110, 1, 0x18, 0x924},
+       { 0x163120, 2, 0x18, 0x924},
+       { 0x163420, 4, 0x18, 0x924},
+       { 0x163438, 2, 0x18, 0x924},
+       { 0x163488, 2, 0x18, 0x924},
+       { 0x163520, 2, 0x18, 0x924},
+       { 0x163800, 1, 0x18, 0x924},
+       { 0x163808, 1, 0x18, 0x924},
+       { 0x163810, 1, 0x18, 0x924},
+       { 0x163818, 1, 0x18, 0x924},
+       { 0x163820, 5, 0x18, 0x924},
+       { 0x163838, 3, 0x18, 0x924},
+       { 0x163848, 3, 0x18, 0x924},
+       { 0x163858, 1, 0x18, 0x924},
+       { 0x163860, 1, 0x18, 0x924},
+       { 0x163868, 1, 0x18, 0x924},
+       { 0x163870, 3, 0x18, 0x924},
+       { 0x163880, 1, 0x18, 0x924},
+       { 0x163888, 3, 0x18, 0x924},
+       { 0x163898, 1, 0x18, 0x924},
+       { 0x1638a0, 1, 0x18, 0x924},
+       { 0x1638a8, 1, 0x18, 0x924},
+       { 0x1638b0, 2, 0x10, 0x924},
+       { 0x1638c0, 1, 0x18, 0x924},
+       { 0x1638c8, 1, 0x18, 0x924},
+       { 0x1638d0, 1, 0x18, 0x924},
+       { 0x1638d8, 1, 0x18, 0x924},
+       { 0x1638e0, 2, 0x18, 0x924},
+       { 0x163910, 1, 0x18, 0x924},
+       { 0x163920, 2, 0x18, 0x924},
+       { 0x163c20, 4, 0x18, 0x924},
+       { 0x163c38, 2, 0x18, 0x924},
+       { 0x163c88, 2, 0x18, 0x924},
+       { 0x163d20, 2, 0x18, 0x924},
+       { 0x164000, 5, 0x1f, 0x924},
+       { 0x164014, 2, 0x1f, 0xfff},
+       { 0x16401c, 53, 0x1f, 0x924},
+       { 0x164100, 2, 0x1f, 0x1fff},
+       { 0x16410c, 1, 0x1f, 0x1fff},
+       { 0x164110, 2, 0x1e, 0x924},
+       { 0x164118, 15, 0x1c, 0x924},
+       { 0x164200, 1, 0x1f, 0x924},
+       { 0x164208, 1, 0x1f, 0x924},
+       { 0x164210, 1, 0x1f, 0x924},
+       { 0x164218, 1, 0x1f, 0x924},
+       { 0x164220, 1, 0x1f, 0x924},
+       { 0x164228, 1, 0x1f, 0x924},
+       { 0x164230, 1, 0x1f, 0x924},
+       { 0x164238, 1, 0x1f, 0x924},
+       { 0x164240, 1, 0x1f, 0x924},
+       { 0x164248, 1, 0x1f, 0x924},
+       { 0x164250, 1, 0x1f, 0x924},
+       { 0x164258, 1, 0x1f, 0x924},
+       { 0x164260, 1, 0x1f, 0x924},
+       { 0x164270, 2, 0x1f, 0x924},
+       { 0x164280, 2, 0x1f, 0x924},
+       { 0x164800, 2, 0x1f, 0x924},
+       { 0x165000, 2, 0x1f, 0x924},
+       { 0x166000, 164, 0x1f, 0x924},
+       { 0x1662b0, 2, 0x1f, 0x1fff},
+       { 0x1662bc, 1, 0x1f, 0x1fff},
+       { 0x1662cc, 7, 0x1c, 0x924},
+       { 0x166400, 49, 0x1f, 0x924},
+       { 0x1664c8, 32, 0x1f, 0x924},
+       { 0x166548, 1, 0x1f, 0xfff},
+       { 0x16654c, 1, 0x1f, 0x924},
+       { 0x166550, 1, 0x1f, 0xfff},
+       { 0x166554, 1, 0x1f, 0x924},
+       { 0x166558, 1, 0x1f, 0xfff},
+       { 0x16655c, 1, 0x1f, 0x924},
+       { 0x166568, 2, 0x1f, 0x924},
+       { 0x166570, 5, 0x1c, 0x924},
+       { 0x166800, 1, 0x1f, 0x924},
+       { 0x168000, 1, 0x1f, 0xfff},
+       { 0x168004, 1, 0x1f, 0x924},
+       { 0x168008, 1, 0x1f, 0xfff},
+       { 0x16800c, 1, 0x1f, 0x924},
+       { 0x168010, 1, 0x1f, 0xfff},
+       { 0x168014, 1, 0x1f, 0x924},
+       { 0x168018, 1, 0x1f, 0xfff},
+       { 0x16801c, 3, 0x1f, 0x924},
+       { 0x168028, 2, 0x1f, 0xfff},
+       { 0x168030, 10, 0x1f, 0x924},
+       { 0x168058, 9, 0x1f, 0xfff},
+       { 0x16807c, 106, 0x1f, 0x924},
+       { 0x168224, 2, 0x3, 0x924},
+       { 0x16822c, 3, 0x1f, 0x924},
+       { 0x168238, 1, 0x1f, 0xfff},
+       { 0x16823c, 25, 0x1f, 0x924},
+       { 0x1682a0, 12, 0x3, 0x924},
+       { 0x1682d0, 7, 0x1f, 0xfff},
+       { 0x1682ec, 5, 0x1f, 0x924},
+       { 0x168300, 2, 0x3, 0xfff},
+       { 0x168308, 65, 0x1f, 0xfff},
+       { 0x16840c, 1, 0x1f, 0x924},
+       { 0x168410, 2, 0x1f, 0xfff},
+       { 0x168418, 2, 0x3, 0x924},
+       { 0x168420, 6, 0x1f, 0x924},
+       { 0x168448, 2, 0x1f, 0x1fff},
+       { 0x168454, 1, 0x1f, 0x1fff},
+       { 0x168800, 19, 0x1f, 0x924},
+       { 0x168900, 1, 0x1f, 0x924},
+       { 0x168a00, 128, 0x1f, 0xfff},
+       { 0x16a000, 1536, 0x1f, 0x924},
+       { 0x16c000, 1536, 0x1f, 0x924},
+       { 0x16e000, 16, 0x2, 0x924},
+       { 0x16e040, 8, 0x1c, 0x924},
+       { 0x16e100, 1, 0x2, 0x924},
+       { 0x16e200, 2, 0x2, 0xfff},
+       { 0x16e400, 1, 0x2, 0x924},
+       { 0x16e404, 2, 0x2, 0xfff},
+       { 0x16e40c, 94, 0x2, 0x924},
+       { 0x16e584, 64, 0x2, 0xfff},
+       { 0x16e684, 2, 0x1e, 0xfff},
+       { 0x16e68c, 4, 0x2, 0xfff},
+       { 0x16e69c, 8, 0x2, 0x924},
+       { 0x16e6bc, 4, 0x1e, 0x924},
+       { 0x16e6cc, 4, 0x2, 0x924},
+       { 0x16e6e0, 2, 0x1c, 0x924},
+       { 0x16e6e8, 5, 0xc, 0x924},
+       { 0x16e6fc, 4, 0x1c, 0xfff},
+       { 0x16e70c, 1, 0x1c, 0x924},
+       { 0x16e768, 17, 0x1c, 0x924},
+       { 0x16e7ac, 12, 0x10, 0xfff},
+       { 0x170000, 24, 0x1f, 0x924},
+       { 0x170060, 4, 0x3, 0x924},
+       { 0x170070, 13, 0x1f, 0x924},
+       { 0x1700a4, 1, 0x1f, 0xfff},
+       { 0x1700a8, 1, 0x1f, 0x924},
+       { 0x1700ac, 2, 0x1f, 0xfff},
+       { 0x1700b4, 3, 0x1f, 0x924},
+       { 0x1700c0, 1, 0x1f, 0xfff},
+       { 0x1700c4, 44, 0x1f, 0x924},
+       { 0x170184, 2, 0x1f, 0x1fff},
+       { 0x170190, 1, 0x1f, 0x1fff},
+       { 0x170194, 11, 0x1c, 0x924},
+       { 0x1701c4, 1, 0x1c, 0x924},
+       { 0x1701cc, 7, 0x1c, 0x924},
+       { 0x1701e8, 1, 0x18, 0x924},
+       { 0x1701ec, 1, 0x1c, 0x924},
+       { 0x1701f4, 1, 0x1c, 0x924},
+       { 0x170200, 4, 0x1f, 0x924},
+       { 0x170214, 1, 0x1f, 0x924},
+       { 0x170218, 77, 0x1c, 0x924},
+       { 0x170400, 64, 0x1c, 0x924},
+       { 0x178000, 1, 0x1f, 0x924},
+       { 0x180000, 61, 0x1f, 0x924},
+       { 0x180114, 2, 0x1f, 0x1fff},
+       { 0x180120, 3, 0x1f, 0x1fff},
+       { 0x180130, 1, 0x1f, 0x1fff},
+       { 0x18013c, 2, 0x1e, 0x924},
+       { 0x180200, 27, 0x1f, 0x924},
+       { 0x18026c, 1, 0x1f, 0xfff},
+       { 0x180270, 12, 0x1f, 0x924},
+       { 0x1802a0, 1, 0x1f, 0xfff},
+       { 0x1802a4, 17, 0x1f, 0x924},
+       { 0x180340, 4, 0x1f, 0x924},
+       { 0x180380, 1, 0x1c, 0x924},
+       { 0x180388, 1, 0x1c, 0x924},
+       { 0x180390, 1, 0x1c, 0x924},
+       { 0x180398, 1, 0x1c, 0x924},
+       { 0x1803a0, 5, 0x1c, 0x924},
+       { 0x1803b4, 2, 0x18, 0x924},
+       { 0x180400, 256, 0x3, 0xfff},
+       { 0x181000, 4, 0x1f, 0x93c},
+       { 0x181010, 1020, 0x1f, 0x38},
+       { 0x182000, 4, 0x18, 0x924},
+       { 0x1a0000, 1, 0x1f, 0x92c},
+       { 0x1a0004, 5631, 0x1f, 0x8},
+       { 0x1a5800, 2560, 0x1e, 0x8},
+       { 0x1a8000, 1, 0x1f, 0x92c},
+       { 0x1a8004, 8191, 0x1e, 0x8},
+       { 0x1b0000, 1, 0x1f, 0x92c},
+       { 0x1b0004, 15, 0x2, 0x8},
+       { 0x1b0040, 1, 0x1e, 0x92c},
+       { 0x1b0044, 239, 0x2, 0x8},
+       { 0x1b0400, 1, 0x1f, 0x92c},
+       { 0x1b0404, 255, 0x2, 0x8},
+       { 0x1b0800, 1, 0x1f, 0x924},
+       { 0x1b0840, 1, 0x1e, 0x924},
+       { 0x1b0c00, 1, 0x1f, 0x1fff},
+       { 0x1b1000, 1, 0x1f, 0x1fff},
+       { 0x1b1040, 1, 0x1e, 0x1fff},
+       { 0x1b1400, 1, 0x1f, 0x924},
+       { 0x1b1440, 1, 0x1e, 0x924},
+       { 0x1b1480, 1, 0x1e, 0x924},
+       { 0x1b14c0, 1, 0x1e, 0x924},
+       { 0x1b1800, 128, 0x1f, 0x10},
+       { 0x1b1c00, 128, 0x1f, 0x10},
+       { 0x1b2000, 1, 0x1f, 0xdb6},
+       { 0x1b2400, 1, 0x1e, 0x92c},
+       { 0x1b2404, 5631, 0x1c, 0x8},
+       { 0x1b8000, 1, 0x1f, 0xfff},
+       { 0x1b8040, 1, 0x1f, 0xfff},
+       { 0x1b8080, 1, 0x1f, 0xfff},
+       { 0x1b80c0, 1, 0x1f, 0xfff},
+       { 0x1b8100, 1, 0x1f, 0x924},
+       { 0x1b8140, 1, 0x1f, 0x924},
+       { 0x1b8180, 1, 0x1f, 0x924},
+       { 0x1b81c0, 1, 0x1f, 0x924},
+       { 0x1b8200, 1, 0x1f, 0x924},
+       { 0x1b8240, 1, 0x1f, 0x924},
+       { 0x1b8280, 1, 0x1f, 0x924},
+       { 0x1b82c0, 1, 0x1f, 0x924},
+       { 0x1b8300, 1, 0x1f, 0x924},
+       { 0x1b8340, 1, 0x1f, 0x924},
+       { 0x1b8380, 1, 0x1f, 0x924},
+       { 0x1b83c0, 1, 0x1f, 0x924},
+       { 0x1b8400, 1, 0x1f, 0x924},
+       { 0x1b8440, 1, 0x1f, 0x924},
+       { 0x1b8480, 1, 0x1f, 0x924},
+       { 0x1b84c0, 1, 0x1f, 0x924},
+       { 0x1b8500, 1, 0x1f, 0x924},
+       { 0x1b8540, 1, 0x1f, 0x924},
+       { 0x1b8580, 1, 0x1f, 0x924},
+       { 0x1b85c0, 19, 0x1c, 0x924},
+       { 0x1b8800, 1, 0x1f, 0x924},
+       { 0x1b8840, 1, 0x1f, 0x924},
+       { 0x1b8880, 1, 0x1f, 0x924},
+       { 0x1b88c0, 1, 0x1f, 0x924},
+       { 0x1b8900, 1, 0x1f, 0x924},
+       { 0x1b8940, 1, 0x1f, 0x924},
+       { 0x1b8980, 1, 0x1f, 0x924},
+       { 0x1b89c0, 1, 0x1f, 0x924},
+       { 0x1b8a00, 1, 0x1f, 0x934},
+       { 0x1b8a40, 1, 0x1f, 0x924},
+       { 0x1b8a80, 1, 0x1f, 0x492},
+       { 0x1b8ac0, 1, 0x1f, 0x924},
+       { 0x1b8b00, 1, 0x1f, 0x924},
+       { 0x1b8b40, 1, 0x1f, 0x924},
+       { 0x1b8b80, 1, 0x1f, 0x924},
+       { 0x1b8bc0, 1, 0x1f, 0x924},
+       { 0x1b8c00, 1, 0x1f, 0x924},
+       { 0x1b8c40, 1, 0x1f, 0x924},
+       { 0x1b8c80, 1, 0x1f, 0x924},
+       { 0x1b8cc0, 1, 0x1f, 0x924},
+       { 0x1b8cc4, 1, 0x1c, 0x924},
+       { 0x1b8d00, 1, 0x1f, 0x924},
+       { 0x1b8d40, 1, 0x1f, 0x924},
+       { 0x1b8d80, 1, 0x1f, 0x924},
+       { 0x1b8dc0, 1, 0x1f, 0x924},
+       { 0x1b8e00, 1, 0x1f, 0x924},
+       { 0x1b8e40, 1, 0x1f, 0x924},
+       { 0x1b8e80, 1, 0x1f, 0x924},
+       { 0x1b8e84, 1, 0x1c, 0x924},
+       { 0x1b8ec0, 1, 0x1e, 0x924},
+       { 0x1b8f00, 1, 0x1e, 0x924},
+       { 0x1b8f40, 1, 0x1e, 0x924},
+       { 0x1b8f80, 1, 0x1e, 0x924},
+       { 0x1b8fc0, 1, 0x1e, 0x924},
+       { 0x1b8fd4, 5, 0x1c, 0x924},
+       { 0x1b8fe8, 2, 0x18, 0x924},
+       { 0x1b9000, 1, 0x1c, 0x924},
+       { 0x1b9040, 3, 0x1c, 0x924},
+       { 0x1b905c, 1, 0x18, 0x924},
+       { 0x1b9064, 1, 0x10, 0x924},
+       { 0x1b9080, 10, 0x10, 0x924},
+       { 0x1c0000, 2, 0x1f, 0x924},
+       { 0x200000, 65, 0x1f, 0x924},
+       { 0x200124, 2, 0x1f, 0x1fff},
+       { 0x200130, 3, 0x1f, 0x1fff},
+       { 0x200140, 1, 0x1f, 0x1fff},
+       { 0x20014c, 2, 0x1e, 0x924},
+       { 0x200200, 27, 0x1f, 0x924},
+       { 0x20026c, 1, 0x1f, 0xfff},
+       { 0x200270, 12, 0x1f, 0x924},
+       { 0x2002a0, 1, 0x1f, 0xfff},
+       { 0x2002a4, 17, 0x1f, 0x924},
+       { 0x200340, 4, 0x1f, 0x924},
+       { 0x200380, 1, 0x1c, 0x924},
+       { 0x200388, 1, 0x1c, 0x924},
+       { 0x200390, 1, 0x1c, 0x924},
+       { 0x200398, 1, 0x1c, 0x924},
+       { 0x2003a0, 1, 0x1c, 0x924},
+       { 0x2003a8, 2, 0x1c, 0x924},
+       { 0x200400, 256, 0x3, 0xfff},
+       { 0x202000, 4, 0x1f, 0x1927},
+       { 0x202010, 2044, 0x1f, 0x1007},
+       { 0x204000, 4, 0x18, 0x924},
+       { 0x220000, 1, 0x1f, 0x925},
+       { 0x220004, 5631, 0x1f, 0x1},
+       { 0x225800, 2560, 0x1e, 0x1},
+       { 0x228000, 1, 0x1f, 0x925},
+       { 0x228004, 8191, 0x1e, 0x1},
+       { 0x230000, 1, 0x1f, 0x925},
+       { 0x230004, 15, 0x2, 0x1},
+       { 0x230040, 1, 0x1e, 0x925},
+       { 0x230044, 239, 0x2, 0x1},
+       { 0x230400, 1, 0x1f, 0x925},
+       { 0x230404, 255, 0x2, 0x1},
+       { 0x230800, 1, 0x1f, 0x924},
+       { 0x230840, 1, 0x1e, 0x924},
+       { 0x230c00, 1, 0x1f, 0x924},
+       { 0x231000, 1, 0x1f, 0x924},
+       { 0x231040, 1, 0x1e, 0x924},
+       { 0x231400, 1, 0x1f, 0x924},
+       { 0x231440, 1, 0x1e, 0x924},
+       { 0x231480, 1, 0x1e, 0x924},
+       { 0x2314c0, 1, 0x1e, 0x924},
+       { 0x231800, 128, 0x1f, 0x2},
+       { 0x231c00, 128, 0x1f, 0x2},
+       { 0x232000, 1, 0x1f, 0xdb6},
+       { 0x232400, 1, 0x1e, 0x925},
+       { 0x232404, 5631, 0x1c, 0x1},
+       { 0x238000, 1, 0x1f, 0xfff},
+       { 0x238040, 1, 0x1f, 0xfff},
+       { 0x238080, 1, 0x1f, 0xfff},
+       { 0x2380c0, 1, 0x1f, 0xfff},
+       { 0x238100, 1, 0x1f, 0x924},
+       { 0x238140, 1, 0x1f, 0x924},
+       { 0x238180, 1, 0x1f, 0x924},
+       { 0x2381c0, 1, 0x1f, 0x924},
+       { 0x238200, 1, 0x1f, 0x924},
+       { 0x238240, 1, 0x1f, 0x924},
+       { 0x238280, 1, 0x1f, 0x924},
+       { 0x2382c0, 1, 0x1f, 0x924},
+       { 0x238300, 1, 0x1f, 0x924},
+       { 0x238340, 1, 0x1f, 0x924},
+       { 0x238380, 1, 0x1f, 0x924},
+       { 0x2383c0, 1, 0x1f, 0x924},
+       { 0x238400, 1, 0x1f, 0x924},
+       { 0x238440, 1, 0x1f, 0x924},
+       { 0x238480, 1, 0x1f, 0x924},
+       { 0x2384c0, 1, 0x1f, 0x924},
+       { 0x238500, 1, 0x1f, 0x924},
+       { 0x238540, 1, 0x1f, 0x924},
+       { 0x238580, 1, 0x1f, 0x924},
+       { 0x2385c0, 19, 0x1c, 0x924},
+       { 0x238800, 1, 0x1f, 0x924},
+       { 0x238840, 1, 0x1f, 0x924},
+       { 0x238880, 1, 0x1f, 0x924},
+       { 0x2388c0, 1, 0x1f, 0x924},
+       { 0x238900, 1, 0x1f, 0x924},
+       { 0x238940, 1, 0x1f, 0x924},
+       { 0x238980, 1, 0x1f, 0x924},
+       { 0x2389c0, 1, 0x1f, 0x924},
+       { 0x238a00, 1, 0x1f, 0x926},
+       { 0x238a40, 1, 0x1f, 0x924},
+       { 0x238a80, 1, 0x1f, 0x492},
+       { 0x238ac0, 1, 0x1f, 0x924},
+       { 0x238b00, 1, 0x1f, 0x924},
+       { 0x238b40, 1, 0x1f, 0x924},
+       { 0x238b80, 1, 0x1f, 0x924},
+       { 0x238bc0, 1, 0x1f, 0x924},
+       { 0x238c00, 1, 0x1f, 0x924},
+       { 0x238c40, 1, 0x1f, 0x924},
+       { 0x238c80, 1, 0x1f, 0x924},
+       { 0x238cc0, 1, 0x1f, 0x924},
+       { 0x238cc4, 1, 0x1c, 0x924},
+       { 0x238d00, 1, 0x1f, 0x924},
+       { 0x238d40, 1, 0x1f, 0x924},
+       { 0x238d80, 1, 0x1f, 0x924},
+       { 0x238dc0, 1, 0x1f, 0x924},
+       { 0x238e00, 1, 0x1f, 0x924},
+       { 0x238e40, 1, 0x1f, 0x924},
+       { 0x238e80, 1, 0x1f, 0x924},
+       { 0x238e84, 1, 0x1c, 0x924},
+       { 0x238ec0, 1, 0x1e, 0x924},
+       { 0x238f00, 1, 0x1e, 0x924},
+       { 0x238f40, 1, 0x1e, 0x924},
+       { 0x238f80, 1, 0x1e, 0x924},
+       { 0x238fc0, 1, 0x1e, 0x924},
+       { 0x238fd4, 5, 0x1c, 0x924},
+       { 0x238fe8, 2, 0x18, 0x924},
+       { 0x239000, 1, 0x1c, 0x924},
+       { 0x239040, 3, 0x1c, 0x924},
+       { 0x23905c, 1, 0x18, 0x924},
+       { 0x239064, 1, 0x10, 0x924},
+       { 0x239080, 10, 0x10, 0x924},
+       { 0x240000, 2, 0x1f, 0x924},
+       { 0x280000, 65, 0x1f, 0x924},
+       { 0x280124, 2, 0x1f, 0x1fff},
+       { 0x280130, 3, 0x1f, 0x1fff},
+       { 0x280140, 1, 0x1f, 0x1fff},
+       { 0x28014c, 2, 0x1e, 0x924},
+       { 0x280200, 27, 0x1f, 0x924},
+       { 0x28026c, 1, 0x1f, 0xfff},
+       { 0x280270, 12, 0x1f, 0x924},
+       { 0x2802a0, 1, 0x1f, 0xfff},
+       { 0x2802a4, 17, 0x1f, 0x924},
+       { 0x280340, 4, 0x1f, 0x924},
+       { 0x280380, 1, 0x1c, 0x924},
+       { 0x280388, 1, 0x1c, 0x924},
+       { 0x280390, 1, 0x1c, 0x924},
+       { 0x280398, 1, 0x1c, 0x924},
+       { 0x2803a0, 1, 0x1c, 0x924},
+       { 0x2803a8, 2, 0x1c, 0x924},
+       { 0x280400, 256, 0x3, 0xfff},
+       { 0x282000, 4, 0x1f, 0x9e4},
+       { 0x282010, 2044, 0x1f, 0x1c0},
+       { 0x284000, 4, 0x18, 0x924},
+       { 0x2a0000, 1, 0x1f, 0x964},
+       { 0x2a0004, 5631, 0x1f, 0x40},
+       { 0x2a5800, 2560, 0x1e, 0x40},
+       { 0x2a8000, 1, 0x1f, 0x964},
+       { 0x2a8004, 8191, 0x1e, 0x40},
+       { 0x2b0000, 1, 0x1f, 0x964},
+       { 0x2b0004, 15, 0x2, 0x40},
+       { 0x2b0040, 1, 0x1e, 0x964},
+       { 0x2b0044, 239, 0x2, 0x40},
+       { 0x2b0400, 1, 0x1f, 0x964},
+       { 0x2b0404, 255, 0x2, 0x40},
+       { 0x2b0800, 1, 0x1f, 0x924},
+       { 0x2b0840, 1, 0x1e, 0x924},
+       { 0x2b0c00, 1, 0x1f, 0x924},
+       { 0x2b1000, 1, 0x1f, 0x924},
+       { 0x2b1040, 1, 0x1e, 0x924},
+       { 0x2b1400, 1, 0x1f, 0x924},
+       { 0x2b1440, 1, 0x1e, 0x924},
+       { 0x2b1480, 1, 0x1e, 0x924},
+       { 0x2b14c0, 1, 0x1e, 0x924},
+       { 0x2b1800, 128, 0x1f, 0x80},
+       { 0x2b1c00, 128, 0x1f, 0x80},
+       { 0x2b2000, 1, 0x1f, 0xdb6},
+       { 0x2b2400, 1, 0x1e, 0x964},
+       { 0x2b2404, 5631, 0x1c, 0x40},
+       { 0x2b8000, 1, 0x1f, 0xfff},
+       { 0x2b8040, 1, 0x1f, 0xfff},
+       { 0x2b8080, 1, 0x1f, 0xfff},
+       { 0x2b80c0, 1, 0x1f, 0x924},
+       { 0x2b8100, 1, 0x1f, 0x924},
+       { 0x2b8140, 1, 0x1f, 0x924},
+       { 0x2b8180, 1, 0x1f, 0x924},
+       { 0x2b81c0, 1, 0x1f, 0x924},
+       { 0x2b8200, 1, 0x1f, 0x924},
+       { 0x2b8240, 1, 0x1f, 0x924},
+       { 0x2b8280, 1, 0x1f, 0x924},
+       { 0x2b82c0, 1, 0x1f, 0x924},
+       { 0x2b8300, 1, 0x1f, 0x924},
+       { 0x2b8340, 1, 0x1f, 0x924},
+       { 0x2b8380, 1, 0x1f, 0x924},
+       { 0x2b83c0, 1, 0x1f, 0x924},
+       { 0x2b8400, 1, 0x1f, 0x924},
+       { 0x2b8440, 1, 0x1f, 0x924},
+       { 0x2b8480, 1, 0x1f, 0x924},
+       { 0x2b84c0, 1, 0x1f, 0x924},
+       { 0x2b8500, 1, 0x1f, 0x924},
+       { 0x2b8540, 1, 0x1f, 0x924},
+       { 0x2b8580, 1, 0x1f, 0x924},
+       { 0x2b85c0, 19, 0x1c, 0x924},
+       { 0x2b8800, 1, 0x1f, 0x924},
+       { 0x2b8840, 1, 0x1f, 0x924},
+       { 0x2b8880, 1, 0x1f, 0x924},
+       { 0x2b88c0, 1, 0x1f, 0x924},
+       { 0x2b8900, 1, 0x1f, 0x924},
+       { 0x2b8940, 1, 0x1f, 0x924},
+       { 0x2b8980, 1, 0x1f, 0x924},
+       { 0x2b89c0, 1, 0x1f, 0x924},
+       { 0x2b8a00, 1, 0x1f, 0x9a4},
+       { 0x2b8a40, 1, 0x1f, 0x924},
+       { 0x2b8a80, 1, 0x1f, 0x492},
+       { 0x2b8ac0, 1, 0x1f, 0x924},
+       { 0x2b8b00, 1, 0x1f, 0x924},
+       { 0x2b8b40, 1, 0x1f, 0x924},
+       { 0x2b8b80, 1, 0x1f, 0x924},
+       { 0x2b8bc0, 1, 0x1f, 0x924},
+       { 0x2b8c00, 1, 0x1f, 0x924},
+       { 0x2b8c40, 1, 0x1f, 0x924},
+       { 0x2b8c80, 1, 0x1f, 0x924},
+       { 0x2b8cc0, 1, 0x1f, 0x924},
+       { 0x2b8cc4, 1, 0x1c, 0x924},
+       { 0x2b8d00, 1, 0x1f, 0x924},
+       { 0x2b8d40, 1, 0x1f, 0x924},
+       { 0x2b8d80, 1, 0x1f, 0x924},
+       { 0x2b8dc0, 1, 0x1f, 0x924},
+       { 0x2b8e00, 1, 0x1f, 0x924},
+       { 0x2b8e40, 1, 0x1f, 0x924},
+       { 0x2b8e80, 1, 0x1f, 0x924},
+       { 0x2b8e84, 1, 0x1c, 0x924},
+       { 0x2b8ec0, 1, 0x1e, 0x924},
+       { 0x2b8f00, 1, 0x1e, 0x924},
+       { 0x2b8f40, 1, 0x1e, 0x924},
+       { 0x2b8f80, 1, 0x1e, 0x924},
+       { 0x2b8fc0, 1, 0x1e, 0x924},
+       { 0x2b8fd4, 5, 0x1c, 0x924},
+       { 0x2b8fe8, 2, 0x18, 0x924},
+       { 0x2b9000, 1, 0x1c, 0x924},
+       { 0x2b9040, 3, 0x1c, 0x924},
+       { 0x2b905c, 1, 0x18, 0x924},
+       { 0x2b9064, 1, 0x10, 0x924},
+       { 0x2b9080, 10, 0x10, 0x924},
+       { 0x2c0000, 2, 0x1f, 0x1fff},
+       { 0x300000, 65, 0x1f, 0x924},
+       { 0x300124, 2, 0x1f, 0x1fff},
+       { 0x300130, 3, 0x1f, 0x1fff},
+       { 0x300140, 1, 0x1f, 0x1fff},
+       { 0x30014c, 2, 0x1e, 0x924},
+       { 0x300200, 27, 0x1f, 0x924},
+       { 0x30026c, 1, 0x1f, 0xfff},
+       { 0x300270, 12, 0x1f, 0x924},
+       { 0x3002a0, 1, 0x1f, 0xfff},
+       { 0x3002a4, 17, 0x1f, 0x924},
+       { 0x300340, 4, 0x1f, 0x924},
+       { 0x300380, 1, 0x1c, 0x924},
+       { 0x300388, 1, 0x1c, 0x924},
+       { 0x300390, 1, 0x1c, 0x924},
+       { 0x300398, 1, 0x1c, 0x924},
+       { 0x3003a0, 1, 0x1c, 0x924},
+       { 0x3003a8, 2, 0x1c, 0x924},
+       { 0x300400, 256, 0x3, 0xfff},
+       { 0x302000, 4, 0x1f, 0xf24},
+       { 0x302010, 2044, 0x1f, 0xe00},
+       { 0x304000, 4, 0x18, 0x924},
+       { 0x320000, 1, 0x1f, 0xb24},
+       { 0x320004, 5631, 0x1f, 0x200},
+       { 0x325800, 2560, 0x1e, 0x200},
+       { 0x328000, 1, 0x1f, 0xb24},
+       { 0x328004, 8191, 0x1e, 0x200},
+       { 0x330000, 1, 0x1f, 0xb24},
+       { 0x330004, 15, 0x2, 0x200},
+       { 0x330040, 1, 0x1e, 0xb24},
+       { 0x330044, 239, 0x2, 0x200},
+       { 0x330400, 1, 0x1f, 0xb24},
+       { 0x330404, 255, 0x2, 0x200},
+       { 0x330800, 1, 0x1f, 0x924},
+       { 0x330840, 1, 0x1e, 0x924},
+       { 0x330c00, 1, 0x1f, 0x924},
+       { 0x331000, 1, 0x1f, 0x924},
+       { 0x331040, 1, 0x1e, 0x924},
+       { 0x331400, 1, 0x1f, 0x924},
+       { 0x331440, 1, 0x1e, 0x924},
+       { 0x331480, 1, 0x1e, 0x924},
+       { 0x3314c0, 1, 0x1e, 0x924},
+       { 0x331800, 128, 0x1f, 0x400},
+       { 0x331c00, 128, 0x1f, 0x400},
+       { 0x332000, 1, 0x1f, 0xdb6},
+       { 0x332400, 1, 0x1e, 0xb24},
+       { 0x332404, 5631, 0x1c, 0x200},
+       { 0x338000, 1, 0x1f, 0xfff},
+       { 0x338040, 1, 0x1f, 0xfff},
+       { 0x338080, 1, 0x1f, 0xfff},
+       { 0x3380c0, 1, 0x1f, 0xfff},
+       { 0x338100, 1, 0x1f, 0x924},
+       { 0x338140, 1, 0x1f, 0x924},
+       { 0x338180, 1, 0x1f, 0x924},
+       { 0x3381c0, 1, 0x1f, 0x924},
+       { 0x338200, 1, 0x1f, 0x924},
+       { 0x338240, 1, 0x1f, 0x924},
+       { 0x338280, 1, 0x1f, 0x924},
+       { 0x3382c0, 1, 0x1f, 0x924},
+       { 0x338300, 1, 0x1f, 0x924},
+       { 0x338340, 1, 0x1f, 0x924},
+       { 0x338380, 1, 0x1f, 0x924},
+       { 0x3383c0, 1, 0x1f, 0x924},
+       { 0x338400, 1, 0x1f, 0x924},
+       { 0x338440, 1, 0x1f, 0x924},
+       { 0x338480, 1, 0x1f, 0x924},
+       { 0x3384c0, 1, 0x1f, 0x924},
+       { 0x338500, 1, 0x1f, 0x924},
+       { 0x338540, 1, 0x1f, 0x924},
+       { 0x338580, 1, 0x1f, 0x924},
+       { 0x3385c0, 19, 0x1c, 0x924},
+       { 0x338800, 1, 0x1f, 0x924},
+       { 0x338840, 1, 0x1f, 0x924},
+       { 0x338880, 1, 0x1f, 0x924},
+       { 0x3388c0, 1, 0x1f, 0x924},
+       { 0x338900, 1, 0x1f, 0x924},
+       { 0x338940, 1, 0x1f, 0x924},
+       { 0x338980, 1, 0x1f, 0x924},
+       { 0x3389c0, 1, 0x1f, 0x924},
+       { 0x338a00, 1, 0x1f, 0xd24},
+       { 0x338a40, 1, 0x1f, 0x924},
+       { 0x338a80, 1, 0x1f, 0x492},
+       { 0x338ac0, 1, 0x1f, 0x924},
+       { 0x338b00, 1, 0x1f, 0x924},
+       { 0x338b40, 1, 0x1f, 0x924},
+       { 0x338b80, 1, 0x1f, 0x924},
+       { 0x338bc0, 1, 0x1f, 0x924},
+       { 0x338c00, 1, 0x1f, 0x924},
+       { 0x338c40, 1, 0x1f, 0x924},
+       { 0x338c80, 1, 0x1f, 0x924},
+       { 0x338cc0, 1, 0x1f, 0x924},
+       { 0x338cc4, 1, 0x1c, 0x924},
+       { 0x338d00, 1, 0x1f, 0x924},
+       { 0x338d40, 1, 0x1f, 0x924},
+       { 0x338d80, 1, 0x1f, 0x924},
+       { 0x338dc0, 1, 0x1f, 0x924},
+       { 0x338e00, 1, 0x1f, 0x924},
+       { 0x338e40, 1, 0x1f, 0x924},
+       { 0x338e80, 1, 0x1f, 0x924},
+       { 0x338e84, 1, 0x1c, 0x924},
+       { 0x338ec0, 1, 0x1e, 0x924},
+       { 0x338f00, 1, 0x1e, 0x924},
+       { 0x338f40, 1, 0x1e, 0x924},
+       { 0x338f80, 1, 0x1e, 0x924},
+       { 0x338fc0, 1, 0x1e, 0x924},
+       { 0x338fd4, 5, 0x1c, 0x924},
+       { 0x338fe8, 2, 0x18, 0x924},
+       { 0x339000, 1, 0x1c, 0x924},
+       { 0x339040, 3, 0x1c, 0x924},
+       { 0x33905c, 1, 0x18, 0x924},
+       { 0x339064, 1, 0x10, 0x924},
+       { 0x339080, 10, 0x10, 0x924},
+       { 0x340000, 2, 0x1f, 0x924},
+       { 0x3a0000, 40960, 0x1c, 0x1000}
 };
-#define REGS_COUNT                     ARRAY_SIZE(reg_addrs)
 
-static const struct dump_sign dump_sign_all = { 0x4e23fde1, 0x70017, 0x3a };
+#define REGS_COUNT ARRAY_SIZE(reg_addrs)
 
-static const u32 page_vals_e2[] = { 0, 128 };
-#define PAGE_MODE_VALUES_E2            ARRAY_SIZE(page_vals_e2)
+static const struct reg_addr idle_reg_addrs[] = {
+       { 0x2104, 1, 0x1f, 0xfff},
+       { 0x2110, 2, 0x1f, 0xfff},
+       { 0x211c, 8, 0x1f, 0xfff},
+       { 0x2814, 1, 0x1f, 0xfff},
+       { 0x281c, 2, 0x1f, 0xfff},
+       { 0x2854, 1, 0x1f, 0xfff},
+       { 0x285c, 1, 0x1f, 0xfff},
+       { 0x3040, 1, 0x1f, 0xfff},
+       { 0x9010, 7, 0x1c, 0xfff},
+       { 0x9030, 1, 0x1c, 0xfff},
+       { 0x9068, 16, 0x1c, 0xfff},
+       { 0x9230, 2, 0x1c, 0xfff},
+       { 0x9244, 1, 0x1c, 0xfff},
+       { 0x9298, 1, 0x1c, 0xfff},
+       { 0x92a8, 1, 0x1c, 0x1fff},
+       { 0xa38c, 1, 0x1f, 0x1fff},
+       { 0xa3c4, 1, 0x1e, 0xfff},
+       { 0xa404, 1, 0x1f, 0xfff},
+       { 0xa408, 2, 0x1f, 0x1fff},
+       { 0xa42c, 12, 0x1f, 0xfff},
+       { 0xa580, 1, 0x1f, 0x1fff},
+       { 0xa590, 1, 0x1f, 0x1fff},
+       { 0xa600, 5, 0x1e, 0xfff},
+       { 0xa618, 1, 0x1e, 0xfff},
+       { 0xa714, 1, 0x1c, 0xfff},
+       { 0xa720, 1, 0x1c, 0xfff},
+       { 0xa750, 1, 0x1c, 0xfff},
+       { 0xc09c, 1, 0x3, 0xfff},
+       { 0x103b0, 1, 0x1f, 0xfff},
+       { 0x103c0, 1, 0x1f, 0xfff},
+       { 0x103d0, 1, 0x3, 0x1fff},
+       { 0x10418, 1, 0x1f, 0xfff},
+       { 0x10420, 1, 0x1f, 0xfff},
+       { 0x10428, 1, 0x1f, 0xfff},
+       { 0x10460, 1, 0x1f, 0xfff},
+       { 0x10474, 1, 0x1f, 0xfff},
+       { 0x104e0, 1, 0x1f, 0xfff},
+       { 0x104ec, 1, 0x1f, 0xfff},
+       { 0x104f8, 1, 0x1f, 0xfff},
+       { 0x10508, 1, 0x1f, 0xfff},
+       { 0x10530, 1, 0x1f, 0xfff},
+       { 0x10538, 1, 0x1f, 0xfff},
+       { 0x10548, 1, 0x1f, 0xfff},
+       { 0x10558, 1, 0x1f, 0xfff},
+       { 0x182a8, 1, 0x1c, 0xfff},
+       { 0x182b8, 1, 0x1c, 0xfff},
+       { 0x18308, 1, 0x1c, 0xfff},
+       { 0x18318, 1, 0x1c, 0xfff},
+       { 0x18338, 1, 0x1c, 0xfff},
+       { 0x18348, 1, 0x1c, 0xfff},
+       { 0x183bc, 1, 0x1c, 0x1fff},
+       { 0x183cc, 1, 0x1c, 0x1fff},
+       { 0x18570, 1, 0x18, 0xfff},
+       { 0x18578, 1, 0x18, 0xfff},
+       { 0x1858c, 1, 0x18, 0xfff},
+       { 0x18594, 1, 0x18, 0xfff},
+       { 0x1862c, 4, 0x10, 0xfff},
+       { 0x2021c, 11, 0x1f, 0xfff},
+       { 0x202a8, 1, 0x1f, 0xfff},
+       { 0x202b8, 1, 0x1f, 0x1fff},
+       { 0x20404, 1, 0x1f, 0xfff},
+       { 0x2040c, 2, 0x1f, 0xfff},
+       { 0x2041c, 2, 0x1f, 0xfff},
+       { 0x40154, 14, 0x1f, 0xfff},
+       { 0x40198, 1, 0x1f, 0x1fff},
+       { 0x404ac, 1, 0x1f, 0xfff},
+       { 0x404bc, 1, 0x1f, 0x1fff},
+       { 0x42290, 1, 0x1f, 0xfff},
+       { 0x422a0, 1, 0x1f, 0xfff},
+       { 0x422b0, 1, 0x1f, 0x1fff},
+       { 0x42548, 1, 0x1f, 0xfff},
+       { 0x42550, 1, 0x1f, 0xfff},
+       { 0x42558, 1, 0x1f, 0xfff},
+       { 0x50160, 8, 0x1f, 0xfff},
+       { 0x501d0, 1, 0x1f, 0xfff},
+       { 0x501e0, 1, 0x1f, 0x1fff},
+       { 0x50204, 1, 0x1f, 0xfff},
+       { 0x5020c, 2, 0x1f, 0xfff},
+       { 0x5021c, 1, 0x1f, 0xfff},
+       { 0x60090, 1, 0x1f, 0xfff},
+       { 0x6011c, 1, 0x1f, 0xfff},
+       { 0x6012c, 1, 0x1f, 0x1fff},
+       { 0xc101c, 1, 0x1f, 0xfff},
+       { 0xc102c, 1, 0x1f, 0x1fff},
+       { 0xc2290, 1, 0x1f, 0xfff},
+       { 0xc22a0, 1, 0x1f, 0xfff},
+       { 0xc22b0, 1, 0x1f, 0x1fff},
+       { 0xc2548, 1, 0x1f, 0xfff},
+       { 0xc2550, 1, 0x1f, 0xfff},
+       { 0xc2558, 1, 0x1f, 0xfff},
+       { 0xc4294, 1, 0x1f, 0xfff},
+       { 0xc42a4, 1, 0x1f, 0xfff},
+       { 0xc42b4, 1, 0x1f, 0x1fff},
+       { 0xc4550, 1, 0x1f, 0xfff},
+       { 0xc4558, 1, 0x1f, 0xfff},
+       { 0xc4560, 1, 0x1f, 0xfff},
+       { 0xd016c, 8, 0x1f, 0xfff},
+       { 0xd01d8, 1, 0x1f, 0xfff},
+       { 0xd01e8, 1, 0x1f, 0x1fff},
+       { 0xd0204, 1, 0x1f, 0xfff},
+       { 0xd020c, 3, 0x1f, 0xfff},
+       { 0xe0154, 8, 0x1f, 0xfff},
+       { 0xe01c8, 1, 0x1f, 0xfff},
+       { 0xe01d8, 1, 0x1f, 0x1fff},
+       { 0xe0204, 1, 0x1f, 0xfff},
+       { 0xe020c, 2, 0x1f, 0xfff},
+       { 0xe021c, 2, 0x1f, 0xfff},
+       { 0x101014, 1, 0x1f, 0xfff},
+       { 0x101030, 1, 0x1f, 0xfff},
+       { 0x101040, 1, 0x1f, 0x1fff},
+       { 0x102058, 1, 0x1f, 0x1fff},
+       { 0x102080, 16, 0x1f, 0xfff},
+       { 0x103004, 2, 0x1f, 0xfff},
+       { 0x103068, 1, 0x1f, 0xfff},
+       { 0x103078, 1, 0x1f, 0xfff},
+       { 0x103088, 1, 0x1f, 0x1fff},
+       { 0x10309c, 2, 0x1e, 0xfff},
+       { 0x1030b8, 2, 0x1c, 0xfff},
+       { 0x1030cc, 1, 0x1c, 0xfff},
+       { 0x1030e0, 1, 0x1c, 0xfff},
+       { 0x104004, 1, 0x1f, 0xfff},
+       { 0x104018, 1, 0x1f, 0xfff},
+       { 0x104020, 1, 0x1f, 0xfff},
+       { 0x10403c, 1, 0x1f, 0xfff},
+       { 0x1040fc, 1, 0x1f, 0xfff},
+       { 0x10410c, 1, 0x1f, 0x1fff},
+       { 0x104400, 1, 0x1f, 0x1fff},
+       { 0x104404, 63, 0x1f, 0xfff},
+       { 0x104800, 1, 0x1f, 0x1fff},
+       { 0x104804, 63, 0x1f, 0xfff},
+       { 0x105000, 4, 0x1f, 0x1fff},
+       { 0x105010, 252, 0x1f, 0xfff},
+       { 0x108094, 1, 0x3, 0xfff},
+       { 0x1201b0, 2, 0x1f, 0xfff},
+       { 0x12032c, 1, 0x1f, 0xfff},
+       { 0x12036c, 3, 0x1f, 0xfff},
+       { 0x120408, 2, 0x1f, 0xfff},
+       { 0x120414, 15, 0x1f, 0xfff},
+       { 0x120478, 2, 0x1f, 0xfff},
+       { 0x12052c, 1, 0x1f, 0xfff},
+       { 0x120564, 3, 0x1f, 0xfff},
+       { 0x12057c, 1, 0x1f, 0x1fff},
+       { 0x12058c, 1, 0x1f, 0x1fff},
+       { 0x120608, 1, 0x1e, 0xfff},
+       { 0x120748, 1, 0x1c, 0xfff},
+       { 0x120778, 2, 0x1c, 0xfff},
+       { 0x120808, 3, 0x1f, 0xfff},
+       { 0x120818, 1, 0x1f, 0xfff},
+       { 0x120820, 1, 0x1f, 0xfff},
+       { 0x120828, 1, 0x1f, 0xfff},
+       { 0x120830, 1, 0x1f, 0xfff},
+       { 0x120838, 1, 0x1f, 0xfff},
+       { 0x120840, 1, 0x1f, 0xfff},
+       { 0x120848, 1, 0x1f, 0xfff},
+       { 0x120850, 1, 0x1f, 0xfff},
+       { 0x120858, 1, 0x1f, 0xfff},
+       { 0x120860, 1, 0x1f, 0xfff},
+       { 0x120868, 1, 0x1f, 0xfff},
+       { 0x120870, 1, 0x1f, 0xfff},
+       { 0x120878, 1, 0x1f, 0xfff},
+       { 0x120880, 1, 0x1f, 0xfff},
+       { 0x120888, 1, 0x1f, 0xfff},
+       { 0x120890, 1, 0x1f, 0xfff},
+       { 0x120898, 1, 0x1f, 0xfff},
+       { 0x1208a0, 1, 0x1f, 0xfff},
+       { 0x1208a8, 1, 0x1f, 0xfff},
+       { 0x1208b0, 1, 0x1f, 0xfff},
+       { 0x1208b8, 1, 0x1f, 0xfff},
+       { 0x1208c0, 1, 0x1f, 0xfff},
+       { 0x1208c8, 1, 0x1f, 0xfff},
+       { 0x1208d0, 1, 0x1f, 0xfff},
+       { 0x1208d8, 1, 0x1f, 0xfff},
+       { 0x1208e0, 1, 0x1f, 0xfff},
+       { 0x1208e8, 1, 0x1f, 0xfff},
+       { 0x1208f0, 1, 0x1f, 0xfff},
+       { 0x1208f8, 1, 0x1f, 0xfff},
+       { 0x120900, 1, 0x1f, 0xfff},
+       { 0x120908, 1, 0x1f, 0xfff},
+       { 0x130030, 1, 0x1c, 0xfff},
+       { 0x13004c, 3, 0x1c, 0xfff},
+       { 0x130064, 2, 0x1c, 0xfff},
+       { 0x13009c, 1, 0x1c, 0x1fff},
+       { 0x130130, 1, 0x1c, 0xfff},
+       { 0x13016c, 1, 0x1c, 0xfff},
+       { 0x130300, 1, 0x1c, 0xfff},
+       { 0x130480, 1, 0x1c, 0xfff},
+       { 0x14005c, 2, 0xf, 0xfff},
+       { 0x1400d0, 2, 0xf, 0xfff},
+       { 0x1400e0, 1, 0xf, 0xfff},
+       { 0x1401c8, 1, 0xf, 0xfff},
+       { 0x140200, 6, 0xf, 0xfff},
+       { 0x140338, 7, 0x10, 0xfff},
+       { 0x140370, 7, 0x10, 0xfff},
+       { 0x15c1bc, 6, 0x10, 0xfff},
+       { 0x15c230, 7, 0x10, 0xfff},
+       { 0x16101c, 1, 0x1f, 0xfff},
+       { 0x16102c, 1, 0x1f, 0x1fff},
+       { 0x164014, 2, 0x1f, 0xfff},
+       { 0x1640f0, 1, 0x1f, 0xfff},
+       { 0x166290, 1, 0x1f, 0xfff},
+       { 0x1662a0, 1, 0x1f, 0xfff},
+       { 0x1662b0, 1, 0x1f, 0x1fff},
+       { 0x166548, 1, 0x1f, 0xfff},
+       { 0x166550, 1, 0x1f, 0xfff},
+       { 0x166558, 1, 0x1f, 0xfff},
+       { 0x168000, 1, 0x1f, 0xfff},
+       { 0x168008, 1, 0x1f, 0xfff},
+       { 0x168010, 1, 0x1f, 0xfff},
+       { 0x168018, 1, 0x1f, 0xfff},
+       { 0x168028, 2, 0x1f, 0xfff},
+       { 0x168058, 9, 0x1f, 0xfff},
+       { 0x168238, 1, 0x1f, 0xfff},
+       { 0x1682d0, 7, 0x1f, 0xfff},
+       { 0x168300, 2, 0x3, 0xfff},
+       { 0x168308, 65, 0x1f, 0xfff},
+       { 0x168410, 2, 0x1f, 0xfff},
+       { 0x168438, 1, 0x1f, 0xfff},
+       { 0x168448, 1, 0x1f, 0x1fff},
+       { 0x168a00, 128, 0x1f, 0xfff},
+       { 0x16e200, 128, 0x2, 0xfff},
+       { 0x16e404, 2, 0x2, 0xfff},
+       { 0x16e584, 64, 0x2, 0xfff},
+       { 0x16e684, 2, 0x1e, 0xfff},
+       { 0x16e68c, 4, 0x2, 0xfff},
+       { 0x16e6fc, 4, 0x1c, 0xfff},
+       { 0x16e7ac, 12, 0x10, 0xfff},
+       { 0x1700a4, 1, 0x1f, 0xfff},
+       { 0x1700ac, 2, 0x1f, 0xfff},
+       { 0x1700c0, 1, 0x1f, 0xfff},
+       { 0x170174, 1, 0x1f, 0xfff},
+       { 0x170184, 1, 0x1f, 0x1fff},
+       { 0x1800f4, 1, 0x1f, 0xfff},
+       { 0x180104, 1, 0x1f, 0xfff},
+       { 0x180114, 1, 0x1f, 0x1fff},
+       { 0x180124, 1, 0x1f, 0x1fff},
+       { 0x18026c, 1, 0x1f, 0xfff},
+       { 0x1802a0, 1, 0x1f, 0xfff},
+       { 0x1b8000, 1, 0x1f, 0xfff},
+       { 0x1b8040, 1, 0x1f, 0xfff},
+       { 0x1b8080, 1, 0x1f, 0xfff},
+       { 0x1b80c0, 1, 0x1f, 0xfff},
+       { 0x200104, 1, 0x1f, 0xfff},
+       { 0x200114, 1, 0x1f, 0xfff},
+       { 0x200124, 1, 0x1f, 0x1fff},
+       { 0x200134, 1, 0x1f, 0x1fff},
+       { 0x20026c, 1, 0x1f, 0xfff},
+       { 0x2002a0, 1, 0x1f, 0xfff},
+       { 0x238000, 1, 0x1f, 0xfff},
+       { 0x238040, 1, 0x1f, 0xfff},
+       { 0x238080, 1, 0x1f, 0xfff},
+       { 0x2380c0, 1, 0x1f, 0xfff},
+       { 0x280104, 1, 0x1f, 0xfff},
+       { 0x280114, 1, 0x1f, 0xfff},
+       { 0x280124, 1, 0x1f, 0x1fff},
+       { 0x280134, 1, 0x1f, 0x1fff},
+       { 0x28026c, 1, 0x1f, 0xfff},
+       { 0x2802a0, 1, 0x1f, 0xfff},
+       { 0x2b8000, 1, 0x1f, 0xfff},
+       { 0x2b8040, 1, 0x1f, 0xfff},
+       { 0x2b8080, 1, 0x1f, 0xfff},
+       { 0x300104, 1, 0x1f, 0xfff},
+       { 0x300114, 1, 0x1f, 0xfff},
+       { 0x300124, 1, 0x1f, 0x1fff},
+       { 0x300134, 1, 0x1f, 0x1fff},
+       { 0x30026c, 1, 0x1f, 0xfff},
+       { 0x3002a0, 1, 0x1f, 0xfff},
+       { 0x338000, 1, 0x1f, 0xfff},
+       { 0x338040, 1, 0x1f, 0xfff},
+       { 0x338080, 1, 0x1f, 0xfff},
+       { 0x3380c0, 1, 0x1f, 0xfff}
+};
 
-static const u32 page_write_regs_e2[] = { 328476 };
-#define PAGE_WRITE_REGS_E2             ARRAY_SIZE(page_write_regs_e2)
+#define IDLE_REGS_COUNT ARRAY_SIZE(idle_reg_addrs)
 
-static const struct reg_addr page_read_regs_e2[] = {
-       { 0x58000, 4608, RI_E2_ONLINE } };
-#define PAGE_READ_REGS_E2              ARRAY_SIZE(page_read_regs_e2)
+static const u32 read_reg_e1[] = {
+       0x1b1000};
 
-static const u32 page_vals_e3[] = { 0, 128 };
-#define PAGE_MODE_VALUES_E3            ARRAY_SIZE(page_vals_e3)
+static const struct wreg_addr wreg_addr_e1 = {
+       0x1b0c00, 192, 1, read_reg_e1, 0x1f, 0x1fff};
 
-static const u32 page_write_regs_e3[] = { 328476 };
-#define PAGE_WRITE_REGS_E3             ARRAY_SIZE(page_write_regs_e3)
+static const u32 read_reg_e1h[] = {
+       0x1b1040, 0x1b1000};
 
-static const struct reg_addr page_read_regs_e3[] = {
-       { 0x58000, 4608, RI_E3E3B0_ONLINE } };
-#define PAGE_READ_REGS_E3              ARRAY_SIZE(page_read_regs_e3)
+static const struct wreg_addr wreg_addr_e1h = {
+       0x1b0c00, 256, 2, read_reg_e1h, 0x1f, 0x1fff};
+
+static const u32 read_reg_e2[] = {
+       0x1b1040, 0x1b1000};
+
+static const struct wreg_addr wreg_addr_e2 = {
+       0x1b0c00, 128, 2, read_reg_e2, 0x1f, 0x1fff};
 
-#endif /* BNX2X_DUMP_H */
+static const u32 read_reg_e3[] = {
+       0x1b1040, 0x1b1000};
+
+static const struct wreg_addr wreg_addr_e3 = {
+       0x1b0c00, 128, 2, read_reg_e3, 0x1f, 0x1fff};
+
+static const u32 read_reg_e3b0[] = {
+       0x1b1040, 0x1b1000};
+
+static const struct wreg_addr wreg_addr_e3b0 = {
+       0x1b0c00, 128, 2, read_reg_e3b0, 0x1f, 0x1fff};
+
+static const unsigned int dump_num_registers[NUM_CHIPS][NUM_PRESETS] = {
+       {20782, 18567, 27975, 19729, 18311, 27719, 20836, 32391, 41799, 20812,
+        26247, 35655, 19074},
+       {32774, 19297, 33277, 31721, 19041, 33021, 32828, 33121, 47101, 32804,
+        26977, 40957, 35895},
+       {36527, 17928, 33697, 35474, 18700, 34466, 36581, 31752, 47521, 36557,
+        25608, 41377, 43903},
+       {45239, 17936, 34387, 44186, 18708, 35156, 45293, 31760, 48211, 45269,
+        25616, 42067, 43903},
+       {45302, 17999, 34802, 44249, 18771, 35571, 45356, 31823, 48626, 45332,
+        25679, 42482, 43903}
+};
+#endif
index 292634f0e90b8e6c7981d15ff4687004a8e928ab..9a674b14b403dc605bfb10c448ea8a175a2614ae 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_ethtool.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -186,6 +186,7 @@ static const struct {
 };
 
 #define BNX2X_NUM_STATS                ARRAY_SIZE(bnx2x_stats_arr)
+
 static int bnx2x_get_port_type(struct bnx2x *bp)
 {
        int port_type;
@@ -233,7 +234,7 @@ static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 
        if ((bp->state == BNX2X_STATE_OPEN) && bp->link_vars.link_up &&
            !(bp->flags & MF_FUNC_DIS)) {
-                       cmd->duplex = bp->link_vars.duplex;
+               cmd->duplex = bp->link_vars.duplex;
 
                if (IS_MF(bp) && !BP_NOMCP(bp))
                        ethtool_cmd_speed_set(cmd, bnx2x_get_mf_speed(bp));
@@ -399,7 +400,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
                DP(BNX2X_MSG_ETHTOOL, "Unsupported port type\n");
                return -EINVAL;
        }
-       /* Save new config in case command complete successully */
+       /* Save new config in case command complete successfully */
        new_multi_phy_config = bp->link_params.multi_phy_config;
        /* Get the new cfg_idx */
        cfg_idx = bnx2x_get_link_cfg_idx(bp);
@@ -596,29 +597,58 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
        return 0;
 }
 
-#define IS_E1_ONLINE(info)     (((info) & RI_E1_ONLINE) == RI_E1_ONLINE)
-#define IS_E1H_ONLINE(info)    (((info) & RI_E1H_ONLINE) == RI_E1H_ONLINE)
-#define IS_E2_ONLINE(info)     (((info) & RI_E2_ONLINE) == RI_E2_ONLINE)
-#define IS_E3_ONLINE(info)     (((info) & RI_E3_ONLINE) == RI_E3_ONLINE)
-#define IS_E3B0_ONLINE(info)   (((info) & RI_E3B0_ONLINE) == RI_E3B0_ONLINE)
+#define DUMP_ALL_PRESETS               0x1FFF
+#define DUMP_MAX_PRESETS               13
 
-static bool bnx2x_is_reg_online(struct bnx2x *bp,
-                               const struct reg_addr *reg_info)
+static int __bnx2x_get_preset_regs_len(struct bnx2x *bp, u32 preset)
 {
        if (CHIP_IS_E1(bp))
-               return IS_E1_ONLINE(reg_info->info);
+               return dump_num_registers[0][preset-1];
        else if (CHIP_IS_E1H(bp))
-               return IS_E1H_ONLINE(reg_info->info);
+               return dump_num_registers[1][preset-1];
        else if (CHIP_IS_E2(bp))
-               return IS_E2_ONLINE(reg_info->info);
+               return dump_num_registers[2][preset-1];
        else if (CHIP_IS_E3A0(bp))
-               return IS_E3_ONLINE(reg_info->info);
+               return dump_num_registers[3][preset-1];
        else if (CHIP_IS_E3B0(bp))
-               return IS_E3B0_ONLINE(reg_info->info);
+               return dump_num_registers[4][preset-1];
        else
-               return false;
+               return 0;
+}
+
+static int __bnx2x_get_regs_len(struct bnx2x *bp)
+{
+       u32 preset_idx;
+       int regdump_len = 0;
+
+       /* Calculate the total preset regs length */
+       for (preset_idx = 1; preset_idx <= DUMP_MAX_PRESETS; preset_idx++)
+               regdump_len += __bnx2x_get_preset_regs_len(bp, preset_idx);
+
+       return regdump_len;
+}
+
+static int bnx2x_get_regs_len(struct net_device *dev)
+{
+       struct bnx2x *bp = netdev_priv(dev);
+       int regdump_len = 0;
+
+       regdump_len = __bnx2x_get_regs_len(bp);
+       regdump_len *= 4;
+       regdump_len += sizeof(struct dump_header);
+
+       return regdump_len;
 }
 
+#define IS_E1_REG(chips)       ((chips & DUMP_CHIP_E1) == DUMP_CHIP_E1)
+#define IS_E1H_REG(chips)      ((chips & DUMP_CHIP_E1H) == DUMP_CHIP_E1H)
+#define IS_E2_REG(chips)       ((chips & DUMP_CHIP_E2) == DUMP_CHIP_E2)
+#define IS_E3A0_REG(chips)     ((chips & DUMP_CHIP_E3A0) == DUMP_CHIP_E3A0)
+#define IS_E3B0_REG(chips)     ((chips & DUMP_CHIP_E3B0) == DUMP_CHIP_E3B0)
+
+#define IS_REG_IN_PRESET(presets, idx)  \
+               ((presets & (1 << (idx-1))) == (1 << (idx-1)))
+
 /******* Paged registers info selectors ********/
 static const u32 *__bnx2x_get_page_addr_ar(struct bnx2x *bp)
 {
@@ -680,38 +710,39 @@ static u32 __bnx2x_get_page_read_num(struct bnx2x *bp)
                return 0;
 }
 
-static int __bnx2x_get_regs_len(struct bnx2x *bp)
+static bool bnx2x_is_reg_in_chip(struct bnx2x *bp,
+                                      const struct reg_addr *reg_info)
 {
-       int num_pages = __bnx2x_get_page_reg_num(bp);
-       int page_write_num = __bnx2x_get_page_write_num(bp);
-       const struct reg_addr *page_read_addr = __bnx2x_get_page_read_ar(bp);
-       int page_read_num = __bnx2x_get_page_read_num(bp);
-       int regdump_len = 0;
-       int i, j, k;
-
-       for (i = 0; i < REGS_COUNT; i++)
-               if (bnx2x_is_reg_online(bp, &reg_addrs[i]))
-                       regdump_len += reg_addrs[i].size;
-
-       for (i = 0; i < num_pages; i++)
-               for (j = 0; j < page_write_num; j++)
-                       for (k = 0; k < page_read_num; k++)
-                               if (bnx2x_is_reg_online(bp, &page_read_addr[k]))
-                                       regdump_len += page_read_addr[k].size;
-
-       return regdump_len;
+       if (CHIP_IS_E1(bp))
+               return IS_E1_REG(reg_info->chips);
+       else if (CHIP_IS_E1H(bp))
+               return IS_E1H_REG(reg_info->chips);
+       else if (CHIP_IS_E2(bp))
+               return IS_E2_REG(reg_info->chips);
+       else if (CHIP_IS_E3A0(bp))
+               return IS_E3A0_REG(reg_info->chips);
+       else if (CHIP_IS_E3B0(bp))
+               return IS_E3B0_REG(reg_info->chips);
+       else
+               return false;
 }
 
-static int bnx2x_get_regs_len(struct net_device *dev)
-{
-       struct bnx2x *bp = netdev_priv(dev);
-       int regdump_len = 0;
-
-       regdump_len = __bnx2x_get_regs_len(bp);
-       regdump_len *= 4;
-       regdump_len += sizeof(struct dump_hdr);
 
-       return regdump_len;
+static bool bnx2x_is_wreg_in_chip(struct bnx2x *bp,
+       const struct wreg_addr *wreg_info)
+{
+       if (CHIP_IS_E1(bp))
+               return IS_E1_REG(wreg_info->chips);
+       else if (CHIP_IS_E1H(bp))
+               return IS_E1H_REG(wreg_info->chips);
+       else if (CHIP_IS_E2(bp))
+               return IS_E2_REG(wreg_info->chips);
+       else if (CHIP_IS_E3A0(bp))
+               return IS_E3A0_REG(wreg_info->chips);
+       else if (CHIP_IS_E3B0(bp))
+               return IS_E3B0_REG(wreg_info->chips);
+       else
+               return false;
 }
 
 /**
@@ -725,9 +756,10 @@ static int bnx2x_get_regs_len(struct net_device *dev)
  * ("read address"). There may be more than one write address per "page" and
  * more than one read address per write address.
  */
-static void bnx2x_read_pages_regs(struct bnx2x *bp, u32 *p)
+static void bnx2x_read_pages_regs(struct bnx2x *bp, u32 *p, u32 preset)
 {
        u32 i, j, k, n;
+
        /* addresses of the paged registers */
        const u32 *page_addr = __bnx2x_get_page_addr_ar(bp);
        /* number of paged registers */
@@ -740,32 +772,100 @@ static void bnx2x_read_pages_regs(struct bnx2x *bp, u32 *p)
        const struct reg_addr *read_addr = __bnx2x_get_page_read_ar(bp);
        /* number of read addresses */
        int read_num = __bnx2x_get_page_read_num(bp);
+       u32 addr, size;
 
        for (i = 0; i < num_pages; i++) {
                for (j = 0; j < write_num; j++) {
                        REG_WR(bp, write_addr[j], page_addr[i]);
-                       for (k = 0; k < read_num; k++)
-                               if (bnx2x_is_reg_online(bp, &read_addr[k]))
-                                       for (n = 0; n <
-                                             read_addr[k].size; n++)
-                                               *p++ = REG_RD(bp,
-                                                      read_addr[k].addr + n*4);
+
+                       for (k = 0; k < read_num; k++) {
+                               if (IS_REG_IN_PRESET(read_addr[k].presets,
+                                                    preset)) {
+                                       size = read_addr[k].size;
+                                       for (n = 0; n < size; n++) {
+                                               addr = read_addr[k].addr + n*4;
+                                               *p++ = REG_RD(bp, addr);
+                                       }
+                               }
+                       }
                }
        }
 }
 
-static void __bnx2x_get_regs(struct bnx2x *bp, u32 *p)
+static int __bnx2x_get_preset_regs(struct bnx2x *bp, u32 *p, u32 preset)
 {
-       u32 i, j;
+       u32 i, j, addr;
+       const struct wreg_addr *wreg_addr_p = NULL;
+
+       if (CHIP_IS_E1(bp))
+               wreg_addr_p = &wreg_addr_e1;
+       else if (CHIP_IS_E1H(bp))
+               wreg_addr_p = &wreg_addr_e1h;
+       else if (CHIP_IS_E2(bp))
+               wreg_addr_p = &wreg_addr_e2;
+       else if (CHIP_IS_E3A0(bp))
+               wreg_addr_p = &wreg_addr_e3;
+       else if (CHIP_IS_E3B0(bp))
+               wreg_addr_p = &wreg_addr_e3b0;
+
+       /* Read the idle_chk registers */
+       for (i = 0; i < IDLE_REGS_COUNT; i++) {
+               if (bnx2x_is_reg_in_chip(bp, &idle_reg_addrs[i]) &&
+                   IS_REG_IN_PRESET(idle_reg_addrs[i].presets, preset)) {
+                       for (j = 0; j < idle_reg_addrs[i].size; j++)
+                               *p++ = REG_RD(bp, idle_reg_addrs[i].addr + j*4);
+               }
+       }
 
        /* Read the regular registers */
-       for (i = 0; i < REGS_COUNT; i++)
-               if (bnx2x_is_reg_online(bp, &reg_addrs[i]))
+       for (i = 0; i < REGS_COUNT; i++) {
+               if (bnx2x_is_reg_in_chip(bp, &reg_addrs[i]) &&
+                   IS_REG_IN_PRESET(reg_addrs[i].presets, preset)) {
                        for (j = 0; j < reg_addrs[i].size; j++)
                                *p++ = REG_RD(bp, reg_addrs[i].addr + j*4);
+               }
+       }
+
+       /* Read the CAM registers */
+       if (bnx2x_is_wreg_in_chip(bp, wreg_addr_p) &&
+           IS_REG_IN_PRESET(wreg_addr_p->presets, preset)) {
+               for (i = 0; i < wreg_addr_p->size; i++) {
+                       *p++ = REG_RD(bp, wreg_addr_p->addr + i*4);
+
+                       /* In case of wreg_addr register, read additional
+                          registers from read_regs array
+                       */
+                       for (j = 0; j < wreg_addr_p->read_regs_count; j++) {
+                               addr = *(wreg_addr_p->read_regs);
+                               *p++ = REG_RD(bp, addr + j*4);
+                       }
+               }
+       }
+
+       /* Paged registers are supported in E2 & E3 only */
+       if (CHIP_IS_E2(bp) || CHIP_IS_E3(bp)) {
+               /* Read "paged" registes */
+               bnx2x_read_pages_regs(bp, p, preset);
+       }
 
-       /* Read "paged" registes */
-       bnx2x_read_pages_regs(bp, p);
+       return 0;
+}
+
+static void __bnx2x_get_regs(struct bnx2x *bp, u32 *p)
+{
+       u32 preset_idx;
+
+       /* Read all registers, by reading all preset registers */
+       for (preset_idx = 1; preset_idx <= DUMP_MAX_PRESETS; preset_idx++) {
+               /* Skip presets with IOR */
+               if ((preset_idx == 2) ||
+                   (preset_idx == 5) ||
+                   (preset_idx == 8) ||
+                   (preset_idx == 11))
+                       continue;
+               __bnx2x_get_preset_regs(bp, p, preset_idx);
+               p += __bnx2x_get_preset_regs_len(bp, preset_idx);
+       }
 }
 
 static void bnx2x_get_regs(struct net_device *dev,
@@ -773,9 +873,9 @@ static void bnx2x_get_regs(struct net_device *dev,
 {
        u32 *p = _p;
        struct bnx2x *bp = netdev_priv(dev);
-       struct dump_hdr dump_hdr = {0};
+       struct dump_header dump_hdr = {0};
 
-       regs->version = 1;
+       regs->version = 2;
        memset(p, 0, regs->len);
 
        if (!netif_running(bp->dev))
@@ -785,32 +885,161 @@ static void bnx2x_get_regs(struct net_device *dev,
         * cause false alarms by reading never written registers. We
         * will re-enable parity attentions right after the dump.
         */
+
+       /* Disable parity on path 0 */
+       bnx2x_pretend_func(bp, 0);
        bnx2x_disable_blocks_parity(bp);
 
-       dump_hdr.hdr_size = (sizeof(struct dump_hdr) / 4) - 1;
-       dump_hdr.dump_sign = dump_sign_all;
-       dump_hdr.xstorm_waitp = REG_RD(bp, XSTORM_WAITP_ADDR);
-       dump_hdr.tstorm_waitp = REG_RD(bp, TSTORM_WAITP_ADDR);
-       dump_hdr.ustorm_waitp = REG_RD(bp, USTORM_WAITP_ADDR);
-       dump_hdr.cstorm_waitp = REG_RD(bp, CSTORM_WAITP_ADDR);
+       /* Disable parity on path 1 */
+       bnx2x_pretend_func(bp, 1);
+       bnx2x_disable_blocks_parity(bp);
 
-       if (CHIP_IS_E1(bp))
-               dump_hdr.info = RI_E1_ONLINE;
-       else if (CHIP_IS_E1H(bp))
-               dump_hdr.info = RI_E1H_ONLINE;
-       else if (!CHIP_IS_E1x(bp))
-               dump_hdr.info = RI_E2_ONLINE |
-               (BP_PATH(bp) ? RI_PATH1_DUMP : RI_PATH0_DUMP);
+       /* Return to current function */
+       bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
+
+       dump_hdr.header_size = (sizeof(struct dump_header) / 4) - 1;
+       dump_hdr.preset = DUMP_ALL_PRESETS;
+       dump_hdr.version = BNX2X_DUMP_VERSION;
 
-       memcpy(p, &dump_hdr, sizeof(struct dump_hdr));
-       p += dump_hdr.hdr_size + 1;
+       /* dump_meta_data presents OR of CHIP and PATH. */
+       if (CHIP_IS_E1(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E1;
+       } else if (CHIP_IS_E1H(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E1H;
+       } else if (CHIP_IS_E2(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E2 |
+               (BP_PATH(bp) ? DUMP_PATH_1 : DUMP_PATH_0);
+       } else if (CHIP_IS_E3A0(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E3A0 |
+               (BP_PATH(bp) ? DUMP_PATH_1 : DUMP_PATH_0);
+       } else if (CHIP_IS_E3B0(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E3B0 |
+               (BP_PATH(bp) ? DUMP_PATH_1 : DUMP_PATH_0);
+       }
+
+       memcpy(p, &dump_hdr, sizeof(struct dump_header));
+       p += dump_hdr.header_size + 1;
 
        /* Actually read the registers */
        __bnx2x_get_regs(bp, p);
 
-       /* Re-enable parity attentions */
+       /* Re-enable parity attentions on path 0 */
+       bnx2x_pretend_func(bp, 0);
        bnx2x_clear_blocks_parity(bp);
        bnx2x_enable_blocks_parity(bp);
+
+       /* Re-enable parity attentions on path 1 */
+       bnx2x_pretend_func(bp, 1);
+       bnx2x_clear_blocks_parity(bp);
+       bnx2x_enable_blocks_parity(bp);
+
+       /* Return to current function */
+       bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
+}
+
+static int bnx2x_get_preset_regs_len(struct net_device *dev, u32 preset)
+{
+       struct bnx2x *bp = netdev_priv(dev);
+       int regdump_len = 0;
+
+       regdump_len = __bnx2x_get_preset_regs_len(bp, preset);
+       regdump_len *= 4;
+       regdump_len += sizeof(struct dump_header);
+
+       return regdump_len;
+}
+
+static int bnx2x_set_dump(struct net_device *dev, struct ethtool_dump *val)
+{
+       struct bnx2x *bp = netdev_priv(dev);
+
+       /* Use the ethtool_dump "flag" field as the dump preset index */
+       bp->dump_preset_idx = val->flag;
+       return 0;
+}
+
+static int bnx2x_get_dump_flag(struct net_device *dev,
+                              struct ethtool_dump *dump)
+{
+       struct bnx2x *bp = netdev_priv(dev);
+
+       /* Calculate the requested preset idx length */
+       dump->len = bnx2x_get_preset_regs_len(dev, bp->dump_preset_idx);
+       DP(BNX2X_MSG_ETHTOOL, "Get dump preset %d length=%d\n",
+          bp->dump_preset_idx, dump->len);
+
+       dump->flag = ETHTOOL_GET_DUMP_DATA;
+       return 0;
+}
+
+static int bnx2x_get_dump_data(struct net_device *dev,
+                              struct ethtool_dump *dump,
+                              void *buffer)
+{
+       u32 *p = buffer;
+       struct bnx2x *bp = netdev_priv(dev);
+       struct dump_header dump_hdr = {0};
+
+       memset(p, 0, dump->len);
+
+       /* Disable parity attentions as long as following dump may
+        * cause false alarms by reading never written registers. We
+        * will re-enable parity attentions right after the dump.
+        */
+
+       /* Disable parity on path 0 */
+       bnx2x_pretend_func(bp, 0);
+       bnx2x_disable_blocks_parity(bp);
+
+       /* Disable parity on path 1 */
+       bnx2x_pretend_func(bp, 1);
+       bnx2x_disable_blocks_parity(bp);
+
+       /* Return to current function */
+       bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
+
+       dump_hdr.header_size = (sizeof(struct dump_header) / 4) - 1;
+       dump_hdr.preset = bp->dump_preset_idx;
+       dump_hdr.version = BNX2X_DUMP_VERSION;
+
+       DP(BNX2X_MSG_ETHTOOL, "Get dump data of preset %d\n", dump_hdr.preset);
+
+       /* dump_meta_data presents OR of CHIP and PATH. */
+       if (CHIP_IS_E1(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E1;
+       } else if (CHIP_IS_E1H(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E1H;
+       } else if (CHIP_IS_E2(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E2 |
+               (BP_PATH(bp) ? DUMP_PATH_1 : DUMP_PATH_0);
+       } else if (CHIP_IS_E3A0(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E3A0 |
+               (BP_PATH(bp) ? DUMP_PATH_1 : DUMP_PATH_0);
+       } else if (CHIP_IS_E3B0(bp)) {
+               dump_hdr.dump_meta_data = DUMP_CHIP_E3B0 |
+               (BP_PATH(bp) ? DUMP_PATH_1 : DUMP_PATH_0);
+       }
+
+       memcpy(p, &dump_hdr, sizeof(struct dump_header));
+       p += dump_hdr.header_size + 1;
+
+       /* Actually read the registers */
+       __bnx2x_get_preset_regs(bp, p, dump_hdr.preset);
+
+       /* Re-enable parity attentions on path 0 */
+       bnx2x_pretend_func(bp, 0);
+       bnx2x_clear_blocks_parity(bp);
+       bnx2x_enable_blocks_parity(bp);
+
+       /* Re-enable parity attentions on path 1 */
+       bnx2x_pretend_func(bp, 1);
+       bnx2x_clear_blocks_parity(bp);
+       bnx2x_enable_blocks_parity(bp);
+
+       /* Return to current function */
+       bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
+
+       return 0;
 }
 
 static void bnx2x_get_drvinfo(struct net_device *dev,
@@ -852,13 +1081,13 @@ static int bnx2x_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
        struct bnx2x *bp = netdev_priv(dev);
 
        if (wol->wolopts & ~WAKE_MAGIC) {
-               DP(BNX2X_MSG_ETHTOOL, "WOL not supproted\n");
+               DP(BNX2X_MSG_ETHTOOL, "WOL not supported\n");
                return -EINVAL;
        }
 
        if (wol->wolopts & WAKE_MAGIC) {
                if (bp->flags & NO_WOL_FLAG) {
-                       DP(BNX2X_MSG_ETHTOOL, "WOL not supproted\n");
+                       DP(BNX2X_MSG_ETHTOOL, "WOL not supported\n");
                        return -EINVAL;
                }
                bp->wol = 1;
@@ -931,7 +1160,7 @@ static int bnx2x_get_eeprom_len(struct net_device *dev)
  * Pf B takes the lock and proceeds to perform it's own access.
  * pf A unlocks the per port lock, while pf B is still working (!).
  * mcp takes the per port lock and corrupts pf B's access (and/or has it's own
- * acess corrupted by pf B).*
+ * access corrupted by pf B)
  */
 static int bnx2x_acquire_nvram_lock(struct bnx2x *bp)
 {
@@ -1061,7 +1290,8 @@ static int bnx2x_nvram_read_dword(struct bnx2x *bp, u32 offset, __be32 *ret_val,
                        val = REG_RD(bp, MCP_REG_MCPR_NVM_READ);
                        /* we read nvram data in cpu order
                         * but ethtool sees it as an array of bytes
-                        * converting to big-endian will do the work */
+                        * converting to big-endian will do the work
+                        */
                        *ret_val = cpu_to_be32(val);
                        rc = 0;
                        break;
@@ -1288,7 +1518,8 @@ static int bnx2x_nvram_write1(struct bnx2x *bp, u32 offset, u8 *data_buf,
                val |= (*data_buf << BYTE_OFFSET(offset));
 
                /* nvram data is returned as an array of bytes
-                * convert it back to cpu order */
+                * convert it back to cpu order
+                */
                val = be32_to_cpu(val);
 
                rc = bnx2x_nvram_write_dword(bp, align_offset, val,
@@ -1500,6 +1731,10 @@ static int bnx2x_set_ringparam(struct net_device *dev,
 {
        struct bnx2x *bp = netdev_priv(dev);
 
+       DP(BNX2X_MSG_ETHTOOL,
+          "set ring params command parameters: rx_pending = %d, tx_pending = %d\n",
+          ering->rx_pending, ering->tx_pending);
+
        if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
                DP(BNX2X_MSG_ETHTOOL,
                   "Handling parity error recovery. Try again later\n");
@@ -1738,7 +1973,6 @@ static int bnx2x_set_eee(struct net_device *dev, struct ethtool_eee *edata)
        return 0;
 }
 
-
 enum {
        BNX2X_CHIP_E1_OFST = 0,
        BNX2X_CHIP_E1H_OFST,
@@ -1866,7 +2100,8 @@ static int bnx2x_test_registers(struct bnx2x *bp)
                hw = BNX2X_CHIP_MASK_E3;
 
        /* Repeat the test twice:
-          First by writing 0x00000000, second by writing 0xffffffff */
+        * First by writing 0x00000000, second by writing 0xffffffff
+        */
        for (idx = 0; idx < 2; idx++) {
 
                switch (idx) {
@@ -2379,8 +2614,8 @@ static void bnx2x_self_test(struct net_device *dev,
                            struct ethtool_test *etest, u64 *buf)
 {
        struct bnx2x *bp = netdev_priv(dev);
-       u8 is_serdes;
-       int rc;
+       u8 is_serdes, link_up;
+       int rc, cnt = 0;
 
        if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
                netdev_err(bp->dev,
@@ -2388,6 +2623,7 @@ static void bnx2x_self_test(struct net_device *dev,
                etest->flags |= ETH_TEST_FL_FAILED;
                return;
        }
+
        DP(BNX2X_MSG_ETHTOOL,
           "Self-test command parameters: offline = %d, external_lb = %d\n",
           (etest->flags & ETH_TEST_FL_OFFLINE),
@@ -2402,20 +2638,17 @@ static void bnx2x_self_test(struct net_device *dev,
        }
 
        is_serdes = (bp->link_vars.link_status & LINK_STATUS_SERDES_LINK) > 0;
-
+       link_up = bp->link_vars.link_up;
        /* offline tests are not supported in MF mode */
        if ((etest->flags & ETH_TEST_FL_OFFLINE) && !IS_MF(bp)) {
                int port = BP_PORT(bp);
                u32 val;
-               u8 link_up;
 
                /* save current value of input enable for TX port IF */
                val = REG_RD(bp, NIG_REG_EGRESS_UMP0_IN_EN + port*4);
                /* disable input for TX port IF */
                REG_WR(bp, NIG_REG_EGRESS_UMP0_IN_EN + port*4, 0);
 
-               link_up = bp->link_vars.link_up;
-
                bnx2x_nic_unload(bp, UNLOAD_NORMAL, false);
                rc = bnx2x_nic_load(bp, LOAD_DIAG);
                if (rc) {
@@ -2477,17 +2710,19 @@ static void bnx2x_self_test(struct net_device *dev,
                etest->flags |= ETH_TEST_FL_FAILED;
        }
 
-       if (bnx2x_link_test(bp, is_serdes) != 0) {
+       if (link_up) {
+               cnt = 100;
+               while (bnx2x_link_test(bp, is_serdes) && --cnt)
+                       msleep(20);
+       }
+
+       if (!cnt) {
                if (!IS_MF(bp))
                        buf[6] = 1;
                else
                        buf[2] = 1;
                etest->flags |= ETH_TEST_FL_FAILED;
        }
-
-#ifdef BNX2X_EXTRA_DEBUG
-       bnx2x_panic_dump(bp);
-#endif
 }
 
 #define IS_PORT_STAT(i) \
@@ -2744,15 +2979,14 @@ static int bnx2x_set_rss_flags(struct bnx2x *bp, struct ethtool_rxnfc *info)
                        DP(BNX2X_MSG_ETHTOOL,
                           "Command parameters not supported\n");
                        return -EINVAL;
-               } else {
-                       return 0;
                }
+               return 0;
 
        case UDP_V4_FLOW:
        case UDP_V6_FLOW:
                /* For UDP either 2-tupple hash or 4-tupple hash is supported */
                if (info->data == (RXH_IP_SRC | RXH_IP_DST |
-                                RXH_L4_B_0_1 | RXH_L4_B_2_3))
+                                  RXH_L4_B_0_1 | RXH_L4_B_2_3))
                        udp_rss_requested = 1;
                else if (info->data == (RXH_IP_SRC | RXH_IP_DST))
                        udp_rss_requested = 0;
@@ -2768,13 +3002,13 @@ static int bnx2x_set_rss_flags(struct bnx2x *bp, struct ethtool_rxnfc *info)
                } else if ((info->flow_type == UDP_V6_FLOW) &&
                           (bp->rss_conf_obj.udp_rss_v6 != udp_rss_requested)) {
                        bp->rss_conf_obj.udp_rss_v6 = udp_rss_requested;
-                       return bnx2x_config_rss_pf(bp, &bp->rss_conf_obj, 0);
                        DP(BNX2X_MSG_ETHTOOL,
                           "rss re-configured, UDP 4-tupple %s\n",
                           udp_rss_requested ? "enabled" : "disabled");
-               } else {
-                       return 0;
+                       return bnx2x_config_rss_pf(bp, &bp->rss_conf_obj, 0);
                }
+               return 0;
+
        case IPV4_FLOW:
        case IPV6_FLOW:
                /* For IP only 2-tupple hash is supported */
@@ -2782,9 +3016,9 @@ static int bnx2x_set_rss_flags(struct bnx2x *bp, struct ethtool_rxnfc *info)
                        DP(BNX2X_MSG_ETHTOOL,
                           "Command parameters not supported\n");
                        return -EINVAL;
-               } else {
-                       return 0;
                }
+               return 0;
+
        case SCTP_V4_FLOW:
        case AH_ESP_V4_FLOW:
        case AH_V4_FLOW:
@@ -2800,9 +3034,9 @@ static int bnx2x_set_rss_flags(struct bnx2x *bp, struct ethtool_rxnfc *info)
                        DP(BNX2X_MSG_ETHTOOL,
                           "Command parameters not supported\n");
                        return -EINVAL;
-               } else {
-                       return 0;
                }
+               return 0;
+
        default:
                return -EINVAL;
        }
@@ -2955,6 +3189,9 @@ static const struct ethtool_ops bnx2x_ethtool_ops = {
        .get_drvinfo            = bnx2x_get_drvinfo,
        .get_regs_len           = bnx2x_get_regs_len,
        .get_regs               = bnx2x_get_regs,
+       .get_dump_flag          = bnx2x_get_dump_flag,
+       .get_dump_data          = bnx2x_get_dump_data,
+       .set_dump               = bnx2x_set_dump,
        .get_wol                = bnx2x_get_wol,
        .set_wol                = bnx2x_set_wol,
        .get_msglevel           = bnx2x_get_msglevel,
index 60a83ad103700602814842e8d3f47e40386801e8..e5f808377c910cea0f578c3f3cc33cf4c91a5877 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_fw_defs.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #define MAX_VLAN_CREDIT_E1H 0 /* Per Chip */
 #define MAX_VLAN_CREDIT_E2 272 /* Per Path */
 
-
 /* Maximal aggregation queues supported */
 #define ETH_MAX_AGGREGATION_QUEUES_E1 32
 #define ETH_MAX_AGGREGATION_QUEUES_E1H_E2 64
 
-
 #define ETH_NUM_OF_MCAST_BINS 256
 #define ETH_NUM_OF_MCAST_ENGINES_E2 72
 
 /* max number of slow path commands per port */
 #define MAX_RAMRODS_PER_PORT 8
 
-
 /**** DEFINES FOR TIMERS/CLOCKS RESOLUTIONS ****/
 
 #define TIMERS_TICK_SIZE_CHIP (1e-3)
        that is not mapped to priority*/
 #define LLFC_TRAFFIC_TYPE_TO_PRIORITY_UNMAPPED 0xFF
 
-
 #define C_ERES_PER_PAGE \
        (PAGE_SIZE / BITS_TO_BYTES(STRUCT_SIZE(event_ring_elem)))
 #define C_ERE_PER_PAGE_MASK (C_ERES_PER_PAGE - 1)
 
 #define INVALID_VNIC_ID        0xFF
 
-
 #define UNDEF_IRO 0x80000000
 
-
 #endif /* BNX2X_FW_DEFS_H */
index 4bed52ba300d4acbe466b4f0930f2fc5c7993e74..f572ae164fce4d49317ca752e2cd0eaac1895ae3 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_fw_file_hdr.h: FW binary file header structure.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3369a50ac6b4fbe087860883c9dd9afc951c3238..037860ecc3434cffca9ee555846ae21dbe8600ab 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_hsi.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -899,6 +899,10 @@ struct port_feat_cfg {                 /* port 0: 0x454  port 1: 0x4c8 */
                #define PORT_FEAT_CFG_DCBX_DISABLED                  0x00000000
                #define PORT_FEAT_CFG_DCBX_ENABLED                   0x00000100
 
+               #define PORT_FEAT_CFG_STORAGE_PERSONALITY_MASK        0x00000C00
+               #define PORT_FEAT_CFG_STORAGE_PERSONALITY_FCOE        0x00000400
+               #define PORT_FEAT_CFG_STORAGE_PERSONALITY_ISCSI       0x00000800
+
        #define PORT_FEATURE_EN_SIZE_MASK                   0x0f000000
        #define PORT_FEATURE_EN_SIZE_SHIFT                           24
        #define PORT_FEATURE_WOL_ENABLED                             0x01000000
@@ -3374,6 +3378,10 @@ struct regpair {
        __le32 hi;
 };
 
+struct regpair_native {
+       u32 lo;
+       u32 hi;
+};
 
 /*
  * Classify rule opcodes in E2/E3
@@ -4400,13 +4408,13 @@ struct tstorm_eth_function_common_config {
  * MAC filtering configuration parameters per port in Tstorm
  */
 struct tstorm_eth_mac_filter_config {
-       __le32 ucast_drop_all;
-       __le32 ucast_accept_all;
-       __le32 mcast_drop_all;
-       __le32 mcast_accept_all;
-       __le32 bcast_accept_all;
-       __le32 vlan_filter[2];
-       __le32 unmatched_unicast;
+       u32 ucast_drop_all;
+       u32 ucast_accept_all;
+       u32 mcast_drop_all;
+       u32 mcast_accept_all;
+       u32 bcast_accept_all;
+       u32 vlan_filter[2];
+       u32 unmatched_unicast;
 };
 
 
@@ -4898,7 +4906,7 @@ union event_data {
  * per PF event ring data
  */
 struct event_ring_data {
-       struct regpair base_addr;
+       struct regpair_native base_addr;
 #if defined(__BIG_ENDIAN)
        u8 index_id;
        u8 sb_id;
@@ -5131,7 +5139,7 @@ struct pci_entity {
  * The fast-path status block meta-data, common to all chips
  */
 struct hc_sb_data {
-       struct regpair host_sb_addr;
+       struct regpair_native host_sb_addr;
        struct hc_status_block_sm state_machine[HC_SB_MAX_SM];
        struct pci_entity p_func;
 #if defined(__BIG_ENDIAN)
@@ -5145,7 +5153,7 @@ struct hc_sb_data {
        u8 state;
        u8 rsrv0;
 #endif
-       struct regpair rsrv1[2];
+       struct regpair_native rsrv1[2];
 };
 
 
@@ -5163,7 +5171,7 @@ enum hc_segment {
  * The fast-path status block meta-data
  */
 struct hc_sp_status_block_data {
-       struct regpair host_sb_addr;
+       struct regpair_native host_sb_addr;
 #if defined(__BIG_ENDIAN)
        u8 rsrv1;
        u8 state;
index c8f10f0e8a0dea6db58e412989f2d35eddc6528d..76df015f486ad9d1653efccde3538dbb47263849 100644 (file)
@@ -1,7 +1,7 @@
 /* bnx2x_init.h: Broadcom Everest network driver.
  *               Structures and macroes needed during the initialization.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d755acfe7a4076d71a5f03d6fcdd491c12d53cba..8ab0dd90096085b33f4ee831f6487c3766b164af 100644 (file)
@@ -2,7 +2,7 @@
  *               Static functions needed during the initialization.
  *               This file is "included" in bnx2x_main.c.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -218,7 +218,7 @@ static void bnx2x_init_wr_zp(struct bnx2x *bp, u32 addr, u32 len,
        /* gunzip_outlen is in dwords */
        len = GUNZIP_OUTLEN(bp);
        for (i = 0; i < len; i++)
-               ((u32 *)GUNZIP_BUF(bp))[i] =
+               ((u32 *)GUNZIP_BUF(bp))[i] = (__force u32)
                                cpu_to_le32(((u32 *)GUNZIP_BUF(bp))[i]);
 
        bnx2x_write_big_buf_wb(bp, addr, len);
@@ -232,7 +232,7 @@ static void bnx2x_init_block(struct bnx2x *bp, u32 block, u32 stage)
        u16 op_end =
                INIT_OPS_OFFSETS(bp)[BLOCK_OPS_IDX(block, stage,
                                                     STAGE_END)];
-       union init_op *op;
+       const union init_op *op;
        u32 op_idx, op_type, addr, len;
        const u32 *data, *data_base;
 
@@ -244,7 +244,7 @@ static void bnx2x_init_block(struct bnx2x *bp, u32 block, u32 stage)
 
        for (op_idx = op_start; op_idx < op_end; op_idx++) {
 
-               op = (union init_op *)&(INIT_OPS(bp)[op_idx]);
+               op = (const union init_op *)&(INIT_OPS(bp)[op_idx]);
                /* Get generic data */
                op_type = op->raw.op;
                addr = op->raw.offset;
index cb41f5403a7505146d9740699a61766f56d8f53b..859df751345e6f9707ca1a402d95cf9685a37419 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2008-2012 Broadcom Corporation
+/* Copyright 2008-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
index ee6e7ec854577b8687bb1e8688ed7e83261664cc..d25c7d79787a1bacdfb0dc526bc9814fdfab8d2d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2008-2012 Broadcom Corporation
+/* Copyright 2008-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
index 2b6a919b6bc4d63873530e8b042093469f6e7c00..c4daee1b72865180c33c96e906d55f8232f060bf 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_main.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -60,7 +60,6 @@
 #include "bnx2x_init_ops.h"
 #include "bnx2x_cmn.h"
 #include "bnx2x_vfpf.h"
-#include "bnx2x_sriov.h"
 #include "bnx2x_dcb.h"
 #include "bnx2x_sp.h"
 
@@ -129,6 +128,17 @@ MODULE_PARM_DESC(debug, " Default debug msglevel");
 
 struct workqueue_struct *bnx2x_wq;
 
+struct bnx2x_mac_vals {
+       u32 xmac_addr;
+       u32 xmac_val;
+       u32 emac_addr;
+       u32 emac_val;
+       u32 umac_addr;
+       u32 umac_val;
+       u32 bmac_addr;
+       u32 bmac_val[2];
+};
+
 enum bnx2x_board_type {
        BCM57710 = 0,
        BCM57711,
@@ -772,12 +782,16 @@ void bnx2x_fw_dump_lvl(struct bnx2x *bp, const char *lvl)
        printk("%s" "begin fw dump (mark 0x%x)\n", lvl, mark);
 
        printk("%s", lvl);
+
+       /* dump buffer after the mark */
        for (offset = mark; offset <= trace_shmem_base; offset += 0x8*4) {
                for (word = 0; word < 8; word++)
                        data[word] = htonl(REG_RD(bp, offset + 4*word));
                data[8] = 0x0;
                pr_cont("%s", (char *)data);
        }
+
+       /* dump buffer before the mark */
        for (offset = addr + 4; offset <= mark; offset += 0x8*4) {
                for (word = 0; word < 8; word++)
                        data[word] = htonl(REG_RD(bp, offset + 4*word));
@@ -792,7 +806,71 @@ static void bnx2x_fw_dump(struct bnx2x *bp)
        bnx2x_fw_dump_lvl(bp, KERN_ERR);
 }
 
-void bnx2x_panic_dump(struct bnx2x *bp)
+static void bnx2x_hc_int_disable(struct bnx2x *bp)
+{
+       int port = BP_PORT(bp);
+       u32 addr = port ? HC_REG_CONFIG_1 : HC_REG_CONFIG_0;
+       u32 val = REG_RD(bp, addr);
+
+       /* in E1 we must use only PCI configuration space to disable
+        * MSI/MSIX capablility
+        * It's forbitten to disable IGU_PF_CONF_MSI_MSIX_EN in HC block
+        */
+       if (CHIP_IS_E1(bp)) {
+               /* Since IGU_PF_CONF_MSI_MSIX_EN still always on
+                * Use mask register to prevent from HC sending interrupts
+                * after we exit the function
+                */
+               REG_WR(bp, HC_REG_INT_MASK + port*4, 0);
+
+               val &= ~(HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
+                        HC_CONFIG_0_REG_INT_LINE_EN_0 |
+                        HC_CONFIG_0_REG_ATTN_BIT_EN_0);
+       } else
+               val &= ~(HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
+                        HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 |
+                        HC_CONFIG_0_REG_INT_LINE_EN_0 |
+                        HC_CONFIG_0_REG_ATTN_BIT_EN_0);
+
+       DP(NETIF_MSG_IFDOWN,
+          "write %x to HC %d (addr 0x%x)\n",
+          val, port, addr);
+
+       /* flush all outstanding writes */
+       mmiowb();
+
+       REG_WR(bp, addr, val);
+       if (REG_RD(bp, addr) != val)
+               BNX2X_ERR("BUG! proper val not read from IGU!\n");
+}
+
+static void bnx2x_igu_int_disable(struct bnx2x *bp)
+{
+       u32 val = REG_RD(bp, IGU_REG_PF_CONFIGURATION);
+
+       val &= ~(IGU_PF_CONF_MSI_MSIX_EN |
+                IGU_PF_CONF_INT_LINE_EN |
+                IGU_PF_CONF_ATTN_BIT_EN);
+
+       DP(NETIF_MSG_IFDOWN, "write %x to IGU\n", val);
+
+       /* flush all outstanding writes */
+       mmiowb();
+
+       REG_WR(bp, IGU_REG_PF_CONFIGURATION, val);
+       if (REG_RD(bp, IGU_REG_PF_CONFIGURATION) != val)
+               BNX2X_ERR("BUG! proper val not read from IGU!\n");
+}
+
+static void bnx2x_int_disable(struct bnx2x *bp)
+{
+       if (bp->common.int_block == INT_BLOCK_HC)
+               bnx2x_hc_int_disable(bp);
+       else
+               bnx2x_igu_int_disable(bp);
+}
+
+void bnx2x_panic_dump(struct bnx2x *bp, bool disable_int)
 {
        int i;
        u16 j;
@@ -802,6 +880,8 @@ void bnx2x_panic_dump(struct bnx2x *bp)
        u16 start = 0, end = 0;
        u8 cos;
 #endif
+       if (disable_int)
+               bnx2x_int_disable(bp);
 
        bp->stats_state = STATS_STATE_DISABLED;
        bp->eth_stats.unrecoverable_error++;
@@ -947,6 +1027,17 @@ void bnx2x_panic_dump(struct bnx2x *bp)
        }
 
 #ifdef BNX2X_STOP_ON_ERROR
+
+       /* event queue */
+       for (i = 0; i < NUM_EQ_DESC; i++) {
+               u32 *data = (u32 *)&bp->eq_ring[i].message.data;
+
+               BNX2X_ERR("event queue [%d]: header: opcode %d, error %d\n",
+                         i, bp->eq_ring[i].message.opcode,
+                         bp->eq_ring[i].message.error);
+               BNX2X_ERR("data: %x %x %x\n", data[0], data[1], data[2]);
+       }
+
        /* Rings */
        /* Rx */
        for_each_valid_rx_queue(bp, i) {
@@ -1219,7 +1310,7 @@ void bnx2x_tx_hw_flushed(struct bnx2x *bp, u32 poll_count)
 
 int bnx2x_send_final_clnup(struct bnx2x *bp, u8 clnup_func, u32 poll_cnt)
 {
-       struct sdm_op_gen op_gen = {0};
+       u32 op_gen_command = 0;
 
        u32 comp_addr = BAR_CSTRORM_INTMEM +
                        CSTORM_FINAL_CLEANUP_COMPLETE_OFFSET(clnup_func);
@@ -1230,13 +1321,13 @@ int bnx2x_send_final_clnup(struct bnx2x *bp, u8 clnup_func, u32 poll_cnt)
                return 1;
        }
 
-       op_gen.command |= OP_GEN_PARAM(XSTORM_AGG_INT_FINAL_CLEANUP_INDEX);
-       op_gen.command |= OP_GEN_TYPE(XSTORM_AGG_INT_FINAL_CLEANUP_COMP_TYPE);
-       op_gen.command |= OP_GEN_AGG_VECT(clnup_func);
-       op_gen.command |= 1 << SDM_OP_GEN_AGG_VECT_IDX_VALID_SHIFT;
+       op_gen_command |= OP_GEN_PARAM(XSTORM_AGG_INT_FINAL_CLEANUP_INDEX);
+       op_gen_command |= OP_GEN_TYPE(XSTORM_AGG_INT_FINAL_CLEANUP_COMP_TYPE);
+       op_gen_command |= OP_GEN_AGG_VECT(clnup_func);
+       op_gen_command |= 1 << SDM_OP_GEN_AGG_VECT_IDX_VALID_SHIFT;
 
        DP(BNX2X_MSG_SP, "sending FW Final cleanup\n");
-       REG_WR(bp, XSDM_REG_OPERATION_GEN, op_gen.command);
+       REG_WR(bp, XSDM_REG_OPERATION_GEN, op_gen_command);
 
        if (bnx2x_flr_clnup_reg_poll(bp, comp_addr, 1, poll_cnt) != 1) {
                BNX2X_ERR("FW final cleanup did not succeed\n");
@@ -1463,26 +1554,31 @@ static void bnx2x_igu_int_enable(struct bnx2x *bp)
        if (msix) {
                val &= ~(IGU_PF_CONF_INT_LINE_EN |
                         IGU_PF_CONF_SINGLE_ISR_EN);
-               val |= (IGU_PF_CONF_FUNC_EN |
-                       IGU_PF_CONF_MSI_MSIX_EN |
+               val |= (IGU_PF_CONF_MSI_MSIX_EN |
                        IGU_PF_CONF_ATTN_BIT_EN);
 
                if (single_msix)
                        val |= IGU_PF_CONF_SINGLE_ISR_EN;
        } else if (msi) {
                val &= ~IGU_PF_CONF_INT_LINE_EN;
-               val |= (IGU_PF_CONF_FUNC_EN |
-                       IGU_PF_CONF_MSI_MSIX_EN |
+               val |= (IGU_PF_CONF_MSI_MSIX_EN |
                        IGU_PF_CONF_ATTN_BIT_EN |
                        IGU_PF_CONF_SINGLE_ISR_EN);
        } else {
                val &= ~IGU_PF_CONF_MSI_MSIX_EN;
-               val |= (IGU_PF_CONF_FUNC_EN |
-                       IGU_PF_CONF_INT_LINE_EN |
+               val |= (IGU_PF_CONF_INT_LINE_EN |
                        IGU_PF_CONF_ATTN_BIT_EN |
                        IGU_PF_CONF_SINGLE_ISR_EN);
        }
 
+       /* Clean previous status - need to configure igu prior to ack*/
+       if ((!msix) || single_msix) {
+               REG_WR(bp, IGU_REG_PF_CONFIGURATION, val);
+               bnx2x_ack_int(bp);
+       }
+
+       val |= IGU_PF_CONF_FUNC_EN;
+
        DP(NETIF_MSG_IFUP, "write 0x%x to IGU  mode %s\n",
           val, (msix ? "MSI-X" : (msi ? "MSI" : "INTx")));
 
@@ -1517,71 +1613,6 @@ void bnx2x_int_enable(struct bnx2x *bp)
                bnx2x_igu_int_enable(bp);
 }
 
-static void bnx2x_hc_int_disable(struct bnx2x *bp)
-{
-       int port = BP_PORT(bp);
-       u32 addr = port ? HC_REG_CONFIG_1 : HC_REG_CONFIG_0;
-       u32 val = REG_RD(bp, addr);
-
-       /*
-        * in E1 we must use only PCI configuration space to disable
-        * MSI/MSIX capablility
-        * It's forbitten to disable IGU_PF_CONF_MSI_MSIX_EN in HC block
-        */
-       if (CHIP_IS_E1(bp)) {
-               /*  Since IGU_PF_CONF_MSI_MSIX_EN still always on
-                *  Use mask register to prevent from HC sending interrupts
-                *  after we exit the function
-                */
-               REG_WR(bp, HC_REG_INT_MASK + port*4, 0);
-
-               val &= ~(HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
-                        HC_CONFIG_0_REG_INT_LINE_EN_0 |
-                        HC_CONFIG_0_REG_ATTN_BIT_EN_0);
-       } else
-               val &= ~(HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
-                        HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 |
-                        HC_CONFIG_0_REG_INT_LINE_EN_0 |
-                        HC_CONFIG_0_REG_ATTN_BIT_EN_0);
-
-       DP(NETIF_MSG_IFDOWN,
-          "write %x to HC %d (addr 0x%x)\n",
-          val, port, addr);
-
-       /* flush all outstanding writes */
-       mmiowb();
-
-       REG_WR(bp, addr, val);
-       if (REG_RD(bp, addr) != val)
-               BNX2X_ERR("BUG! proper val not read from IGU!\n");
-}
-
-static void bnx2x_igu_int_disable(struct bnx2x *bp)
-{
-       u32 val = REG_RD(bp, IGU_REG_PF_CONFIGURATION);
-
-       val &= ~(IGU_PF_CONF_MSI_MSIX_EN |
-                IGU_PF_CONF_INT_LINE_EN |
-                IGU_PF_CONF_ATTN_BIT_EN);
-
-       DP(NETIF_MSG_IFDOWN, "write %x to IGU\n", val);
-
-       /* flush all outstanding writes */
-       mmiowb();
-
-       REG_WR(bp, IGU_REG_PF_CONFIGURATION, val);
-       if (REG_RD(bp, IGU_REG_PF_CONFIGURATION) != val)
-               BNX2X_ERR("BUG! proper val not read from IGU!\n");
-}
-
-static void bnx2x_int_disable(struct bnx2x *bp)
-{
-       if (bp->common.int_block == INT_BLOCK_HC)
-               bnx2x_hc_int_disable(bp);
-       else
-               bnx2x_igu_int_disable(bp);
-}
-
 void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw)
 {
        int msix = (bp->flags & USING_MSIX_FLAG) ? 1 : 0;
@@ -1667,11 +1698,11 @@ static int bnx2x_get_leader_lock_resource(struct bnx2x *bp)
 }
 
 /**
- * bnx2x_trylock_leader_lock- try to aquire a leader lock.
+ * bnx2x_trylock_leader_lock- try to acquire a leader lock.
  *
  * @bp: driver handle
  *
- * Tries to aquire a leader lock for current engine.
+ * Tries to acquire a leader lock for current engine.
  */
 static bool bnx2x_trylock_leader_lock(struct bnx2x *bp)
 {
@@ -1788,7 +1819,7 @@ void bnx2x_sp_event(struct bnx2x_fastpath *fp, union eth_rx_cqe *rr_cqe)
                 * mark pending ACK to MCP bit.
                 * prevent case that both bits are cleared.
                 * At the end of load/unload driver checks that
-                * sp_state is cleaerd, and this order prevents
+                * sp_state is cleared, and this order prevents
                 * races
                 */
                smp_mb__before_clear_bit();
@@ -1844,14 +1875,12 @@ irqreturn_t bnx2x_interrupt(int irq, void *dev_instance)
                if (status & (mask | 0x1)) {
                        struct cnic_ops *c_ops = NULL;
 
-                       if (likely(bp->state == BNX2X_STATE_OPEN)) {
-                               rcu_read_lock();
-                               c_ops = rcu_dereference(bp->cnic_ops);
-                               if (c_ops)
-                                       c_ops->cnic_handler(bp->cnic_data,
-                                                           NULL);
-                               rcu_read_unlock();
-                       }
+                       rcu_read_lock();
+                       c_ops = rcu_dereference(bp->cnic_ops);
+                       if (c_ops && (bp->cnic_eth_dev.drv_state &
+                                     CNIC_DRV_STATE_HANDLES_IRQ))
+                               c_ops->cnic_handler(bp->cnic_data, NULL);
+                       rcu_read_unlock();
 
                        status &= ~mask;
                }
@@ -2610,7 +2639,7 @@ void bnx2x__link_status_update(struct bnx2x *bp)
 static int bnx2x_afex_func_update(struct bnx2x *bp, u16 vifid,
                                  u16 vlan_val, u8 allowed_prio)
 {
-       struct bnx2x_func_state_params func_params = {0};
+       struct bnx2x_func_state_params func_params = {NULL};
        struct bnx2x_func_afex_update_params *f_update_params =
                &func_params.params.afex_update;
 
@@ -2635,7 +2664,7 @@ static int bnx2x_afex_func_update(struct bnx2x *bp, u16 vifid,
 static int bnx2x_afex_handle_vif_list_cmd(struct bnx2x *bp, u8 cmd_type,
                                          u16 vif_index, u8 func_bit_map)
 {
-       struct bnx2x_func_state_params func_params = {0};
+       struct bnx2x_func_state_params func_params = {NULL};
        struct bnx2x_func_afex_viflists_params *update_params =
                &func_params.params.afex_viflists;
        int rc;
@@ -2651,7 +2680,7 @@ static int bnx2x_afex_handle_vif_list_cmd(struct bnx2x *bp, u8 cmd_type,
 
        /* set parameters according to cmd_type */
        update_params->afex_vif_list_command = cmd_type;
-       update_params->vif_list_index = cpu_to_le16(vif_index);
+       update_params->vif_list_index = vif_index;
        update_params->func_bit_map =
                (cmd_type == VIF_LIST_RULE_GET) ? 0 : func_bit_map;
        update_params->func_to_clear = 0;
@@ -2935,6 +2964,10 @@ static unsigned long bnx2x_get_common_flags(struct bnx2x *bp,
                __set_bit(BNX2X_Q_FLG_ZERO_STATS, &flags);
 
 
+#ifdef BNX2X_STOP_ON_ERROR
+       __set_bit(BNX2X_Q_FLG_TX_SEC, &flags);
+#endif
+
        return flags;
 }
 
@@ -3010,15 +3043,12 @@ static void bnx2x_pf_rx_q_prep(struct bnx2x *bp,
                                pause->sge_th_hi + FW_PREFETCH_CNT >
                                MAX_RX_SGE_CNT * NUM_RX_SGE_PAGES);
 
-               tpa_agg_size = min_t(u32,
-                       (min_t(u32, 8, MAX_SKB_FRAGS) *
-                       SGE_PAGE_SIZE * PAGES_PER_SGE), 0xffff);
+               tpa_agg_size = TPA_AGG_SIZE;
                max_sge = SGE_PAGE_ALIGN(bp->dev->mtu) >>
                        SGE_PAGE_SHIFT;
                max_sge = ((max_sge + PAGES_PER_SGE - 1) &
                          (~(PAGES_PER_SGE-1))) >> PAGES_PER_SGE_SHIFT;
-               sge_sz = (u16)min_t(u32, SGE_PAGE_SIZE * PAGES_PER_SGE,
-                                   0xffff);
+               sge_sz = (u16)min_t(u32, SGE_PAGES, 0xffff);
        }
 
        /* pause - not for e1 */
@@ -3063,7 +3093,7 @@ static void bnx2x_pf_rx_q_prep(struct bnx2x *bp,
 
        /* Maximum number or simultaneous TPA aggregation for this Queue.
         *
-        * For PF Clients it should be the maximum avaliable number.
+        * For PF Clients it should be the maximum available number.
         * VF driver(s) may want to define it to a smaller value.
         */
        rxq_init->max_tpa_queues = MAX_AGG_QS(bp);
@@ -3157,7 +3187,7 @@ static void bnx2x_pf_init(struct bnx2x *bp)
        if (bp->port.pmf)
                storm_memset_cmng(bp, &bp->cmng, BP_PORT(bp));
 
-       /* init Event Queue */
+       /* init Event Queue - PCI bus guarantees correct endianity*/
        eq_data.base_addr.hi = U64_HI(bp->eq_mapping);
        eq_data.base_addr.lo = U64_LO(bp->eq_mapping);
        eq_data.producer = bp->eq_prod;
@@ -3247,65 +3277,75 @@ static void bnx2x_drv_info_fcoe_stat(struct bnx2x *bp)
                struct fcoe_statistics_params *fw_fcoe_stat =
                        &bp->fw_stats_data->fcoe;
 
-               ADD_64(fcoe_stat->rx_bytes_hi, 0, fcoe_stat->rx_bytes_lo,
-                      fw_fcoe_stat->rx_stat0.fcoe_rx_byte_cnt);
+               ADD_64_LE(fcoe_stat->rx_bytes_hi, LE32_0,
+                         fcoe_stat->rx_bytes_lo,
+                         fw_fcoe_stat->rx_stat0.fcoe_rx_byte_cnt);
 
-               ADD_64(fcoe_stat->rx_bytes_hi,
-                      fcoe_q_tstorm_stats->rcv_ucast_bytes.hi,
-                      fcoe_stat->rx_bytes_lo,
-                      fcoe_q_tstorm_stats->rcv_ucast_bytes.lo);
+               ADD_64_LE(fcoe_stat->rx_bytes_hi,
+                         fcoe_q_tstorm_stats->rcv_ucast_bytes.hi,
+                         fcoe_stat->rx_bytes_lo,
+                         fcoe_q_tstorm_stats->rcv_ucast_bytes.lo);
 
-               ADD_64(fcoe_stat->rx_bytes_hi,
-                      fcoe_q_tstorm_stats->rcv_bcast_bytes.hi,
-                      fcoe_stat->rx_bytes_lo,
-                      fcoe_q_tstorm_stats->rcv_bcast_bytes.lo);
+               ADD_64_LE(fcoe_stat->rx_bytes_hi,
+                         fcoe_q_tstorm_stats->rcv_bcast_bytes.hi,
+                         fcoe_stat->rx_bytes_lo,
+                         fcoe_q_tstorm_stats->rcv_bcast_bytes.lo);
 
-               ADD_64(fcoe_stat->rx_bytes_hi,
-                      fcoe_q_tstorm_stats->rcv_mcast_bytes.hi,
-                      fcoe_stat->rx_bytes_lo,
-                      fcoe_q_tstorm_stats->rcv_mcast_bytes.lo);
+               ADD_64_LE(fcoe_stat->rx_bytes_hi,
+                         fcoe_q_tstorm_stats->rcv_mcast_bytes.hi,
+                         fcoe_stat->rx_bytes_lo,
+                         fcoe_q_tstorm_stats->rcv_mcast_bytes.lo);
 
-               ADD_64(fcoe_stat->rx_frames_hi, 0, fcoe_stat->rx_frames_lo,
-                      fw_fcoe_stat->rx_stat0.fcoe_rx_pkt_cnt);
+               ADD_64_LE(fcoe_stat->rx_frames_hi, LE32_0,
+                         fcoe_stat->rx_frames_lo,
+                         fw_fcoe_stat->rx_stat0.fcoe_rx_pkt_cnt);
 
-               ADD_64(fcoe_stat->rx_frames_hi, 0, fcoe_stat->rx_frames_lo,
-                      fcoe_q_tstorm_stats->rcv_ucast_pkts);
+               ADD_64_LE(fcoe_stat->rx_frames_hi, LE32_0,
+                         fcoe_stat->rx_frames_lo,
+                         fcoe_q_tstorm_stats->rcv_ucast_pkts);
 
-               ADD_64(fcoe_stat->rx_frames_hi, 0, fcoe_stat->rx_frames_lo,
-                      fcoe_q_tstorm_stats->rcv_bcast_pkts);
+               ADD_64_LE(fcoe_stat->rx_frames_hi, LE32_0,
+                         fcoe_stat->rx_frames_lo,
+                         fcoe_q_tstorm_stats->rcv_bcast_pkts);
 
-               ADD_64(fcoe_stat->rx_frames_hi, 0, fcoe_stat->rx_frames_lo,
-                      fcoe_q_tstorm_stats->rcv_mcast_pkts);
+               ADD_64_LE(fcoe_stat->rx_frames_hi, LE32_0,
+                         fcoe_stat->rx_frames_lo,
+                         fcoe_q_tstorm_stats->rcv_mcast_pkts);
 
-               ADD_64(fcoe_stat->tx_bytes_hi, 0, fcoe_stat->tx_bytes_lo,
-                      fw_fcoe_stat->tx_stat.fcoe_tx_byte_cnt);
+               ADD_64_LE(fcoe_stat->tx_bytes_hi, LE32_0,
+                         fcoe_stat->tx_bytes_lo,
+                         fw_fcoe_stat->tx_stat.fcoe_tx_byte_cnt);
 
-               ADD_64(fcoe_stat->tx_bytes_hi,
-                      fcoe_q_xstorm_stats->ucast_bytes_sent.hi,
-                      fcoe_stat->tx_bytes_lo,
-                      fcoe_q_xstorm_stats->ucast_bytes_sent.lo);
+               ADD_64_LE(fcoe_stat->tx_bytes_hi,
+                         fcoe_q_xstorm_stats->ucast_bytes_sent.hi,
+                         fcoe_stat->tx_bytes_lo,
+                         fcoe_q_xstorm_stats->ucast_bytes_sent.lo);
 
-               ADD_64(fcoe_stat->tx_bytes_hi,
-                      fcoe_q_xstorm_stats->bcast_bytes_sent.hi,
-                      fcoe_stat->tx_bytes_lo,
-                      fcoe_q_xstorm_stats->bcast_bytes_sent.lo);
+               ADD_64_LE(fcoe_stat->tx_bytes_hi,
+                         fcoe_q_xstorm_stats->bcast_bytes_sent.hi,
+                         fcoe_stat->tx_bytes_lo,
+                         fcoe_q_xstorm_stats->bcast_bytes_sent.lo);
 
-               ADD_64(fcoe_stat->tx_bytes_hi,
-                      fcoe_q_xstorm_stats->mcast_bytes_sent.hi,
-                      fcoe_stat->tx_bytes_lo,
-                      fcoe_q_xstorm_stats->mcast_bytes_sent.lo);
+               ADD_64_LE(fcoe_stat->tx_bytes_hi,
+                         fcoe_q_xstorm_stats->mcast_bytes_sent.hi,
+                         fcoe_stat->tx_bytes_lo,
+                         fcoe_q_xstorm_stats->mcast_bytes_sent.lo);
 
-               ADD_64(fcoe_stat->tx_frames_hi, 0, fcoe_stat->tx_frames_lo,
-                      fw_fcoe_stat->tx_stat.fcoe_tx_pkt_cnt);
+               ADD_64_LE(fcoe_stat->tx_frames_hi, LE32_0,
+                         fcoe_stat->tx_frames_lo,
+                         fw_fcoe_stat->tx_stat.fcoe_tx_pkt_cnt);
 
-               ADD_64(fcoe_stat->tx_frames_hi, 0, fcoe_stat->tx_frames_lo,
-                      fcoe_q_xstorm_stats->ucast_pkts_sent);
+               ADD_64_LE(fcoe_stat->tx_frames_hi, LE32_0,
+                         fcoe_stat->tx_frames_lo,
+                         fcoe_q_xstorm_stats->ucast_pkts_sent);
 
-               ADD_64(fcoe_stat->tx_frames_hi, 0, fcoe_stat->tx_frames_lo,
-                      fcoe_q_xstorm_stats->bcast_pkts_sent);
+               ADD_64_LE(fcoe_stat->tx_frames_hi, LE32_0,
+                         fcoe_stat->tx_frames_lo,
+                         fcoe_q_xstorm_stats->bcast_pkts_sent);
 
-               ADD_64(fcoe_stat->tx_frames_hi, 0, fcoe_stat->tx_frames_lo,
-                      fcoe_q_xstorm_stats->mcast_pkts_sent);
+               ADD_64_LE(fcoe_stat->tx_frames_hi, LE32_0,
+                         fcoe_stat->tx_frames_lo,
+                         fcoe_q_xstorm_stats->mcast_pkts_sent);
        }
 
        /* ask L5 driver to add data to the struct */
@@ -3776,7 +3816,7 @@ static void bnx2x_fan_failure(struct bnx2x *bp)
                            "Please contact OEM Support for assistance\n");
 
        /*
-        * Scheudle device reset (unload)
+        * Schedule device reset (unload)
         * This is due to some boards consuming sufficient power when driver is
         * up to overheat if fan fails.
         */
@@ -4755,7 +4795,7 @@ static int  bnx2x_cnic_handle_cfc_del(struct bnx2x *bp, u32 cid,
 
                BNX2X_ERR("got delete ramrod for CNIC CID %d with error!\n",
                          cid);
-               bnx2x_panic_dump(bp);
+               bnx2x_panic_dump(bp, false);
        }
        bnx2x_cnic_cfc_comp(bp, cid, err);
        return 0;
@@ -4797,7 +4837,8 @@ static void bnx2x_handle_classification_eqe(struct bnx2x *bp,
        /* Always push next commands out, don't wait here */
        __set_bit(RAMROD_CONT, &ramrod_flags);
 
-       switch (elem->message.data.eth_event.echo >> BNX2X_SWCID_SHIFT) {
+       switch (le32_to_cpu((__force __le32)elem->message.data.eth_event.echo)
+                           >> BNX2X_SWCID_SHIFT) {
        case BNX2X_FILTER_MAC_PENDING:
                DP(BNX2X_MSG_SP, "Got SETUP_MAC completions\n");
                if (CNIC_LOADED(bp) && (cid == BNX2X_ISCSI_ETH_CID(bp)))
@@ -4874,7 +4915,7 @@ static void bnx2x_after_function_update(struct bnx2x *bp)
        struct bnx2x_queue_update_params *q_update_params =
                &queue_params.params.update;
 
-       /* Send Q update command with afex vlan removal values  for all Qs */
+       /* Send Q update command with afex vlan removal values for all Qs */
        queue_params.cmd = BNX2X_Q_CMD_UPDATE;
 
        /* set silent vlan removal values according to vlan mode */
@@ -4976,7 +5017,6 @@ static void bnx2x_eq_int(struct bnx2x *bp)
        for (; sw_cons != hw_cons;
              sw_prod = NEXT_EQ_IDX(sw_prod), sw_cons = NEXT_EQ_IDX(sw_cons)) {
 
-
                elem = &bp->eq_ring[EQ_DESC(sw_cons)];
 
                rc = bnx2x_iov_eq_sp_event(bp, elem);
@@ -4985,9 +5025,11 @@ static void bnx2x_eq_int(struct bnx2x *bp)
                           rc);
                        goto next_spqe;
                }
-               cid = SW_CID(elem->message.data.cfc_del_event.cid);
-               opcode = elem->message.opcode;
 
+               /* elem CID originates from FW; actually LE */
+               cid = SW_CID((__force __le32)
+                            elem->message.data.cfc_del_event.cid);
+               opcode = elem->message.opcode;
 
                /* handle eq element */
                switch (opcode) {
@@ -5269,62 +5311,6 @@ void bnx2x_drv_pulse(struct bnx2x *bp)
                 bp->fw_drv_pulse_wr_seq);
 }
 
-/* crc is the first field in the bulletin board. compute the crc over the
- * entire bulletin board excluding the crc field itself
- */
-u32 bnx2x_crc_vf_bulletin(struct bnx2x *bp,
-                         struct pf_vf_bulletin_content *bulletin)
-{
-       return crc32(BULLETIN_CRC_SEED,
-                ((u8 *)bulletin) + sizeof(bulletin->crc),
-                BULLETIN_CONTENT_SIZE - sizeof(bulletin->crc));
-}
-
-/* Check for new posts on the bulletin board */
-enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp)
-{
-       struct pf_vf_bulletin_content bulletin = bp->pf2vf_bulletin->content;
-       int attempts;
-
-       /* bulletin board hasn't changed since last sample */
-       if (bp->old_bulletin.version == bulletin.version)
-               return PFVF_BULLETIN_UNCHANGED;
-
-       /* validate crc of new bulletin board */
-       if (bp->old_bulletin.version != bp->pf2vf_bulletin->content.version) {
-               /* sampling structure in mid post may result with corrupted data
-                * validate crc to ensure coherency.
-                */
-               for (attempts = 0; attempts < BULLETIN_ATTEMPTS; attempts++) {
-                       bulletin = bp->pf2vf_bulletin->content;
-                       if (bulletin.crc == bnx2x_crc_vf_bulletin(bp,
-                                                                 &bulletin))
-                               break;
-
-                       BNX2X_ERR("bad crc on bulletin board. contained %x computed %x\n",
-                                 bulletin.crc,
-                                 bnx2x_crc_vf_bulletin(bp, &bulletin));
-               }
-               if (attempts >= BULLETIN_ATTEMPTS) {
-                       BNX2X_ERR("pf to vf bulletin board crc was wrong %d consecutive times. Aborting\n",
-                                 attempts);
-                       return PFVF_BULLETIN_CRC_ERR;
-               }
-       }
-
-       /* the mac address in bulletin board is valid and is new */
-       if (bulletin.valid_bitmap & 1 << MAC_ADDR_VALID &&
-           memcmp(bulletin.mac, bp->old_bulletin.mac, ETH_ALEN)) {
-               /* update new mac to net device */
-               memcpy(bp->dev->dev_addr, bulletin.mac, ETH_ALEN);
-       }
-
-       /* copy new bulletin board to bp */
-       bp->old_bulletin = bulletin;
-
-       return PFVF_BULLETIN_UPDATED;
-}
-
 static void bnx2x_timer(unsigned long data)
 {
        struct bnx2x *bp = (struct bnx2x *) data;
@@ -5562,7 +5548,7 @@ void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid,
 
        DP(NETIF_MSG_IFUP, "Init FW SB %d\n", fw_sb_id);
 
-       /* write indecies to HW */
+       /* write indices to HW - PCI guarantees endianity of regpairs */
        bnx2x_wr_fp_sb_data(bp, fw_sb_id, sb_data_p, data_size);
 }
 
@@ -5650,6 +5636,7 @@ static void bnx2x_init_def_sb(struct bnx2x *bp)
 
        bnx2x_zero_sp_sb(bp);
 
+       /* PCI guarantees endianity of regpairs */
        sp_sb_data.state                = SB_ENABLED;
        sp_sb_data.host_sb_addr.lo      = U64_LO(section);
        sp_sb_data.host_sb_addr.hi      = U64_HI(section);
@@ -5706,13 +5693,12 @@ static void bnx2x_init_eq_ring(struct bnx2x *bp)
                min_t(int, MAX_SP_DESC_CNT - MAX_SPQ_PENDING, NUM_EQ_DESC) - 1);
 }
 
-
 /* called with netif_addr_lock_bh() */
-void bnx2x_set_q_rx_mode(struct bnx2x *bp, u8 cl_id,
-                        unsigned long rx_mode_flags,
-                        unsigned long rx_accept_flags,
-                        unsigned long tx_accept_flags,
-                        unsigned long ramrod_flags)
+int bnx2x_set_q_rx_mode(struct bnx2x *bp, u8 cl_id,
+                       unsigned long rx_mode_flags,
+                       unsigned long rx_accept_flags,
+                       unsigned long tx_accept_flags,
+                       unsigned long ramrod_flags)
 {
        struct bnx2x_rx_mode_ramrod_params ramrod_param;
        int rc;
@@ -5742,22 +5728,21 @@ void bnx2x_set_q_rx_mode(struct bnx2x *bp, u8 cl_id,
        rc = bnx2x_config_rx_mode(bp, &ramrod_param);
        if (rc < 0) {
                BNX2X_ERR("Set rx_mode %d failed\n", bp->rx_mode);
-               return;
+               return rc;
        }
+
+       return 0;
 }
 
-/* called with netif_addr_lock_bh() */
-void bnx2x_set_storm_rx_mode(struct bnx2x *bp)
+static int bnx2x_fill_accept_flags(struct bnx2x *bp, u32 rx_mode,
+                                  unsigned long *rx_accept_flags,
+                                  unsigned long *tx_accept_flags)
 {
-       unsigned long rx_mode_flags = 0, ramrod_flags = 0;
-       unsigned long rx_accept_flags = 0, tx_accept_flags = 0;
+       /* Clear the flags first */
+       *rx_accept_flags = 0;
+       *tx_accept_flags = 0;
 
-       if (!NO_FCOE(bp))
-
-               /* Configure rx_mode of FCoE Queue */
-               __set_bit(BNX2X_RX_MODE_FCOE_ETH, &rx_mode_flags);
-
-       switch (bp->rx_mode) {
+       switch (rx_mode) {
        case BNX2X_RX_MODE_NONE:
                /*
                 * 'drop all' supersedes any accept flags that may have been
@@ -5765,25 +5750,25 @@ void bnx2x_set_storm_rx_mode(struct bnx2x *bp)
                 */
                break;
        case BNX2X_RX_MODE_NORMAL:
-               __set_bit(BNX2X_ACCEPT_UNICAST, &rx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_MULTICAST, &rx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_BROADCAST, &rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_UNICAST, rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_MULTICAST, rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_BROADCAST, rx_accept_flags);
 
                /* internal switching mode */
-               __set_bit(BNX2X_ACCEPT_UNICAST, &tx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_MULTICAST, &tx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_BROADCAST, &tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_UNICAST, tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_MULTICAST, tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_BROADCAST, tx_accept_flags);
 
                break;
        case BNX2X_RX_MODE_ALLMULTI:
-               __set_bit(BNX2X_ACCEPT_UNICAST, &rx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_ALL_MULTICAST, &rx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_BROADCAST, &rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_UNICAST, rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_ALL_MULTICAST, rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_BROADCAST, rx_accept_flags);
 
                /* internal switching mode */
-               __set_bit(BNX2X_ACCEPT_UNICAST, &tx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_ALL_MULTICAST, &tx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_BROADCAST, &tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_UNICAST, tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_ALL_MULTICAST, tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_BROADCAST, tx_accept_flags);
 
                break;
        case BNX2X_RX_MODE_PROMISC:
@@ -5791,36 +5776,57 @@ void bnx2x_set_storm_rx_mode(struct bnx2x *bp)
                 * should receive matched and unmatched (in resolution of port)
                 * unicast packets.
                 */
-               __set_bit(BNX2X_ACCEPT_UNMATCHED, &rx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_UNICAST, &rx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_ALL_MULTICAST, &rx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_BROADCAST, &rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_UNMATCHED, rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_UNICAST, rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_ALL_MULTICAST, rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_BROADCAST, rx_accept_flags);
 
                /* internal switching mode */
-               __set_bit(BNX2X_ACCEPT_ALL_MULTICAST, &tx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_BROADCAST, &tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_ALL_MULTICAST, tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_BROADCAST, tx_accept_flags);
 
                if (IS_MF_SI(bp))
-                       __set_bit(BNX2X_ACCEPT_ALL_UNICAST, &tx_accept_flags);
+                       __set_bit(BNX2X_ACCEPT_ALL_UNICAST, tx_accept_flags);
                else
-                       __set_bit(BNX2X_ACCEPT_UNICAST, &tx_accept_flags);
+                       __set_bit(BNX2X_ACCEPT_UNICAST, tx_accept_flags);
 
                break;
        default:
-               BNX2X_ERR("Unknown rx_mode: %d\n", bp->rx_mode);
-               return;
+               BNX2X_ERR("Unknown rx_mode: %d\n", rx_mode);
+               return -EINVAL;
        }
 
+       /* Set ACCEPT_ANY_VLAN as we do not enable filtering by VLAN */
        if (bp->rx_mode != BNX2X_RX_MODE_NONE) {
-               __set_bit(BNX2X_ACCEPT_ANY_VLAN, &rx_accept_flags);
-               __set_bit(BNX2X_ACCEPT_ANY_VLAN, &tx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_ANY_VLAN, rx_accept_flags);
+               __set_bit(BNX2X_ACCEPT_ANY_VLAN, tx_accept_flags);
        }
 
+       return 0;
+}
+
+/* called with netif_addr_lock_bh() */
+int bnx2x_set_storm_rx_mode(struct bnx2x *bp)
+{
+       unsigned long rx_mode_flags = 0, ramrod_flags = 0;
+       unsigned long rx_accept_flags = 0, tx_accept_flags = 0;
+       int rc;
+
+       if (!NO_FCOE(bp))
+               /* Configure rx_mode of FCoE Queue */
+               __set_bit(BNX2X_RX_MODE_FCOE_ETH, &rx_mode_flags);
+
+       rc = bnx2x_fill_accept_flags(bp, bp->rx_mode, &rx_accept_flags,
+                                    &tx_accept_flags);
+       if (rc)
+               return rc;
+
        __set_bit(RAMROD_RX, &ramrod_flags);
        __set_bit(RAMROD_TX, &ramrod_flags);
 
-       bnx2x_set_q_rx_mode(bp, bp->fp->cl_id, rx_mode_flags, rx_accept_flags,
-                           tx_accept_flags, ramrod_flags);
+       return bnx2x_set_q_rx_mode(bp, bp->fp->cl_id, rx_mode_flags,
+                                  rx_accept_flags, tx_accept_flags,
+                                  ramrod_flags);
 }
 
 static void bnx2x_init_internal_common(struct bnx2x *bp)
@@ -6516,7 +6522,7 @@ static int bnx2x_init_hw_common(struct bnx2x *bp)
        DP(NETIF_MSG_HW, "starting common init  func %d\n", BP_ABS_FUNC(bp));
 
        /*
-        * take the UNDI lock to protect undi_unload flow from accessing
+        * take the RESET lock to protect undi_unload flow from accessing
         * registers while we're resetting the chip
         */
        bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RESET);
@@ -6646,7 +6652,7 @@ static int bnx2x_init_hw_common(struct bnx2x *bp)
  *                 queues with "old" ILT addresses.
  *             c.  PF enable in the PGLC.
  *             d.  Clear the was_error of the PF in the PGLC. (could have
- *                 occured while driver was down)
+ *                 occurred while driver was down)
  *             e.  PF enable in the CFC (WEAK + STRONG)
  *             f.  Timers scan enable
  *     3.  PF driver unload flow:
@@ -6687,7 +6693,7 @@ static int bnx2x_init_hw_common(struct bnx2x *bp)
                /* Step 1: set zeroes to all ilt page entries with valid bit on
                 * Step 2: set the timers first/last ilt entry to point
                 * to the entire range to prevent ILT range error for 3rd/4th
-                * vnic (this code assumes existance of the vnic)
+                * vnic (this code assumes existence of the vnic)
                 *
                 * both steps performed by call to bnx2x_ilt_client_init_op()
                 * with dummy TM client
@@ -6704,7 +6710,6 @@ static int bnx2x_init_hw_common(struct bnx2x *bp)
                REG_WR(bp, PXP2_REG_RQ_DRAM_ALIGN_SEL, 1);
        }
 
-
        REG_WR(bp, PXP2_REG_RQ_DISABLE_INPUTS, 0);
        REG_WR(bp, PXP2_REG_RD_DISABLE_INPUTS, 0);
 
@@ -7187,7 +7192,6 @@ static int bnx2x_init_hw_port(struct bnx2x *bp)
                }
        }
 
-
        /* If SPIO5 is set to generate interrupts, enable it for this port */
        val = REG_RD(bp, MISC_REG_SPIO_EVENT_EN);
        if (val & MISC_SPIO_SPIO5) {
@@ -7414,8 +7418,10 @@ static int bnx2x_init_hw_func(struct bnx2x *bp)
        /* FLR cleanup - hmmm */
        if (!CHIP_IS_E1x(bp)) {
                rc = bnx2x_pf_flr_clnup(bp);
-               if (rc)
+               if (rc) {
+                       bnx2x_fw_dump(bp);
                        return rc;
+               }
        }
 
        /* set MSI reconfigure capability */
@@ -7730,10 +7736,6 @@ void bnx2x_free_mem(struct bnx2x *bp)
 {
        int i;
 
-       /* fastpath */
-       bnx2x_free_fp_mem(bp);
-       /* end of fastpath */
-
        BNX2X_PCI_FREE(bp->def_status_blk, bp->def_status_blk_mapping,
                       sizeof(struct host_sp_status_block));
 
@@ -7754,6 +7756,8 @@ void bnx2x_free_mem(struct bnx2x *bp)
 
        BNX2X_PCI_FREE(bp->eq_ring, bp->eq_mapping,
                       BCM_PAGE_SIZE * NUM_EQ_PAGES);
+
+       bnx2x_iov_free_mem(bp);
 }
 
 
@@ -8371,8 +8375,8 @@ static void bnx2x_reset_func(struct bnx2x *bp)
 
        /* SP SB */
        REG_WR8(bp, BAR_CSTRORM_INTMEM +
-                  CSTORM_SP_STATUS_BLOCK_DATA_STATE_OFFSET(func),
-                  SB_DISABLED);
+               CSTORM_SP_STATUS_BLOCK_DATA_STATE_OFFSET(func),
+               SB_DISABLED);
 
        for (i = 0; i < XSTORM_SPQ_DATA_SIZE / 4; i++)
                REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_SPQ_DATA_OFFSET(func),
@@ -8673,7 +8677,7 @@ void bnx2x_chip_cleanup(struct bnx2x *bp, int unload_mode, bool keep_link)
        }
 
        /* Give HW time to discard old tx messages */
-       usleep_range(1000, 1000);
+       usleep_range(1000, 2000);
 
        /* Clean all ETH MACs */
        rc = bnx2x_del_all_macs(bp, &bp->sp_objs[0].mac_obj, BNX2X_ETH_MAC,
@@ -9097,7 +9101,7 @@ static int bnx2x_er_poll_igu_vq(struct bnx2x *bp)
                if (pend_bits == 0)
                        break;
 
-               usleep_range(1000, 1000);
+               usleep_range(1000, 2000);
        } while (cnt-- > 0);
 
        if (cnt <= 0) {
@@ -9114,8 +9118,7 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global)
        int cnt = 1000;
        u32 val = 0;
        u32 sr_cnt, blk_cnt, port_is_idle_0, port_is_idle_1, pgl_exp_rom2;
-               u32 tags_63_32 = 0;
-
+       u32 tags_63_32 = 0;
 
        /* Empty the Tetris buffer, wait for 1s */
        do {
@@ -9133,7 +9136,7 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global)
                    (pgl_exp_rom2 == 0xffffffff) &&
                    (!CHIP_IS_E3(bp) || (tags_63_32 == 0xffffffff)))
                        break;
-               usleep_range(1000, 1000);
+               usleep_range(1000, 2000);
        } while (cnt-- > 0);
 
        if (cnt <= 0) {
@@ -9166,7 +9169,7 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global)
        /* Wait for 1ms to empty GLUE and PCI-E core queues,
         * PSWHST, GRC and PSWRD Tetris buffer.
         */
-       usleep_range(1000, 1000);
+       usleep_range(1000, 2000);
 
        /* Prepare to chip reset: */
        /* MCP */
@@ -9525,29 +9528,14 @@ sp_rtnl_not_reset:
        /* work which needs rtnl lock not-taken (as it takes the lock itself and
         * can be called from other contexts as well)
         */
-
        rtnl_unlock();
 
+       /* enable SR-IOV if applicable */
        if (IS_SRIOV(bp) && test_and_clear_bit(BNX2X_SP_RTNL_ENABLE_SRIOV,
-                                              &bp->sp_rtnl_state)) {
-               int rc = 0;
-
-               /* disbale sriov in case it is still enabled */
-               pci_disable_sriov(bp->pdev);
-               DP(BNX2X_MSG_IOV, "sriov disabled\n");
-
-               /* enable sriov */
-               DP(BNX2X_MSG_IOV, "vf num (%d)\n", (bp->vfdb->sriov.nr_virtfn));
-               rc = pci_enable_sriov(bp->pdev, (bp->vfdb->sriov.nr_virtfn));
-               if (rc)
-                       BNX2X_ERR("pci_enable_sriov failed with %d\n", rc);
-               else
-                       DP(BNX2X_MSG_IOV, "sriov enabled\n");
-       }
+                                              &bp->sp_rtnl_state))
+               bnx2x_enable_sriov(bp);
 }
 
-/* end of nic load/unload */
-
 static void bnx2x_period_task(struct work_struct *work)
 {
        struct bnx2x *bp = container_of(work, struct bnx2x, period_task.work);
@@ -9590,42 +9578,19 @@ u32 bnx2x_get_pretend_reg(struct bnx2x *bp)
        return base + (BP_ABS_FUNC(bp)) * stride;
 }
 
-static void bnx2x_undi_int_disable_e1h(struct bnx2x *bp)
-{
-       u32 reg = bnx2x_get_pretend_reg(bp);
-
-       /* Flush all outstanding writes */
-       mmiowb();
-
-       /* Pretend to be function 0 */
-       REG_WR(bp, reg, 0);
-       REG_RD(bp, reg);        /* Flush the GRC transaction (in the chip) */
-
-       /* From now we are in the "like-E1" mode */
-       bnx2x_int_disable(bp);
-
-       /* Flush all outstanding writes */
-       mmiowb();
-
-       /* Restore the original function */
-       REG_WR(bp, reg, BP_ABS_FUNC(bp));
-       REG_RD(bp, reg);
-}
-
-static inline void bnx2x_undi_int_disable(struct bnx2x *bp)
-{
-       if (CHIP_IS_E1(bp))
-               bnx2x_int_disable(bp);
-       else
-               bnx2x_undi_int_disable_e1h(bp);
-}
-
-static void bnx2x_prev_unload_close_mac(struct bnx2x *bp)
+static void bnx2x_prev_unload_close_mac(struct bnx2x *bp,
+                                       struct bnx2x_mac_vals *vals)
 {
        u32 val, base_addr, offset, mask, reset_reg;
        bool mac_stopped = false;
        u8 port = BP_PORT(bp);
 
+       /* reset addresses as they also mark which values were changed */
+       vals->bmac_addr = 0;
+       vals->umac_addr = 0;
+       vals->xmac_addr = 0;
+       vals->emac_addr = 0;
+
        reset_reg = REG_RD(bp, MISC_REG_RESET_REG_2);
 
        if (!CHIP_IS_E3(bp)) {
@@ -9647,14 +9612,18 @@ static void bnx2x_prev_unload_close_mac(struct bnx2x *bp)
                         */
                        wb_data[0] = REG_RD(bp, base_addr + offset);
                        wb_data[1] = REG_RD(bp, base_addr + offset + 0x4);
+                       vals->bmac_addr = base_addr + offset;
+                       vals->bmac_val[0] = wb_data[0];
+                       vals->bmac_val[1] = wb_data[1];
                        wb_data[0] &= ~BMAC_CONTROL_RX_ENABLE;
-                       REG_WR(bp, base_addr + offset, wb_data[0]);
-                       REG_WR(bp, base_addr + offset + 0x4, wb_data[1]);
+                       REG_WR(bp, vals->bmac_addr, wb_data[0]);
+                       REG_WR(bp, vals->bmac_addr + 0x4, wb_data[1]);
 
                }
                BNX2X_DEV_INFO("Disable emac Rx\n");
-               REG_WR(bp, NIG_REG_NIG_EMAC0_EN + BP_PORT(bp)*4, 0);
-
+               vals->emac_addr = NIG_REG_NIG_EMAC0_EN + BP_PORT(bp)*4;
+               vals->emac_val = REG_RD(bp, vals->emac_addr);
+               REG_WR(bp, vals->emac_addr, 0);
                mac_stopped = true;
        } else {
                if (reset_reg & MISC_REGISTERS_RESET_REG_2_XMAC) {
@@ -9665,14 +9634,18 @@ static void bnx2x_prev_unload_close_mac(struct bnx2x *bp)
                               val & ~(1 << 1));
                        REG_WR(bp, base_addr + XMAC_REG_PFC_CTRL_HI,
                               val | (1 << 1));
-                       REG_WR(bp, base_addr + XMAC_REG_CTRL, 0);
+                       vals->xmac_addr = base_addr + XMAC_REG_CTRL;
+                       vals->xmac_val = REG_RD(bp, vals->xmac_addr);
+                       REG_WR(bp, vals->xmac_addr, 0);
                        mac_stopped = true;
                }
                mask = MISC_REGISTERS_RESET_REG_2_UMAC0 << port;
                if (mask & reset_reg) {
                        BNX2X_DEV_INFO("Disable umac Rx\n");
                        base_addr = BP_PORT(bp) ? GRCBASE_UMAC1 : GRCBASE_UMAC0;
-                       REG_WR(bp, base_addr + UMAC_REG_COMMAND_CONFIG, 0);
+                       vals->umac_addr = base_addr + UMAC_REG_COMMAND_CONFIG;
+                       vals->umac_val = REG_RD(bp, vals->umac_addr);
+                       REG_WR(bp, vals->umac_addr, 0);
                        mac_stopped = true;
                }
        }
@@ -9832,6 +9805,8 @@ static int bnx2x_prev_unload_uncommon(struct bnx2x *bp)
        if (bnx2x_prev_is_path_marked(bp))
                return bnx2x_prev_mcp_done(bp);
 
+       BNX2X_DEV_INFO("Path is unmarked\n");
+
        /* If function has FLR capabilities, and existing FW version matches
         * the one required, then FLR will be sufficient to clean any residue
         * left by previous driver
@@ -9864,12 +9839,16 @@ static int bnx2x_prev_unload_common(struct bnx2x *bp)
 {
        u32 reset_reg, tmp_reg = 0, rc;
        bool prev_undi = false;
+       struct bnx2x_mac_vals mac_vals;
+
        /* It is possible a previous function received 'common' answer,
         * but hasn't loaded yet, therefore creating a scenario of
         * multiple functions receiving 'common' on the same path.
         */
        BNX2X_DEV_INFO("Common unload Flow\n");
 
+       memset(&mac_vals, 0, sizeof(mac_vals));
+
        if (bnx2x_prev_is_path_marked(bp))
                return bnx2x_prev_mcp_done(bp);
 
@@ -9880,12 +9859,14 @@ static int bnx2x_prev_unload_common(struct bnx2x *bp)
                u32 timer_count = 1000;
 
                /* Close the MAC Rx to prevent BRB from filling up */
-               bnx2x_prev_unload_close_mac(bp);
+               bnx2x_prev_unload_close_mac(bp, &mac_vals);
+
+               /* close LLH filters towards the BRB */
+               bnx2x_set_rx_filter(&bp->link_params, 0);
 
                /* Check if the UNDI driver was previously loaded
                 * UNDI driver initializes CID offset for normal bell to 0x7
                 */
-               reset_reg = REG_RD(bp, MISC_REG_RESET_REG_1);
                if (reset_reg & MISC_REGISTERS_RESET_REG_1_RST_DORQ) {
                        tmp_reg = REG_RD(bp, DORQ_REG_NORM_CID_OFST);
                        if (tmp_reg == 0x7) {
@@ -9893,6 +9874,8 @@ static int bnx2x_prev_unload_common(struct bnx2x *bp)
                                prev_undi = true;
                                /* clear the UNDI indication */
                                REG_WR(bp, DORQ_REG_NORM_CID_OFST, 0);
+                               /* clear possible idle check errors */
+                               REG_RD(bp, NIG_REG_NIG_INT_STS_CLR_0);
                        }
                }
                /* wait until BRB is empty */
@@ -9927,6 +9910,17 @@ static int bnx2x_prev_unload_common(struct bnx2x *bp)
        /* No packets are in the pipeline, path is ready for reset */
        bnx2x_reset_common(bp);
 
+       if (mac_vals.xmac_addr)
+               REG_WR(bp, mac_vals.xmac_addr, mac_vals.xmac_val);
+       if (mac_vals.umac_addr)
+               REG_WR(bp, mac_vals.umac_addr, mac_vals.umac_val);
+       if (mac_vals.emac_addr)
+               REG_WR(bp, mac_vals.emac_addr, mac_vals.emac_val);
+       if (mac_vals.bmac_addr) {
+               REG_WR(bp, mac_vals.bmac_addr, mac_vals.bmac_val[0]);
+               REG_WR(bp, mac_vals.bmac_addr + 4, mac_vals.bmac_val[1]);
+       }
+
        rc = bnx2x_prev_mark_path(bp, prev_undi);
        if (rc) {
                bnx2x_prev_mcp_done(bp);
@@ -9948,7 +9942,8 @@ static void bnx2x_prev_interrupted_dmae(struct bnx2x *bp)
        if (!CHIP_IS_E1x(bp)) {
                u32 val = REG_RD(bp, PGLUE_B_REG_PGLUE_B_INT_STS);
                if (val & PGLUE_B_PGLUE_B_INT_STS_REG_WAS_ERROR_ATTN) {
-                       BNX2X_ERR("was error bit was found to be set in pglueb upon startup. Clearing");
+                       DP(BNX2X_MSG_SP,
+                          "'was error' bit was found to be set in pglueb upon startup. Clearing\n");
                        REG_WR(bp, PGLUE_B_REG_WAS_ERROR_PF_7_0_CLR,
                               1 << BP_FUNC(bp));
                }
@@ -9990,7 +9985,6 @@ static int bnx2x_prev_unload(struct bnx2x *bp)
                REG_WR(bp, MCP_REG_MCPR_ACCESS_LOCK, 0);
        }
 
-
        do {
                /* Lock MCP using an unload request */
                fw = bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_REQ_WOL_DIS, 0);
@@ -10557,10 +10551,10 @@ static void bnx2x_link_settings_requested(struct bnx2x *bp)
 
 static void bnx2x_set_mac_buf(u8 *mac_buf, u32 mac_lo, u16 mac_hi)
 {
-       mac_hi = cpu_to_be16(mac_hi);
-       mac_lo = cpu_to_be32(mac_lo);
-       memcpy(mac_buf, &mac_hi, sizeof(mac_hi));
-       memcpy(mac_buf + sizeof(mac_hi), &mac_lo, sizeof(mac_lo));
+       __be16 mac_hi_be = cpu_to_be16(mac_hi);
+       __be32 mac_lo_be = cpu_to_be32(mac_lo);
+       memcpy(mac_buf, &mac_hi_be, sizeof(mac_hi_be));
+       memcpy(mac_buf + sizeof(mac_hi_be), &mac_lo_be, sizeof(mac_lo_be));
 }
 
 static void bnx2x_get_port_hwinfo(struct bnx2x *bp)
@@ -10596,6 +10590,13 @@ static void bnx2x_get_port_hwinfo(struct bnx2x *bp)
        bp->wol = (!(bp->flags & NO_WOL_FLAG) &&
                   (config & PORT_FEATURE_WOL_ENABLED));
 
+       if ((config & PORT_FEAT_CFG_STORAGE_PERSONALITY_MASK) ==
+           PORT_FEAT_CFG_STORAGE_PERSONALITY_FCOE && !IS_MF(bp))
+               bp->flags |= NO_ISCSI_FLAG;
+       if ((config & PORT_FEAT_CFG_STORAGE_PERSONALITY_MASK) ==
+           PORT_FEAT_CFG_STORAGE_PERSONALITY_ISCSI && !(IS_MF(bp)))
+               bp->flags |= NO_FCOE_FLAG;
+
        BNX2X_DEV_INFO("lane_config 0x%08x  speed_cap_mask0 0x%08x  link_config0 0x%08x\n",
                       bp->link_params.lane_config,
                       bp->link_params.speed_cap_mask[0],
@@ -10703,21 +10704,21 @@ static void bnx2x_get_fcoe_info(struct bnx2x *bp)
                /* Port info */
                bp->cnic_eth_dev.fcoe_wwn_port_name_hi =
                        SHMEM_RD(bp,
-                               dev_info.port_hw_config[port].
+                                dev_info.port_hw_config[port].
                                 fcoe_wwn_port_name_upper);
                bp->cnic_eth_dev.fcoe_wwn_port_name_lo =
                        SHMEM_RD(bp,
-                               dev_info.port_hw_config[port].
+                                dev_info.port_hw_config[port].
                                 fcoe_wwn_port_name_lower);
 
                /* Node info */
                bp->cnic_eth_dev.fcoe_wwn_node_name_hi =
                        SHMEM_RD(bp,
-                               dev_info.port_hw_config[port].
+                                dev_info.port_hw_config[port].
                                 fcoe_wwn_node_name_upper);
                bp->cnic_eth_dev.fcoe_wwn_node_name_lo =
                        SHMEM_RD(bp,
-                               dev_info.port_hw_config[port].
+                                dev_info.port_hw_config[port].
                                 fcoe_wwn_node_name_lower);
        } else if (!IS_MF_SD(bp)) {
                /*
@@ -10815,7 +10816,7 @@ static void bnx2x_get_cnic_mac_hwinfo(struct bnx2x *bp)
                        /* Zero primary MAC configuration */
                        memset(bp->dev->dev_addr, 0, ETH_ALEN);
 
-               if (IS_MF_FCOE_AFEX(bp))
+               if (IS_MF_FCOE_AFEX(bp) || IS_MF_FCOE_SD(bp))
                        /* use FIP MAC as primary MAC */
                        memcpy(bp->dev->dev_addr, fip_mac, ETH_ALEN);
 
@@ -10878,7 +10879,6 @@ static void bnx2x_get_mac_hwinfo(struct bnx2x *bp)
        }
 
        memcpy(bp->link_params.mac_addr, bp->dev->dev_addr, ETH_ALEN);
-       memcpy(bp->dev->perm_addr, bp->dev->dev_addr, ETH_ALEN);
 
        if (!bnx2x_is_valid_ether_addr(bp, bp->dev->dev_addr))
                dev_err(&bp->pdev->dev,
@@ -10943,7 +10943,7 @@ static int bnx2x_get_hwinfo(struct bnx2x *bp)
 
                        while (tout && REG_RD(bp, IGU_REG_RESET_MEMORIES)) {
                                tout--;
-                               usleep_range(1000, 1000);
+                               usleep_range(1000, 2000);
                        }
 
                        if (REG_RD(bp, IGU_REG_RESET_MEMORIES)) {
@@ -11621,7 +11621,6 @@ static int bnx2x_set_mc_list(struct bnx2x *bp)
        return rc;
 }
 
-
 /* If bp->state is OPEN, should be called with netif_addr_lock_bh() */
 void bnx2x_set_rx_mode(struct net_device *dev)
 {
@@ -11790,7 +11789,9 @@ static const struct net_device_ops bnx2x_netdev_ops = {
        .ndo_poll_controller    = poll_bnx2x,
 #endif
        .ndo_setup_tc           = bnx2x_setup_tc,
+#ifdef CONFIG_BNX2X_SRIOV
        .ndo_set_vf_mac         = bnx2x_set_vf_mac,
+#endif
 #ifdef NETDEV_FCOE_WWNN
        .ndo_fcoe_get_wwn       = bnx2x_fcoe_get_wwn,
 #endif
@@ -11907,13 +11908,14 @@ static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev,
         * support Physical Device Assignment where kernel BDF maybe arbitrary
         * (depending on hypervisor).
         */
-       if (chip_is_e1x)
+       if (chip_is_e1x) {
                bp->pf_num = PCI_FUNC(pdev->devfn);
-       else {/* chip is E2/3*/
+       } else {
+               /* chip is E2/3*/
                pci_read_config_dword(bp->pdev,
                                      PCICFG_ME_REGISTER, &pci_cfg_dword);
                bp->pf_num = (u8)((pci_cfg_dword & ME_REG_ABS_PF_NUM) >>
-                   ME_REG_ABS_PF_NUM_SHIFT);
+                                 ME_REG_ABS_PF_NUM_SHIFT);
        }
        BNX2X_DEV_INFO("me reg PF num: %d\n", bp->pf_num);
 
@@ -12013,7 +12015,7 @@ static int bnx2x_check_firmware(struct bnx2x *bp)
        struct bnx2x_fw_file_hdr *fw_hdr;
        struct bnx2x_fw_file_section *sections;
        u32 offset, len, num_ops;
-       u16 *ops_offsets;
+       __be16 *ops_offsets;
        int i;
        const u8 *fw_ver;
 
@@ -12038,7 +12040,7 @@ static int bnx2x_check_firmware(struct bnx2x *bp)
 
        /* Likewise for the init_ops offsets */
        offset = be32_to_cpu(fw_hdr->init_ops_offsets.offset);
-       ops_offsets = (u16 *)(firmware->data + offset);
+       ops_offsets = (__force __be16 *)(firmware->data + offset);
        num_ops = be32_to_cpu(fw_hdr->init_ops.len) / sizeof(struct raw_op);
 
        for (i = 0; i < be32_to_cpu(fw_hdr->init_ops_offsets.len) / 2; i++) {
@@ -12434,7 +12436,7 @@ static int bnx2x_init_one(struct pci_dev *pdev,
        BNX2X_DEV_INFO("Cnic support is %s\n", CNIC_SUPPORT(bp) ? "on" : "off");
        BNX2X_DEV_INFO("Max num of status blocks %d\n", max_non_def_sbs);
        BNX2X_DEV_INFO("Allocated netdev with %d tx and %d rx queues\n",
-                         tx_count, rx_count);
+                      tx_count, rx_count);
 
        rc = bnx2x_init_bp(bp);
        if (rc)
@@ -12445,17 +12447,10 @@ static int bnx2x_init_one(struct pci_dev *pdev,
         * l2 connections.
         */
        if (IS_VF(bp)) {
-               /* vf doorbells are embedded within the regview */
-               bp->doorbells = bp->regview + PXP_VF_ADDR_DB_START;
-
-               /* allocate vf2pf mailbox for vf to pf channel */
-               BNX2X_PCI_ALLOC(bp->vf2pf_mbox, &bp->vf2pf_mbox_mapping,
-                               sizeof(struct bnx2x_vf_mbx_msg));
-
-               /* allocate pf 2 vf bulletin board */
-               BNX2X_PCI_ALLOC(bp->pf2vf_bulletin, &bp->pf2vf_bulletin_mapping,
-                               sizeof(union pf_vf_bulletin));
-
+               bnx2x_vf_map_doorbells(bp);
+               rc = bnx2x_vf_pci_alloc(bp);
+               if (rc)
+                       goto init_one_exit;
        } else {
                doorbell_size = BNX2X_L2_MAX_CID(bp) * (1 << BNX2X_DB_SHIFT);
                if (doorbell_size > pci_resource_len(pdev, 2)) {
@@ -12519,6 +12514,7 @@ static int bnx2x_init_one(struct pci_dev *pdev,
                dev_err(&pdev->dev, "Cannot set interrupts\n");
                goto init_one_exit;
        }
+       BNX2X_DEV_INFO("set interrupts successfully\n");
 
        /* register the net device */
        rc = register_netdev(dev);
@@ -12552,11 +12548,6 @@ static int bnx2x_init_one(struct pci_dev *pdev,
 
        return 0;
 
-alloc_mem_err:
-       BNX2X_PCI_FREE(bp->vf2pf_mbox, bp->vf2pf_mbox_mapping,
-                      sizeof(struct bnx2x_vf_mbx_msg));
-       rc = -ENOMEM;
-
 init_one_exit:
        if (bp->regview)
                iounmap(bp->regview);
@@ -13419,619 +13410,36 @@ struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *dev)
        return cp;
 }
 
-int bnx2x_send_msg2pf(struct bnx2x *bp, u8 *done, dma_addr_t msg_mapping)
-{
-       struct cstorm_vf_zone_data __iomem *zone_data =
-               REG_ADDR(bp, PXP_VF_ADDR_CSDM_GLOBAL_START);
-       int tout = 600, interval = 100; /* wait for 60 seconds */
-
-       if (*done) {
-               BNX2X_ERR("done was non zero before message to pf was sent\n");
-               WARN_ON(true);
-               return -EINVAL;
-       }
-
-       /* Write message address */
-       writel(U64_LO(msg_mapping),
-              &zone_data->non_trigger.vf_pf_channel.msg_addr_lo);
-       writel(U64_HI(msg_mapping),
-              &zone_data->non_trigger.vf_pf_channel.msg_addr_hi);
-
-       /* make sure the address is written before FW accesses it */
-       wmb();
-
-       /* Trigger the PF FW */
-       writeb(1, &zone_data->trigger.vf_pf_channel.addr_valid);
-
-       /* Wait for PF to complete */
-       while ((tout >= 0) && (!*done)) {
-               msleep(interval);
-               tout -= 1;
-
-               /* progress indicator - HV can take its own sweet time in
-                * answering VFs...
-                */
-               DP_CONT(BNX2X_MSG_IOV, ".");
-       }
-
-       if (!*done) {
-               BNX2X_ERR("PF response has timed out\n");
-               return -EAGAIN;
-       }
-       DP(BNX2X_MSG_SP, "Got a response from PF\n");
-       return 0;
-}
-
-int bnx2x_get_vf_id(struct bnx2x *bp, u32 *vf_id)
-{
-       u32 me_reg;
-       int tout = 10, interval = 100; /* Wait for 1 sec */
-
-       do {
-               /* pxp traps vf read of doorbells and returns me reg value */
-               me_reg = readl(bp->doorbells);
-               if (GOOD_ME_REG(me_reg))
-                       break;
-
-               msleep(interval);
-
-               BNX2X_ERR("Invalid ME register value: 0x%08x\n. Is pf driver up?",
-                         me_reg);
-       } while (tout-- > 0);
-
-       if (!GOOD_ME_REG(me_reg)) {
-               BNX2X_ERR("Invalid ME register value: 0x%08x\n", me_reg);
-               return -EINVAL;
-       }
-
-       BNX2X_ERR("valid ME register value: 0x%08x\n", me_reg);
-
-       *vf_id = (me_reg & ME_REG_VF_NUM_MASK) >> ME_REG_VF_NUM_SHIFT;
-
-       return 0;
-}
-
-int bnx2x_vfpf_acquire(struct bnx2x *bp, u8 tx_count, u8 rx_count)
-{
-       int rc = 0, attempts = 0;
-       struct vfpf_acquire_tlv *req = &bp->vf2pf_mbox->req.acquire;
-       struct pfvf_acquire_resp_tlv *resp = &bp->vf2pf_mbox->resp.acquire_resp;
-       u32 vf_id;
-       bool resources_acquired = false;
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_ACQUIRE, sizeof(*req));
-
-       if (bnx2x_get_vf_id(bp, &vf_id))
-               return -EAGAIN;
-
-       req->vfdev_info.vf_id = vf_id;
-       req->vfdev_info.vf_os = 0;
-
-       req->resc_request.num_rxqs = rx_count;
-       req->resc_request.num_txqs = tx_count;
-       req->resc_request.num_sbs = bp->igu_sb_cnt;
-       req->resc_request.num_mac_filters = VF_ACQUIRE_MAC_FILTERS;
-       req->resc_request.num_mc_filters = VF_ACQUIRE_MC_FILTERS;
-
-       /* pf 2 vf bulletin board address */
-       req->bulletin_addr = bp->pf2vf_bulletin_mapping;
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       while (!resources_acquired) {
-               DP(BNX2X_MSG_SP, "attempting to acquire resources\n");
-
-               /* send acquire request */
-               rc = bnx2x_send_msg2pf(bp,
-                                      &resp->hdr.status,
-                                      bp->vf2pf_mbox_mapping);
-
-               /* PF timeout */
-               if (rc)
-                       return rc;
-
-               /* copy acquire response from buffer to bp */
-               memcpy(&bp->acquire_resp, resp, sizeof(bp->acquire_resp));
-
-               attempts++;
-
-               /* test whether the PF accepted our request. If not, humble the
-                * the request and try again.
-                */
-               if (bp->acquire_resp.hdr.status == PFVF_STATUS_SUCCESS) {
-                       DP(BNX2X_MSG_SP, "resources acquired\n");
-                       resources_acquired = true;
-               } else if (bp->acquire_resp.hdr.status ==
-                          PFVF_STATUS_NO_RESOURCE &&
-                          attempts < VF_ACQUIRE_THRESH) {
-                       DP(BNX2X_MSG_SP,
-                          "PF unwilling to fulfill resource request. Try PF recommended amount\n");
-
-                       /* humble our request */
-                       req->resc_request.num_txqs =
-                               bp->acquire_resp.resc.num_txqs;
-                       req->resc_request.num_rxqs =
-                               bp->acquire_resp.resc.num_rxqs;
-                       req->resc_request.num_sbs =
-                               bp->acquire_resp.resc.num_sbs;
-                       req->resc_request.num_mac_filters =
-                               bp->acquire_resp.resc.num_mac_filters;
-                       req->resc_request.num_vlan_filters =
-                               bp->acquire_resp.resc.num_vlan_filters;
-                       req->resc_request.num_mc_filters =
-                               bp->acquire_resp.resc.num_mc_filters;
-
-                       /* Clear response buffer */
-                       memset(&bp->vf2pf_mbox->resp, 0,
-                              sizeof(union pfvf_tlvs));
-               } else {
-                       /* PF reports error */
-                       BNX2X_ERR("Failed to get the requested amount of resources: %d. Breaking...\n",
-                                 bp->acquire_resp.hdr.status);
-                       return -EAGAIN;
-               }
-       }
-
-       /* get HW info */
-       bp->common.chip_id |= (bp->acquire_resp.pfdev_info.chip_num & 0xffff);
-       bp->link_params.chip_id = bp->common.chip_id;
-       bp->db_size = bp->acquire_resp.pfdev_info.db_size;
-       bp->common.int_block = INT_BLOCK_IGU;
-       bp->common.chip_port_mode = CHIP_2_PORT_MODE;
-       bp->igu_dsb_id = -1;
-       bp->mf_ov = 0;
-       bp->mf_mode = 0;
-       bp->common.flash_size = 0;
-       bp->flags |=
-               NO_WOL_FLAG | NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG | NO_FCOE_FLAG;
-       bp->igu_sb_cnt = 1;
-       bp->igu_base_sb = bp->acquire_resp.resc.hw_sbs[0].hw_sb_id;
-       strlcpy(bp->fw_ver, bp->acquire_resp.pfdev_info.fw_ver,
-               sizeof(bp->fw_ver));
-
-       if (is_valid_ether_addr(bp->acquire_resp.resc.current_mac_addr))
-               memcpy(bp->dev->dev_addr,
-                      bp->acquire_resp.resc.current_mac_addr,
-                      ETH_ALEN);
-
-       return 0;
-}
-
-int bnx2x_vfpf_release(struct bnx2x *bp)
-{
-       struct vfpf_release_tlv *req = &bp->vf2pf_mbox->req.release;
-       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
-       u32 rc = 0, vf_id;
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_RELEASE, sizeof(*req));
-
-       if (bnx2x_get_vf_id(bp, &vf_id))
-               return -EAGAIN;
-
-       req->vf_id = vf_id;
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       /* send release request */
-       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
-
-       if (rc)
-               /* PF timeout */
-               return rc;
-       if (resp->hdr.status == PFVF_STATUS_SUCCESS) {
-               /* PF released us */
-               DP(BNX2X_MSG_SP, "vf released\n");
-       } else {
-               /* PF reports error */
-               BNX2X_ERR("PF failed our release request - are we out of sync? response status: %d\n",
-                         resp->hdr.status);
-               return -EAGAIN;
-       }
-
-       return 0;
-}
-
-/* Tell PF about SB addresses */
-int bnx2x_vfpf_init(struct bnx2x *bp)
-{
-       struct vfpf_init_tlv *req = &bp->vf2pf_mbox->req.init;
-       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
-       int rc, i;
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_INIT, sizeof(*req));
-
-       /* status blocks */
-       for_each_eth_queue(bp, i)
-               req->sb_addr[i] = (dma_addr_t)bnx2x_fp(bp, i,
-                                                      status_blk_mapping);
-
-       /* statistics - requests only supports single queue for now */
-       req->stats_addr = bp->fw_stats_data_mapping +
-                         offsetof(struct bnx2x_fw_stats_data, queue_stats);
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
-       if (rc)
-               return rc;
-
-       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
-               BNX2X_ERR("INIT VF failed: %d. Breaking...\n",
-                         resp->hdr.status);
-               return -EAGAIN;
-       }
-
-       DP(BNX2X_MSG_SP, "INIT VF Succeeded\n");
-       return 0;
-}
-
-/* CLOSE VF - opposite to INIT_VF */
-void bnx2x_vfpf_close_vf(struct bnx2x *bp)
-{
-       struct vfpf_close_tlv *req = &bp->vf2pf_mbox->req.close;
-       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
-       int i, rc;
-       u32 vf_id;
-
-       /* If we haven't got a valid VF id, there is no sense to
-        * continue with sending messages
-        */
-       if (bnx2x_get_vf_id(bp, &vf_id))
-               goto free_irq;
-
-       /* Close the queues */
-       for_each_queue(bp, i)
-               bnx2x_vfpf_teardown_queue(bp, i);
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_CLOSE, sizeof(*req));
-
-       req->vf_id = vf_id;
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
-
-       if (rc)
-               BNX2X_ERR("Sending CLOSE failed. rc was: %d\n", rc);
-
-       else if (resp->hdr.status != PFVF_STATUS_SUCCESS)
-               BNX2X_ERR("Sending CLOSE failed: pf response was %d\n",
-                         resp->hdr.status);
-
-free_irq:
-       /* Disable HW interrupts, NAPI */
-       bnx2x_netif_stop(bp, 0);
-       /* Delete all NAPI objects */
-       bnx2x_del_all_napi(bp);
-
-       /* Release IRQs */
-       bnx2x_free_irq(bp);
-}
-
-/* ask the pf to open a queue for the vf */
-int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx)
-{
-       struct vfpf_setup_q_tlv *req = &bp->vf2pf_mbox->req.setup_q;
-       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
-       struct bnx2x_fastpath *fp = &bp->fp[fp_idx];
-       u16 tpa_agg_size = 0, flags = 0;
-       int rc;
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_SETUP_Q, sizeof(*req));
-
-       /* select tpa mode to request */
-       if (!fp->disable_tpa) {
-               flags |= VFPF_QUEUE_FLG_TPA;
-               flags |= VFPF_QUEUE_FLG_TPA_IPV6;
-               if (fp->mode == TPA_MODE_GRO)
-                       flags |= VFPF_QUEUE_FLG_TPA_GRO;
-               tpa_agg_size = TPA_AGG_SIZE;
-       }
-
-       /* calculate queue flags */
-       flags |= VFPF_QUEUE_FLG_STATS;
-       flags |= VFPF_QUEUE_FLG_CACHE_ALIGN;
-       flags |= IS_MF_SD(bp) ? VFPF_QUEUE_FLG_OV : 0;
-       flags |= VFPF_QUEUE_FLG_VLAN;
-       DP(NETIF_MSG_IFUP, "vlan removal enabled\n");
-
-       /* Common */
-       req->vf_qid = fp_idx;
-       req->param_valid = VFPF_RXQ_VALID | VFPF_TXQ_VALID;
-
-       /* Rx */
-       req->rxq.rcq_addr = fp->rx_comp_mapping;
-       req->rxq.rcq_np_addr = fp->rx_comp_mapping + BCM_PAGE_SIZE;
-       req->rxq.rxq_addr = fp->rx_desc_mapping;
-       req->rxq.sge_addr = fp->rx_sge_mapping;
-       req->rxq.vf_sb = fp_idx;
-       req->rxq.sb_index = HC_INDEX_ETH_RX_CQ_CONS;
-       req->rxq.hc_rate = bp->rx_ticks ? 1000000/bp->rx_ticks : 0;
-       req->rxq.mtu = bp->dev->mtu;
-       req->rxq.buf_sz = fp->rx_buf_size;
-       req->rxq.sge_buf_sz = BCM_PAGE_SIZE * PAGES_PER_SGE;
-       req->rxq.tpa_agg_sz = tpa_agg_size;
-       req->rxq.max_sge_pkt = SGE_PAGE_ALIGN(bp->dev->mtu) >> SGE_PAGE_SHIFT;
-       req->rxq.max_sge_pkt = ((req->rxq.max_sge_pkt + PAGES_PER_SGE - 1) &
-                         (~(PAGES_PER_SGE-1))) >> PAGES_PER_SGE_SHIFT;
-       req->rxq.flags = flags;
-       req->rxq.drop_flags = 0;
-       req->rxq.cache_line_log = BNX2X_RX_ALIGN_SHIFT;
-       req->rxq.stat_id = -1; /* No stats at the moment */
-
-       /* Tx */
-       req->txq.txq_addr = fp->txdata_ptr[FIRST_TX_COS_INDEX]->tx_desc_mapping;
-       req->txq.vf_sb = fp_idx;
-       req->txq.sb_index = HC_INDEX_ETH_TX_CQ_CONS_COS0;
-       req->txq.hc_rate = bp->tx_ticks ? 1000000/bp->tx_ticks : 0;
-       req->txq.flags = flags;
-       req->txq.traffic_type = LLFC_TRAFFIC_TYPE_NW;
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
-       if (rc)
-               BNX2X_ERR("Sending SETUP_Q message for queue[%d] failed!\n",
-                         fp_idx);
-
-       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
-               BNX2X_ERR("Status of SETUP_Q for queue[%d] is %d\n",
-                         fp_idx, resp->hdr.status);
-               return -EINVAL;
-       }
-       return rc;
-}
-
-int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx)
-{
-       struct vfpf_q_op_tlv *req = &bp->vf2pf_mbox->req.q_op;
-       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
-       int rc;
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_TEARDOWN_Q,
-                       sizeof(*req));
-
-       req->vf_qid = qidx;
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
-
-       if (rc) {
-               BNX2X_ERR("Sending TEARDOWN for queue %d failed: %d\n", qidx,
-                         rc);
-               return rc;
-       }
-
-       /* PF failed the transaction */
-       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
-               BNX2X_ERR("TEARDOWN for queue %d failed: %d\n", qidx,
-                         resp->hdr.status);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-/* request pf to add a mac for the vf */
-int bnx2x_vfpf_set_mac(struct bnx2x *bp)
+u32 bnx2x_rx_ustorm_prods_offset(struct bnx2x_fastpath *fp)
 {
-       struct vfpf_set_q_filters_tlv *req = &bp->vf2pf_mbox->req.set_q_filters;
-       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
-       int rc;
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_SET_Q_FILTERS,
-                       sizeof(*req));
-
-       req->flags = VFPF_SET_Q_FILTERS_MAC_VLAN_CHANGED;
-       req->vf_qid = 0;
-       req->n_mac_vlan_filters = 1;
-       req->filters[0].flags =
-               VFPF_Q_FILTER_DEST_MAC_VALID | VFPF_Q_FILTER_SET_MAC;
-
-       /* sample bulletin board for new mac */
-       bnx2x_sample_bulletin(bp);
-
-       /* copy mac from device to request */
-       memcpy(req->filters[0].mac, bp->dev->dev_addr, ETH_ALEN);
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       /* send message to pf */
-       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
-       if (rc) {
-               BNX2X_ERR("failed to send message to pf. rc was %d\n", rc);
-               return rc;
-       }
-
-       /* failure may mean PF was configured with a new mac for us */
-       while (resp->hdr.status == PFVF_STATUS_FAILURE) {
-               DP(BNX2X_MSG_IOV,
-                  "vfpf SET MAC failed. Check bulletin board for new posts\n");
-
-               /* check if bulletin board was updated */
-               if (bnx2x_sample_bulletin(bp) == PFVF_BULLETIN_UPDATED) {
-                       /* copy mac from device to request */
-                       memcpy(req->filters[0].mac, bp->dev->dev_addr,
-                              ETH_ALEN);
-
-                       /* send message to pf */
-                       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status,
-                                              bp->vf2pf_mbox_mapping);
-               } else {
-                       /* no new info in bulletin */
-                       break;
-               }
-       }
+       struct bnx2x *bp = fp->bp;
+       u32 offset = BAR_USTRORM_INTMEM;
 
-       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
-               BNX2X_ERR("vfpf SET MAC failed: %d\n", resp->hdr.status);
-               return -EINVAL;
-       }
+       if (IS_VF(bp))
+               return bnx2x_vf_ustorm_prods_offset(bp, fp);
+       else if (!CHIP_IS_E1x(bp))
+               offset += USTORM_RX_PRODS_E2_OFFSET(fp->cl_qzone_id);
+       else
+               offset += USTORM_RX_PRODS_E1X_OFFSET(BP_PORT(bp), fp->cl_id);
 
-       return 0;
+       return offset;
 }
 
-int bnx2x_vfpf_set_mcast(struct net_device *dev)
+/* called only on E1H or E2.
+ * When pretending to be PF, the pretend value is the function number 0...7
+ * When pretending to be VF, the pretend val is the PF-num:VF-valid:ABS-VFID
+ * combination
+ */
+int bnx2x_pretend_func(struct bnx2x *bp, u16 pretend_func_val)
 {
-       struct bnx2x *bp = netdev_priv(dev);
-       struct vfpf_set_q_filters_tlv *req = &bp->vf2pf_mbox->req.set_q_filters;
-       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
-       int rc, i = 0;
-       struct netdev_hw_addr *ha;
-
-       if (bp->state != BNX2X_STATE_OPEN) {
-               DP(NETIF_MSG_IFUP, "state is %x, returning\n", bp->state);
-               return -EINVAL;
-       }
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_SET_Q_FILTERS,
-                       sizeof(*req));
-
-       /* Get Rx mode requested */
-       DP(NETIF_MSG_IFUP, "dev->flags = %x\n", dev->flags);
+       u32 pretend_reg;
 
-       netdev_for_each_mc_addr(ha, dev) {
-               DP(NETIF_MSG_IFUP, "Adding mcast MAC: %pM\n",
-                  bnx2x_mc_addr(ha));
-               memcpy(req->multicast[i], bnx2x_mc_addr(ha), ETH_ALEN);
-               i++;
-       }
-
-       /* We support four PFVF_MAX_MULTICAST_PER_VF mcast
-        * addresses tops
-        */
-       if (i >= PFVF_MAX_MULTICAST_PER_VF) {
-               DP(NETIF_MSG_IFUP,
-                  "VF supports not more than %d multicast MAC addresses\n",
-                  PFVF_MAX_MULTICAST_PER_VF);
-               return -EINVAL;
-       }
-
-       req->n_multicast = i;
-       req->flags |= VFPF_SET_Q_FILTERS_MULTICAST_CHANGED;
-       req->vf_qid = 0;
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
-       if (rc) {
-               BNX2X_ERR("Sending a message failed: %d\n", rc);
-               return rc;
-       }
-
-       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
-               BNX2X_ERR("Set Rx mode/multicast failed: %d\n",
-                         resp->hdr.status);
-               return -EINVAL;
-       }
+       if (CHIP_IS_E1H(bp) && pretend_func_val >= E1H_FUNC_MAX)
+               return -1;
 
+       /* get my own pretend register */
+       pretend_reg = bnx2x_get_pretend_reg(bp);
+       REG_WR(bp, pretend_reg, pretend_func_val);
+       REG_RD(bp, pretend_reg);
        return 0;
 }
-
-int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp)
-{
-       int mode = bp->rx_mode;
-       struct vfpf_set_q_filters_tlv *req = &bp->vf2pf_mbox->req.set_q_filters;
-       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
-       int rc;
-
-       /* clear mailbox and prep first tlv */
-       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_SET_Q_FILTERS,
-                       sizeof(*req));
-
-       DP(NETIF_MSG_IFUP, "Rx mode is %d\n", mode);
-
-       switch (mode) {
-       case BNX2X_RX_MODE_NONE: /* no Rx */
-               req->rx_mask = VFPF_RX_MASK_ACCEPT_NONE;
-               break;
-       case BNX2X_RX_MODE_NORMAL:
-               req->rx_mask = VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST;
-               req->rx_mask |= VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST;
-               req->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST;
-               break;
-       case BNX2X_RX_MODE_ALLMULTI:
-               req->rx_mask = VFPF_RX_MASK_ACCEPT_ALL_MULTICAST;
-               req->rx_mask |= VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST;
-               req->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST;
-               break;
-       case BNX2X_RX_MODE_PROMISC:
-               req->rx_mask = VFPF_RX_MASK_ACCEPT_ALL_UNICAST;
-               req->rx_mask |= VFPF_RX_MASK_ACCEPT_ALL_MULTICAST;
-               req->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST;
-               break;
-       default:
-               BNX2X_ERR("BAD rx mode (%d)\n", mode);
-               return -EINVAL;
-       }
-
-       req->flags |= VFPF_SET_Q_FILTERS_RX_MASK_CHANGED;
-       req->vf_qid = 0;
-
-       /* add list termination tlv */
-       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
-                     sizeof(struct channel_list_end_tlv));
-
-       /* output tlvs list */
-       bnx2x_dp_tlv_list(bp, req);
-
-       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
-       if (rc)
-               BNX2X_ERR("Sending a message failed: %d\n", rc);
-
-       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
-               BNX2X_ERR("Set Rx mode failed: %d\n", resp->hdr.status);
-               return -EINVAL;
-       }
-
-       return rc;
-}
index ddd5106ad2f9c5d8349dd89250dea3d28a944735..caf1aef651eb0bd38081887b68315597c2a5dc16 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_mfw_req.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2012 Broadcom Corporation
+ * Copyright (c) 2012-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a01596561d68009a9e391f0c1082fad4ba0a4f32..791eb2d530111dd7e5fa8aa5c88adadf5e91ddb9 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_reg.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 /* [R 32] Interrupt register #0 read */
 #define NIG_REG_NIG_INT_STS_0                                   0x103b0
 #define NIG_REG_NIG_INT_STS_1                                   0x103c0
+/* [RC 32] Interrupt register #0 read clear */
+#define NIG_REG_NIG_INT_STS_CLR_0                               0x103b4
 /* [R 32] Legacy E1 and E1H location for parity error mask register. */
 #define NIG_REG_NIG_PRTY_MASK                                   0x103dc
 /* [RW 32] Parity mask register #0 read/write */
 #define HW_LOCK_RESOURCE_SPIO                                   2
 #define AEU_INPUTS_ATTN_BITS_ATC_HW_INTERRUPT                   (0x1<<4)
 #define AEU_INPUTS_ATTN_BITS_ATC_PARITY_ERROR                   (0x1<<5)
+#define AEU_INPUTS_ATTN_BITS_BRB_HW_INTERRUPT                   (0x1<<19)
 #define AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR                   (0x1<<18)
 #define AEU_INPUTS_ATTN_BITS_CCM_HW_INTERRUPT                   (0x1<<31)
 #define AEU_INPUTS_ATTN_BITS_CCM_PARITY_ERROR                   (0x1<<30)
index 147933a3f466bdcdad1d267bcb2ff38e34d6fb90..7306416bc90d29af91461440ff19da77f07429e7 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_sp.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2011-2012 Broadcom Corporation
+ * Copyright (c) 2011-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -325,7 +325,7 @@ static inline int bnx2x_state_wait(struct bnx2x *bp, int state,
                        return 0;
                }
 
-               usleep_range(1000, 1000);
+               usleep_range(1000, 2000);
 
                if (bp->panic)
                        return -EIO;
@@ -707,7 +707,8 @@ static inline void bnx2x_vlan_mac_set_cmd_hdr_e2(struct bnx2x *bp,
 static inline void bnx2x_vlan_mac_set_rdata_hdr_e2(u32 cid, int type,
                                struct eth_classify_header *hdr, int rule_cnt)
 {
-       hdr->echo = (cid & BNX2X_SWCID_MASK) | (type << BNX2X_SWCID_SHIFT);
+       hdr->echo = cpu_to_le32((cid & BNX2X_SWCID_MASK) |
+                               (type << BNX2X_SWCID_SHIFT));
        hdr->rule_cnt = (u8)rule_cnt;
 }
 
@@ -813,8 +814,9 @@ static inline void bnx2x_vlan_mac_set_rdata_hdr_e1x(struct bnx2x *bp,
 
        hdr->length = 1;
        hdr->offset = (u8)cam_offset;
-       hdr->client_id = 0xff;
-       hdr->echo = ((r->cid & BNX2X_SWCID_MASK) | (type << BNX2X_SWCID_SHIFT));
+       hdr->client_id = cpu_to_le16(0xff);
+       hdr->echo = cpu_to_le32((r->cid & BNX2X_SWCID_MASK) |
+                               (type << BNX2X_SWCID_SHIFT));
 }
 
 static inline void bnx2x_vlan_mac_set_cfg_entry_e1x(struct bnx2x *bp,
@@ -903,7 +905,7 @@ static void bnx2x_set_one_vlan_e2(struct bnx2x *bp,
                (struct eth_classify_rules_ramrod_data *)(raw->rdata);
        int rule_cnt = rule_idx + 1;
        union eth_classify_rule_cmd *rule_entry = &data->rules[rule_idx];
-       int cmd = elem->cmd_data.vlan_mac.cmd;
+       enum bnx2x_vlan_mac_cmd cmd = elem->cmd_data.vlan_mac.cmd;
        bool add = (cmd == BNX2X_VLAN_MAC_ADD) ? true : false;
        u16 vlan = elem->cmd_data.vlan_mac.u.vlan.vlan;
 
@@ -953,7 +955,7 @@ static void bnx2x_set_one_vlan_mac_e2(struct bnx2x *bp,
                (struct eth_classify_rules_ramrod_data *)(raw->rdata);
        int rule_cnt = rule_idx + 1;
        union eth_classify_rule_cmd *rule_entry = &data->rules[rule_idx];
-       int cmd = elem->cmd_data.vlan_mac.cmd;
+       enum bnx2x_vlan_mac_cmd cmd = elem->cmd_data.vlan_mac.cmd;
        bool add = (cmd == BNX2X_VLAN_MAC_ADD) ? true : false;
        u16 vlan = elem->cmd_data.vlan_mac.u.vlan_mac.vlan;
        u8 *mac = elem->cmd_data.vlan_mac.u.vlan_mac.mac;
@@ -1407,7 +1409,7 @@ static int bnx2x_wait_vlan_mac(struct bnx2x *bp,
 
                /* Wait until there are no pending commands */
                if (!bnx2x_exe_queue_empty(exeq))
-                       usleep_range(1000, 1000);
+                       usleep_range(1000, 2000);
                else
                        return 0;
        }
@@ -1442,7 +1444,7 @@ static int bnx2x_complete_vlan_mac(struct bnx2x *bp,
        if (cqe->message.error)
                return -EINVAL;
 
-       /* Run the next bulk of pending commands if requeted */
+       /* Run the next bulk of pending commands if requested */
        if (test_bit(RAMROD_CONT, ramrod_flags)) {
                rc = bnx2x_exe_queue_step(bp, &o->exe_queue, ramrod_flags);
                if (rc < 0)
@@ -1532,7 +1534,7 @@ static inline int bnx2x_vlan_mac_get_registry_elem(
        bool restore,
        struct bnx2x_vlan_mac_registry_elem **re)
 {
-       int cmd = elem->cmd_data.vlan_mac.cmd;
+       enum bnx2x_vlan_mac_cmd cmd = elem->cmd_data.vlan_mac.cmd;
        struct bnx2x_vlan_mac_registry_elem *reg_elem;
 
        /* Allocate a new registry element if needed. */
@@ -1591,7 +1593,7 @@ static int bnx2x_execute_vlan_mac(struct bnx2x *bp,
        bool restore = test_bit(RAMROD_RESTORE, ramrod_flags);
        bool drv_only = test_bit(RAMROD_DRV_CLR_ONLY, ramrod_flags);
        struct bnx2x_vlan_mac_registry_elem *reg_elem;
-       int cmd;
+       enum bnx2x_vlan_mac_cmd cmd;
 
        /*
         * If DRIVER_ONLY execution is requested, cleanup a registry
@@ -2103,7 +2105,7 @@ static inline void __storm_memset_mac_filters(struct bnx2x *bp,
 static int bnx2x_set_rx_mode_e1x(struct bnx2x *bp,
                                 struct bnx2x_rx_mode_ramrod_params *p)
 {
-       /* update the bp MAC filter structure  */
+       /* update the bp MAC filter structure */
        u32 mask = (1 << p->cl_id);
 
        struct tstorm_eth_mac_filter_config *mac_filters =
@@ -2166,7 +2168,7 @@ static int bnx2x_set_rx_mode_e1x(struct bnx2x *bp,
                mac_filters->unmatched_unicast & ~mask;
 
        DP(BNX2X_MSG_SP, "drop_ucast 0x%x\ndrop_mcast 0x%x\n accp_ucast 0x%x\n"
-                                        "accp_mcast 0x%x\naccp_bcast 0x%x\n",
+                        "accp_mcast 0x%x\naccp_bcast 0x%x\n",
           mac_filters->ucast_drop_all, mac_filters->mcast_drop_all,
           mac_filters->ucast_accept_all, mac_filters->mcast_accept_all,
           mac_filters->bcast_accept_all);
@@ -2186,12 +2188,12 @@ static inline void bnx2x_rx_mode_set_rdata_hdr_e2(u32 cid,
                                struct eth_classify_header *hdr,
                                u8 rule_cnt)
 {
-       hdr->echo = cid;
+       hdr->echo = cpu_to_le32(cid);
        hdr->rule_cnt = rule_cnt;
 }
 
 static inline void bnx2x_rx_mode_set_cmd_state_e2(struct bnx2x *bp,
-                               unsigned long accept_flags,
+                               unsigned long *accept_flags,
                                struct eth_filter_rules_cmd *cmd,
                                bool clear_accept_all)
 {
@@ -2201,33 +2203,33 @@ static inline void bnx2x_rx_mode_set_cmd_state_e2(struct bnx2x *bp,
        state = ETH_FILTER_RULES_CMD_UCAST_DROP_ALL |
                ETH_FILTER_RULES_CMD_MCAST_DROP_ALL;
 
-       if (accept_flags) {
-               if (test_bit(BNX2X_ACCEPT_UNICAST, &accept_flags))
-                       state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
+       if (test_bit(BNX2X_ACCEPT_UNICAST, accept_flags))
+               state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
 
-               if (test_bit(BNX2X_ACCEPT_MULTICAST, &accept_flags))
-                       state &= ~ETH_FILTER_RULES_CMD_MCAST_DROP_ALL;
+       if (test_bit(BNX2X_ACCEPT_MULTICAST, accept_flags))
+               state &= ~ETH_FILTER_RULES_CMD_MCAST_DROP_ALL;
 
-               if (test_bit(BNX2X_ACCEPT_ALL_UNICAST, &accept_flags)) {
-                       state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
-                       state |= ETH_FILTER_RULES_CMD_UCAST_ACCEPT_ALL;
-               }
+       if (test_bit(BNX2X_ACCEPT_ALL_UNICAST, accept_flags)) {
+               state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
+               state |= ETH_FILTER_RULES_CMD_UCAST_ACCEPT_ALL;
+       }
 
-               if (test_bit(BNX2X_ACCEPT_ALL_MULTICAST, &accept_flags)) {
-                       state |= ETH_FILTER_RULES_CMD_MCAST_ACCEPT_ALL;
-                       state &= ~ETH_FILTER_RULES_CMD_MCAST_DROP_ALL;
-               }
-               if (test_bit(BNX2X_ACCEPT_BROADCAST, &accept_flags))
-                       state |= ETH_FILTER_RULES_CMD_BCAST_ACCEPT_ALL;
+       if (test_bit(BNX2X_ACCEPT_ALL_MULTICAST, accept_flags)) {
+               state |= ETH_FILTER_RULES_CMD_MCAST_ACCEPT_ALL;
+               state &= ~ETH_FILTER_RULES_CMD_MCAST_DROP_ALL;
+       }
 
-               if (test_bit(BNX2X_ACCEPT_UNMATCHED, &accept_flags)) {
-                       state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
-                       state |= ETH_FILTER_RULES_CMD_UCAST_ACCEPT_UNMATCHED;
-               }
-               if (test_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags))
-                       state |= ETH_FILTER_RULES_CMD_ACCEPT_ANY_VLAN;
+       if (test_bit(BNX2X_ACCEPT_BROADCAST, accept_flags))
+               state |= ETH_FILTER_RULES_CMD_BCAST_ACCEPT_ALL;
+
+       if (test_bit(BNX2X_ACCEPT_UNMATCHED, accept_flags)) {
+               state &= ~ETH_FILTER_RULES_CMD_UCAST_DROP_ALL;
+               state |= ETH_FILTER_RULES_CMD_UCAST_ACCEPT_UNMATCHED;
        }
 
+       if (test_bit(BNX2X_ACCEPT_ANY_VLAN, accept_flags))
+               state |= ETH_FILTER_RULES_CMD_ACCEPT_ANY_VLAN;
+
        /* Clear ACCEPT_ALL_XXX flags for FCoE L2 Queue */
        if (clear_accept_all) {
                state &= ~ETH_FILTER_RULES_CMD_MCAST_ACCEPT_ALL;
@@ -2260,8 +2262,9 @@ static int bnx2x_set_rx_mode_e2(struct bnx2x *bp,
                data->rules[rule_idx].cmd_general_data =
                        ETH_FILTER_RULES_CMD_TX_CMD;
 
-               bnx2x_rx_mode_set_cmd_state_e2(bp, p->tx_accept_flags,
-                       &(data->rules[rule_idx++]), false);
+               bnx2x_rx_mode_set_cmd_state_e2(bp, &p->tx_accept_flags,
+                                              &(data->rules[rule_idx++]),
+                                              false);
        }
 
        /* Rx */
@@ -2272,8 +2275,9 @@ static int bnx2x_set_rx_mode_e2(struct bnx2x *bp,
                data->rules[rule_idx].cmd_general_data =
                        ETH_FILTER_RULES_CMD_RX_CMD;
 
-               bnx2x_rx_mode_set_cmd_state_e2(bp, p->rx_accept_flags,
-                       &(data->rules[rule_idx++]), false);
+               bnx2x_rx_mode_set_cmd_state_e2(bp, &p->rx_accept_flags,
+                                              &(data->rules[rule_idx++]),
+                                              false);
        }
 
 
@@ -2293,9 +2297,10 @@ static int bnx2x_set_rx_mode_e2(struct bnx2x *bp,
                        data->rules[rule_idx].cmd_general_data =
                                                ETH_FILTER_RULES_CMD_TX_CMD;
 
-                       bnx2x_rx_mode_set_cmd_state_e2(bp, p->tx_accept_flags,
-                                                    &(data->rules[rule_idx++]),
+                       bnx2x_rx_mode_set_cmd_state_e2(bp, &p->tx_accept_flags,
+                                                      &(data->rules[rule_idx]),
                                                       true);
+                       rule_idx++;
                }
 
                /* Rx */
@@ -2306,9 +2311,10 @@ static int bnx2x_set_rx_mode_e2(struct bnx2x *bp,
                        data->rules[rule_idx].cmd_general_data =
                                                ETH_FILTER_RULES_CMD_RX_CMD;
 
-                       bnx2x_rx_mode_set_cmd_state_e2(bp, p->rx_accept_flags,
-                                                    &(data->rules[rule_idx++]),
+                       bnx2x_rx_mode_set_cmd_state_e2(bp, &p->rx_accept_flags,
+                                                      &(data->rules[rule_idx]),
                                                       true);
+                       rule_idx++;
                }
        }
 
@@ -2429,7 +2435,7 @@ static int bnx2x_mcast_wait(struct bnx2x *bp,
 static int bnx2x_mcast_enqueue_cmd(struct bnx2x *bp,
                                   struct bnx2x_mcast_obj *o,
                                   struct bnx2x_mcast_ramrod_params *p,
-                                  int cmd)
+                                  enum bnx2x_mcast_cmd cmd)
 {
        int total_sz;
        struct bnx2x_pending_mcast_cmd *new_cmd;
@@ -2561,7 +2567,7 @@ static inline u8 bnx2x_mcast_get_rx_tx_flag(struct bnx2x_mcast_obj *o)
 static void bnx2x_mcast_set_one_rule_e2(struct bnx2x *bp,
                                        struct bnx2x_mcast_obj *o, int idx,
                                        union bnx2x_mcast_config_data *cfg_data,
-                                       int cmd)
+                                       enum bnx2x_mcast_cmd cmd)
 {
        struct bnx2x_raw_obj *r = &o->raw;
        struct eth_multicast_rules_ramrod_data *data =
@@ -2625,7 +2631,7 @@ static inline int bnx2x_mcast_handle_restore_cmd_e2(
        int *rdata_idx)
 {
        int cur_bin, cnt = *rdata_idx;
-       union bnx2x_mcast_config_data cfg_data = {0};
+       union bnx2x_mcast_config_data cfg_data = {NULL};
 
        /* go through the registry and configure the bins from it */
        for (cur_bin = bnx2x_mcast_get_next_bin(o, start_bin); cur_bin >= 0;
@@ -2657,7 +2663,7 @@ static inline void bnx2x_mcast_hdl_pending_add_e2(struct bnx2x *bp,
 {
        struct bnx2x_mcast_mac_elem *pmac_pos, *pmac_pos_n;
        int cnt = *line_idx;
-       union bnx2x_mcast_config_data cfg_data = {0};
+       union bnx2x_mcast_config_data cfg_data = {NULL};
 
        list_for_each_entry_safe(pmac_pos, pmac_pos_n, &cmd_pos->data.macs_head,
                                 link) {
@@ -2780,7 +2786,7 @@ static inline void bnx2x_mcast_hdl_add(struct bnx2x *bp,
        int *line_idx)
 {
        struct bnx2x_mcast_list_elem *mlist_pos;
-       union bnx2x_mcast_config_data cfg_data = {0};
+       union bnx2x_mcast_config_data cfg_data = {NULL};
        int cnt = *line_idx;
 
        list_for_each_entry(mlist_pos, &p->mcast_list, link) {
@@ -2790,7 +2796,7 @@ static inline void bnx2x_mcast_hdl_add(struct bnx2x *bp,
                cnt++;
 
                DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC\n",
-                                mlist_pos->mac);
+                  mlist_pos->mac);
        }
 
        *line_idx = cnt;
@@ -2827,7 +2833,8 @@ static inline void bnx2x_mcast_hdl_del(struct bnx2x *bp,
  * Returns number of lines filled in the ramrod data in total.
  */
 static inline int bnx2x_mcast_handle_current_cmd(struct bnx2x *bp,
-                       struct bnx2x_mcast_ramrod_params *p, int cmd,
+                       struct bnx2x_mcast_ramrod_params *p,
+                       enum bnx2x_mcast_cmd cmd,
                        int start_cnt)
 {
        struct bnx2x_mcast_obj *o = p->mcast_obj;
@@ -2861,7 +2868,7 @@ static inline int bnx2x_mcast_handle_current_cmd(struct bnx2x *bp,
 
 static int bnx2x_mcast_validate_e2(struct bnx2x *bp,
                                   struct bnx2x_mcast_ramrod_params *p,
-                                  int cmd)
+                                  enum bnx2x_mcast_cmd cmd)
 {
        struct bnx2x_mcast_obj *o = p->mcast_obj;
        int reg_sz = o->get_registry_size(o);
@@ -2930,8 +2937,9 @@ static inline void bnx2x_mcast_set_rdata_hdr_e2(struct bnx2x *bp,
        struct eth_multicast_rules_ramrod_data *data =
                (struct eth_multicast_rules_ramrod_data *)(r->rdata);
 
-       data->header.echo = ((r->cid & BNX2X_SWCID_MASK) |
-                         (BNX2X_FILTER_MCAST_PENDING << BNX2X_SWCID_SHIFT));
+       data->header.echo = cpu_to_le32((r->cid & BNX2X_SWCID_MASK) |
+                                       (BNX2X_FILTER_MCAST_PENDING <<
+                                        BNX2X_SWCID_SHIFT));
        data->header.rule_cnt = len;
 }
 
@@ -2965,7 +2973,7 @@ static inline int bnx2x_mcast_refresh_registry_e2(struct bnx2x *bp,
 
 static int bnx2x_mcast_setup_e2(struct bnx2x *bp,
                                struct bnx2x_mcast_ramrod_params *p,
-                               int cmd)
+                               enum bnx2x_mcast_cmd cmd)
 {
        struct bnx2x_raw_obj *raw = &p->mcast_obj->raw;
        struct bnx2x_mcast_obj *o = p->mcast_obj;
@@ -3051,7 +3059,7 @@ static int bnx2x_mcast_setup_e2(struct bnx2x *bp,
 
 static int bnx2x_mcast_validate_e1h(struct bnx2x *bp,
                                    struct bnx2x_mcast_ramrod_params *p,
-                                   int cmd)
+                                   enum bnx2x_mcast_cmd cmd)
 {
        /* Mark, that there is a work to do */
        if ((cmd == BNX2X_MCAST_CMD_DEL) || (cmd == BNX2X_MCAST_CMD_RESTORE))
@@ -3085,7 +3093,7 @@ static inline void bnx2x_mcast_hdl_add_e1h(struct bnx2x *bp,
                BNX2X_57711_SET_MC_FILTER(mc_filter, bit);
 
                DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC, bin %d\n",
-                                mlist_pos->mac, bit);
+                  mlist_pos->mac, bit);
 
                /* bookkeeping... */
                BIT_VEC64_SET_BIT(o->registry.aprox_match.vec,
@@ -3113,7 +3121,7 @@ static inline void bnx2x_mcast_hdl_restore_e1h(struct bnx2x *bp,
  */
 static int bnx2x_mcast_setup_e1h(struct bnx2x *bp,
                                 struct bnx2x_mcast_ramrod_params *p,
-                                int cmd)
+                                enum bnx2x_mcast_cmd cmd)
 {
        int i;
        struct bnx2x_mcast_obj *o = p->mcast_obj;
@@ -3167,7 +3175,7 @@ static int bnx2x_mcast_setup_e1h(struct bnx2x *bp,
 
 static int bnx2x_mcast_validate_e1(struct bnx2x *bp,
                                   struct bnx2x_mcast_ramrod_params *p,
-                                  int cmd)
+                                  enum bnx2x_mcast_cmd cmd)
 {
        struct bnx2x_mcast_obj *o = p->mcast_obj;
        int reg_sz = o->get_registry_size(o);
@@ -3240,7 +3248,7 @@ static void bnx2x_mcast_revert_e1(struct bnx2x *bp,
 static void bnx2x_mcast_set_one_rule_e1(struct bnx2x *bp,
                                        struct bnx2x_mcast_obj *o, int idx,
                                        union bnx2x_mcast_config_data *cfg_data,
-                                       int cmd)
+                                       enum bnx2x_mcast_cmd cmd)
 {
        struct bnx2x_raw_obj *r = &o->raw;
        struct mac_configuration_cmd *data =
@@ -3284,9 +3292,10 @@ static inline void bnx2x_mcast_set_rdata_hdr_e1(struct bnx2x *bp,
                     BNX2X_MAX_MULTICAST*(1 + r->func_id));
 
        data->hdr.offset = offset;
-       data->hdr.client_id = 0xff;
-       data->hdr.echo = ((r->cid & BNX2X_SWCID_MASK) |
-                         (BNX2X_FILTER_MCAST_PENDING << BNX2X_SWCID_SHIFT));
+       data->hdr.client_id = cpu_to_le16(0xff);
+       data->hdr.echo = cpu_to_le32((r->cid & BNX2X_SWCID_MASK) |
+                                    (BNX2X_FILTER_MCAST_PENDING <<
+                                     BNX2X_SWCID_SHIFT));
        data->hdr.length = len;
 }
 
@@ -3309,7 +3318,7 @@ static inline int bnx2x_mcast_handle_restore_cmd_e1(
 {
        struct bnx2x_mcast_mac_elem *elem;
        int i = 0;
-       union bnx2x_mcast_config_data cfg_data = {0};
+       union bnx2x_mcast_config_data cfg_data = {NULL};
 
        /* go through the registry and configure the MACs from it. */
        list_for_each_entry(elem, &o->registry.exact_match.macs, link) {
@@ -3319,7 +3328,7 @@ static inline int bnx2x_mcast_handle_restore_cmd_e1(
                i++;
 
                  DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC\n",
-                                  cfg_data.mac);
+                    cfg_data.mac);
        }
 
        *rdata_idx = i;
@@ -3334,7 +3343,7 @@ static inline int bnx2x_mcast_handle_pending_cmds_e1(
        struct bnx2x_pending_mcast_cmd *cmd_pos;
        struct bnx2x_mcast_mac_elem *pmac_pos;
        struct bnx2x_mcast_obj *o = p->mcast_obj;
-       union bnx2x_mcast_config_data cfg_data = {0};
+       union bnx2x_mcast_config_data cfg_data = {NULL};
        int cnt = 0;
 
 
@@ -3355,7 +3364,7 @@ static inline int bnx2x_mcast_handle_pending_cmds_e1(
                        cnt++;
 
                        DP(BNX2X_MSG_SP, "About to configure %pM mcast MAC\n",
-                                        pmac_pos->mac);
+                          pmac_pos->mac);
                }
                break;
 
@@ -3458,7 +3467,7 @@ static inline int bnx2x_mcast_refresh_registry_e1(struct bnx2x *bp,
 
 static int bnx2x_mcast_setup_e1(struct bnx2x *bp,
                                struct bnx2x_mcast_ramrod_params *p,
-                               int cmd)
+                               enum bnx2x_mcast_cmd cmd)
 {
        struct bnx2x_mcast_obj *o = p->mcast_obj;
        struct bnx2x_raw_obj *raw = &o->raw;
@@ -3562,7 +3571,7 @@ static void bnx2x_mcast_set_registry_size_aprox(struct bnx2x_mcast_obj *o,
 
 int bnx2x_config_mcast(struct bnx2x *bp,
                       struct bnx2x_mcast_ramrod_params *p,
-                      int cmd)
+                      enum bnx2x_mcast_cmd cmd)
 {
        struct bnx2x_mcast_obj *o = p->mcast_obj;
        struct bnx2x_raw_obj *r = &o->raw;
@@ -4085,8 +4094,8 @@ static int bnx2x_setup_rss(struct bnx2x *bp,
        DP(BNX2X_MSG_SP, "Configuring RSS\n");
 
        /* Set an echo field */
-       data->echo = (r->cid & BNX2X_SWCID_MASK) |
-                    (r->state << BNX2X_SWCID_SHIFT);
+       data->echo = cpu_to_le32((r->cid & BNX2X_SWCID_MASK) |
+                                (r->state << BNX2X_SWCID_SHIFT));
 
        /* RSS mode */
        if (test_bit(BNX2X_RSS_MODE_DISABLED, &p->rss_flags))
@@ -4237,11 +4246,16 @@ int bnx2x_queue_state_change(struct bnx2x *bp,
        unsigned long *pending = &o->pending;
 
        /* Check that the requested transition is legal */
-       if (o->check_transition(bp, o, params))
+       rc = o->check_transition(bp, o, params);
+       if (rc) {
+               BNX2X_ERR("check transition returned an error. rc %d\n", rc);
                return -EINVAL;
+       }
 
        /* Set "pending" bit */
+       DP(BNX2X_MSG_SP, "pending bit was=%lx\n", o->pending);
        pending_bit = o->set_pending(o, params);
+       DP(BNX2X_MSG_SP, "pending bit now=%lx\n", o->pending);
 
        /* Don't send a command if only driver cleanup was requested */
        if (test_bit(RAMROD_DRV_CLR_ONLY, &params->ramrod_flags))
@@ -5025,8 +5039,11 @@ static int bnx2x_queue_chk_transition(struct bnx2x *bp,
         * Don't allow a next state transition if we are in the middle of
         * the previous one.
         */
-       if (o->pending)
+       if (o->pending) {
+               BNX2X_ERR("Blocking transition since pending was %lx\n",
+                         o->pending);
                return -EBUSY;
+       }
 
        switch (state) {
        case BNX2X_Q_STATE_RESET:
@@ -5652,9 +5669,9 @@ static inline int bnx2x_func_send_start(struct bnx2x *bp,
        memset(rdata, 0, sizeof(*rdata));
 
        /* Fill the ramrod data with provided parameters */
-       rdata->function_mode = (u8)start_params->mf_mode;
-       rdata->sd_vlan_tag   = cpu_to_le16(start_params->sd_vlan_tag);
-       rdata->path_id       = BP_PATH(bp);
+       rdata->function_mode    = (u8)start_params->mf_mode;
+       rdata->sd_vlan_tag      = cpu_to_le16(start_params->sd_vlan_tag);
+       rdata->path_id          = BP_PATH(bp);
        rdata->network_cos_mode = start_params->network_cos_mode;
 
        /*
@@ -5737,21 +5754,20 @@ inline int bnx2x_func_send_afex_viflists(struct bnx2x *bp,
        struct bnx2x_func_sp_obj *o = params->f_obj;
        struct afex_vif_list_ramrod_data *rdata =
                (struct afex_vif_list_ramrod_data *)o->afex_rdata;
-       struct bnx2x_func_afex_viflists_params *afex_viflist_params =
+       struct bnx2x_func_afex_viflists_params *afex_vif_params =
                &params->params.afex_viflists;
        u64 *p_rdata = (u64 *)rdata;
 
        memset(rdata, 0, sizeof(*rdata));
 
        /* Fill the ramrod data with provided parameters */
-       rdata->vif_list_index = afex_viflist_params->vif_list_index;
-       rdata->func_bit_map = afex_viflist_params->func_bit_map;
-       rdata->afex_vif_list_command =
-               afex_viflist_params->afex_vif_list_command;
-       rdata->func_to_clear = afex_viflist_params->func_to_clear;
+       rdata->vif_list_index = cpu_to_le16(afex_vif_params->vif_list_index);
+       rdata->func_bit_map          = afex_vif_params->func_bit_map;
+       rdata->afex_vif_list_command = afex_vif_params->afex_vif_list_command;
+       rdata->func_to_clear         = afex_vif_params->func_to_clear;
 
        /* send in echo type of sub command */
-       rdata->echo = afex_viflist_params->afex_vif_list_command;
+       rdata->echo = afex_vif_params->afex_vif_list_command;
 
        /*  No need for an explicit memory barrier here as long we would
         *  need to ensure the ordering of writing to the SPQ element
index b30467856899c7264f579b4ef5deafd95a7613a7..ff907609b9fc5cef7c975b2a28453d562e09fc02 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_sp.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2011-2012 Broadcom Corporation
+ * Copyright (c) 2011-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -54,7 +54,7 @@ typedef enum {
        BNX2X_OBJ_TYPE_RX_TX,
 } bnx2x_obj_type;
 
-/* Filtering states */
+/* Public slow path states */
 enum {
        BNX2X_FILTER_MAC_PENDING,
        BNX2X_FILTER_VLAN_PENDING,
@@ -524,7 +524,7 @@ struct bnx2x_mcast_ramrod_params {
        int mcast_list_len;
 };
 
-enum {
+enum bnx2x_mcast_cmd {
        BNX2X_MCAST_CMD_ADD,
        BNX2X_MCAST_CMD_CONT,
        BNX2X_MCAST_CMD_DEL,
@@ -573,7 +573,8 @@ struct bnx2x_mcast_obj {
         * @param cmd command to execute (BNX2X_MCAST_CMD_X, see above)
         */
        int (*config_mcast)(struct bnx2x *bp,
-                               struct bnx2x_mcast_ramrod_params *p, int cmd);
+                           struct bnx2x_mcast_ramrod_params *p,
+                           enum bnx2x_mcast_cmd cmd);
 
        /**
         * Fills the ramrod data during the RESTORE flow.
@@ -590,11 +591,13 @@ struct bnx2x_mcast_obj {
                           int start_bin, int *rdata_idx);
 
        int (*enqueue_cmd)(struct bnx2x *bp, struct bnx2x_mcast_obj *o,
-                          struct bnx2x_mcast_ramrod_params *p, int cmd);
+                          struct bnx2x_mcast_ramrod_params *p,
+                          enum bnx2x_mcast_cmd cmd);
 
        void (*set_one_rule)(struct bnx2x *bp,
                             struct bnx2x_mcast_obj *o, int idx,
-                            union bnx2x_mcast_config_data *cfg_data, int cmd);
+                            union bnx2x_mcast_config_data *cfg_data,
+                            enum bnx2x_mcast_cmd cmd);
 
        /** Checks if there are more mcast MACs to be set or a previous
         *  command is still pending.
@@ -617,7 +620,8 @@ struct bnx2x_mcast_obj {
         * feasible.
         */
        int (*validate)(struct bnx2x *bp,
-                       struct bnx2x_mcast_ramrod_params *p, int cmd);
+                       struct bnx2x_mcast_ramrod_params *p,
+                       enum bnx2x_mcast_cmd cmd);
 
        /**
         * Restore the values of internal counters in case of a failure.
@@ -1347,7 +1351,8 @@ void bnx2x_init_mcast_obj(struct bnx2x *bp,
  *         completions.
  */
 int bnx2x_config_mcast(struct bnx2x *bp,
-                      struct bnx2x_mcast_ramrod_params *p, int cmd);
+                      struct bnx2x_mcast_ramrod_params *p,
+                      enum bnx2x_mcast_cmd cmd);
 
 /****************** CREDIT POOL ****************/
 void bnx2x_init_mac_credit_pool(struct bnx2x *bp,
index 71fcef0d4071d27690d8bc605da8ab5bcf752c3f..6adfa2093581ef611960e0c9fe364b69726d6de5 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_sriov.c: Broadcom Everest network driver.
  *
- * Copyright 2009-2012 Broadcom Corporation
+ * Copyright 2009-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -20,7 +20,7 @@
 #include "bnx2x.h"
 #include "bnx2x_init.h"
 #include "bnx2x_cmn.h"
-#include "bnx2x_sriov.h"
+#include <linux/crc32.h>
 
 /* General service functions */
 static void storm_memset_vf_to_pf(struct bnx2x *bp, u16 abs_fid,
@@ -463,8 +463,7 @@ static int bnx2x_vfop_qdtor_cmd(struct bnx2x *bp,
                return bnx2x_vfop_transition(bp, vf, bnx2x_vfop_qdtor,
                                             cmd->block);
        }
-       DP(BNX2X_MSG_IOV, "VF[%d] failed to add a vfop. rc %d\n",
-          vf->abs_vfid, vfop->rc);
+       DP(BNX2X_MSG_IOV, "VF[%d] failed to add a vfop.\n", vf->abs_vfid);
        return -ENOMEM;
 }
 
@@ -1334,25 +1333,6 @@ int bnx2x_vfop_qdown_cmd(struct bnx2x *bp,
  * for calling pretend prior to calling these routines
  */
 
-/* called only on E1H or E2.
- * When pretending to be PF, the pretend value is the function number 0...7
- * When pretending to be VF, the pretend val is the PF-num:VF-valid:ABS-VFID
- * combination
- */
-int bnx2x_pretend_func(struct bnx2x *bp, u16 pretend_func_val)
-{
-       u32 pretend_reg;
-
-       if (CHIP_IS_E1H(bp) && pretend_func_val > E1H_FUNC_MAX)
-               return -1;
-
-       /* get my own pretend register */
-       pretend_reg = bnx2x_get_pretend_reg(bp);
-       REG_WR(bp, pretend_reg, pretend_func_val);
-       REG_RD(bp, pretend_reg);
-       return 0;
-}
-
 /* internal vf enable - until vf is enabled internally all transactions
  * are blocked. this routine should always be called last with pretend.
  */
@@ -1800,7 +1780,7 @@ static void bnx2x_vf_set_bars(struct bnx2x *bp, struct bnx2x_virtf *vf)
                u64 start = pci_resource_start(dev, PCI_IOV_RESOURCES + i);
                u32 size = pci_resource_len(dev, PCI_IOV_RESOURCES + i);
 
-               do_div(size, iov->total);
+               size /= iov->total;
                vf->bars[n].bar = start + size * vf->abs_vfid;
                vf->bars[n].size = size;
        }
@@ -3031,3 +3011,188 @@ void bnx2x_unlock_vf_pf_channel(struct bnx2x *bp, struct bnx2x_virtf *vf,
        /* record the locking op */
        vf->op_current = CHANNEL_TLV_NONE;
 }
+
+void bnx2x_enable_sriov(struct bnx2x *bp)
+{
+       int rc = 0;
+
+       /* disbale sriov in case it is still enabled */
+       pci_disable_sriov(bp->pdev);
+       DP(BNX2X_MSG_IOV, "sriov disabled\n");
+
+       /* enable sriov */
+       DP(BNX2X_MSG_IOV, "vf num (%d)\n", (bp->vfdb->sriov.nr_virtfn));
+       rc = pci_enable_sriov(bp->pdev, (bp->vfdb->sriov.nr_virtfn));
+       if (rc)
+               BNX2X_ERR("pci_enable_sriov failed with %d\n", rc);
+       else
+               DP(BNX2X_MSG_IOV, "sriov enabled\n");
+}
+
+/* New mac for VF. Consider these cases:
+ * 1. VF hasn't been acquired yet - save the mac in local bulletin board and
+ *    supply at acquire.
+ * 2. VF has already been acquired but has not yet initialized - store in local
+ *    bulletin board. mac will be posted on VF bulletin board after VF init. VF
+ *    will configure this mac when it is ready.
+ * 3. VF has already initialized but has not yet setup a queue - post the new
+ *    mac on VF's bulletin board right now. VF will configure this mac when it
+ *    is ready.
+ * 4. VF has already set a queue - delete any macs already configured for this
+ *    queue and manually config the new mac.
+ * In any event, once this function has been called refuse any attempts by the
+ * VF to configure any mac for itself except for this mac. In case of a race
+ * where the VF fails to see the new post on its bulletin board before sending a
+ * mac configuration request, the PF will simply fail the request and VF can try
+ * again after consulting its bulletin board
+ */
+int bnx2x_set_vf_mac(struct net_device *dev, int queue, u8 *mac)
+{
+       struct bnx2x *bp = netdev_priv(dev);
+       int rc, q_logical_state, vfidx = queue;
+       struct bnx2x_virtf *vf = BP_VF(bp, vfidx);
+       struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx);
+
+       /* if SRIOV is disabled there is nothing to do (and somewhere, someone
+        * has erred).
+        */
+       if (!IS_SRIOV(bp)) {
+               BNX2X_ERR("bnx2x_set_vf_mac called though sriov is disabled\n");
+               return -EINVAL;
+       }
+
+       if (!is_valid_ether_addr(mac)) {
+               BNX2X_ERR("mac address invalid\n");
+               return -EINVAL;
+       }
+
+       /* update PF's copy of the VF's bulletin. will no longer accept mac
+        * configuration requests from vf unless match this mac
+        */
+       bulletin->valid_bitmap |= 1 << MAC_ADDR_VALID;
+       memcpy(bulletin->mac, mac, ETH_ALEN);
+
+       /* Post update on VF's bulletin board */
+       rc = bnx2x_post_vf_bulletin(bp, vfidx);
+       if (rc) {
+               BNX2X_ERR("failed to update VF[%d] bulletin\n", vfidx);
+               return rc;
+       }
+
+       /* is vf initialized and queue set up? */
+       q_logical_state =
+               bnx2x_get_q_logical_state(bp, &bnx2x_vfq(vf, 0, sp_obj));
+       if (vf->state == VF_ENABLED &&
+           q_logical_state == BNX2X_Q_LOGICAL_STATE_ACTIVE) {
+               /* configure the mac in device on this vf's queue */
+               unsigned long flags = 0;
+               struct bnx2x_vlan_mac_obj *mac_obj = &bnx2x_vfq(vf, 0, mac_obj);
+
+               /* must lock vfpf channel to protect against vf flows */
+               bnx2x_lock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_MAC);
+
+               /* remove existing eth macs */
+               rc = bnx2x_del_all_macs(bp, mac_obj, BNX2X_ETH_MAC, true);
+               if (rc) {
+                       BNX2X_ERR("failed to delete eth macs\n");
+                       return -EINVAL;
+               }
+
+               /* remove existing uc list macs */
+               rc = bnx2x_del_all_macs(bp, mac_obj, BNX2X_UC_LIST_MAC, true);
+               if (rc) {
+                       BNX2X_ERR("failed to delete uc_list macs\n");
+                       return -EINVAL;
+               }
+
+               /* configure the new mac to device */
+               __set_bit(RAMROD_COMP_WAIT, &flags);
+               bnx2x_set_mac_one(bp, (u8 *)&bulletin->mac, mac_obj, true,
+                                 BNX2X_ETH_MAC, &flags);
+
+               bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_MAC);
+       }
+
+       return rc;
+}
+
+/* crc is the first field in the bulletin board. compute the crc over the
+ * entire bulletin board excluding the crc field itself
+ */
+u32 bnx2x_crc_vf_bulletin(struct bnx2x *bp,
+                         struct pf_vf_bulletin_content *bulletin)
+{
+       return crc32(BULLETIN_CRC_SEED,
+                ((u8 *)bulletin) + sizeof(bulletin->crc),
+                bulletin->length - sizeof(bulletin->crc));
+}
+
+/* Check for new posts on the bulletin board */
+enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp)
+{
+       struct pf_vf_bulletin_content bulletin = bp->pf2vf_bulletin->content;
+       int attempts;
+
+       /* bulletin board hasn't changed since last sample */
+       if (bp->old_bulletin.version == bulletin.version)
+               return PFVF_BULLETIN_UNCHANGED;
+
+       /* validate crc of new bulletin board */
+       if (bp->old_bulletin.version != bp->pf2vf_bulletin->content.version) {
+               /* sampling structure in mid post may result with corrupted data
+                * validate crc to ensure coherency.
+                */
+               for (attempts = 0; attempts < BULLETIN_ATTEMPTS; attempts++) {
+                       bulletin = bp->pf2vf_bulletin->content;
+                       if (bulletin.crc == bnx2x_crc_vf_bulletin(bp,
+                                                                 &bulletin))
+                               break;
+                       BNX2X_ERR("bad crc on bulletin board. contained %x computed %x\n",
+                                 bulletin.crc,
+                                 bnx2x_crc_vf_bulletin(bp, &bulletin));
+               }
+               if (attempts >= BULLETIN_ATTEMPTS) {
+                       BNX2X_ERR("pf to vf bulletin board crc was wrong %d consecutive times. Aborting\n",
+                                 attempts);
+                       return PFVF_BULLETIN_CRC_ERR;
+               }
+       }
+
+       /* the mac address in bulletin board is valid and is new */
+       if (bulletin.valid_bitmap & 1 << MAC_ADDR_VALID &&
+           memcmp(bulletin.mac, bp->old_bulletin.mac, ETH_ALEN)) {
+               /* update new mac to net device */
+               memcpy(bp->dev->dev_addr, bulletin.mac, ETH_ALEN);
+       }
+
+       /* copy new bulletin board to bp */
+       bp->old_bulletin = bulletin;
+
+       return PFVF_BULLETIN_UPDATED;
+}
+
+void bnx2x_vf_map_doorbells(struct bnx2x *bp)
+{
+       /* vf doorbells are embedded within the regview */
+       bp->doorbells = bp->regview + PXP_VF_ADDR_DB_START;
+}
+
+int bnx2x_vf_pci_alloc(struct bnx2x *bp)
+{
+       /* allocate vf2pf mailbox for vf to pf channel */
+       BNX2X_PCI_ALLOC(bp->vf2pf_mbox, &bp->vf2pf_mbox_mapping,
+                       sizeof(struct bnx2x_vf_mbx_msg));
+
+       /* allocate pf 2 vf bulletin board */
+       BNX2X_PCI_ALLOC(bp->pf2vf_bulletin, &bp->pf2vf_bulletin_mapping,
+                       sizeof(union pf_vf_bulletin));
+
+       return 0;
+
+alloc_mem_err:
+       BNX2X_PCI_FREE(bp->vf2pf_mbox, bp->vf2pf_mbox_mapping,
+                      sizeof(struct bnx2x_vf_mbx_msg));
+       BNX2X_PCI_FREE(bp->vf2pf_mbox, bp->vf2pf_mbox_mapping,
+                      sizeof(union pf_vf_bulletin));
+       return -ENOMEM;
+}
index aab2a0525c261a654cd5b9924909289095338874..b4050173add939a1ebbf164253b14b6b7e019947 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_sriov.h: Broadcom Everest network driver.
  *
- * Copyright 2009-2012 Broadcom Corporation
+ * Copyright 2009-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
 #define BNX2X_SRIOV_H
 
 #include "bnx2x_vfpf.h"
-#include "bnx2x_cmn.h"
+#include "bnx2x.h"
+
+enum sample_bulletin_result {
+          PFVF_BULLETIN_UNCHANGED,
+          PFVF_BULLETIN_UPDATED,
+          PFVF_BULLETIN_CRC_ERR
+};
+
+#ifdef CONFIG_BNX2X_SRIOV
 
 /* The bnx2x device structure holds vfdb structure described below.
  * The VF array is indexed by the relative vfid.
@@ -712,12 +720,90 @@ u32 bnx2x_crc_vf_bulletin(struct bnx2x *bp,
                          struct pf_vf_bulletin_content *bulletin);
 int bnx2x_post_vf_bulletin(struct bnx2x *bp, int vf);
 
-enum sample_bulletin_result {
-          PFVF_BULLETIN_UNCHANGED,
-          PFVF_BULLETIN_UPDATED,
-          PFVF_BULLETIN_CRC_ERR
-};
 
 enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp);
 
+/* VF side vfpf channel functions */
+int bnx2x_vfpf_acquire(struct bnx2x *bp, u8 tx_count, u8 rx_count);
+int bnx2x_vfpf_release(struct bnx2x *bp);
+int bnx2x_vfpf_release(struct bnx2x *bp);
+int bnx2x_vfpf_init(struct bnx2x *bp);
+void bnx2x_vfpf_close_vf(struct bnx2x *bp);
+int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx);
+int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx);
+int bnx2x_vfpf_set_mac(struct bnx2x *bp);
+int bnx2x_vfpf_set_mcast(struct net_device *dev);
+int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp);
+
+static inline void bnx2x_vf_fill_fw_str(struct bnx2x *bp, char *buf,
+                                       size_t buf_len)
+{
+       strlcpy(buf, bp->acquire_resp.pfdev_info.fw_ver, buf_len);
+}
+
+static inline int bnx2x_vf_ustorm_prods_offset(struct bnx2x *bp,
+                                              struct bnx2x_fastpath *fp)
+{
+       return PXP_VF_ADDR_USDM_QUEUES_START +
+               bp->acquire_resp.resc.hw_qid[fp->index] *
+               sizeof(struct ustorm_queue_zone_data);
+}
+
+enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp);
+void bnx2x_vf_map_doorbells(struct bnx2x *bp);
+int bnx2x_vf_pci_alloc(struct bnx2x *bp);
+void bnx2x_enable_sriov(struct bnx2x *bp);
+static inline int bnx2x_vf_headroom(struct bnx2x *bp)
+{
+       return bp->vfdb->sriov.nr_virtfn * BNX2X_CLIENTS_PER_VF;
+}
+
+#else /* CONFIG_BNX2X_SRIOV */
+
+static inline void bnx2x_iov_set_queue_sp_obj(struct bnx2x *bp, int vf_cid,
+                               struct bnx2x_queue_sp_obj **q_obj) {}
+static inline void bnx2x_iov_sp_event(struct bnx2x *bp, int vf_cid,
+                                     bool queue_work) {}
+static inline void bnx2x_vf_handle_flr_event(struct bnx2x *bp) {}
+static inline int bnx2x_iov_eq_sp_event(struct bnx2x *bp,
+                                       union event_ring_elem *elem) {return 1; }
+static inline void bnx2x_iov_sp_task(struct bnx2x *bp) {}
+static inline void bnx2x_vf_mbx(struct bnx2x *bp,
+                               struct vf_pf_event_data *vfpf_event) {}
+static inline int bnx2x_iov_init_ilt(struct bnx2x *bp, u16 line) {return line; }
+static inline void bnx2x_iov_init_dq(struct bnx2x *bp) {}
+static inline int bnx2x_iov_alloc_mem(struct bnx2x *bp) {return 0; }
+static inline void bnx2x_iov_free_mem(struct bnx2x *bp) {}
+static inline int bnx2x_iov_chip_cleanup(struct bnx2x *bp) {return 0; }
+static inline void bnx2x_iov_init_dmae(struct bnx2x *bp) {}
+static inline int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param,
+                                    int num_vfs_param) {return 0; }
+static inline void bnx2x_iov_remove_one(struct bnx2x *bp) {}
+static inline void bnx2x_enable_sriov(struct bnx2x *bp) {}
+static inline int bnx2x_vfpf_acquire(struct bnx2x *bp,
+                                    u8 tx_count, u8 rx_count) {return 0; }
+static inline int bnx2x_vfpf_release(struct bnx2x *bp) {return 0; }
+static inline int bnx2x_vfpf_init(struct bnx2x *bp) {return 0; }
+static inline void bnx2x_vfpf_close_vf(struct bnx2x *bp) {}
+static inline int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx) {return 0; }
+static inline int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx) {return 0; }
+static inline int bnx2x_vfpf_set_mac(struct bnx2x *bp) {return 0; }
+static inline int bnx2x_vfpf_set_mcast(struct net_device *dev) {return 0; }
+static inline int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp) {return 0; }
+static inline int bnx2x_iov_nic_init(struct bnx2x *bp) {return 0; }
+static inline int bnx2x_vf_headroom(struct bnx2x *bp) {return 0; }
+static inline void bnx2x_iov_adjust_stats_req(struct bnx2x *bp) {}
+static inline void bnx2x_vf_fill_fw_str(struct bnx2x *bp, char *buf,
+                                       size_t buf_len) {}
+static inline int bnx2x_vf_ustorm_prods_offset(struct bnx2x *bp,
+                                              struct bnx2x_fastpath *fp) {return 0; }
+static inline enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp)
+{
+       return PFVF_BULLETIN_UNCHANGED;
+}
+
+static inline int bnx2x_vf_map_doorbells(struct bnx2x *bp) {return 0; }
+static inline int bnx2x_vf_pci_alloc(struct bnx2x *bp) {return 0; }
+
+#endif /* CONFIG_BNX2X_SRIOV */
 #endif /* bnx2x_sriov.h */
index 93a8e7430c591f6b250e6e8edb8e04b7911e7f41..4397f8b76f2ea79e23bbe730329e488ded73f749 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_stats.c: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -212,7 +212,7 @@ static int bnx2x_stats_comp(struct bnx2x *bp)
                        break;
                }
                cnt--;
-               usleep_range(1000, 1000);
+               usleep_range(1000, 2000);
        }
        return 1;
 }
@@ -1010,8 +1010,8 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
                UPDATE_EXTEND_TSTAT(rcv_bcast_pkts,
                                        total_broadcast_packets_received);
                UPDATE_EXTEND_E_TSTAT(pkts_too_big_discard,
-                                     etherstatsoverrsizepkts);
-               UPDATE_EXTEND_E_TSTAT(no_buff_discard, no_buff_discard);
+                                     etherstatsoverrsizepkts, 32);
+               UPDATE_EXTEND_E_TSTAT(no_buff_discard, no_buff_discard, 16);
 
                SUB_EXTEND_USTAT(ucast_no_buff_pkts,
                                        total_unicast_packets_received);
@@ -1090,15 +1090,15 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
               estats->total_bytes_received_lo,
               estats->rx_stat_ifhcinbadoctets_lo);
 
-       ADD_64(estats->total_bytes_received_hi,
-              le32_to_cpu(tfunc->rcv_error_bytes.hi),
-              estats->total_bytes_received_lo,
-              le32_to_cpu(tfunc->rcv_error_bytes.lo));
+       ADD_64_LE(estats->total_bytes_received_hi,
+                 tfunc->rcv_error_bytes.hi,
+                 estats->total_bytes_received_lo,
+                 tfunc->rcv_error_bytes.lo);
 
-       ADD_64(estats->error_bytes_received_hi,
-              le32_to_cpu(tfunc->rcv_error_bytes.hi),
-              estats->error_bytes_received_lo,
-              le32_to_cpu(tfunc->rcv_error_bytes.lo));
+       ADD_64_LE(estats->error_bytes_received_hi,
+                 tfunc->rcv_error_bytes.hi,
+                 estats->error_bytes_received_lo,
+                 tfunc->rcv_error_bytes.lo);
 
        UPDATE_ESTAT(etherstatsoverrsizepkts, rx_stat_dot3statsframestoolong);
 
index b4d7b26c7fe78906be5998608c3b0d46b7e1df84..364e37ecbc5cc013573ab63f5e1125f1e8cd750e 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_stats.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -421,16 +421,19 @@ struct bnx2x_fw_port_stats_old {
                              new->s); \
        } while (0)
 
-#define UPDATE_EXTEND_TSTAT(s, t) \
+#define UPDATE_EXTEND_TSTAT_X(s, t, size) \
        do { \
-               diff = le32_to_cpu(tclient->s) - le32_to_cpu(old_tclient->s); \
+               diff = le##size##_to_cpu(tclient->s) - \
+                      le##size##_to_cpu(old_tclient->s); \
                old_tclient->s = tclient->s; \
                ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
        } while (0)
 
-#define UPDATE_EXTEND_E_TSTAT(s, t) \
+#define UPDATE_EXTEND_TSTAT(s, t) UPDATE_EXTEND_TSTAT_X(s, t, 32)
+
+#define UPDATE_EXTEND_E_TSTAT(s, t, size) \
        do { \
-               UPDATE_EXTEND_TSTAT(s, t); \
+               UPDATE_EXTEND_TSTAT_X(s, t, size); \
                ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
        } while (0)
 
index b410b9fff20965243e18162bd6f0d8916aeb00d8..36246129864ca8176203f68421dbf721d6a078fb 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_vfpf.c: Broadcom Everest network driver.
  *
- * Copyright 2009-2012 Broadcom Corporation
+ * Copyright 2009-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -18,7 +18,7 @@
  */
 
 #include "bnx2x.h"
-#include "bnx2x_sriov.h"
+#include "bnx2x_cmn.h"
 #include <linux/crc32.h>
 
 /* place a given tlv on the tlv buffer at a given offset */
@@ -98,6 +98,622 @@ static inline int bnx2x_pfvf_status_codes(int rc)
        }
 }
 
+int bnx2x_send_msg2pf(struct bnx2x *bp, u8 *done, dma_addr_t msg_mapping)
+{
+       struct cstorm_vf_zone_data __iomem *zone_data =
+               REG_ADDR(bp, PXP_VF_ADDR_CSDM_GLOBAL_START);
+       int tout = 600, interval = 100; /* wait for 60 seconds */
+
+       if (*done) {
+               BNX2X_ERR("done was non zero before message to pf was sent\n");
+               WARN_ON(true);
+               return -EINVAL;
+       }
+
+       /* Write message address */
+       writel(U64_LO(msg_mapping),
+              &zone_data->non_trigger.vf_pf_channel.msg_addr_lo);
+       writel(U64_HI(msg_mapping),
+              &zone_data->non_trigger.vf_pf_channel.msg_addr_hi);
+
+       /* make sure the address is written before FW accesses it */
+       wmb();
+
+       /* Trigger the PF FW */
+       writeb(1, &zone_data->trigger.vf_pf_channel.addr_valid);
+
+       /* Wait for PF to complete */
+       while ((tout >= 0) && (!*done)) {
+               msleep(interval);
+               tout -= 1;
+
+               /* progress indicator - HV can take its own sweet time in
+                * answering VFs...
+                */
+               DP_CONT(BNX2X_MSG_IOV, ".");
+       }
+
+       if (!*done) {
+               BNX2X_ERR("PF response has timed out\n");
+               return -EAGAIN;
+       }
+       DP(BNX2X_MSG_SP, "Got a response from PF\n");
+       return 0;
+}
+
+int bnx2x_get_vf_id(struct bnx2x *bp, u32 *vf_id)
+{
+       u32 me_reg;
+       int tout = 10, interval = 100; /* Wait for 1 sec */
+
+       do {
+               /* pxp traps vf read of doorbells and returns me reg value */
+               me_reg = readl(bp->doorbells);
+               if (GOOD_ME_REG(me_reg))
+                       break;
+
+               msleep(interval);
+
+               BNX2X_ERR("Invalid ME register value: 0x%08x\n. Is pf driver up?",
+                         me_reg);
+       } while (tout-- > 0);
+
+       if (!GOOD_ME_REG(me_reg)) {
+               BNX2X_ERR("Invalid ME register value: 0x%08x\n", me_reg);
+               return -EINVAL;
+       }
+
+       BNX2X_ERR("valid ME register value: 0x%08x\n", me_reg);
+
+       *vf_id = (me_reg & ME_REG_VF_NUM_MASK) >> ME_REG_VF_NUM_SHIFT;
+
+       return 0;
+}
+
+int bnx2x_vfpf_acquire(struct bnx2x *bp, u8 tx_count, u8 rx_count)
+{
+       int rc = 0, attempts = 0;
+       struct vfpf_acquire_tlv *req = &bp->vf2pf_mbox->req.acquire;
+       struct pfvf_acquire_resp_tlv *resp = &bp->vf2pf_mbox->resp.acquire_resp;
+       u32 vf_id;
+       bool resources_acquired = false;
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_ACQUIRE, sizeof(*req));
+
+       if (bnx2x_get_vf_id(bp, &vf_id))
+               return -EAGAIN;
+
+       req->vfdev_info.vf_id = vf_id;
+       req->vfdev_info.vf_os = 0;
+
+       req->resc_request.num_rxqs = rx_count;
+       req->resc_request.num_txqs = tx_count;
+       req->resc_request.num_sbs = bp->igu_sb_cnt;
+       req->resc_request.num_mac_filters = VF_ACQUIRE_MAC_FILTERS;
+       req->resc_request.num_mc_filters = VF_ACQUIRE_MC_FILTERS;
+
+       /* pf 2 vf bulletin board address */
+       req->bulletin_addr = bp->pf2vf_bulletin_mapping;
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+
+       while (!resources_acquired) {
+               DP(BNX2X_MSG_SP, "attempting to acquire resources\n");
+
+               /* send acquire request */
+               rc = bnx2x_send_msg2pf(bp,
+                                      &resp->hdr.status,
+                                      bp->vf2pf_mbox_mapping);
+
+               /* PF timeout */
+               if (rc)
+                       return rc;
+
+               /* copy acquire response from buffer to bp */
+               memcpy(&bp->acquire_resp, resp, sizeof(bp->acquire_resp));
+
+               attempts++;
+
+               /* test whether the PF accepted our request. If not, humble the
+                * the request and try again.
+                */
+               if (bp->acquire_resp.hdr.status == PFVF_STATUS_SUCCESS) {
+                       DP(BNX2X_MSG_SP, "resources acquired\n");
+                       resources_acquired = true;
+               } else if (bp->acquire_resp.hdr.status ==
+                          PFVF_STATUS_NO_RESOURCE &&
+                          attempts < VF_ACQUIRE_THRESH) {
+                       DP(BNX2X_MSG_SP,
+                          "PF unwilling to fulfill resource request. Try PF recommended amount\n");
+
+                       /* humble our request */
+                       req->resc_request.num_txqs =
+                               bp->acquire_resp.resc.num_txqs;
+                       req->resc_request.num_rxqs =
+                               bp->acquire_resp.resc.num_rxqs;
+                       req->resc_request.num_sbs =
+                               bp->acquire_resp.resc.num_sbs;
+                       req->resc_request.num_mac_filters =
+                               bp->acquire_resp.resc.num_mac_filters;
+                       req->resc_request.num_vlan_filters =
+                               bp->acquire_resp.resc.num_vlan_filters;
+                       req->resc_request.num_mc_filters =
+                               bp->acquire_resp.resc.num_mc_filters;
+
+                       /* Clear response buffer */
+                       memset(&bp->vf2pf_mbox->resp, 0,
+                              sizeof(union pfvf_tlvs));
+               } else {
+                       /* PF reports error */
+                       BNX2X_ERR("Failed to get the requested amount of resources: %d. Breaking...\n",
+                                 bp->acquire_resp.hdr.status);
+                       return -EAGAIN;
+               }
+       }
+
+       /* get HW info */
+       bp->common.chip_id |= (bp->acquire_resp.pfdev_info.chip_num & 0xffff);
+       bp->link_params.chip_id = bp->common.chip_id;
+       bp->db_size = bp->acquire_resp.pfdev_info.db_size;
+       bp->common.int_block = INT_BLOCK_IGU;
+       bp->common.chip_port_mode = CHIP_2_PORT_MODE;
+       bp->igu_dsb_id = -1;
+       bp->mf_ov = 0;
+       bp->mf_mode = 0;
+       bp->common.flash_size = 0;
+       bp->flags |=
+               NO_WOL_FLAG | NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG | NO_FCOE_FLAG;
+       bp->igu_sb_cnt = 1;
+       bp->igu_base_sb = bp->acquire_resp.resc.hw_sbs[0].hw_sb_id;
+       strlcpy(bp->fw_ver, bp->acquire_resp.pfdev_info.fw_ver,
+               sizeof(bp->fw_ver));
+
+       if (is_valid_ether_addr(bp->acquire_resp.resc.current_mac_addr))
+               memcpy(bp->dev->dev_addr,
+                      bp->acquire_resp.resc.current_mac_addr,
+                      ETH_ALEN);
+
+       return 0;
+}
+
+int bnx2x_vfpf_release(struct bnx2x *bp)
+{
+       struct vfpf_release_tlv *req = &bp->vf2pf_mbox->req.release;
+       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
+       u32 rc = 0, vf_id;
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_RELEASE, sizeof(*req));
+
+       if (bnx2x_get_vf_id(bp, &vf_id))
+               return -EAGAIN;
+
+       req->vf_id = vf_id;
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+
+       /* send release request */
+       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
+
+       if (rc)
+               /* PF timeout */
+               return rc;
+       if (resp->hdr.status == PFVF_STATUS_SUCCESS) {
+               /* PF released us */
+               DP(BNX2X_MSG_SP, "vf released\n");
+       } else {
+               /* PF reports error */
+               BNX2X_ERR("PF failed our release request - are we out of sync? response status: %d\n",
+                         resp->hdr.status);
+               return -EAGAIN;
+       }
+
+       return 0;
+}
+
+/* Tell PF about SB addresses */
+int bnx2x_vfpf_init(struct bnx2x *bp)
+{
+       struct vfpf_init_tlv *req = &bp->vf2pf_mbox->req.init;
+       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
+       int rc, i;
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_INIT, sizeof(*req));
+
+       /* status blocks */
+       for_each_eth_queue(bp, i)
+               req->sb_addr[i] = (dma_addr_t)bnx2x_fp(bp, i,
+                                                      status_blk_mapping);
+
+       /* statistics - requests only supports single queue for now */
+       req->stats_addr = bp->fw_stats_data_mapping +
+                         offsetof(struct bnx2x_fw_stats_data, queue_stats);
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+
+       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
+       if (rc)
+               return rc;
+
+       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
+               BNX2X_ERR("INIT VF failed: %d. Breaking...\n",
+                         resp->hdr.status);
+               return -EAGAIN;
+       }
+
+       DP(BNX2X_MSG_SP, "INIT VF Succeeded\n");
+       return 0;
+}
+
+/* CLOSE VF - opposite to INIT_VF */
+void bnx2x_vfpf_close_vf(struct bnx2x *bp)
+{
+       struct vfpf_close_tlv *req = &bp->vf2pf_mbox->req.close;
+       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
+       int i, rc;
+       u32 vf_id;
+
+       /* If we haven't got a valid VF id, there is no sense to
+        * continue with sending messages
+        */
+       if (bnx2x_get_vf_id(bp, &vf_id))
+               goto free_irq;
+
+       /* Close the queues */
+       for_each_queue(bp, i)
+               bnx2x_vfpf_teardown_queue(bp, i);
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_CLOSE, sizeof(*req));
+
+       req->vf_id = vf_id;
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+
+       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
+
+       if (rc)
+               BNX2X_ERR("Sending CLOSE failed. rc was: %d\n", rc);
+
+       else if (resp->hdr.status != PFVF_STATUS_SUCCESS)
+               BNX2X_ERR("Sending CLOSE failed: pf response was %d\n",
+                         resp->hdr.status);
+
+free_irq:
+       /* Disable HW interrupts, NAPI */
+       bnx2x_netif_stop(bp, 0);
+       /* Delete all NAPI objects */
+       bnx2x_del_all_napi(bp);
+
+       /* Release IRQs */
+       bnx2x_free_irq(bp);
+}
+
+/* ask the pf to open a queue for the vf */
+int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx)
+{
+       struct vfpf_setup_q_tlv *req = &bp->vf2pf_mbox->req.setup_q;
+       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
+       struct bnx2x_fastpath *fp = &bp->fp[fp_idx];
+       u16 tpa_agg_size = 0, flags = 0;
+       int rc;
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_SETUP_Q, sizeof(*req));
+
+       /* select tpa mode to request */
+       if (!fp->disable_tpa) {
+               flags |= VFPF_QUEUE_FLG_TPA;
+               flags |= VFPF_QUEUE_FLG_TPA_IPV6;
+               if (fp->mode == TPA_MODE_GRO)
+                       flags |= VFPF_QUEUE_FLG_TPA_GRO;
+               tpa_agg_size = TPA_AGG_SIZE;
+       }
+
+       /* calculate queue flags */
+       flags |= VFPF_QUEUE_FLG_STATS;
+       flags |= VFPF_QUEUE_FLG_CACHE_ALIGN;
+       flags |= IS_MF_SD(bp) ? VFPF_QUEUE_FLG_OV : 0;
+       flags |= VFPF_QUEUE_FLG_VLAN;
+       DP(NETIF_MSG_IFUP, "vlan removal enabled\n");
+
+       /* Common */
+       req->vf_qid = fp_idx;
+       req->param_valid = VFPF_RXQ_VALID | VFPF_TXQ_VALID;
+
+       /* Rx */
+       req->rxq.rcq_addr = fp->rx_comp_mapping;
+       req->rxq.rcq_np_addr = fp->rx_comp_mapping + BCM_PAGE_SIZE;
+       req->rxq.rxq_addr = fp->rx_desc_mapping;
+       req->rxq.sge_addr = fp->rx_sge_mapping;
+       req->rxq.vf_sb = fp_idx;
+       req->rxq.sb_index = HC_INDEX_ETH_RX_CQ_CONS;
+       req->rxq.hc_rate = bp->rx_ticks ? 1000000/bp->rx_ticks : 0;
+       req->rxq.mtu = bp->dev->mtu;
+       req->rxq.buf_sz = fp->rx_buf_size;
+       req->rxq.sge_buf_sz = BCM_PAGE_SIZE * PAGES_PER_SGE;
+       req->rxq.tpa_agg_sz = tpa_agg_size;
+       req->rxq.max_sge_pkt = SGE_PAGE_ALIGN(bp->dev->mtu) >> SGE_PAGE_SHIFT;
+       req->rxq.max_sge_pkt = ((req->rxq.max_sge_pkt + PAGES_PER_SGE - 1) &
+                         (~(PAGES_PER_SGE-1))) >> PAGES_PER_SGE_SHIFT;
+       req->rxq.flags = flags;
+       req->rxq.drop_flags = 0;
+       req->rxq.cache_line_log = BNX2X_RX_ALIGN_SHIFT;
+       req->rxq.stat_id = -1; /* No stats at the moment */
+
+       /* Tx */
+       req->txq.txq_addr = fp->txdata_ptr[FIRST_TX_COS_INDEX]->tx_desc_mapping;
+       req->txq.vf_sb = fp_idx;
+       req->txq.sb_index = HC_INDEX_ETH_TX_CQ_CONS_COS0;
+       req->txq.hc_rate = bp->tx_ticks ? 1000000/bp->tx_ticks : 0;
+       req->txq.flags = flags;
+       req->txq.traffic_type = LLFC_TRAFFIC_TYPE_NW;
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+
+       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
+       if (rc)
+               BNX2X_ERR("Sending SETUP_Q message for queue[%d] failed!\n",
+                         fp_idx);
+
+       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
+               BNX2X_ERR("Status of SETUP_Q for queue[%d] is %d\n",
+                         fp_idx, resp->hdr.status);
+               return -EINVAL;
+       }
+       return rc;
+}
+
+int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx)
+{
+       struct vfpf_q_op_tlv *req = &bp->vf2pf_mbox->req.q_op;
+       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
+       int rc;
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_TEARDOWN_Q,
+                       sizeof(*req));
+
+       req->vf_qid = qidx;
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+
+       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
+
+       if (rc) {
+               BNX2X_ERR("Sending TEARDOWN for queue %d failed: %d\n", qidx,
+                         rc);
+               return rc;
+       }
+
+       /* PF failed the transaction */
+       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
+               BNX2X_ERR("TEARDOWN for queue %d failed: %d\n", qidx,
+                         resp->hdr.status);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+/* request pf to add a mac for the vf */
+int bnx2x_vfpf_set_mac(struct bnx2x *bp)
+{
+       struct vfpf_set_q_filters_tlv *req = &bp->vf2pf_mbox->req.set_q_filters;
+       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
+       int rc;
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_SET_Q_FILTERS,
+                       sizeof(*req));
+
+       req->flags = VFPF_SET_Q_FILTERS_MAC_VLAN_CHANGED;
+       req->vf_qid = 0;
+       req->n_mac_vlan_filters = 1;
+       req->filters[0].flags =
+               VFPF_Q_FILTER_DEST_MAC_VALID | VFPF_Q_FILTER_SET_MAC;
+
+       /* sample bulletin board for new mac */
+       bnx2x_sample_bulletin(bp);
+
+       /* copy mac from device to request */
+       memcpy(req->filters[0].mac, bp->dev->dev_addr, ETH_ALEN);
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+
+       /* send message to pf */
+       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
+       if (rc) {
+               BNX2X_ERR("failed to send message to pf. rc was %d\n", rc);
+               return rc;
+       }
+
+       /* failure may mean PF was configured with a new mac for us */
+       while (resp->hdr.status == PFVF_STATUS_FAILURE) {
+               DP(BNX2X_MSG_IOV,
+                  "vfpf SET MAC failed. Check bulletin board for new posts\n");
+
+               /* check if bulletin board was updated */
+               if (bnx2x_sample_bulletin(bp) == PFVF_BULLETIN_UPDATED) {
+                       /* copy mac from device to request */
+                       memcpy(req->filters[0].mac, bp->dev->dev_addr,
+                              ETH_ALEN);
+
+                       /* send message to pf */
+                       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status,
+                                              bp->vf2pf_mbox_mapping);
+               } else {
+                       /* no new info in bulletin */
+                       break;
+               }
+       }
+
+       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
+               BNX2X_ERR("vfpf SET MAC failed: %d\n", resp->hdr.status);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+int bnx2x_vfpf_set_mcast(struct net_device *dev)
+{
+       struct bnx2x *bp = netdev_priv(dev);
+       struct vfpf_set_q_filters_tlv *req = &bp->vf2pf_mbox->req.set_q_filters;
+       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
+       int rc, i = 0;
+       struct netdev_hw_addr *ha;
+
+       if (bp->state != BNX2X_STATE_OPEN) {
+               DP(NETIF_MSG_IFUP, "state is %x, returning\n", bp->state);
+               return -EINVAL;
+       }
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_SET_Q_FILTERS,
+                       sizeof(*req));
+
+       /* Get Rx mode requested */
+       DP(NETIF_MSG_IFUP, "dev->flags = %x\n", dev->flags);
+
+       netdev_for_each_mc_addr(ha, dev) {
+               DP(NETIF_MSG_IFUP, "Adding mcast MAC: %pM\n",
+                  bnx2x_mc_addr(ha));
+               memcpy(req->multicast[i], bnx2x_mc_addr(ha), ETH_ALEN);
+               i++;
+       }
+
+       /* We support four PFVF_MAX_MULTICAST_PER_VF mcast
+         * addresses tops
+         */
+       if (i >= PFVF_MAX_MULTICAST_PER_VF) {
+               DP(NETIF_MSG_IFUP,
+                  "VF supports not more than %d multicast MAC addresses\n",
+                  PFVF_MAX_MULTICAST_PER_VF);
+               return -EINVAL;
+       }
+
+       req->n_multicast = i;
+       req->flags |= VFPF_SET_Q_FILTERS_MULTICAST_CHANGED;
+       req->vf_qid = 0;
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
+       if (rc) {
+               BNX2X_ERR("Sending a message failed: %d\n", rc);
+               return rc;
+       }
+
+       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
+               BNX2X_ERR("Set Rx mode/multicast failed: %d\n",
+                         resp->hdr.status);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp)
+{
+       int mode = bp->rx_mode;
+       struct vfpf_set_q_filters_tlv *req = &bp->vf2pf_mbox->req.set_q_filters;
+       struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
+       int rc;
+
+       /* clear mailbox and prep first tlv */
+       bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_SET_Q_FILTERS,
+                       sizeof(*req));
+
+       DP(NETIF_MSG_IFUP, "Rx mode is %d\n", mode);
+
+       switch (mode) {
+       case BNX2X_RX_MODE_NONE: /* no Rx */
+               req->rx_mask = VFPF_RX_MASK_ACCEPT_NONE;
+               break;
+       case BNX2X_RX_MODE_NORMAL:
+               req->rx_mask = VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST;
+               req->rx_mask |= VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST;
+               req->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST;
+               break;
+       case BNX2X_RX_MODE_ALLMULTI:
+               req->rx_mask = VFPF_RX_MASK_ACCEPT_ALL_MULTICAST;
+               req->rx_mask |= VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST;
+               req->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST;
+               break;
+       case BNX2X_RX_MODE_PROMISC:
+               req->rx_mask = VFPF_RX_MASK_ACCEPT_ALL_UNICAST;
+               req->rx_mask |= VFPF_RX_MASK_ACCEPT_ALL_MULTICAST;
+               req->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST;
+               break;
+       default:
+               BNX2X_ERR("BAD rx mode (%d)\n", mode);
+               return -EINVAL;
+       }
+
+       req->flags |= VFPF_SET_Q_FILTERS_RX_MASK_CHANGED;
+       req->vf_qid = 0;
+
+       /* add list termination tlv */
+       bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
+                     sizeof(struct channel_list_end_tlv));
+
+       /* output tlvs list */
+       bnx2x_dp_tlv_list(bp, req);
+
+       rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
+       if (rc)
+               BNX2X_ERR("Sending a message failed: %d\n", rc);
+
+       if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
+               BNX2X_ERR("Set Rx mode failed: %d\n", resp->hdr.status);
+               return -EINVAL;
+       }
+
+       return rc;
+}
+
 /* General service functions */
 static void storm_memset_vf_mbx_ack(struct bnx2x *bp, u16 abs_fid)
 {
@@ -1015,7 +1631,6 @@ int bnx2x_post_vf_bulletin(struct bnx2x *bp, int vf)
        dma_addr_t pf_addr = BP_VF_BULLETIN_DMA(bp)->mapping +
                vf * BULLETIN_CONTENT_SIZE;
        dma_addr_t vf_addr = bnx2x_vf(bp, vf, bulletin_map);
-       u32 len = BULLETIN_CONTENT_SIZE;
        int rc;
 
        /* can only update vf after init took place */
@@ -1025,11 +1640,12 @@ int bnx2x_post_vf_bulletin(struct bnx2x *bp, int vf)
 
        /* increment bulletin board version and compute crc */
        bulletin->version++;
+       bulletin->length = BULLETIN_CONTENT_SIZE;
        bulletin->crc = bnx2x_crc_vf_bulletin(bp, bulletin);
 
        /* propagate bulletin board via dmae to vm memory */
        rc = bnx2x_copy32_vf_dmae(bp, false, pf_addr,
                                  bnx2x_vf(bp, vf, abs_vfid), U64_HI(vf_addr),
-                                 U64_LO(vf_addr), len/4);
+                                 U64_LO(vf_addr), bulletin->length / 4);
        return rc;
 }
index 9f07adaf06f4dd775bdba8f9d04fdad7ab3b1f09..bfc80baec00d7564628f4088be05c47ae3f9a899 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x_vfpf.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2011-2012 Broadcom Corporation
+ * Copyright (c) 2011-2013 Broadcom Corporation
  *
  * Unless you and Broadcom execute a separate written software license
  * agreement governing use of this software, this software is licensed to you
@@ -18,6 +18,8 @@
 #ifndef VF_PF_IF_H
 #define VF_PF_IF_H
 
+#ifdef CONFIG_BNX2X_SRIOV
+
 /* Common definitions for all HVs */
 struct vf_pf_resc_request {
        u8  num_rxqs;
@@ -316,7 +318,8 @@ struct pf_vf_bulletin_content {
        u32 crc;                        /* crc of structure to ensure is not in
                                         * mid-update
                                         */
-       u32 version;
+       u16 version;
+       u16 length;
 
        aligned_u64 valid_bitmap;       /* bitmap indicating which fields
                                         * hold valid values
@@ -353,4 +356,5 @@ enum channel_tlvs {
        CHANNEL_TLV_MAX
 };
 
+#endif /* CONFIG_BNX2X_SRIOV */
 #endif /* VF_PF_IF_H */
index df8c30d1a52cc4d1fc35e6fb8f7cf6c1b73d31c3..1c4dadc7ebbb75bdd9b76ec4264ea9c8e4280f7f 100644 (file)
@@ -4816,6 +4816,8 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev)
                return err;
        }
 
+       ethdev->drv_state |= CNIC_DRV_STATE_HANDLES_IRQ;
+
        return 0;
 }
 
@@ -5136,6 +5138,7 @@ static int cnic_start_bnx2x_hw(struct cnic_dev *dev)
        if (ret)
                return ret;
 
+       ethdev->drv_state |= CNIC_DRV_STATE_HANDLES_IRQ;
        return 0;
 }
 
@@ -5387,6 +5390,7 @@ static void cnic_stop_hw(struct cnic_dev *dev)
                }
                cnic_shutdown_rings(dev);
                cp->stop_cm(dev);
+               cp->ethdev->drv_state &= ~CNIC_DRV_STATE_HANDLES_IRQ;
                clear_bit(CNIC_F_CNIC_UP, &dev->flags);
                RCU_INIT_POINTER(cp->ulp_ops[CNIC_ULP_L4], NULL);
                synchronize_rcu();
index 2a35436f90956744a2efa443062001a4acde1727..0c9367a0f57d92ef56c5f0f89dea166e0e00b180 100644 (file)
@@ -179,6 +179,7 @@ struct cnic_eth_dev {
 #define CNIC_DRV_STATE_NO_ISCSI_OOO    0x00000004
 #define CNIC_DRV_STATE_NO_ISCSI                0x00000008
 #define CNIC_DRV_STATE_NO_FCOE         0x00000010
+#define CNIC_DRV_STATE_HANDLES_IRQ     0x00000020
        u32             chip_id;
        u32             max_kwqe_pending;
        struct pci_dev  *pdev;
index 3a1c8a3cf7c91af5ada39f9ded17e604212b2c01..e9b35da375cb4c3b7bf5c31a1b03d18097ad44c1 100644 (file)
@@ -2385,7 +2385,7 @@ static int sbmac_mii_probe(struct net_device *dev)
                return -ENXIO;
        }
 
-       phy_dev = phy_connect(dev, dev_name(&phy_dev->dev), &sbmac_mii_poll, 0,
+       phy_dev = phy_connect(dev, dev_name(&phy_dev->dev), &sbmac_mii_poll,
                              PHY_INTERFACE_MODE_GMII);
        if (IS_ERR(phy_dev)) {
                printk(KERN_ERR "%s: could not attach to PHY\n", dev->name);
index bc4d98991a329700f137bd6eaab0a4249377078c..ab07026a36e310cb9790928490cd1f104512f4ac 100644 (file)
@@ -1286,14 +1286,26 @@ static int tg3_phy_auxctl_write(struct tg3 *tp, int reg, u32 set)
        return tg3_writephy(tp, MII_TG3_AUX_CTRL, set | reg);
 }
 
-#define TG3_PHY_AUXCTL_SMDSP_ENABLE(tp) \
-       tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, \
-                            MII_TG3_AUXCTL_ACTL_SMDSP_ENA | \
-                            MII_TG3_AUXCTL_ACTL_TX_6DB)
+static int tg3_phy_toggle_auxctl_smdsp(struct tg3 *tp, bool enable)
+{
+       u32 val;
+       int err;
+
+       err = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val);
+
+       if (err)
+               return err;
+       if (enable)
+
+               val |= MII_TG3_AUXCTL_ACTL_SMDSP_ENA;
+       else
+               val &= ~MII_TG3_AUXCTL_ACTL_SMDSP_ENA;
 
-#define TG3_PHY_AUXCTL_SMDSP_DISABLE(tp) \
-       tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, \
-                            MII_TG3_AUXCTL_ACTL_TX_6DB);
+       err = tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL,
+                                  val | MII_TG3_AUXCTL_ACTL_TX_6DB);
+
+       return err;
+}
 
 static int tg3_bmcr_reset(struct tg3 *tp)
 {
@@ -2004,8 +2016,8 @@ static int tg3_phy_init(struct tg3 *tp)
        phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
 
        /* Attach the MAC to the PHY. */
-       phydev = phy_connect(tp->dev, dev_name(&phydev->dev), tg3_adjust_link,
-                            phydev->dev_flags, phydev->interface);
+       phydev = phy_connect(tp->dev, dev_name(&phydev->dev),
+                            tg3_adjust_link, phydev->interface);
        if (IS_ERR(phydev)) {
                dev_err(&tp->pdev->dev, "Could not attach to PHY\n");
                return PTR_ERR(phydev);
@@ -2226,7 +2238,7 @@ static void tg3_phy_apply_otp(struct tg3 *tp)
 
        otp = tp->phy_otp;
 
-       if (TG3_PHY_AUXCTL_SMDSP_ENABLE(tp))
+       if (tg3_phy_toggle_auxctl_smdsp(tp, true))
                return;
 
        phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT);
@@ -2251,7 +2263,7 @@ static void tg3_phy_apply_otp(struct tg3 *tp)
              ((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT);
        tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy);
 
-       TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
+       tg3_phy_toggle_auxctl_smdsp(tp, false);
 }
 
 static void tg3_phy_eee_adjust(struct tg3 *tp, u32 current_link_up)
@@ -2287,9 +2299,9 @@ static void tg3_phy_eee_adjust(struct tg3 *tp, u32 current_link_up)
 
        if (!tp->setlpicnt) {
                if (current_link_up == 1 &&
-                  !TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
+                  !tg3_phy_toggle_auxctl_smdsp(tp, true)) {
                        tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, 0x0000);
-                       TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
+                       tg3_phy_toggle_auxctl_smdsp(tp, false);
                }
 
                val = tr32(TG3_CPMU_EEE_MODE);
@@ -2305,11 +2317,11 @@ static void tg3_phy_eee_enable(struct tg3 *tp)
            (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
             GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
             tg3_flag(tp, 57765_CLASS)) &&
-           !TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
+           !tg3_phy_toggle_auxctl_smdsp(tp, true)) {
                val = MII_TG3_DSP_TAP26_ALNOKO |
                      MII_TG3_DSP_TAP26_RMRXSTO;
                tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, val);
-               TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
+               tg3_phy_toggle_auxctl_smdsp(tp, false);
        }
 
        val = tr32(TG3_CPMU_EEE_MODE);
@@ -2453,7 +2465,7 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
                tg3_writephy(tp, MII_CTRL1000,
                             CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER);
 
-               err = TG3_PHY_AUXCTL_SMDSP_ENABLE(tp);
+               err = tg3_phy_toggle_auxctl_smdsp(tp, true);
                if (err)
                        return err;
 
@@ -2474,7 +2486,7 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
        tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
        tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0000);
 
-       TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
+       tg3_phy_toggle_auxctl_smdsp(tp, false);
 
        tg3_writephy(tp, MII_CTRL1000, phy9_orig);
 
@@ -2575,10 +2587,10 @@ static int tg3_phy_reset(struct tg3 *tp)
 
 out:
        if ((tp->phy_flags & TG3_PHYFLG_ADC_BUG) &&
-           !TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
+           !tg3_phy_toggle_auxctl_smdsp(tp, true)) {
                tg3_phydsp_write(tp, 0x201f, 0x2aaa);
                tg3_phydsp_write(tp, 0x000a, 0x0323);
-               TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
+               tg3_phy_toggle_auxctl_smdsp(tp, false);
        }
 
        if (tp->phy_flags & TG3_PHYFLG_5704_A0_BUG) {
@@ -2587,14 +2599,14 @@ out:
        }
 
        if (tp->phy_flags & TG3_PHYFLG_BER_BUG) {
-               if (!TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
+               if (!tg3_phy_toggle_auxctl_smdsp(tp, true)) {
                        tg3_phydsp_write(tp, 0x000a, 0x310b);
                        tg3_phydsp_write(tp, 0x201f, 0x9506);
                        tg3_phydsp_write(tp, 0x401f, 0x14e2);
-                       TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
+                       tg3_phy_toggle_auxctl_smdsp(tp, false);
                }
        } else if (tp->phy_flags & TG3_PHYFLG_JITTER_BUG) {
-               if (!TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
+               if (!tg3_phy_toggle_auxctl_smdsp(tp, true)) {
                        tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
                        if (tp->phy_flags & TG3_PHYFLG_ADJUST_TRIM) {
                                tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x110b);
@@ -2603,7 +2615,7 @@ out:
                        } else
                                tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
 
-                       TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
+                       tg3_phy_toggle_auxctl_smdsp(tp, false);
                }
        }
 
@@ -4015,7 +4027,7 @@ static int tg3_phy_autoneg_cfg(struct tg3 *tp, u32 advertise, u32 flowctrl)
        tw32(TG3_CPMU_EEE_MODE,
             tr32(TG3_CPMU_EEE_MODE) & ~TG3_CPMU_EEEMD_LPI_ENABLE);
 
-       err = TG3_PHY_AUXCTL_SMDSP_ENABLE(tp);
+       err = tg3_phy_toggle_auxctl_smdsp(tp, true);
        if (!err) {
                u32 err2;
 
@@ -4049,7 +4061,7 @@ static int tg3_phy_autoneg_cfg(struct tg3 *tp, u32 advertise, u32 flowctrl)
                                                 MII_TG3_DSP_CH34TP2_HIBW01);
                }
 
-               err2 = TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
+               err2 = tg3_phy_toggle_auxctl_smdsp(tp, false);
                if (!err)
                        err = err2;
        }
@@ -6958,6 +6970,9 @@ static void tg3_poll_controller(struct net_device *dev)
        int i;
        struct tg3 *tp = netdev_priv(dev);
 
+       if (tg3_irq_sync(tp))
+               return;
+
        for (i = 0; i < tp->irq_cnt; i++)
                tg3_interrupt(tp->napi[i].irq_vec, &tp->napi[i]);
 }
@@ -13726,8 +13741,10 @@ static void tg3_get_5720_nvram_info(struct tg3 *tp)
                switch (nvmpinstrp) {
                case FLASH_5762_EEPROM_HD:
                        nvmpinstrp = FLASH_5720_EEPROM_HD;
+                       break;
                case FLASH_5762_EEPROM_LD:
                        nvmpinstrp = FLASH_5720_EEPROM_LD;
+                       break;
                }
        }
 
@@ -15772,7 +15789,6 @@ static int tg3_get_macaddr_sparc(struct tg3 *tp)
        addr = of_get_property(dp, "local-mac-address", &len);
        if (addr && len == 6) {
                memcpy(dev->dev_addr, addr, 6);
-               memcpy(dev->perm_addr, dev->dev_addr, 6);
                return 0;
        }
        return -ENODEV;
@@ -15783,7 +15799,6 @@ static int tg3_get_default_macaddr_sparc(struct tg3 *tp)
        struct net_device *dev = tp->dev;
 
        memcpy(dev->dev_addr, idprom->id_ethaddr, 6);
-       memcpy(dev->perm_addr, idprom->id_ethaddr, 6);
        return 0;
 }
 #endif
@@ -15860,7 +15875,6 @@ static int tg3_get_device_address(struct tg3 *tp)
 #endif
                return -EINVAL;
        }
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
        return 0;
 }
 
@@ -16497,6 +16511,7 @@ static int tg3_init_one(struct pci_dev *pdev,
        tp->pm_cap = pm_cap;
        tp->rx_mode = TG3_DEF_RX_MODE;
        tp->tx_mode = TG3_DEF_TX_MODE;
+       tp->irq_sync = 1;
 
        if (tg3_debug > 0)
                tp->msg_enable = tg3_debug;
index a9b0830fb39d90b3227fe14741c8a4a3f09dc2d6..352190b9ebe722ec271a7dd7a6d764fceba1044b 100644 (file)
@@ -287,7 +287,7 @@ static int macb_mii_probe(struct net_device *dev)
        }
 
        /* attach the mac to the phy */
-       ret = phy_connect_direct(dev, phydev, &macb_handle_link_change, 0,
+       ret = phy_connect_direct(dev, phydev, &macb_handle_link_change,
                                 bp->phy_interface);
        if (ret) {
                netdev_err(dev, "Could not attach to PHY\n");
index c8fdeaae56c0a70bbb28e147979738f5533e2fdb..20d2085f61c54639bb6baa6926b9a9a09bf8d82d 100644 (file)
@@ -131,7 +131,7 @@ static void t1_set_rxmode(struct net_device *dev)
 static void link_report(struct port_info *p)
 {
        if (!netif_carrier_ok(p->dev))
-               printk(KERN_INFO "%s: link down\n", p->dev->name);
+               netdev_info(p->dev, "link down\n");
        else {
                const char *s = "10Mbps";
 
@@ -141,9 +141,9 @@ static void link_report(struct port_info *p)
                        case SPEED_100:   s = "100Mbps"; break;
                }
 
-               printk(KERN_INFO "%s: link up, %s, %s-duplex\n",
-                      p->dev->name, s,
-                      p->link_config.duplex == DUPLEX_FULL ? "full" : "half");
+               netdev_info(p->dev, "link up, %s, %s-duplex\n",
+                           s, p->link_config.duplex == DUPLEX_FULL
+                           ? "full" : "half");
        }
 }
 
@@ -976,19 +976,13 @@ static const struct net_device_ops cxgb_netdev_ops = {
 
 static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
-       static int version_printed;
-
        int i, err, pci_using_dac = 0;
        unsigned long mmio_start, mmio_len;
        const struct board_info *bi;
        struct adapter *adapter = NULL;
        struct port_info *pi;
 
-       if (!version_printed) {
-               printk(KERN_INFO "%s - version %s\n", DRV_DESCRIPTION,
-                      DRV_VERSION);
-               ++version_printed;
-       }
+       pr_info_once("%s - version %s\n", DRV_DESCRIPTION, DRV_VERSION);
 
        err = pci_enable_device(pdev);
        if (err)
@@ -1124,8 +1118,8 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        for (i = 0; i < bi->port_number; ++i) {
                err = register_netdev(adapter->port[i].dev);
                if (err)
-                       pr_warning("%s: cannot register net device %s, skipping\n",
-                                  pci_name(pdev), adapter->port[i].dev->name);
+                       pr_warn("%s: cannot register net device %s, skipping\n",
+                               pci_name(pdev), adapter->port[i].dev->name);
                else {
                        /*
                         * Change the name we use for messages to the name of
@@ -1143,10 +1137,10 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_release_adapter_res;
        }
 
-       printk(KERN_INFO "%s: %s (rev %d), %s %dMHz/%d-bit\n", adapter->name,
-              bi->desc, adapter->params.chip_revision,
-              adapter->params.pci.is_pcix ? "PCIX" : "PCI",
-              adapter->params.pci.speed, adapter->params.pci.width);
+       pr_info("%s: %s (rev %d), %s %dMHz/%d-bit\n",
+               adapter->name, bi->desc, adapter->params.chip_revision,
+               adapter->params.pci.is_pcix ? "PCIX" : "PCI",
+               adapter->params.pci.speed, adapter->params.pci.width);
 
        /*
         * Set the T1B ASIC and memory clocks.
index d84872e8817131233c9f949615ec9b0492d1ebe8..482976925154d1dad9d18eebeda003ce1088d2db 100644 (file)
@@ -1822,8 +1822,8 @@ netdev_tx_t t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
                 */
                if (unlikely(skb->len < ETH_HLEN ||
                             skb->len > dev->mtu + eth_hdr_len(skb->data))) {
-                       pr_debug("%s: packet size %d hdr %d mtu%d\n", dev->name,
-                                skb->len, eth_hdr_len(skb->data), dev->mtu);
+                       netdev_dbg(dev, "packet size %d hdr %d mtu%d\n",
+                                  skb->len, eth_hdr_len(skb->data), dev->mtu);
                        dev_kfree_skb_any(skb);
                        return NETDEV_TX_OK;
                }
@@ -1831,7 +1831,7 @@ netdev_tx_t t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
                if (skb->ip_summed == CHECKSUM_PARTIAL &&
                    ip_hdr(skb)->protocol == IPPROTO_UDP) {
                        if (unlikely(skb_checksum_help(skb))) {
-                               pr_debug("%s: unable to do udp checksum\n", dev->name);
+                               netdev_dbg(dev, "unable to do udp checksum\n");
                                dev_kfree_skb_any(skb);
                                return NETDEV_TX_OK;
                        }
index f15ee326d5c19414563b30abbb66ba780fd59b00..2b5e62193ceaace56320adadfac566f29f6984b1 100644 (file)
@@ -29,6 +29,9 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/init.h>
@@ -153,7 +156,7 @@ struct workqueue_struct *cxgb3_wq;
 static void link_report(struct net_device *dev)
 {
        if (!netif_carrier_ok(dev))
-               printk(KERN_INFO "%s: link down\n", dev->name);
+               netdev_info(dev, "link down\n");
        else {
                const char *s = "10Mbps";
                const struct port_info *p = netdev_priv(dev);
@@ -170,8 +173,9 @@ static void link_report(struct net_device *dev)
                        break;
                }
 
-               printk(KERN_INFO "%s: link up, %s, %s-duplex\n", dev->name, s,
-                      p->link_config.duplex == DUPLEX_FULL ? "full" : "half");
+               netdev_info(dev, "link up, %s, %s-duplex\n",
+                           s, p->link_config.duplex == DUPLEX_FULL
+                           ? "full" : "half");
        }
 }
 
@@ -318,10 +322,10 @@ void t3_os_phymod_changed(struct adapter *adap, int port_id)
        const struct port_info *pi = netdev_priv(dev);
 
        if (pi->phy.modtype == phy_modtype_none)
-               printk(KERN_INFO "%s: PHY module unplugged\n", dev->name);
+               netdev_info(dev, "PHY module unplugged\n");
        else
-               printk(KERN_INFO "%s: %s PHY module inserted\n", dev->name,
-                      mod_str[pi->phy.modtype]);
+               netdev_info(dev, "%s PHY module inserted\n",
+                           mod_str[pi->phy.modtype]);
 }
 
 static void cxgb_set_rxmode(struct net_device *dev)
@@ -1422,8 +1426,7 @@ static int cxgb_open(struct net_device *dev)
        if (is_offload(adapter) && !ofld_disable) {
                err = offload_open(dev);
                if (err)
-                       printk(KERN_WARNING
-                              "Could not initialize offload capabilities\n");
+                       pr_warn("Could not initialize offload capabilities\n");
        }
 
        netif_set_real_num_tx_queues(dev, pi->nqsets);
@@ -3132,14 +3135,13 @@ static void print_port_info(struct adapter *adap, const struct adapter_info *ai)
 
                if (!test_bit(i, &adap->registered_device_map))
                        continue;
-               printk(KERN_INFO "%s: %s %s %sNIC (rev %d) %s%s\n",
-                      dev->name, ai->desc, pi->phy.desc,
-                      is_offload(adap) ? "R" : "", adap->params.rev, buf,
-                      (adap->flags & USING_MSIX) ? " MSI-X" :
-                      (adap->flags & USING_MSI) ? " MSI" : "");
+               netdev_info(dev, "%s %s %sNIC (rev %d) %s%s\n",
+                           ai->desc, pi->phy.desc,
+                           is_offload(adap) ? "R" : "", adap->params.rev, buf,
+                           (adap->flags & USING_MSIX) ? " MSI-X" :
+                           (adap->flags & USING_MSI) ? " MSI" : "");
                if (adap->name == dev->name && adap->params.vpd.mclk)
-                       printk(KERN_INFO
-                              "%s: %uMB CM, %uMB PMTX, %uMB PMRX, S/N: %s\n",
+                       pr_info("%s: %uMB CM, %uMB PMTX, %uMB PMRX, S/N: %s\n",
                               adap->name, t3_mc7_size(&adap->cm) >> 20,
                               t3_mc7_size(&adap->pmtx) >> 20,
                               t3_mc7_size(&adap->pmrx) >> 20,
@@ -3177,24 +3179,18 @@ static void cxgb3_init_iscsi_mac(struct net_device *dev)
                        NETIF_F_IPV6_CSUM | NETIF_F_HIGHDMA)
 static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
-       static int version_printed;
-
        int i, err, pci_using_dac = 0;
        resource_size_t mmio_start, mmio_len;
        const struct adapter_info *ai;
        struct adapter *adapter = NULL;
        struct port_info *pi;
 
-       if (!version_printed) {
-               printk(KERN_INFO "%s - version %s\n", DRV_DESC, DRV_VERSION);
-               ++version_printed;
-       }
+       pr_info_once("%s - version %s\n", DRV_DESC, DRV_VERSION);
 
        if (!cxgb3_wq) {
                cxgb3_wq = create_singlethread_workqueue(DRV_NAME);
                if (!cxgb3_wq) {
-                       printk(KERN_ERR DRV_NAME
-                              ": cannot initialize work queue\n");
+                       pr_err("cannot initialize work queue\n");
                        return -ENOMEM;
                }
        }
index 3f1f5018c66e7276185aeffb766e474870cd6763..4232767862b5857c33d324095e9d6ba1c2d0cc18 100644 (file)
@@ -30,6 +30,8 @@
  * SOFTWARE.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/list.h>
 #include <linux/slab.h>
 #include <net/neighbour.h>
@@ -62,9 +64,8 @@ static const unsigned int MAX_ATIDS = 64 * 1024;
 static const unsigned int ATID_BASE = 0x10000;
 
 static void cxgb_neigh_update(struct neighbour *neigh);
-static void cxgb_redirect(struct dst_entry *old, struct neighbour *old_neigh,
-                         struct dst_entry *new, struct neighbour *new_neigh,
-                         const void *daddr);
+static void cxgb_redirect(struct dst_entry *old, struct dst_entry *new,
+                         struct neighbour *neigh, const void *daddr);
 
 static inline int offload_activated(struct t3cdev *tdev)
 {
@@ -235,8 +236,7 @@ static int cxgb_ulp_iscsi_ctl(struct adapter *adapter, unsigned int req,
                if ((val >> S_MAXRXDATA) != 0x3f60) {
                        val &= (M_RXCOALESCESIZE << S_RXCOALESCESIZE);
                        val |= V_MAXRXDATA(0x3f60);
-                       printk(KERN_INFO
-                               "%s, iscsi set MaxRxData to 16224 (0x%x).\n",
+                       pr_info("%s, iscsi set MaxRxData to 16224 (0x%x)\n",
                                adapter->name, val);
                        t3_write_reg(adapter, A_TP_PARA_REG2, val);
                }
@@ -256,8 +256,7 @@ static int cxgb_ulp_iscsi_ctl(struct adapter *adapter, unsigned int req,
                for (i = 0; i < 4; i++)
                        val |= (uiip->pgsz_factor[i] & 0xF) << (8 * i);
                if (val && (val != t3_read_reg(adapter, A_ULPRX_ISCSI_PSZ))) {
-                       printk(KERN_INFO
-                               "%s, setting iscsi pgsz 0x%x, %u,%u,%u,%u.\n",
+                       pr_info("%s, setting iscsi pgsz 0x%x, %u,%u,%u,%u\n",
                                adapter->name, val, uiip->pgsz_factor[0],
                                uiip->pgsz_factor[1], uiip->pgsz_factor[2],
                                uiip->pgsz_factor[3]);
@@ -709,8 +708,7 @@ static int do_smt_write_rpl(struct t3cdev *dev, struct sk_buff *skb)
        struct cpl_smt_write_rpl *rpl = cplhdr(skb);
 
        if (rpl->status != CPL_ERR_NONE)
-               printk(KERN_ERR
-                      "Unexpected SMT_WRITE_RPL status %u for entry %u\n",
+               pr_err("Unexpected SMT_WRITE_RPL status %u for entry %u\n",
                       rpl->status, GET_TID(rpl));
 
        return CPL_RET_BUF_DONE;
@@ -721,8 +719,7 @@ static int do_l2t_write_rpl(struct t3cdev *dev, struct sk_buff *skb)
        struct cpl_l2t_write_rpl *rpl = cplhdr(skb);
 
        if (rpl->status != CPL_ERR_NONE)
-               printk(KERN_ERR
-                      "Unexpected L2T_WRITE_RPL status %u for entry %u\n",
+               pr_err("Unexpected L2T_WRITE_RPL status %u for entry %u\n",
                       rpl->status, GET_TID(rpl));
 
        return CPL_RET_BUF_DONE;
@@ -733,8 +730,7 @@ static int do_rte_write_rpl(struct t3cdev *dev, struct sk_buff *skb)
        struct cpl_rte_write_rpl *rpl = cplhdr(skb);
 
        if (rpl->status != CPL_ERR_NONE)
-               printk(KERN_ERR
-                      "Unexpected RTE_WRITE_RPL status %u for entry %u\n",
+               pr_err("Unexpected RTE_WRITE_RPL status %u for entry %u\n",
                       rpl->status, GET_TID(rpl));
 
        return CPL_RET_BUF_DONE;
@@ -754,7 +750,7 @@ static int do_act_open_rpl(struct t3cdev *dev, struct sk_buff *skb)
                                                                    t3c_tid->
                                                                    ctx);
        } else {
-               printk(KERN_ERR "%s: received clientless CPL command 0x%x\n",
+               pr_err("%s: received clientless CPL command 0x%x\n",
                       dev->name, CPL_ACT_OPEN_RPL);
                return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG;
        }
@@ -772,7 +768,7 @@ static int do_stid_rpl(struct t3cdev *dev, struct sk_buff *skb)
                return t3c_tid->client->handlers[p->opcode] (dev, skb,
                                                             t3c_tid->ctx);
        } else {
-               printk(KERN_ERR "%s: received clientless CPL command 0x%x\n",
+               pr_err("%s: received clientless CPL command 0x%x\n",
                       dev->name, p->opcode);
                return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG;
        }
@@ -790,7 +786,7 @@ static int do_hwtid_rpl(struct t3cdev *dev, struct sk_buff *skb)
                return t3c_tid->client->handlers[p->opcode]
                    (dev, skb, t3c_tid->ctx);
        } else {
-               printk(KERN_ERR "%s: received clientless CPL command 0x%x\n",
+               pr_err("%s: received clientless CPL command 0x%x\n",
                       dev->name, p->opcode);
                return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG;
        }
@@ -817,7 +813,7 @@ static int do_cr(struct t3cdev *dev, struct sk_buff *skb)
                return t3c_tid->client->handlers[CPL_PASS_ACCEPT_REQ]
                    (dev, skb, t3c_tid->ctx);
        } else {
-               printk(KERN_ERR "%s: received clientless CPL command 0x%x\n",
+               pr_err("%s: received clientless CPL command 0x%x\n",
                       dev->name, CPL_PASS_ACCEPT_REQ);
                return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG;
        }
@@ -911,7 +907,7 @@ static int do_act_establish(struct t3cdev *dev, struct sk_buff *skb)
                return t3c_tid->client->handlers[CPL_ACT_ESTABLISH]
                    (dev, skb, t3c_tid->ctx);
        } else {
-               printk(KERN_ERR "%s: received clientless CPL command 0x%x\n",
+               pr_err("%s: received clientless CPL command 0x%x\n",
                       dev->name, CPL_ACT_ESTABLISH);
                return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG;
        }
@@ -957,7 +953,7 @@ static int do_term(struct t3cdev *dev, struct sk_buff *skb)
                return t3c_tid->client->handlers[opcode] (dev, skb,
                                                          t3c_tid->ctx);
        } else {
-               printk(KERN_ERR "%s: received clientless CPL command 0x%x\n",
+               pr_err("%s: received clientless CPL command 0x%x\n",
                       dev->name, opcode);
                return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG;
        }
@@ -973,10 +969,9 @@ static int nb_callback(struct notifier_block *self, unsigned long event,
        }
        case (NETEVENT_REDIRECT):{
                struct netevent_redirect *nr = ctx;
-               cxgb_redirect(nr->old, nr->old_neigh,
-                             nr->new, nr->new_neigh,
+               cxgb_redirect(nr->old, nr->new, nr->neigh,
                              nr->daddr);
-               cxgb_neigh_update(nr->new_neigh);
+               cxgb_neigh_update(nr->neigh);
                break;
        }
        default:
@@ -994,8 +989,7 @@ static struct notifier_block nb = {
  */
 static int do_bad_cpl(struct t3cdev *dev, struct sk_buff *skb)
 {
-       printk(KERN_ERR "%s: received bad CPL command 0x%x\n", dev->name,
-              *skb->data);
+       pr_err("%s: received bad CPL command 0x%x\n", dev->name, *skb->data);
        return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG;
 }
 
@@ -1013,8 +1007,8 @@ void t3_register_cpl_handler(unsigned int opcode, cpl_handler_func h)
        if (opcode < NUM_CPL_CMDS)
                cpl_handlers[opcode] = h ? h : do_bad_cpl;
        else
-               printk(KERN_ERR "T3C: handler registration for "
-                      "opcode %x failed\n", opcode);
+               pr_err("T3C: handler registration for opcode %x failed\n",
+                      opcode);
 }
 
 EXPORT_SYMBOL(t3_register_cpl_handler);
@@ -1033,9 +1027,8 @@ static int process_rx(struct t3cdev *dev, struct sk_buff **skbs, int n)
                if (ret & CPL_RET_UNKNOWN_TID) {
                        union opcode_tid *p = cplhdr(skb);
 
-                       printk(KERN_ERR "%s: CPL message (opcode %u) had "
-                              "unknown TID %u\n", dev->name, opcode,
-                              G_TID(ntohl(p->opcode_tid)));
+                       pr_err("%s: CPL message (opcode %u) had unknown TID %u\n",
+                              dev->name, opcode, G_TID(ntohl(p->opcode_tid)));
                }
 #endif
                if (ret & CPL_RET_BUF_DONE)
@@ -1099,7 +1092,7 @@ static void set_l2t_ix(struct t3cdev *tdev, u32 tid, struct l2t_entry *e)
 
        skb = alloc_skb(sizeof(*req), GFP_ATOMIC);
        if (!skb) {
-               printk(KERN_ERR "%s: cannot allocate skb!\n", __func__);
+               pr_err("%s: cannot allocate skb!\n", __func__);
                return;
        }
        skb->priority = CPL_PRIORITY_CONTROL;
@@ -1114,11 +1107,11 @@ static void set_l2t_ix(struct t3cdev *tdev, u32 tid, struct l2t_entry *e)
        tdev->send(tdev, skb);
 }
 
-static void cxgb_redirect(struct dst_entry *old, struct neighbour *old_neigh,
-                         struct dst_entry *new, struct neighbour *new_neigh,
+static void cxgb_redirect(struct dst_entry *old, struct dst_entry *new,
+                         struct neighbour *neigh,
                          const void *daddr)
 {
-       struct net_device *olddev, *newdev;
+       struct net_device *dev;
        struct tid_info *ti;
        struct t3cdev *tdev;
        u32 tid;
@@ -1126,29 +1119,17 @@ static void cxgb_redirect(struct dst_entry *old, struct neighbour *old_neigh,
        struct l2t_entry *e;
        struct t3c_tid_entry *te;
 
-       olddev = old_neigh->dev;
-       newdev = new_neigh->dev;
+       dev = neigh->dev;
 
-       if (!is_offloading(olddev))
-               return;
-       if (!is_offloading(newdev)) {
-               printk(KERN_WARNING "%s: Redirect to non-offload "
-                      "device ignored.\n", __func__);
+       if (!is_offloading(dev))
                return;
-       }
-       tdev = dev2t3cdev(olddev);
+       tdev = dev2t3cdev(dev);
        BUG_ON(!tdev);
-       if (tdev != dev2t3cdev(newdev)) {
-               printk(KERN_WARNING "%s: Redirect to different "
-                      "offload device ignored.\n", __func__);
-               return;
-       }
 
        /* Add new L2T entry */
-       e = t3_l2t_get(tdev, new, newdev, daddr);
+       e = t3_l2t_get(tdev, new, dev, daddr);
        if (!e) {
-               printk(KERN_ERR "%s: couldn't allocate new l2t entry!\n",
-                      __func__);
+               pr_err("%s: couldn't allocate new l2t entry!\n", __func__);
                return;
        }
 
index dd901c5061b910a607f54105d99eef7ea1690f49..9096dc09c72f1c1ad16cdfa27a3d283f6c33fea6 100644 (file)
@@ -1278,7 +1278,7 @@ netdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        /* update port statistics */
-       if (skb->ip_summed == CHECKSUM_COMPLETE)
+       if (skb->ip_summed == CHECKSUM_PARTIAL)
                qs->port_stats[SGE_PSTAT_TX_CSUM]++;
        if (skb_shinfo(skb)->gso_size)
                qs->port_stats[SGE_PSTAT_TSO]++;
index 3dee68612c9e87868e3b5b61b475693273480319..c74a898fcd4f7c41bd338ba08fa8e73b078ff5db 100644 (file)
@@ -3725,8 +3725,6 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
 
                memcpy(adapter->port[i]->dev_addr, hw_addr,
                       ETH_ALEN);
-               memcpy(adapter->port[i]->perm_addr, hw_addr,
-                      ETH_ALEN);
                init_link_config(&p->link_config, p->phy.caps);
                p->phy.ops->power_down(&p->phy, 1);
 
index f0718e1a83696b0e2ec0b8fad9121288ecda81bc..424f8ed67d3984d6db2b0ffbc9b4f35c7cb4df42 100644 (file)
@@ -4016,8 +4016,7 @@ static int adap_init0_no_config(struct adapter *adapter, int reset)
                                                  VFRES_NEQ, VFRES_NETHCTRL,
                                                  VFRES_NIQFLINT, VFRES_NIQ,
                                                  VFRES_TC, VFRES_NVI,
-                                                 FW_PFVF_CMD_CMASK_GET(
-                                                 FW_PFVF_CMD_CMASK_MASK),
+                                                 FW_PFVF_CMD_CMASK_MASK,
                                                  pfvfres_pmask(
                                                  adapter, pf, vf),
                                                  VFRES_NEXACTF,
@@ -5131,7 +5130,7 @@ static int __init cxgb4_init_module(void)
        /* Debugfs support is optional, just warn if this fails */
        cxgb4_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL);
        if (!cxgb4_debugfs_root)
-               pr_warning("could not create debugfs entry, continuing\n");
+               pr_warn("could not create debugfs entry, continuing\n");
 
        ret = pci_register_driver(&cxgb4_driver);
        if (ret < 0)
index 22f3af5166bf50ec7d2c6b7d2bd8778b6e15e963..4ce62031f62fa3a51500d8a571feba701e2fa6ed 100644 (file)
@@ -3603,7 +3603,6 @@ int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
                p->lport = j;
                p->rss_size = rss_size;
                memcpy(adap->port[i]->dev_addr, addr, ETH_ALEN);
-               memcpy(adap->port[i]->perm_addr, addr, ETH_ALEN);
                adap->port[i]->dev_id = j;
 
                ret = ntohl(c.u.info.lstatus_to_modtype);
index 611396c4b3810020264b638523566c3a8a48aba6..68eaa9c88c7d8a77646bd217e00877a281254a59 100644 (file)
@@ -466,7 +466,6 @@ static inline void t4_os_set_hw_addr(struct adapter *adapter, int pidx,
                                     u8 hw_addr[])
 {
        memcpy(adapter->port[pidx]->dev_addr, hw_addr, ETH_ALEN);
-       memcpy(adapter->port[pidx]->perm_addr, hw_addr, ETH_ALEN);
 }
 
 /**
index 0188df705719d8d601c6d4dd4685f1f762c023f6..56b46ab2d4c5ae452410da4469ab7b2c86ba1894 100644 (file)
@@ -33,6 +33,8 @@
  * SOFTWARE.
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/init.h>
@@ -196,11 +198,10 @@ void t4vf_os_link_changed(struct adapter *adapter, int pidx, int link_ok)
                        break;
                }
 
-               printk(KERN_INFO "%s: link up, %s, full-duplex, %s PAUSE\n",
-                      dev->name, s, fc);
+               netdev_info(dev, "link up, %s, full-duplex, %s PAUSE\n", s, fc);
        } else {
                netif_carrier_off(dev);
-               printk(KERN_INFO "%s: link down\n", dev->name);
+               netdev_info(dev, "link down\n");
        }
 }
 
@@ -2465,8 +2466,6 @@ static const struct net_device_ops cxgb4vf_netdev_ops     = {
 static int cxgb4vf_pci_probe(struct pci_dev *pdev,
                             const struct pci_device_id *ent)
 {
-       static int version_printed;
-
        int pci_using_dac;
        int err, pidx;
        unsigned int pmask;
@@ -2478,10 +2477,7 @@ static int cxgb4vf_pci_probe(struct pci_dev *pdev,
         * Print our driver banner the first time we're called to initialize a
         * device.
         */
-       if (version_printed == 0) {
-               printk(KERN_INFO "%s - version %s\n", DRV_DESC, DRV_VERSION);
-               version_printed = 1;
-       }
+       pr_info_once("%s - version %s\n", DRV_DESC, DRV_VERSION);
 
        /*
         * Initialize generic PCI device state.
@@ -2920,18 +2916,15 @@ static int __init cxgb4vf_module_init(void)
         * Vet our module parameters.
         */
        if (msi != MSI_MSIX && msi != MSI_MSI) {
-               printk(KERN_WARNING KBUILD_MODNAME
-                      ": bad module parameter msi=%d; must be %d"
-                      " (MSI-X or MSI) or %d (MSI)\n",
-                      msi, MSI_MSIX, MSI_MSI);
+               pr_warn("bad module parameter msi=%d; must be %d (MSI-X or MSI) or %d (MSI)\n",
+                       msi, MSI_MSIX, MSI_MSI);
                return -EINVAL;
        }
 
        /* Debugfs support is optional, just warn if this fails */
        cxgb4vf_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL);
        if (IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
-               printk(KERN_WARNING KBUILD_MODNAME ": could not create"
-                      " debugfs entry, continuing\n");
+               pr_warn("could not create debugfs entry, continuing\n");
 
        ret = pci_register_driver(&cxgb4vf_driver);
        if (ret < 0 && !IS_ERR_OR_NULL(cxgb4vf_debugfs_root))
index ebccebff1437e44a6068f7f7ed37cc70e823f552..ec1a233622c6ae704f9b37bb4a2f4805d2860b1a 100644 (file)
@@ -1490,7 +1490,8 @@ static int enic_request_intr(struct enic *enic)
 
                for (i = 0; i < enic->rq_count; i++) {
                        intr = enic_msix_rq_intr(enic, i);
-                       sprintf(enic->msix[intr].devname,
+                       snprintf(enic->msix[intr].devname,
+                               sizeof(enic->msix[intr].devname),
                                "%.11s-rx-%d", netdev->name, i);
                        enic->msix[intr].isr = enic_isr_msix_rq;
                        enic->msix[intr].devid = &enic->napi[i];
@@ -1498,20 +1499,23 @@ static int enic_request_intr(struct enic *enic)
 
                for (i = 0; i < enic->wq_count; i++) {
                        intr = enic_msix_wq_intr(enic, i);
-                       sprintf(enic->msix[intr].devname,
+                       snprintf(enic->msix[intr].devname,
+                               sizeof(enic->msix[intr].devname),
                                "%.11s-tx-%d", netdev->name, i);
                        enic->msix[intr].isr = enic_isr_msix_wq;
                        enic->msix[intr].devid = enic;
                }
 
                intr = enic_msix_err_intr(enic);
-               sprintf(enic->msix[intr].devname,
+               snprintf(enic->msix[intr].devname,
+                       sizeof(enic->msix[intr].devname),
                        "%.11s-err", netdev->name);
                enic->msix[intr].isr = enic_isr_msix_err;
                enic->msix[intr].devid = enic;
 
                intr = enic_msix_notify_intr(enic);
-               sprintf(enic->msix[intr].devname,
+               snprintf(enic->msix[intr].devname,
+                       sizeof(enic->msix[intr].devname),
                        "%.11s-notify", netdev->name);
                enic->msix[intr].isr = enic_isr_msix_notify;
                enic->msix[intr].devid = enic;
index 37940279ded82e7ace413b06c62068de8ea7dd48..68262aa57d017eb2d2e3b00623503a55005d6649 100644 (file)
@@ -17,21 +17,5 @@ config NET_VENDOR_DEC
          your specific card in the following questions.
 
 if NET_VENDOR_DEC
-
-config EWRK3
-       tristate "EtherWORKS 3 (DE203, DE204, DE205) support"
-       depends on ISA
-       select CRC32
-       ---help---
-         This driver supports the DE203, DE204 and DE205 network (Ethernet)
-         cards. If this is for you, say Y and read
-         <file:Documentation/networking/ewrk3.txt> in the kernel source as
-         well as the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called ewrk3.
-
 source "drivers/net/ethernet/dec/tulip/Kconfig"
-
 endif # NET_VENDOR_DEC
index 1b01ed8d42c85ed95f2e41b0e80e4b2ef3929273..32993fccbbfd8dc3aeb884da6e9d1b6b3e35153f 100644 (file)
@@ -2,5 +2,4 @@
 # Makefile for the Digital Equipment Inc. network device drivers.
 #
 
-obj-$(CONFIG_EWRK3) += ewrk3.o
 obj-$(CONFIG_NET_TULIP) += tulip/
diff --git a/drivers/net/ethernet/dec/ewrk3.c b/drivers/net/ethernet/dec/ewrk3.c
deleted file mode 100644 (file)
index 5015172..0000000
+++ /dev/null
@@ -1,1961 +0,0 @@
-/*  ewrk3.c: A DIGITAL EtherWORKS 3 ethernet driver for Linux.
-
-   Written 1994 by David C. Davies.
-
-   Copyright 1994 Digital Equipment Corporation.
-
-   This software may be used and distributed according to the terms of
-   the GNU General Public License, incorporated herein by reference.
-
-   This driver is written for the Digital Equipment Corporation series
-   of EtherWORKS ethernet cards:
-
-   DE203 Turbo (BNC)
-   DE204 Turbo (TP)
-   DE205 Turbo (TP BNC)
-
-   The driver has been tested on a relatively busy  network using the DE205
-   card and benchmarked with 'ttcp': it transferred 16M  of data at 975kB/s
-   (7.8Mb/s) to a DECstation 5000/200.
-
-   The author may be reached at davies@maniac.ultranet.com.
-
-   =========================================================================
-   This driver has been written  substantially  from scratch, although  its
-   inheritance of style and stack interface from 'depca.c' and in turn from
-   Donald Becker's 'lance.c' should be obvious.
-
-   The  DE203/4/5 boards  all  use a new proprietary   chip in place of the
-   LANCE chip used in prior cards  (DEPCA, DE100, DE200/1/2, DE210, DE422).
-   Use the depca.c driver in the standard distribution  for the LANCE based
-   cards from DIGITAL; this driver will not work with them.
-
-   The DE203/4/5 cards have 2  main modes: shared memory  and I/O only. I/O
-   only makes  all the card accesses through  I/O transactions and  no high
-   (shared)  memory is used. This  mode provides a >48% performance penalty
-   and  is deprecated in this  driver,  although allowed to provide initial
-   setup when hardstrapped.
-
-   The shared memory mode comes in 3 flavours: 2kB, 32kB and 64kB. There is
-   no point in using any mode other than the 2kB  mode - their performances
-   are virtually identical, although the driver has  been tested in the 2kB
-   and 32kB modes. I would suggest you uncomment the line:
-
-   FORCE_2K_MODE;
-
-   to allow the driver to configure the card as a  2kB card at your current
-   base  address, thus leaving more  room to clutter  your  system box with
-   other memory hungry boards.
-
-   As many ISA  and EISA cards  can be supported  under this driver  as you
-   wish, limited primarily  by the available IRQ lines,  rather than by the
-   available I/O addresses  (24 ISA,  16 EISA).   I have  checked different
-   configurations of  multiple  depca cards and  ewrk3 cards  and have  not
-   found a problem yet (provided you have at least depca.c v0.38) ...
-
-   The board IRQ setting   must be at  an unused  IRQ which is  auto-probed
-   using  Donald  Becker's autoprobe  routines.   All  these cards   are at
-   {5,10,11,15}.
-
-   No 16MB memory  limitation should exist with this  driver as DMA is  not
-   used and the common memory area is in low memory on the network card (my
-   current system has 20MB and I've not had problems yet).
-
-   The ability to load  this driver as a  loadable module has been included
-   and used  extensively during the  driver development (to save those long
-   reboot sequences). To utilise this ability, you have to do 8 things:
-
-   0) have a copy of the loadable modules code installed on your system.
-   1) copy ewrk3.c from the  /linux/drivers/net directory to your favourite
-   temporary directory.
-   2) edit the  source code near  line 1898 to reflect  the I/O address and
-   IRQ you're using.
-   3) compile  ewrk3.c, but include -DMODULE in  the command line to ensure
-   that the correct bits are compiled (see end of source code).
-   4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
-   kernel with the ewrk3 configuration turned off and reboot.
-   5) insmod ewrk3.o
-   [Alan Cox: Changed this so you can insmod ewrk3.o irq=x io=y]
-   [Adam Kropelin: now accepts irq=x1,x2 io=y1,y2 for multiple cards]
-   6) run the net startup bits for your new eth?? interface manually
-   (usually /etc/rc.inet[12] at boot time).
-   7) enjoy!
-
-   Note that autoprobing is not allowed in loadable modules - the system is
-   already up and running and you're messing with interrupts.
-
-   To unload a module, turn off the associated interface
-   'ifconfig eth?? down' then 'rmmod ewrk3'.
-
-   Promiscuous   mode has been  turned  off  in this driver,   but  all the
-   multicast  address bits  have been   turned on. This  improved the  send
-   performance on a busy network by about 13%.
-
-   Ioctl's have now been provided (primarily because  I wanted to grab some
-   packet size statistics). They  are patterned after 'plipconfig.c' from a
-   suggestion by Alan Cox.  Using these  ioctls, you can enable promiscuous
-   mode, add/delete multicast  addresses, change the hardware address,  get
-   packet size distribution statistics and muck around with the control and
-   status register. I'll add others if and when the need arises.
-
-   TO DO:
-   ------
-
-
-   Revision History
-   ----------------
-
-   Version   Date        Description
-
-   0.1     26-aug-94   Initial writing. ALPHA code release.
-   0.11    31-aug-94   Fixed: 2k mode memory base calc.,
-   LeMAC version calc.,
-   IRQ vector assignments during autoprobe.
-   0.12    31-aug-94   Tested working on LeMAC2 (DE20[345]-AC) card.
-   Fixed up MCA hash table algorithm.
-   0.20     4-sep-94   Added IOCTL functionality.
-   0.21    14-sep-94   Added I/O mode.
-   0.21axp 15-sep-94   Special version for ALPHA AXP Linux V1.0.
-   0.22    16-sep-94   Added more IOCTLs & tidied up.
-   0.23    21-sep-94   Added transmit cut through.
-   0.24    31-oct-94   Added uid checks in some ioctls.
-   0.30     1-nov-94   BETA code release.
-   0.31     5-dec-94   Added check/allocate region code.
-   0.32    16-jan-95   Broadcast packet fix.
-   0.33    10-Feb-95   Fix recognition bug reported by <bkm@star.rl.ac.uk>.
-   0.40    27-Dec-95   Rationalise MODULE and autoprobe code.
-   Rewrite for portability & updated.
-   ALPHA support from <jestabro@amt.tay1.dec.com>
-   Added verify_area() calls in ewrk3_ioctl() from
-   suggestion by <heiko@colossus.escape.de>.
-   Add new multicasting code.
-   0.41    20-Jan-96   Fix IRQ set up problem reported by
-   <kenneth@bbs.sas.ntu.ac.sg>.
-   0.42    22-Apr-96   Fix alloc_device() bug <jari@markkus2.fimr.fi>
-   0.43    16-Aug-96   Update alloc_device() to conform to de4x5.c
-   0.44    08-Nov-01   use library crc32 functions <Matt_Domsch@dell.com>
-   0.45    19-Jul-02   fix unaligned access on alpha <martin@bruli.net>
-   0.46    10-Oct-02   Multiple NIC support when module <akropel1@rochester.rr.com>
-   0.47    18-Oct-02   ethtool support <akropel1@rochester.rr.com>
-   0.48    18-Oct-02   cli/sti removal for 2.5 <vda@port.imtp.ilyichevsk.odessa.ua>
-   ioctl locking, signature search cleanup <akropel1@rochester.rr.com>
-
-   =========================================================================
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/crc32.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/ethtool.h>
-#include <linux/time.h>
-#include <linux/types.h>
-#include <linux/unistd.h>
-#include <linux/ctype.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/uaccess.h>
-
-#include "ewrk3.h"
-
-#define DRV_NAME       "ewrk3"
-#define DRV_VERSION    "0.48"
-
-static char version[] __initdata =
-DRV_NAME ":v" DRV_VERSION " 2002/10/18 davies@maniac.ultranet.com\n";
-
-#ifdef EWRK3_DEBUG
-static int ewrk3_debug = EWRK3_DEBUG;
-#else
-static int ewrk3_debug = 1;
-#endif
-
-#define EWRK3_NDA 0xffe0       /* No Device Address */
-
-#define PROBE_LENGTH    32
-#define ETH_PROM_SIG    0xAA5500FFUL
-
-#ifndef EWRK3_SIGNATURE
-#define EWRK3_SIGNATURE {"DE203","DE204","DE205",""}
-#define EWRK3_STRLEN 8
-#endif
-
-#ifndef EWRK3_RAM_BASE_ADDRESSES
-#define EWRK3_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0x00000}
-#endif
-
-/*
-   ** Sets up the I/O area for the autoprobe.
- */
-#define EWRK3_IO_BASE 0x100    /* Start address for probe search */
-#define EWRK3_IOP_INC 0x20     /* I/O address increment */
-#define EWRK3_TOTAL_SIZE 0x20  /* required I/O address length */
-
-#ifndef MAX_NUM_EWRK3S
-#define MAX_NUM_EWRK3S 21
-#endif
-
-#ifndef EWRK3_EISA_IO_PORTS
-#define EWRK3_EISA_IO_PORTS 0x0c00     /* I/O port base address, slot 0 */
-#endif
-
-#ifndef MAX_EISA_SLOTS
-#define MAX_EISA_SLOTS 16
-#define EISA_SLOT_INC 0x1000
-#endif
-
-#define QUEUE_PKT_TIMEOUT (1*HZ)       /* Jiffies */
-
-/*
-   ** EtherWORKS 3 shared memory window sizes
- */
-#define IO_ONLY         0x00
-#define SHMEM_2K        0x800
-#define SHMEM_32K       0x8000
-#define SHMEM_64K       0x10000
-
-/*
-   ** EtherWORKS 3 IRQ ENABLE/DISABLE
- */
-#define ENABLE_IRQs { \
-  icr |= lp->irq_mask;\
-  outb(icr, EWRK3_ICR);                     /* Enable the IRQs */\
-}
-
-#define DISABLE_IRQs { \
-  icr = inb(EWRK3_ICR);\
-  icr &= ~lp->irq_mask;\
-  outb(icr, EWRK3_ICR);                     /* Disable the IRQs */\
-}
-
-/*
-   ** EtherWORKS 3 START/STOP
- */
-#define START_EWRK3 { \
-  csr = inb(EWRK3_CSR);\
-  csr &= ~(CSR_TXD|CSR_RXD);\
-  outb(csr, EWRK3_CSR);                     /* Enable the TX and/or RX */\
-}
-
-#define STOP_EWRK3 { \
-  csr = (CSR_TXD|CSR_RXD);\
-  outb(csr, EWRK3_CSR);                     /* Disable the TX and/or RX */\
-}
-
-/*
-   ** The EtherWORKS 3 private structure
- */
-#define EWRK3_PKT_STAT_SZ 16
-#define EWRK3_PKT_BIN_SZ  128  /* Should be >=100 unless you
-                                  increase EWRK3_PKT_STAT_SZ */
-
-struct ewrk3_stats {
-       u32 bins[EWRK3_PKT_STAT_SZ];
-       u32 unicast;
-       u32 multicast;
-       u32 broadcast;
-       u32 excessive_collisions;
-       u32 tx_underruns;
-       u32 excessive_underruns;
-};
-
-struct ewrk3_private {
-       char adapter_name[80];  /* Name exported to /proc/ioports */
-       u_long shmem_base;      /* Shared memory start address */
-       void __iomem *shmem;
-       u_long shmem_length;    /* Shared memory window length */
-       struct ewrk3_stats pktStats; /* Private stats counters */
-       u_char irq_mask;        /* Adapter IRQ mask bits */
-       u_char mPage;           /* Maximum 2kB Page number */
-       u_char lemac;           /* Chip rev. level */
-       u_char hard_strapped;   /* Don't allow a full open */
-       u_char txc;             /* Transmit cut through */
-       void __iomem *mctbl;    /* Pointer to the multicast table */
-       u_char led_mask;        /* Used to reserve LED access for ethtool */
-       spinlock_t hw_lock;
-};
-
-/*
-   ** Force the EtherWORKS 3 card to be in 2kB MODE
- */
-#define FORCE_2K_MODE { \
-  shmem_length = SHMEM_2K;\
-  outb(((mem_start - 0x80000) >> 11), EWRK3_MBR);\
-}
-
-/*
-   ** Public Functions
- */
-static int ewrk3_open(struct net_device *dev);
-static netdev_tx_t ewrk3_queue_pkt(struct sk_buff *skb, struct net_device *dev);
-static irqreturn_t ewrk3_interrupt(int irq, void *dev_id);
-static int ewrk3_close(struct net_device *dev);
-static void set_multicast_list(struct net_device *dev);
-static int ewrk3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
-static const struct ethtool_ops ethtool_ops_203;
-static const struct ethtool_ops ethtool_ops;
-
-/*
-   ** Private functions
- */
-static int ewrk3_hw_init(struct net_device *dev, u_long iobase);
-static void ewrk3_init(struct net_device *dev);
-static int ewrk3_rx(struct net_device *dev);
-static int ewrk3_tx(struct net_device *dev);
-static void ewrk3_timeout(struct net_device *dev);
-
-static void EthwrkSignature(char *name, char *eeprom_image);
-static int DevicePresent(u_long iobase);
-static void SetMulticastFilter(struct net_device *dev);
-static int EISA_signature(char *name, s32 eisa_id);
-
-static int Read_EEPROM(u_long iobase, u_char eaddr);
-static int Write_EEPROM(short data, u_long iobase, u_char eaddr);
-static u_char get_hw_addr(struct net_device *dev, u_char * eeprom_image, char chipType);
-
-static int ewrk3_probe1(struct net_device *dev, u_long iobase, int irq);
-static int isa_probe(struct net_device *dev, u_long iobase);
-static int eisa_probe(struct net_device *dev, u_long iobase);
-
-static u_char irq[MAX_NUM_EWRK3S+1] = {5, 0, 10, 3, 11, 9, 15, 12};
-
-static char name[EWRK3_STRLEN + 1];
-static int num_ewrks3s;
-
-/*
-   ** Miscellaneous defines...
- */
-#define INIT_EWRK3 {\
-    outb(EEPROM_INIT, EWRK3_IOPR);\
-    mdelay(1);\
-}
-
-#ifndef MODULE
-struct net_device * __init ewrk3_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct ewrk3_private));
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-       }
-
-       err = ewrk3_probe1(dev, dev->base_addr, dev->irq);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-
-}
-#endif
-
-static int __init ewrk3_probe1(struct net_device *dev, u_long iobase, int irq)
-{
-       int err;
-
-       dev->base_addr = iobase;
-       dev->irq = irq;
-
-       /* Address PROM pattern */
-       err = isa_probe(dev, iobase);
-       if (err != 0)
-               err = eisa_probe(dev, iobase);
-
-       if (err)
-               return err;
-
-       err = register_netdev(dev);
-       if (err)
-               release_region(dev->base_addr, EWRK3_TOTAL_SIZE);
-
-       return err;
-}
-
-static const struct net_device_ops ewrk3_netdev_ops = {
-       .ndo_open               = ewrk3_open,
-       .ndo_start_xmit         = ewrk3_queue_pkt,
-       .ndo_stop               = ewrk3_close,
-       .ndo_set_rx_mode        = set_multicast_list,
-       .ndo_do_ioctl           = ewrk3_ioctl,
-       .ndo_tx_timeout         = ewrk3_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-static int __init
-ewrk3_hw_init(struct net_device *dev, u_long iobase)
-{
-       struct ewrk3_private *lp;
-       int i, status = 0;
-       u_long mem_start, shmem_length;
-       u_char cr, cmr, icr, nicsr, lemac, hard_strapped = 0;
-       u_char eeprom_image[EEPROM_MAX], chksum, eisa_cr = 0;
-
-       /*
-       ** Stop the EWRK3. Enable the DBR ROM. Disable interrupts and remote boot.
-       ** This also disables the EISA_ENABLE bit in the EISA Control Register.
-        */
-       if (iobase > 0x400)
-               eisa_cr = inb(EISA_CR);
-       INIT_EWRK3;
-
-       nicsr = inb(EWRK3_CSR);
-
-       icr = inb(EWRK3_ICR);
-       icr &= 0x70;
-       outb(icr, EWRK3_ICR);   /* Disable all the IRQs */
-
-       if (nicsr != (CSR_TXD | CSR_RXD))
-               return -ENXIO;
-
-       /* Check that the EEPROM is alive and well and not living on Pluto... */
-       for (chksum = 0, i = 0; i < EEPROM_MAX; i += 2) {
-               union {
-                       short val;
-                       char c[2];
-               } tmp;
-
-               tmp.val = (short) Read_EEPROM(iobase, (i >> 1));
-               eeprom_image[i] = tmp.c[0];
-               eeprom_image[i + 1] = tmp.c[1];
-               chksum += eeprom_image[i] + eeprom_image[i + 1];
-       }
-
-       if (chksum != 0) {      /* Bad EEPROM Data! */
-               printk("%s: Device has a bad on-board EEPROM.\n", dev->name);
-               return -ENXIO;
-       }
-
-       EthwrkSignature(name, eeprom_image);
-       if (*name == '\0')
-               return -ENXIO;
-
-       dev->base_addr = iobase;
-
-       if (iobase > 0x400) {
-               outb(eisa_cr, EISA_CR);         /* Rewrite the EISA CR */
-       }
-       lemac = eeprom_image[EEPROM_CHIPVER];
-       cmr = inb(EWRK3_CMR);
-
-       if (((lemac == LeMAC) && ((cmr & CMR_NO_EEPROM) != CMR_NO_EEPROM)) ||
-           ((lemac == LeMAC2) && !(cmr & CMR_HS))) {
-               printk("%s: %s at %#4lx", dev->name, name, iobase);
-               hard_strapped = 1;
-       } else if ((iobase & 0x0fff) == EWRK3_EISA_IO_PORTS) {
-               /* EISA slot address */
-               printk("%s: %s at %#4lx (EISA slot %ld)",
-                      dev->name, name, iobase, ((iobase >> 12) & 0x0f));
-       } else {        /* ISA port address */
-               printk("%s: %s at %#4lx", dev->name, name, iobase);
-       }
-
-       printk(", h/w address ");
-       if (lemac != LeMAC2)
-               DevicePresent(iobase);  /* need after EWRK3_INIT */
-       status = get_hw_addr(dev, eeprom_image, lemac);
-       printk("%pM\n", dev->dev_addr);
-
-       if (status) {
-               printk("      which has an EEPROM CRC error.\n");
-               return -ENXIO;
-       }
-
-       if (lemac == LeMAC2) {  /* Special LeMAC2 CMR things */
-               cmr &= ~(CMR_RA | CMR_WB | CMR_LINK | CMR_POLARITY | CMR_0WS);
-               if (eeprom_image[EEPROM_MISC0] & READ_AHEAD)
-                       cmr |= CMR_RA;
-               if (eeprom_image[EEPROM_MISC0] & WRITE_BEHIND)
-                       cmr |= CMR_WB;
-               if (eeprom_image[EEPROM_NETMAN0] & NETMAN_POL)
-                       cmr |= CMR_POLARITY;
-               if (eeprom_image[EEPROM_NETMAN0] & NETMAN_LINK)
-                       cmr |= CMR_LINK;
-               if (eeprom_image[EEPROM_MISC0] & _0WS_ENA)
-                       cmr |= CMR_0WS;
-       }
-       if (eeprom_image[EEPROM_SETUP] & SETUP_DRAM)
-               cmr |= CMR_DRAM;
-       outb(cmr, EWRK3_CMR);
-
-       cr = inb(EWRK3_CR);     /* Set up the Control Register */
-       cr |= eeprom_image[EEPROM_SETUP] & SETUP_APD;
-       if (cr & SETUP_APD)
-               cr |= eeprom_image[EEPROM_SETUP] & SETUP_PS;
-       cr |= eeprom_image[EEPROM_MISC0] & FAST_BUS;
-       cr |= eeprom_image[EEPROM_MISC0] & ENA_16;
-       outb(cr, EWRK3_CR);
-
-       /*
-       ** Determine the base address and window length for the EWRK3
-       ** RAM from the memory base register.
-       */
-       mem_start = inb(EWRK3_MBR);
-       shmem_length = 0;
-       if (mem_start != 0) {
-               if ((mem_start >= 0x0a) && (mem_start <= 0x0f)) {
-                       mem_start *= SHMEM_64K;
-                       shmem_length = SHMEM_64K;
-               } else if ((mem_start >= 0x14) && (mem_start <= 0x1f)) {
-                       mem_start *= SHMEM_32K;
-                       shmem_length = SHMEM_32K;
-               } else if ((mem_start >= 0x40) && (mem_start <= 0xff)) {
-                       mem_start = mem_start * SHMEM_2K + 0x80000;
-                       shmem_length = SHMEM_2K;
-               } else {
-                       return -ENXIO;
-               }
-       }
-       /*
-       ** See the top of this source code for comments about
-       ** uncommenting this line.
-       */
-/*          FORCE_2K_MODE; */
-
-       if (hard_strapped) {
-               printk("      is hard strapped.\n");
-       } else if (mem_start) {
-               printk("      has a %dk RAM window", (int) (shmem_length >> 10));
-               printk(" at 0x%.5lx", mem_start);
-       } else {
-               printk("      is in I/O only mode");
-       }
-
-       lp = netdev_priv(dev);
-       lp->shmem_base = mem_start;
-       lp->shmem = ioremap(mem_start, shmem_length);
-       if (!lp->shmem)
-               return -ENOMEM;
-       lp->shmem_length = shmem_length;
-       lp->lemac = lemac;
-       lp->hard_strapped = hard_strapped;
-       lp->led_mask = CR_LED;
-       spin_lock_init(&lp->hw_lock);
-
-       lp->mPage = 64;
-       if (cmr & CMR_DRAM)
-               lp->mPage <<= 1;        /* 2 DRAMS on module */
-
-       sprintf(lp->adapter_name, "%s (%s)", name, dev->name);
-
-       lp->irq_mask = ICR_TNEM | ICR_TXDM | ICR_RNEM | ICR_RXDM;
-
-       if (!hard_strapped) {
-               /*
-               ** Enable EWRK3 board interrupts for autoprobing
-               */
-               icr |= ICR_IE;  /* Enable interrupts */
-               outb(icr, EWRK3_ICR);
-
-               /* The DMA channel may be passed in on this parameter. */
-               dev->dma = 0;
-
-               /* To auto-IRQ we enable the initialization-done and DMA err,
-                  interrupts. For now we will always get a DMA error. */
-               if (dev->irq < 2) {
-#ifndef MODULE
-                       u_char irqnum;
-                       unsigned long irq_mask;
-
-
-                       irq_mask = probe_irq_on();
-
-                       /*
-                       ** Trigger a TNE interrupt.
-                       */
-                       icr |= ICR_TNEM;
-                       outb(1, EWRK3_TDQ);     /* Write to the TX done queue */
-                       outb(icr, EWRK3_ICR);   /* Unmask the TXD interrupt */
-
-                       irqnum = irq[((icr & IRQ_SEL) >> 4)];
-
-                       mdelay(20);
-                       dev->irq = probe_irq_off(irq_mask);
-                       if ((dev->irq) && (irqnum == dev->irq)) {
-                               printk(" and uses IRQ%d.\n", dev->irq);
-                       } else {
-                               if (!dev->irq) {
-                                       printk(" and failed to detect IRQ line.\n");
-                               } else if ((irqnum == 1) && (lemac == LeMAC2)) {
-                                       printk(" and an illegal IRQ line detected.\n");
-                               } else {
-                                       printk(", but incorrect IRQ line detected.\n");
-                               }
-                               iounmap(lp->shmem);
-                               return -ENXIO;
-                       }
-
-                       DISABLE_IRQs;   /* Mask all interrupts */
-
-#endif                         /* MODULE */
-               } else {
-                       printk(" and requires IRQ%d.\n", dev->irq);
-               }
-       }
-
-       if (ewrk3_debug > 1) {
-               printk(version);
-       }
-       /* The EWRK3-specific entries in the device structure. */
-       dev->netdev_ops = &ewrk3_netdev_ops;
-       if (lp->adapter_name[4] == '3')
-               SET_ETHTOOL_OPS(dev, &ethtool_ops_203);
-       else
-               SET_ETHTOOL_OPS(dev, &ethtool_ops);
-       dev->watchdog_timeo = QUEUE_PKT_TIMEOUT;
-
-       dev->mem_start = 0;
-
-       return 0;
-}
-
-
-static int ewrk3_open(struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       u_long iobase = dev->base_addr;
-       int status = 0;
-       u_char icr, csr;
-
-       /*
-          ** Stop the TX and RX...
-        */
-       STOP_EWRK3;
-
-       if (!lp->hard_strapped) {
-               if (request_irq(dev->irq, (void *) ewrk3_interrupt, 0, "ewrk3", dev)) {
-                       printk("ewrk3_open(): Requested IRQ%d is busy\n", dev->irq);
-                       status = -EAGAIN;
-               } else {
-
-                       /*
-                          ** Re-initialize the EWRK3...
-                        */
-                       ewrk3_init(dev);
-
-                       if (ewrk3_debug > 1) {
-                               printk("%s: ewrk3 open with irq %d\n", dev->name, dev->irq);
-                               printk("  physical address: %pM\n", dev->dev_addr);
-                               if (lp->shmem_length == 0) {
-                                       printk("  no shared memory, I/O only mode\n");
-                               } else {
-                                       printk("  start of shared memory: 0x%08lx\n", lp->shmem_base);
-                                       printk("  window length: 0x%04lx\n", lp->shmem_length);
-                               }
-                               printk("  # of DRAMS: %d\n", ((inb(EWRK3_CMR) & 0x02) ? 2 : 1));
-                               printk("  csr:  0x%02x\n", inb(EWRK3_CSR));
-                               printk("  cr:   0x%02x\n", inb(EWRK3_CR));
-                               printk("  icr:  0x%02x\n", inb(EWRK3_ICR));
-                               printk("  cmr:  0x%02x\n", inb(EWRK3_CMR));
-                               printk("  fmqc: 0x%02x\n", inb(EWRK3_FMQC));
-                       }
-                       netif_start_queue(dev);
-                       /*
-                          ** Unmask EWRK3 board interrupts
-                        */
-                       icr = inb(EWRK3_ICR);
-                       ENABLE_IRQs;
-
-               }
-       } else {
-               printk(KERN_ERR "%s: ewrk3 available for hard strapped set up only.\n", dev->name);
-               printk(KERN_ERR "      Run the 'ewrk3setup' utility or remove the hard straps.\n");
-               return -EINVAL;
-       }
-
-       return status;
-}
-
-/*
-   ** Initialize the EtherWORKS 3 operating conditions
- */
-static void ewrk3_init(struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       u_char csr, page;
-       u_long iobase = dev->base_addr;
-       int i;
-
-       /*
-          ** Enable any multicasts
-        */
-       set_multicast_list(dev);
-
-       /*
-       ** Set hardware MAC address. Address is initialized from the EEPROM
-       ** during startup but may have since been changed by the user.
-       */
-       for (i=0; i<ETH_ALEN; i++)
-               outb(dev->dev_addr[i], EWRK3_PAR0 + i);
-
-       /*
-          ** Clean out any remaining entries in all the queues here
-        */
-       while (inb(EWRK3_TQ));
-       while (inb(EWRK3_TDQ));
-       while (inb(EWRK3_RQ));
-       while (inb(EWRK3_FMQ));
-
-       /*
-          ** Write a clean free memory queue
-        */
-       for (page = 1; page < lp->mPage; page++) {      /* Write the free page numbers */
-               outb(page, EWRK3_FMQ);  /* to the Free Memory Queue */
-       }
-
-       START_EWRK3;            /* Enable the TX and/or RX */
-}
-
-/*
- *  Transmit timeout
- */
-
-static void ewrk3_timeout(struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       u_char icr, csr;
-       u_long iobase = dev->base_addr;
-
-       if (!lp->hard_strapped)
-       {
-               printk(KERN_WARNING"%s: transmit timed/locked out, status %04x, resetting.\n",
-                      dev->name, inb(EWRK3_CSR));
-
-               /*
-                  ** Mask all board interrupts
-                */
-               DISABLE_IRQs;
-
-               /*
-                  ** Stop the TX and RX...
-                */
-               STOP_EWRK3;
-
-               ewrk3_init(dev);
-
-               /*
-                  ** Unmask EWRK3 board interrupts
-                */
-               ENABLE_IRQs;
-
-               dev->trans_start = jiffies; /* prevent tx timeout */
-               netif_wake_queue(dev);
-       }
-}
-
-/*
-   ** Writes a socket buffer to the free page queue
- */
-static netdev_tx_t ewrk3_queue_pkt(struct sk_buff *skb, struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       u_long iobase = dev->base_addr;
-       void __iomem *buf = NULL;
-       u_char icr;
-       u_char page;
-
-       spin_lock_irq (&lp->hw_lock);
-       DISABLE_IRQs;
-
-       /* if no resources available, exit, request packet be queued */
-       if (inb (EWRK3_FMQC) == 0) {
-               printk (KERN_WARNING "%s: ewrk3_queue_pkt(): No free resources...\n",
-                       dev->name);
-               printk (KERN_WARNING "%s: ewrk3_queue_pkt(): CSR: %02x ICR: %02x FMQC: %02x\n",
-                       dev->name, inb (EWRK3_CSR), inb (EWRK3_ICR),
-                       inb (EWRK3_FMQC));
-               goto err_out;
-       }
-
-       /*
-        ** Get a free page from the FMQ
-        */
-       if ((page = inb (EWRK3_FMQ)) >= lp->mPage) {
-               printk ("ewrk3_queue_pkt(): Invalid free memory page (%d).\n",
-                    (u_char) page);
-               goto err_out;
-       }
-
-
-       /*
-        ** Set up shared memory window and pointer into the window
-        */
-       if (lp->shmem_length == IO_ONLY) {
-               outb (page, EWRK3_IOPR);
-       } else if (lp->shmem_length == SHMEM_2K) {
-               buf = lp->shmem;
-               outb (page, EWRK3_MPR);
-       } else if (lp->shmem_length == SHMEM_32K) {
-               buf = (((short) page << 11) & 0x7800) + lp->shmem;
-               outb ((page >> 4), EWRK3_MPR);
-       } else if (lp->shmem_length == SHMEM_64K) {
-               buf = (((short) page << 11) & 0xf800) + lp->shmem;
-               outb ((page >> 5), EWRK3_MPR);
-       } else {
-               printk (KERN_ERR "%s: Oops - your private data area is hosed!\n",
-                       dev->name);
-               BUG ();
-       }
-
-       /*
-        ** Set up the buffer control structures and copy the data from
-        ** the socket buffer to the shared memory .
-        */
-       if (lp->shmem_length == IO_ONLY) {
-               int i;
-               u_char *p = skb->data;
-               outb ((char) (TCR_QMODE | TCR_PAD | TCR_IFC), EWRK3_DATA);
-               outb ((char) (skb->len & 0xff), EWRK3_DATA);
-               outb ((char) ((skb->len >> 8) & 0xff), EWRK3_DATA);
-               outb ((char) 0x04, EWRK3_DATA);
-               for (i = 0; i < skb->len; i++) {
-                       outb (*p++, EWRK3_DATA);
-               }
-               outb (page, EWRK3_TQ);  /* Start sending pkt */
-       } else {
-               writeb ((char) (TCR_QMODE | TCR_PAD | TCR_IFC), buf);   /* ctrl byte */
-               buf += 1;
-               writeb ((char) (skb->len & 0xff), buf); /* length (16 bit xfer) */
-               buf += 1;
-               if (lp->txc) {
-                       writeb(((skb->len >> 8) & 0xff) | XCT, buf);
-                       buf += 1;
-                       writeb (0x04, buf);     /* index byte */
-                       buf += 1;
-                       writeb (0x00, (buf + skb->len));        /* Write the XCT flag */
-                       memcpy_toio (buf, skb->data, PRELOAD);  /* Write PRELOAD bytes */
-                       outb (page, EWRK3_TQ);  /* Start sending pkt */
-                       memcpy_toio (buf + PRELOAD,
-                                        skb->data + PRELOAD,
-                                        skb->len - PRELOAD);
-                       writeb (0xff, (buf + skb->len));        /* Write the XCT flag */
-               } else {
-                       writeb ((skb->len >> 8) & 0xff, buf);
-                       buf += 1;
-                       writeb (0x04, buf);     /* index byte */
-                       buf += 1;
-                       memcpy_toio (buf, skb->data, skb->len); /* Write data bytes */
-                       outb (page, EWRK3_TQ);  /* Start sending pkt */
-               }
-       }
-
-       ENABLE_IRQs;
-       spin_unlock_irq (&lp->hw_lock);
-
-       dev->stats.tx_bytes += skb->len;
-       dev_kfree_skb (skb);
-
-       /* Check for free resources: stop Tx queue if there are none */
-       if (inb (EWRK3_FMQC) == 0)
-               netif_stop_queue (dev);
-
-       return NETDEV_TX_OK;
-
-err_out:
-       ENABLE_IRQs;
-       spin_unlock_irq (&lp->hw_lock);
-       return NETDEV_TX_BUSY;
-}
-
-/*
-   ** The EWRK3 interrupt handler.
- */
-static irqreturn_t ewrk3_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct ewrk3_private *lp;
-       u_long iobase;
-       u_char icr, cr, csr;
-
-       lp = netdev_priv(dev);
-       iobase = dev->base_addr;
-
-       /* get the interrupt information */
-       csr = inb(EWRK3_CSR);
-
-       /*
-        ** Mask the EWRK3 board interrupts and turn on the LED
-        */
-       spin_lock(&lp->hw_lock);
-       DISABLE_IRQs;
-
-       cr = inb(EWRK3_CR);
-       cr |= lp->led_mask;
-       outb(cr, EWRK3_CR);
-
-       if (csr & CSR_RNE)      /* Rx interrupt (packet[s] arrived) */
-               ewrk3_rx(dev);
-
-       if (csr & CSR_TNE)      /* Tx interrupt (packet sent) */
-               ewrk3_tx(dev);
-
-       /*
-        ** Now deal with the TX/RX disable flags. These are set when there
-        ** are no more resources. If resources free up then enable these
-        ** interrupts, otherwise mask them - failure to do this will result
-        ** in the system hanging in an interrupt loop.
-        */
-       if (inb(EWRK3_FMQC)) {  /* any resources available? */
-               lp->irq_mask |= ICR_TXDM | ICR_RXDM;    /* enable the interrupt source */
-               csr &= ~(CSR_TXD | CSR_RXD);    /* ensure restart of a stalled TX or RX */
-               outb(csr, EWRK3_CSR);
-               netif_wake_queue(dev);
-       } else {
-               lp->irq_mask &= ~(ICR_TXDM | ICR_RXDM);         /* disable the interrupt source */
-       }
-
-       /* Unmask the EWRK3 board interrupts and turn off the LED */
-       cr &= ~(lp->led_mask);
-       outb(cr, EWRK3_CR);
-       ENABLE_IRQs;
-       spin_unlock(&lp->hw_lock);
-       return IRQ_HANDLED;
-}
-
-/* Called with lp->hw_lock held */
-static int ewrk3_rx(struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       u_long iobase = dev->base_addr;
-       int i, status = 0;
-       u_char page;
-       void __iomem *buf = NULL;
-
-       while (inb(EWRK3_RQC) && !status) {     /* Whilst there's incoming data */
-               if ((page = inb(EWRK3_RQ)) < lp->mPage) {       /* Get next entry's buffer page */
-                       /*
-                          ** Set up shared memory window and pointer into the window
-                        */
-                       if (lp->shmem_length == IO_ONLY) {
-                               outb(page, EWRK3_IOPR);
-                       } else if (lp->shmem_length == SHMEM_2K) {
-                               buf = lp->shmem;
-                               outb(page, EWRK3_MPR);
-                       } else if (lp->shmem_length == SHMEM_32K) {
-                               buf = (((short) page << 11) & 0x7800) + lp->shmem;
-                               outb((page >> 4), EWRK3_MPR);
-                       } else if (lp->shmem_length == SHMEM_64K) {
-                               buf = (((short) page << 11) & 0xf800) + lp->shmem;
-                               outb((page >> 5), EWRK3_MPR);
-                       } else {
-                               status = -1;
-                               printk("%s: Oops - your private data area is hosed!\n", dev->name);
-                       }
-
-                       if (!status) {
-                               char rx_status;
-                               int pkt_len;
-
-                               if (lp->shmem_length == IO_ONLY) {
-                                       rx_status = inb(EWRK3_DATA);
-                                       pkt_len = inb(EWRK3_DATA);
-                                       pkt_len |= ((u_short) inb(EWRK3_DATA) << 8);
-                               } else {
-                                       rx_status = readb(buf);
-                                       buf += 1;
-                                       pkt_len = readw(buf);
-                                       buf += 3;
-                               }
-
-                               if (!(rx_status & R_ROK)) {     /* There was an error. */
-                                       dev->stats.rx_errors++; /* Update the error stats. */
-                                       if (rx_status & R_DBE)
-                                               dev->stats.rx_frame_errors++;
-                                       if (rx_status & R_CRC)
-                                               dev->stats.rx_crc_errors++;
-                                       if (rx_status & R_PLL)
-                                               dev->stats.rx_fifo_errors++;
-                               } else {
-                                       struct sk_buff *skb;
-                                       skb = netdev_alloc_skb(dev,
-                                                       pkt_len + 2);
-
-                                       if (skb != NULL) {
-                                               unsigned char *p;
-                                               skb_reserve(skb, 2);    /* Align to 16 bytes */
-                                               p = skb_put(skb, pkt_len);
-
-                                               if (lp->shmem_length == IO_ONLY) {
-                                                       *p = inb(EWRK3_DATA);   /* dummy read */
-                                                       for (i = 0; i < pkt_len; i++) {
-                                                               *p++ = inb(EWRK3_DATA);
-                                                       }
-                                               } else {
-                                                       memcpy_fromio(p, buf, pkt_len);
-                                               }
-
-                                               for (i = 1; i < EWRK3_PKT_STAT_SZ - 1; i++) {
-                                                       if (pkt_len < i * EWRK3_PKT_BIN_SZ) {
-                                                               lp->pktStats.bins[i]++;
-                                                               i = EWRK3_PKT_STAT_SZ;
-                                                       }
-                                               }
-                                               p = skb->data;  /* Look at the dest addr */
-                                               if (is_multicast_ether_addr(p)) {
-                                                       if (is_broadcast_ether_addr(p)) {
-                                                               lp->pktStats.broadcast++;
-                                                       } else {
-                                                               lp->pktStats.multicast++;
-                                                       }
-                                               } else if (ether_addr_equal(p,
-                                                                           dev->dev_addr)) {
-                                                       lp->pktStats.unicast++;
-                                               }
-                                               lp->pktStats.bins[0]++;         /* Duplicates stats.rx_packets */
-                                               if (lp->pktStats.bins[0] == 0) {        /* Reset counters */
-                                                       memset(&lp->pktStats, 0, sizeof(lp->pktStats));
-                                               }
-                                               /*
-                                                  ** Notify the upper protocol layers that there is another
-                                                  ** packet to handle
-                                                */
-                                               skb->protocol = eth_type_trans(skb, dev);
-                                               netif_rx(skb);
-
-                                               /*
-                                                  ** Update stats
-                                                */
-                                               dev->stats.rx_packets++;
-                                               dev->stats.rx_bytes += pkt_len;
-                                       } else {
-                                               printk("%s: Insufficient memory; nuking packet.\n", dev->name);
-                                               dev->stats.rx_dropped++;                /* Really, deferred. */
-                                               break;
-                                       }
-                               }
-                       }
-                       /*
-                          ** Return the received buffer to the free memory queue
-                        */
-                       outb(page, EWRK3_FMQ);
-               } else {
-                       printk("ewrk3_rx(): Illegal page number, page %d\n", page);
-                       printk("ewrk3_rx(): CSR: %02x ICR: %02x FMQC: %02x\n", inb(EWRK3_CSR), inb(EWRK3_ICR), inb(EWRK3_FMQC));
-               }
-       }
-       return status;
-}
-
-/*
-** Buffer sent - check for TX buffer errors.
-** Called with lp->hw_lock held
-*/
-static int ewrk3_tx(struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       u_long iobase = dev->base_addr;
-       u_char tx_status;
-
-       while ((tx_status = inb(EWRK3_TDQ)) > 0) {      /* Whilst there's old buffers */
-               if (tx_status & T_VSTS) {       /* The status is valid */
-                       if (tx_status & T_TXE) {
-                               dev->stats.tx_errors++;
-                               if (tx_status & T_NCL)
-                                       dev->stats.tx_carrier_errors++;
-                               if (tx_status & T_LCL)
-                                       dev->stats.tx_window_errors++;
-                               if (tx_status & T_CTU) {
-                                       if ((tx_status & T_COLL) ^ T_XUR) {
-                                               lp->pktStats.tx_underruns++;
-                                       } else {
-                                               lp->pktStats.excessive_underruns++;
-                                       }
-                               } else if (tx_status & T_COLL) {
-                                       if ((tx_status & T_COLL) ^ T_XCOLL) {
-                                               dev->stats.collisions++;
-                                       } else {
-                                               lp->pktStats.excessive_collisions++;
-                                       }
-                               }
-                       } else {
-                               dev->stats.tx_packets++;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-static int ewrk3_close(struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       u_long iobase = dev->base_addr;
-       u_char icr, csr;
-
-       netif_stop_queue(dev);
-
-       if (ewrk3_debug > 1) {
-               printk("%s: Shutting down ethercard, status was %2.2x.\n",
-                      dev->name, inb(EWRK3_CSR));
-       }
-       /*
-          ** We stop the EWRK3 here... mask interrupts and stop TX & RX
-        */
-       DISABLE_IRQs;
-
-       STOP_EWRK3;
-
-       /*
-          ** Clean out the TX and RX queues here (note that one entry
-          ** may get added to either the TXD or RX queues if the TX or RX
-          ** just starts processing a packet before the STOP_EWRK3 command
-          ** is received. This will be flushed in the ewrk3_open() call).
-        */
-       while (inb(EWRK3_TQ));
-       while (inb(EWRK3_TDQ));
-       while (inb(EWRK3_RQ));
-
-       if (!lp->hard_strapped) {
-               free_irq(dev->irq, dev);
-       }
-       return 0;
-}
-
-/*
-   ** Set or clear the multicast filter for this adapter.
- */
-static void set_multicast_list(struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       u_long iobase = dev->base_addr;
-       u_char csr;
-
-       csr = inb(EWRK3_CSR);
-
-       if (lp->shmem_length == IO_ONLY) {
-               lp->mctbl = NULL;
-       } else {
-               lp->mctbl = lp->shmem + PAGE0_HTE;
-       }
-
-       csr &= ~(CSR_PME | CSR_MCE);
-       if (dev->flags & IFF_PROMISC) {         /* set promiscuous mode */
-               csr |= CSR_PME;
-               outb(csr, EWRK3_CSR);
-       } else {
-               SetMulticastFilter(dev);
-               csr |= CSR_MCE;
-               outb(csr, EWRK3_CSR);
-       }
-}
-
-/*
-   ** Calculate the hash code and update the logical address filter
-   ** from a list of ethernet multicast addresses.
-   ** Little endian crc one liner from Matt Thomas, DEC.
-   **
-   ** Note that when clearing the table, the broadcast bit must remain asserted
-   ** to receive broadcast messages.
- */
-static void SetMulticastFilter(struct net_device *dev)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       struct netdev_hw_addr *ha;
-       u_long iobase = dev->base_addr;
-       int i;
-       char bit, byte;
-       short __iomem *p = lp->mctbl;
-       u16 hashcode;
-       u32 crc;
-
-       spin_lock_irq(&lp->hw_lock);
-
-       if (lp->shmem_length == IO_ONLY) {
-               outb(0, EWRK3_IOPR);
-               outw(PAGE0_HTE, EWRK3_PIR1);
-       } else {
-               outb(0, EWRK3_MPR);
-       }
-
-       if (dev->flags & IFF_ALLMULTI) {
-               for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {
-                       if (lp->shmem_length == IO_ONLY) {
-                               outb(0xff, EWRK3_DATA);
-                       } else {        /* memset didn't work here */
-                               writew(0xffff, p);
-                               p++;
-                               i++;
-                       }
-               }
-       } else {
-               /* Clear table except for broadcast bit */
-               if (lp->shmem_length == IO_ONLY) {
-                       for (i = 0; i < (HASH_TABLE_LEN >> 4) - 1; i++) {
-                               outb(0x00, EWRK3_DATA);
-                       }
-                       outb(0x80, EWRK3_DATA);
-                       i++;    /* insert the broadcast bit */
-                       for (; i < (HASH_TABLE_LEN >> 3); i++) {
-                               outb(0x00, EWRK3_DATA);
-                       }
-               } else {
-                       memset_io(lp->mctbl, 0, HASH_TABLE_LEN >> 3);
-                       writeb(0x80, lp->mctbl + (HASH_TABLE_LEN >> 4) - 1);
-               }
-
-               /* Update table */
-               netdev_for_each_mc_addr(ha, dev) {
-                       crc = ether_crc_le(ETH_ALEN, ha->addr);
-                       hashcode = crc & ((1 << 9) - 1);        /* hashcode is 9 LSb of CRC */
-
-                       byte = hashcode >> 3;   /* bit[3-8] -> byte in filter */
-                       bit = 1 << (hashcode & 0x07);   /* bit[0-2] -> bit in byte */
-
-                       if (lp->shmem_length == IO_ONLY) {
-                               u_char tmp;
-
-                               outw(PAGE0_HTE + byte, EWRK3_PIR1);
-                               tmp = inb(EWRK3_DATA);
-                               tmp |= bit;
-                               outw(PAGE0_HTE + byte, EWRK3_PIR1);
-                               outb(tmp, EWRK3_DATA);
-                       } else {
-                               writeb(readb(lp->mctbl + byte) | bit, lp->mctbl + byte);
-                       }
-               }
-       }
-
-       spin_unlock_irq(&lp->hw_lock);
-}
-
-/*
-   ** ISA bus I/O device probe
- */
-static int __init isa_probe(struct net_device *dev, u_long ioaddr)
-{
-       int i = num_ewrks3s, maxSlots;
-       int ret = -ENODEV;
-
-       u_long iobase;
-
-       if (ioaddr >= 0x400)
-               goto out;
-
-       if (ioaddr == 0) {      /* Autoprobing */
-               iobase = EWRK3_IO_BASE;         /* Get the first slot address */
-               maxSlots = 24;
-       } else {                /* Probe a specific location */
-               iobase = ioaddr;
-               maxSlots = i + 1;
-       }
-
-       for (; (i < maxSlots) && (dev != NULL);
-            iobase += EWRK3_IOP_INC, i++)
-       {
-               if (request_region(iobase, EWRK3_TOTAL_SIZE, DRV_NAME)) {
-                       if (DevicePresent(iobase) == 0) {
-                               int irq = dev->irq;
-                               ret = ewrk3_hw_init(dev, iobase);
-                               if (!ret)
-                                       break;
-                               dev->irq = irq;
-                       }
-                       release_region(iobase, EWRK3_TOTAL_SIZE);
-               }
-       }
- out:
-
-       return ret;
-}
-
-/*
-   ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually
-   ** the motherboard.
- */
-static int __init eisa_probe(struct net_device *dev, u_long ioaddr)
-{
-       int i, maxSlots;
-       u_long iobase;
-       int ret = -ENODEV;
-
-       if (ioaddr < 0x1000)
-               goto out;
-
-       iobase = ioaddr;
-       i = (ioaddr >> 12);
-       maxSlots = i + 1;
-
-       for (i = 1; (i < maxSlots) && (dev != NULL); i++, iobase += EISA_SLOT_INC) {
-               if (EISA_signature(name, EISA_ID) == 0) {
-                       if (request_region(iobase, EWRK3_TOTAL_SIZE, DRV_NAME) &&
-                           DevicePresent(iobase) == 0) {
-                               int irq = dev->irq;
-                               ret = ewrk3_hw_init(dev, iobase);
-                               if (!ret)
-                                       break;
-                               dev->irq = irq;
-                       }
-                       release_region(iobase, EWRK3_TOTAL_SIZE);
-               }
-       }
-
- out:
-       return ret;
-}
-
-
-/*
-   ** Read the EWRK3 EEPROM using this routine
- */
-static int Read_EEPROM(u_long iobase, u_char eaddr)
-{
-       int i;
-
-       outb((eaddr & 0x3f), EWRK3_PIR1);       /* set up 6 bits of address info */
-       outb(EEPROM_RD, EWRK3_IOPR);    /* issue read command */
-       for (i = 0; i < 5000; i++)
-               inb(EWRK3_CSR); /* wait 1msec */
-
-       return inw(EWRK3_EPROM1);       /* 16 bits data return */
-}
-
-/*
-   ** Write the EWRK3 EEPROM using this routine
- */
-static int Write_EEPROM(short data, u_long iobase, u_char eaddr)
-{
-       int i;
-
-       outb(EEPROM_WR_EN, EWRK3_IOPR);         /* issue write enable command */
-       for (i = 0; i < 5000; i++)
-               inb(EWRK3_CSR); /* wait 1msec */
-       outw(data, EWRK3_EPROM1);       /* write data to register */
-       outb((eaddr & 0x3f), EWRK3_PIR1);       /* set up 6 bits of address info */
-       outb(EEPROM_WR, EWRK3_IOPR);    /* issue write command */
-       for (i = 0; i < 75000; i++)
-               inb(EWRK3_CSR); /* wait 15msec */
-       outb(EEPROM_WR_DIS, EWRK3_IOPR);        /* issue write disable command */
-       for (i = 0; i < 5000; i++)
-               inb(EWRK3_CSR); /* wait 1msec */
-
-       return 0;
-}
-
-/*
-   ** Look for a particular board name in the on-board EEPROM.
- */
-static void __init EthwrkSignature(char *name, char *eeprom_image)
-{
-       int i;
-       char *signatures[] = EWRK3_SIGNATURE;
-
-       for (i=0; *signatures[i] != '\0'; i++)
-               if( !strncmp(eeprom_image+EEPROM_PNAME7, signatures[i], strlen(signatures[i])) )
-                       break;
-
-       if (*signatures[i] != '\0') {
-               memcpy(name, eeprom_image+EEPROM_PNAME7, EWRK3_STRLEN);
-               name[EWRK3_STRLEN] = '\0';
-       } else
-               name[0] = '\0';
-}
-
-/*
-   ** Look for a special sequence in the Ethernet station address PROM that
-   ** is common across all EWRK3 products.
-   **
-   ** Search the Ethernet address ROM for the signature. Since the ROM address
-   ** counter can start at an arbitrary point, the search must include the entire
-   ** probe sequence length plus the (length_of_the_signature - 1).
-   ** Stop the search IMMEDIATELY after the signature is found so that the
-   ** PROM address counter is correctly positioned at the start of the
-   ** ethernet address for later read out.
- */
-
-static int __init DevicePresent(u_long iobase)
-{
-       union {
-               struct {
-                       u32 a;
-                       u32 b;
-               } llsig;
-               char Sig[sizeof(u32) << 1];
-       }
-       dev;
-       short sigLength;
-       char data;
-       int i, j, status = 0;
-
-       dev.llsig.a = ETH_PROM_SIG;
-       dev.llsig.b = ETH_PROM_SIG;
-       sigLength = sizeof(u32) << 1;
-
-       for (i = 0, j = 0; j < sigLength && i < PROBE_LENGTH + sigLength - 1; i++) {
-               data = inb(EWRK3_APROM);
-               if (dev.Sig[j] == data) {       /* track signature */
-                       j++;
-               } else {        /* lost signature; begin search again */
-                       if (data == dev.Sig[0]) {
-                               j = 1;
-                       } else {
-                               j = 0;
-                       }
-               }
-       }
-
-       if (j != sigLength) {
-               status = -ENODEV;       /* search failed */
-       }
-       return status;
-}
-
-static u_char __init get_hw_addr(struct net_device *dev, u_char * eeprom_image, char chipType)
-{
-       int i, j, k;
-       u_short chksum;
-       u_char crc, lfsr, sd, status = 0;
-       u_long iobase = dev->base_addr;
-       u16 tmp;
-
-       if (chipType == LeMAC2) {
-               for (crc = 0x6a, j = 0; j < ETH_ALEN; j++) {
-                       sd = dev->dev_addr[j] = eeprom_image[EEPROM_PADDR0 + j];
-                       outb(dev->dev_addr[j], EWRK3_PAR0 + j);
-                       for (k = 0; k < 8; k++, sd >>= 1) {
-                               lfsr = ((((crc & 0x02) >> 1) ^ (crc & 0x01)) ^ (sd & 0x01)) << 7;
-                               crc = (crc >> 1) + lfsr;
-                       }
-               }
-               if (crc != eeprom_image[EEPROM_PA_CRC])
-                       status = -1;
-       } else {
-               for (i = 0, k = 0; i < ETH_ALEN;) {
-                       k <<= 1;
-                       if (k > 0xffff)
-                               k -= 0xffff;
-
-                       k += (u_char) (tmp = inb(EWRK3_APROM));
-                       dev->dev_addr[i] = (u_char) tmp;
-                       outb(dev->dev_addr[i], EWRK3_PAR0 + i);
-                       i++;
-                       k += (u_short) ((tmp = inb(EWRK3_APROM)) << 8);
-                       dev->dev_addr[i] = (u_char) tmp;
-                       outb(dev->dev_addr[i], EWRK3_PAR0 + i);
-                       i++;
-
-                       if (k > 0xffff)
-                               k -= 0xffff;
-               }
-               if (k == 0xffff)
-                       k = 0;
-               chksum = inb(EWRK3_APROM);
-               chksum |= (inb(EWRK3_APROM) << 8);
-               if (k != chksum)
-                       status = -1;
-       }
-
-       return status;
-}
-
-/*
-   ** Look for a particular board name in the EISA configuration space
- */
-static int __init EISA_signature(char *name, s32 eisa_id)
-{
-       u_long i;
-       char *signatures[] = EWRK3_SIGNATURE;
-       char ManCode[EWRK3_STRLEN];
-       union {
-               s32 ID;
-               char Id[4];
-       } Eisa;
-       int status = 0;
-
-       *name = '\0';
-       for (i = 0; i < 4; i++) {
-               Eisa.Id[i] = inb(eisa_id + i);
-       }
-
-       ManCode[0] = (((Eisa.Id[0] >> 2) & 0x1f) + 0x40);
-       ManCode[1] = (((Eisa.Id[1] & 0xe0) >> 5) + ((Eisa.Id[0] & 0x03) << 3) + 0x40);
-       ManCode[2] = (((Eisa.Id[2] >> 4) & 0x0f) + 0x30);
-       ManCode[3] = ((Eisa.Id[2] & 0x0f) + 0x30);
-       ManCode[4] = (((Eisa.Id[3] >> 4) & 0x0f) + 0x30);
-       ManCode[5] = '\0';
-
-       for (i = 0; (*signatures[i] != '\0') && (*name == '\0'); i++) {
-               if (strstr(ManCode, signatures[i]) != NULL) {
-                       strcpy(name, ManCode);
-                       status = 1;
-               }
-       }
-
-       return status;          /* return the device name string */
-}
-
-static void ewrk3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
-{
-       int fwrev = Read_EEPROM(dev->base_addr, EEPROM_REVLVL);
-
-       strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
-       strlcpy(info->version, DRV_VERSION, sizeof(info->version));
-       snprintf(info->fw_version, sizeof(info->fw_version), "%d", fwrev);
-       strlcpy(info->bus_info, "N/A", sizeof(info->bus_info));
-       info->eedump_len = EEPROM_MAX;
-}
-
-static int ewrk3_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       unsigned long iobase = dev->base_addr;
-       u8 cr = inb(EWRK3_CR);
-
-       switch (lp->adapter_name[4]) {
-       case '3': /* DE203 */
-               ecmd->supported = SUPPORTED_BNC;
-               ecmd->port = PORT_BNC;
-               break;
-
-       case '4': /* DE204 */
-               ecmd->supported = SUPPORTED_TP;
-               ecmd->port = PORT_TP;
-               break;
-
-       case '5': /* DE205 */
-               ecmd->supported = SUPPORTED_TP | SUPPORTED_BNC | SUPPORTED_AUI;
-               ecmd->autoneg = !(cr & CR_APD);
-               /*
-               ** Port is only valid if autoneg is disabled
-               ** and even then we don't know if AUI is jumpered.
-               */
-               if (!ecmd->autoneg)
-                       ecmd->port = (cr & CR_PSEL) ? PORT_BNC : PORT_TP;
-               break;
-       }
-
-       ecmd->supported |= SUPPORTED_10baseT_Half;
-       ethtool_cmd_speed_set(ecmd, SPEED_10);
-       ecmd->duplex = DUPLEX_HALF;
-       return 0;
-}
-
-static int ewrk3_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       unsigned long iobase = dev->base_addr;
-       unsigned long flags;
-       u8 cr;
-
-       /* DE205 is the only card with anything to set */
-       if (lp->adapter_name[4] != '5')
-               return -EOPNOTSUPP;
-
-       /* Sanity-check parameters */
-       if (ecmd->speed != SPEED_10)
-               return -EINVAL;
-       if (ecmd->port != PORT_TP && ecmd->port != PORT_BNC)
-               return -EINVAL; /* AUI is not software-selectable */
-       if (ecmd->transceiver != XCVR_INTERNAL)
-               return -EINVAL;
-       if (ecmd->duplex != DUPLEX_HALF)
-               return -EINVAL;
-       if (ecmd->phy_address != 0)
-               return -EINVAL;
-
-       spin_lock_irqsave(&lp->hw_lock, flags);
-       cr = inb(EWRK3_CR);
-
-       /* If Autoneg is set, change to Auto Port mode */
-       /* Otherwise, disable Auto Port and set port explicitly */
-       if (ecmd->autoneg) {
-               cr &= ~CR_APD;
-       } else {
-               cr |= CR_APD;
-               if (ecmd->port == PORT_TP)
-                       cr &= ~CR_PSEL;         /* Force TP */
-               else
-                       cr |= CR_PSEL;          /* Force BNC */
-       }
-
-       /* Commit the changes */
-       outb(cr, EWRK3_CR);
-       spin_unlock_irqrestore(&lp->hw_lock, flags);
-       return 0;
-}
-
-static u32 ewrk3_get_link(struct net_device *dev)
-{
-       unsigned long iobase = dev->base_addr;
-       u8 cmr = inb(EWRK3_CMR);
-       /* DE203 has BNC only and link status does not apply */
-       /* On DE204 this is always valid since TP is the only port. */
-       /* On DE205 this reflects TP status even if BNC or AUI is selected. */
-       return !(cmr & CMR_LINK);
-}
-
-static int ewrk3_set_phys_id(struct net_device *dev,
-                            enum ethtool_phys_id_state state)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       unsigned long iobase = dev->base_addr;
-       u8 cr;
-
-       spin_lock_irq(&lp->hw_lock);
-
-       switch (state) {
-       case ETHTOOL_ID_ACTIVE:
-               /* Prevent ISR from twiddling the LED */
-               lp->led_mask = 0;
-               spin_unlock_irq(&lp->hw_lock);
-               return 2;       /* cycle on/off twice per second */
-
-       case ETHTOOL_ID_ON:
-               cr = inb(EWRK3_CR);
-               outb(cr | CR_LED, EWRK3_CR);
-               break;
-
-       case ETHTOOL_ID_OFF:
-               cr = inb(EWRK3_CR);
-               outb(cr & ~CR_LED, EWRK3_CR);
-               break;
-
-       case ETHTOOL_ID_INACTIVE:
-               lp->led_mask = CR_LED;
-               cr = inb(EWRK3_CR);
-               outb(cr & ~CR_LED, EWRK3_CR);
-       }
-       spin_unlock_irq(&lp->hw_lock);
-
-       return 0;
-}
-
-static const struct ethtool_ops ethtool_ops_203 = {
-       .get_drvinfo = ewrk3_get_drvinfo,
-       .get_settings = ewrk3_get_settings,
-       .set_settings = ewrk3_set_settings,
-       .set_phys_id = ewrk3_set_phys_id,
-};
-
-static const struct ethtool_ops ethtool_ops = {
-       .get_drvinfo = ewrk3_get_drvinfo,
-       .get_settings = ewrk3_get_settings,
-       .set_settings = ewrk3_set_settings,
-       .get_link = ewrk3_get_link,
-       .set_phys_id = ewrk3_set_phys_id,
-};
-
-/*
-   ** Perform IOCTL call functions here. Some are privileged operations and the
-   ** effective uid is checked in those cases.
- */
-static int ewrk3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-{
-       struct ewrk3_private *lp = netdev_priv(dev);
-       struct ewrk3_ioctl *ioc = (struct ewrk3_ioctl *) &rq->ifr_ifru;
-       u_long iobase = dev->base_addr;
-       int i, j, status = 0;
-       u_char csr;
-       unsigned long flags;
-       union ewrk3_addr {
-               u_char addr[HASH_TABLE_LEN * ETH_ALEN];
-               u_short val[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
-       };
-
-       union ewrk3_addr *tmp;
-
-       /* All we handle are private IOCTLs */
-       if (cmd != EWRK3IOCTL)
-               return -EOPNOTSUPP;
-
-       tmp = kmalloc(sizeof(union ewrk3_addr), GFP_KERNEL);
-       if(tmp==NULL)
-               return -ENOMEM;
-
-       switch (ioc->cmd) {
-       case EWRK3_GET_HWADDR:  /* Get the hardware address */
-               for (i = 0; i < ETH_ALEN; i++) {
-                       tmp->addr[i] = dev->dev_addr[i];
-               }
-               ioc->len = ETH_ALEN;
-               if (copy_to_user(ioc->data, tmp->addr, ioc->len))
-                       status = -EFAULT;
-               break;
-
-       case EWRK3_SET_HWADDR:  /* Set the hardware address */
-               if (capable(CAP_NET_ADMIN)) {
-                       spin_lock_irqsave(&lp->hw_lock, flags);
-                       csr = inb(EWRK3_CSR);
-                       csr |= (CSR_TXD | CSR_RXD);
-                       outb(csr, EWRK3_CSR);   /* Disable the TX and RX */
-                       spin_unlock_irqrestore(&lp->hw_lock, flags);
-
-                       if (copy_from_user(tmp->addr, ioc->data, ETH_ALEN)) {
-                               status = -EFAULT;
-                               break;
-                       }
-                       spin_lock_irqsave(&lp->hw_lock, flags);
-                       for (i = 0; i < ETH_ALEN; i++) {
-                               dev->dev_addr[i] = tmp->addr[i];
-                               outb(tmp->addr[i], EWRK3_PAR0 + i);
-                       }
-
-                       csr = inb(EWRK3_CSR);
-                       csr &= ~(CSR_TXD | CSR_RXD);    /* Enable the TX and RX */
-                       outb(csr, EWRK3_CSR);
-                       spin_unlock_irqrestore(&lp->hw_lock, flags);
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_SET_PROM:    /* Set Promiscuous Mode */
-               if (capable(CAP_NET_ADMIN)) {
-                       spin_lock_irqsave(&lp->hw_lock, flags);
-                       csr = inb(EWRK3_CSR);
-                       csr |= CSR_PME;
-                       csr &= ~CSR_MCE;
-                       outb(csr, EWRK3_CSR);
-                       spin_unlock_irqrestore(&lp->hw_lock, flags);
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_CLR_PROM:    /* Clear Promiscuous Mode */
-               if (capable(CAP_NET_ADMIN)) {
-                       spin_lock_irqsave(&lp->hw_lock, flags);
-                       csr = inb(EWRK3_CSR);
-                       csr &= ~CSR_PME;
-                       outb(csr, EWRK3_CSR);
-                       spin_unlock_irqrestore(&lp->hw_lock, flags);
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_GET_MCA:     /* Get the multicast address table */
-               spin_lock_irqsave(&lp->hw_lock, flags);
-               if (lp->shmem_length == IO_ONLY) {
-                       outb(0, EWRK3_IOPR);
-                       outw(PAGE0_HTE, EWRK3_PIR1);
-                       for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {
-                               tmp->addr[i] = inb(EWRK3_DATA);
-                       }
-               } else {
-                       outb(0, EWRK3_MPR);
-                       memcpy_fromio(tmp->addr, lp->shmem + PAGE0_HTE, (HASH_TABLE_LEN >> 3));
-               }
-               spin_unlock_irqrestore(&lp->hw_lock, flags);
-
-               ioc->len = (HASH_TABLE_LEN >> 3);
-               if (copy_to_user(ioc->data, tmp->addr, ioc->len))
-                       status = -EFAULT;
-
-               break;
-       case EWRK3_SET_MCA:     /* Set a multicast address */
-               if (capable(CAP_NET_ADMIN)) {
-                       if (ioc->len > HASH_TABLE_LEN) {
-                               status = -EINVAL;
-                               break;
-                       }
-                       if (copy_from_user(tmp->addr, ioc->data, ETH_ALEN * ioc->len)) {
-                               status = -EFAULT;
-                               break;
-                       }
-                       set_multicast_list(dev);
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_CLR_MCA:     /* Clear all multicast addresses */
-               if (capable(CAP_NET_ADMIN)) {
-                       set_multicast_list(dev);
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_MCA_EN:      /* Enable multicast addressing */
-               if (capable(CAP_NET_ADMIN)) {
-                       spin_lock_irqsave(&lp->hw_lock, flags);
-                       csr = inb(EWRK3_CSR);
-                       csr |= CSR_MCE;
-                       csr &= ~CSR_PME;
-                       outb(csr, EWRK3_CSR);
-                       spin_unlock_irqrestore(&lp->hw_lock, flags);
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_GET_STATS: { /* Get the driver statistics */
-               struct ewrk3_stats *tmp_stats =
-                       kmalloc(sizeof(lp->pktStats), GFP_KERNEL);
-               if (!tmp_stats) {
-                       status = -ENOMEM;
-                       break;
-               }
-
-               spin_lock_irqsave(&lp->hw_lock, flags);
-               memcpy(tmp_stats, &lp->pktStats, sizeof(lp->pktStats));
-               spin_unlock_irqrestore(&lp->hw_lock, flags);
-
-               ioc->len = sizeof(lp->pktStats);
-               if (copy_to_user(ioc->data, tmp_stats, sizeof(lp->pktStats)))
-                       status = -EFAULT;
-               kfree(tmp_stats);
-               break;
-       }
-       case EWRK3_CLR_STATS:   /* Zero out the driver statistics */
-               if (capable(CAP_NET_ADMIN)) {
-                       spin_lock_irqsave(&lp->hw_lock, flags);
-                       memset(&lp->pktStats, 0, sizeof(lp->pktStats));
-                       spin_unlock_irqrestore(&lp->hw_lock,flags);
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_GET_CSR:     /* Get the CSR Register contents */
-               tmp->addr[0] = inb(EWRK3_CSR);
-               ioc->len = 1;
-               if (copy_to_user(ioc->data, tmp->addr, ioc->len))
-                       status = -EFAULT;
-               break;
-       case EWRK3_SET_CSR:     /* Set the CSR Register contents */
-               if (capable(CAP_NET_ADMIN)) {
-                       if (copy_from_user(tmp->addr, ioc->data, 1)) {
-                               status = -EFAULT;
-                               break;
-                       }
-                       outb(tmp->addr[0], EWRK3_CSR);
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_GET_EEPROM:  /* Get the EEPROM contents */
-               if (capable(CAP_NET_ADMIN)) {
-                       for (i = 0; i < (EEPROM_MAX >> 1); i++) {
-                               tmp->val[i] = (short) Read_EEPROM(iobase, i);
-                       }
-                       i = EEPROM_MAX;
-                       tmp->addr[i++] = inb(EWRK3_CMR);                /* Config/Management Reg. */
-                       for (j = 0; j < ETH_ALEN; j++) {
-                               tmp->addr[i++] = inb(EWRK3_PAR0 + j);
-                       }
-                       ioc->len = EEPROM_MAX + 1 + ETH_ALEN;
-                       if (copy_to_user(ioc->data, tmp->addr, ioc->len))
-                               status = -EFAULT;
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_SET_EEPROM:  /* Set the EEPROM contents */
-               if (capable(CAP_NET_ADMIN)) {
-                       if (copy_from_user(tmp->addr, ioc->data, EEPROM_MAX)) {
-                               status = -EFAULT;
-                               break;
-                       }
-                       for (i = 0; i < (EEPROM_MAX >> 1); i++) {
-                               Write_EEPROM(tmp->val[i], iobase, i);
-                       }
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_GET_CMR:     /* Get the CMR Register contents */
-               tmp->addr[0] = inb(EWRK3_CMR);
-               ioc->len = 1;
-               if (copy_to_user(ioc->data, tmp->addr, ioc->len))
-                       status = -EFAULT;
-               break;
-       case EWRK3_SET_TX_CUT_THRU:     /* Set TX cut through mode */
-               if (capable(CAP_NET_ADMIN)) {
-                       lp->txc = 1;
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       case EWRK3_CLR_TX_CUT_THRU:     /* Clear TX cut through mode */
-               if (capable(CAP_NET_ADMIN)) {
-                       lp->txc = 0;
-               } else {
-                       status = -EPERM;
-               }
-
-               break;
-       default:
-               status = -EOPNOTSUPP;
-       }
-       kfree(tmp);
-       return status;
-}
-
-#ifdef MODULE
-static struct net_device *ewrk3_devs[MAX_NUM_EWRK3S];
-static int ndevs;
-static int io[MAX_NUM_EWRK3S+1] = { 0x300, 0, };
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, byte, NULL, 0);
-MODULE_PARM_DESC(io, "EtherWORKS 3 I/O base address(es)");
-MODULE_PARM_DESC(irq, "EtherWORKS 3 IRQ number(s)");
-
-static __exit void ewrk3_exit_module(void)
-{
-       int i;
-
-       for( i=0; i<ndevs; i++ ) {
-               struct net_device *dev = ewrk3_devs[i];
-               struct ewrk3_private *lp = netdev_priv(dev);
-               ewrk3_devs[i] = NULL;
-               unregister_netdev(dev);
-               release_region(dev->base_addr, EWRK3_TOTAL_SIZE);
-               iounmap(lp->shmem);
-               free_netdev(dev);
-       }
-}
-
-static __init int ewrk3_init_module(void)
-{
-       int i=0;
-
-       while( io[i] && irq[i] ) {
-               struct net_device *dev
-                       = alloc_etherdev(sizeof(struct ewrk3_private));
-
-               if (!dev)
-                       break;
-
-               if (ewrk3_probe1(dev, io[i], irq[i]) != 0) {
-                       free_netdev(dev);
-                       break;
-               }
-
-               ewrk3_devs[ndevs++] = dev;
-               i++;
-       }
-
-       return ndevs ? 0 : -EIO;
-}
-
-
-/* Hack for breakage in new module stuff */
-module_exit(ewrk3_exit_module);
-module_init(ewrk3_init_module);
-#endif                         /* MODULE */
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/dec/ewrk3.h b/drivers/net/ethernet/dec/ewrk3.h
deleted file mode 100644 (file)
index 8e0ee90..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
-    Written 1994 by David C. Davies.
-
-    Copyright 1994 Digital Equipment Corporation.
-
-    This software may be used and distributed according to  the terms of the
-    GNU General Public License, incorporated herein by reference.
-
-    The author may    be  reached as davies@wanton.lkg.dec.com  or   Digital
-    Equipment Corporation, 550 King Street, Littleton MA 01460.
-
-    =========================================================================
-*/
-
-/*
-** I/O Address Register Map
-*/
-#define EWRK3_CSR    iobase+0x00   /* Control and Status Register */
-#define EWRK3_CR     iobase+0x01   /* Control Register */
-#define EWRK3_ICR    iobase+0x02   /* Interrupt Control Register */
-#define EWRK3_TSR    iobase+0x03   /* Transmit Status Register */
-#define EWRK3_RSVD1  iobase+0x04   /* RESERVED */
-#define EWRK3_RSVD2  iobase+0x05   /* RESERVED */
-#define EWRK3_FMQ    iobase+0x06   /* Free Memory Queue */
-#define EWRK3_FMQC   iobase+0x07   /* Free Memory Queue Counter */
-#define EWRK3_RQ     iobase+0x08   /* Receive Queue */
-#define EWRK3_RQC    iobase+0x09   /* Receive Queue Counter */
-#define EWRK3_TQ     iobase+0x0a   /* Transmit Queue */
-#define EWRK3_TQC    iobase+0x0b   /* Transmit Queue Counter */
-#define EWRK3_TDQ    iobase+0x0c   /* Transmit Done Queue */
-#define EWRK3_TDQC   iobase+0x0d   /* Transmit Done Queue Counter */
-#define EWRK3_PIR1   iobase+0x0e   /* Page Index Register 1 */
-#define EWRK3_PIR2   iobase+0x0f   /* Page Index Register 2 */
-#define EWRK3_DATA   iobase+0x10   /* Data Register */
-#define EWRK3_IOPR   iobase+0x11   /* I/O Page Register */
-#define EWRK3_IOBR   iobase+0x12   /* I/O Base Register */
-#define EWRK3_MPR    iobase+0x13   /* Memory Page Register */
-#define EWRK3_MBR    iobase+0x14   /* Memory Base Register */
-#define EWRK3_APROM  iobase+0x15   /* Address PROM */
-#define EWRK3_EPROM1 iobase+0x16   /* EEPROM Data Register 1 */
-#define EWRK3_EPROM2 iobase+0x17   /* EEPROM Data Register 2 */
-#define EWRK3_PAR0   iobase+0x18   /* Physical Address Register 0 */
-#define EWRK3_PAR1   iobase+0x19   /* Physical Address Register 1 */
-#define EWRK3_PAR2   iobase+0x1a   /* Physical Address Register 2 */
-#define EWRK3_PAR3   iobase+0x1b   /* Physical Address Register 3 */
-#define EWRK3_PAR4   iobase+0x1c   /* Physical Address Register 4 */
-#define EWRK3_PAR5   iobase+0x1d   /* Physical Address Register 5 */
-#define EWRK3_CMR    iobase+0x1e   /* Configuration/Management Register */
-
-/*
-** Control Page Map
-*/
-#define PAGE0_FMQ     0x000         /* Free Memory Queue */
-#define PAGE0_RQ      0x080         /* Receive Queue */
-#define PAGE0_TQ      0x100         /* Transmit Queue */
-#define PAGE0_TDQ     0x180         /* Transmit Done Queue */
-#define PAGE0_HTE     0x200         /* Hash Table Entries */
-#define PAGE0_RSVD    0x240         /* RESERVED */
-#define PAGE0_USRD    0x600         /* User Data */
-
-/*
-** Control and Status Register bit definitions (EWRK3_CSR)
-*/
-#define CSR_RA         0x80        /* Runt Accept */
-#define CSR_PME                0x40        /* Promiscuous Mode Enable */
-#define CSR_MCE                0x20        /* Multicast Enable */
-#define CSR_TNE                0x08        /* TX Done Queue Not Empty */
-#define CSR_RNE                0x04        /* RX Queue Not Empty */
-#define CSR_TXD                0x02        /* TX Disable */
-#define CSR_RXD                0x01        /* RX Disable */
-
-/*
-** Control Register bit definitions (EWRK3_CR)
-*/
-#define CR_APD         0x80    /* Auto Port Disable */
-#define CR_PSEL                0x40    /* Port Select (0->TP port) */
-#define CR_LBCK                0x20    /* LoopBaCK enable */
-#define CR_FDUP                0x10    /* Full DUPlex enable */
-#define CR_FBUS                0x08    /* Fast BUS enable (ISA clk > 8.33MHz) */
-#define CR_EN_16       0x04    /* ENable 16 bit memory accesses */
-#define CR_LED         0x02    /* LED (1-> turn on) */
-
-/*
-** Interrupt Control Register bit definitions (EWRK3_ICR)
-*/
-#define ICR_IE         0x80    /* Interrupt Enable */
-#define ICR_IS         0x60    /* Interrupt Selected */
-#define ICR_TNEM       0x08    /* TNE Mask (0->mask) */
-#define ICR_RNEM       0x04    /* RNE Mask (0->mask) */
-#define ICR_TXDM       0x02    /* TXD Mask (0->mask) */
-#define ICR_RXDM       0x01    /* RXD Mask (0->mask) */
-
-/*
-** Transmit Status Register bit definitions (EWRK3_TSR)
-*/
-#define TSR_NCL                0x80    /* No Carrier Loopback */
-#define TSR_ID         0x40    /* Initially Deferred */
-#define TSR_LCL                0x20    /* Late CoLlision */
-#define TSR_ECL                0x10    /* Excessive CoLlisions */
-#define TSR_RCNTR      0x0f    /* Retries CouNTeR */
-
-/*
-** I/O Page Register bit definitions (EWRK3_IOPR)
-*/
-#define EEPROM_INIT    0xc0    /* EEPROM INIT command */
-#define EEPROM_WR_EN   0xc8    /* EEPROM WRITE ENABLE command */
-#define EEPROM_WR      0xd0    /* EEPROM WRITE command */
-#define EEPROM_WR_DIS  0xd8    /* EEPROM WRITE DISABLE command */
-#define EEPROM_RD      0xe0    /* EEPROM READ command */
-
-/*
-** I/O Base Register bit definitions (EWRK3_IOBR)
-*/
-#define EISA_REGS_EN   0x20    /* Enable EISA ID and Control Registers */
-#define EISA_IOB        0x1f   /* Compare bits for I/O Base Address */
-
-/*
-** I/O Configuration/Management Register bit definitions (EWRK3_CMR)
-*/
-#define CMR_RA          0x80    /* Read Ahead */
-#define CMR_WB          0x40    /* Write Behind */
-#define CMR_LINK        0x20   /* 0->TP */
-#define CMR_POLARITY    0x10   /* Informational */
-#define CMR_NO_EEPROM  0x0c    /* NO_EEPROM<1:0> pin status */
-#define CMR_HS          0x08   /* Hard Strapped pin status (LeMAC2) */
-#define CMR_PNP         0x04    /* Plug 'n Play */
-#define CMR_DRAM        0x02   /* 0-> 1DRAM, 1-> 2 DRAM on board */
-#define CMR_0WS         0x01    /* Zero Wait State */
-
-/*
-** MAC Receive Status Register bit definitions
-*/
-
-#define R_ROK          0x80    /* Receive OK summary */
-#define R_IAM          0x10    /* Individual Address Match */
-#define R_MCM          0x08    /* MultiCast Match */
-#define R_DBE          0x04    /* Dribble Bit Error */
-#define R_CRC          0x02    /* CRC error */
-#define R_PLL          0x01    /* Phase Lock Lost */
-
-/*
-** MAC Transmit Control Register bit definitions
-*/
-
-#define TCR_SQEE       0x40    /* SQE Enable - look for heartbeat  */
-#define TCR_SED        0x20    /* Stop when Error Detected */
-#define TCR_QMODE      0x10    /* Q_MODE */
-#define TCR_LAB         0x08   /* Less Aggressive Backoff */
-#define TCR_PAD        0x04    /* PAD Runt Packets */
-#define TCR_IFC        0x02    /* Insert Frame Check */
-#define TCR_ISA        0x01    /* Insert Source Address */
-
-/*
-** MAC Transmit Status Register bit definitions
-*/
-
-#define T_VSTS         0x80    /* Valid STatuS */
-#define T_CTU          0x40    /* Cut Through Used */
-#define T_SQE          0x20    /* Signal Quality Error */
-#define T_NCL          0x10    /* No Carrier Loopback */
-#define T_LCL           0x08   /* Late Collision */
-#define T_ID           0x04    /* Initially Deferred */
-#define T_COLL         0x03    /* COLLision status */
-#define T_XCOLL         0x03    /* Excessive Collisions */
-#define T_MCOLL         0x02    /* Multiple Collisions */
-#define T_OCOLL         0x01    /* One Collision */
-#define T_NOCOLL        0x00    /* No Collisions */
-#define T_XUR           0x03    /* Excessive Underruns */
-#define T_TXE           0x7f    /* TX Errors */
-
-/*
-** EISA Configuration Register bit definitions
-*/
-
-#define EISA_ID       iobase + 0x0c80  /* EISA ID Registers */
-#define EISA_ID0      iobase + 0x0c80  /* EISA ID Register 0 */
-#define EISA_ID1      iobase + 0x0c81  /* EISA ID Register 1 */
-#define EISA_ID2      iobase + 0x0c82  /* EISA ID Register 2 */
-#define EISA_ID3      iobase + 0x0c83  /* EISA ID Register 3 */
-#define EISA_CR       iobase + 0x0c84  /* EISA Control Register */
-
-/*
-** EEPROM BYTES
-*/
-#define EEPROM_MEMB     0x00
-#define EEPROM_IOB      0x01
-#define EEPROM_EISA_ID0 0x02
-#define EEPROM_EISA_ID1 0x03
-#define EEPROM_EISA_ID2 0x04
-#define EEPROM_EISA_ID3 0x05
-#define EEPROM_MISC0    0x06
-#define EEPROM_MISC1    0x07
-#define EEPROM_PNAME7   0x08
-#define EEPROM_PNAME6   0x09
-#define EEPROM_PNAME5   0x0a
-#define EEPROM_PNAME4   0x0b
-#define EEPROM_PNAME3   0x0c
-#define EEPROM_PNAME2   0x0d
-#define EEPROM_PNAME1   0x0e
-#define EEPROM_PNAME0   0x0f
-#define EEPROM_SWFLAGS  0x10
-#define EEPROM_HWCAT    0x11
-#define EEPROM_NETMAN2  0x12
-#define EEPROM_REVLVL   0x13
-#define EEPROM_NETMAN0  0x14
-#define EEPROM_NETMAN1  0x15
-#define EEPROM_CHIPVER  0x16
-#define EEPROM_SETUP    0x17
-#define EEPROM_PADDR0   0x18
-#define EEPROM_PADDR1   0x19
-#define EEPROM_PADDR2   0x1a
-#define EEPROM_PADDR3   0x1b
-#define EEPROM_PADDR4   0x1c
-#define EEPROM_PADDR5   0x1d
-#define EEPROM_PA_CRC   0x1e
-#define EEPROM_CHKSUM   0x1f
-
-/*
-** EEPROM bytes for checksumming
-*/
-#define EEPROM_MAX      32             /* bytes */
-
-/*
-** EEPROM MISCELLANEOUS FLAGS
-*/
-#define RBE_SHADOW     0x0100  /* Remote Boot Enable Shadow */
-#define READ_AHEAD      0x0080  /* Read Ahead feature */
-#define IRQ_SEL2        0x0070  /* IRQ line selection (LeMAC2) */
-#define IRQ_SEL         0x0060  /* IRQ line selection */
-#define FAST_BUS        0x0008  /* ISA Bus speeds > 8.33MHz */
-#define ENA_16          0x0004  /* Enables 16 bit memory transfers */
-#define WRITE_BEHIND    0x0002  /* Write Behind feature */
-#define _0WS_ENA        0x0001  /* Zero Wait State Enable */
-
-/*
-** EEPROM NETWORK MANAGEMENT FLAGS
-*/
-#define NETMAN_POL      0x04    /* Polarity defeat */
-#define NETMAN_LINK     0x02    /* Link defeat */
-#define NETMAN_CCE      0x01    /* Custom Counters Enable */
-
-/*
-** EEPROM SW FLAGS
-*/
-#define SW_SQE         0x10    /* Signal Quality Error */
-#define SW_LAB         0x08    /* Less Aggressive Backoff */
-#define SW_INIT                0x04    /* Initialized */
-#define SW_TIMEOUT             0x02    /* 0:2.5 mins, 1: 30 secs */
-#define SW_REMOTE              0x01    /* Remote Boot Enable -> 1 */
-
-/*
-** EEPROM SETUP FLAGS
-*/
-#define SETUP_APD      0x80    /* AutoPort Disable */
-#define SETUP_PS       0x40    /* Port Select */
-#define SETUP_MP       0x20    /* MultiPort */
-#define SETUP_1TP      0x10    /* 1 port, TP */
-#define SETUP_1COAX    0x00    /* 1 port, Coax */
-#define SETUP_DRAM     0x02    /* Number of DRAMS on board */
-
-/*
-** EEPROM MANAGEMENT FLAGS
-*/
-#define MGMT_CCE       0x01    /* Custom Counters Enable */
-
-/*
-** EEPROM VERSIONS
-*/
-#define LeMAC           0x11
-#define LeMAC2          0x12
-
-/*
-** Miscellaneous
-*/
-
-#define EEPROM_WAIT_TIME 1000    /* Number of microseconds */
-#define EISA_EN         0x0001   /* Enable EISA bus buffers */
-
-#define HASH_TABLE_LEN   512     /* Bits */
-
-#define XCT 0x80                 /* Transmit Cut Through */
-#define PRELOAD 16               /* 4 long words */
-
-#define MASK_INTERRUPTS   1
-#define UNMASK_INTERRUPTS 0
-
-#define EEPROM_OFFSET(a) ((u_short)((u_long)(a)))
-
-/*
-** Include the IOCTL stuff
-*/
-#include <linux/sockios.h>
-
-#define        EWRK3IOCTL      SIOCDEVPRIVATE
-
-struct ewrk3_ioctl {
-       unsigned short cmd;                /* Command to run */
-       unsigned short len;                /* Length of the data buffer */
-       unsigned char  __user *data;       /* Pointer to the data buffer */
-};
-
-/*
-** Recognised commands for the driver
-*/
-#define EWRK3_GET_HWADDR       0x01 /* Get the hardware address */
-#define EWRK3_SET_HWADDR       0x02 /* Get the hardware address */
-#define EWRK3_SET_PROM         0x03 /* Set Promiscuous Mode */
-#define EWRK3_CLR_PROM         0x04 /* Clear Promiscuous Mode */
-#define EWRK3_SAY_BOO          0x05 /* Say "Boo!" to the kernel log file */
-#define EWRK3_GET_MCA          0x06 /* Get a multicast address */
-#define EWRK3_SET_MCA          0x07 /* Set a multicast address */
-#define EWRK3_CLR_MCA          0x08 /* Clear a multicast address */
-#define EWRK3_MCA_EN           0x09 /* Enable a multicast address group */
-#define EWRK3_GET_STATS        0x0a /* Get the driver statistics */
-#define EWRK3_CLR_STATS        0x0b /* Zero out the driver statistics */
-#define EWRK3_GET_CSR          0x0c /* Get the CSR Register contents */
-#define EWRK3_SET_CSR          0x0d /* Set the CSR Register contents */
-#define EWRK3_GET_EEPROM       0x0e /* Get the EEPROM contents */
-#define EWRK3_SET_EEPROM       0x0f /* Set the EEPROM contents */
-#define EWRK3_GET_CMR          0x10 /* Get the CMR Register contents */
-#define EWRK3_CLR_TX_CUT_THRU          0x11 /* Clear the TX cut through mode */
-#define EWRK3_SET_TX_CUT_THRU  0x12 /* Set the TX cut through mode */
index b5afe218c31be3644df3c7c527a3a574b45e8320..ee26ce78e270cabfb7acff61745b597703bab13c 100644 (file)
@@ -5,7 +5,7 @@
 config NET_VENDOR_DLINK
        bool "D-Link devices"
        default y
-       depends on PCI || PARPORT
+       depends on PCI
        ---help---
          If you have a network (Ethernet) card belonging to this class, say Y
          and read the Ethernet-HOWTO, available from
@@ -18,36 +18,6 @@ config NET_VENDOR_DLINK
 
 if NET_VENDOR_DLINK
 
-config DE600
-       tristate "D-Link DE600 pocket adapter support"
-       depends on PARPORT
-       ---help---
-         This is a network (Ethernet) device which attaches to your parallel
-         port. Read <file:Documentation/networking/DLINK.txt> as well as the
-         Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>, if you want to use
-         this. It is possible to have several devices share a single parallel
-         port and it is safe to compile the corresponding drivers into the
-         kernel.
-
-         To compile this driver as a module, choose M here: the module
-         will be called de600.
-
-config DE620
-       tristate "D-Link DE620 pocket adapter support"
-       depends on PARPORT
-       ---help---
-         This is a network (Ethernet) device which attaches to your parallel
-         port. Read <file:Documentation/networking/DLINK.txt> as well as the
-         Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>, if you want to use
-         this. It is possible to have several devices share a single parallel
-         port and it is safe to compile the corresponding drivers into the
-         kernel.
-
-         To compile this driver as a module, choose M here: the module
-         will be called de620.
-
 config DL2K
        tristate "DL2000/TC902x-based Gigabit Ethernet support"
        depends on PCI
index c705eaa4f5b27f0426db53de19bb882cd539550e..40085f67157bde9be0634e1aad39050a6f0a8fcf 100644 (file)
@@ -2,7 +2,5 @@
 # Makefile for the D-Link network device drivers.
 #
 
-obj-$(CONFIG_DE600) += de600.o
-obj-$(CONFIG_DE620) += de620.o
 obj-$(CONFIG_DL2K) += dl2k.o
 obj-$(CONFIG_SUNDANCE) += sundance.o
diff --git a/drivers/net/ethernet/dlink/de600.c b/drivers/net/ethernet/dlink/de600.c
deleted file mode 100644 (file)
index 414f0ee..0000000
+++ /dev/null
@@ -1,529 +0,0 @@
-static const char version[] = "de600.c: $Revision: 1.41-2.5 $,  Bjorn Ekwall (bj0rn@blox.se)\n";
-/*
- *     de600.c
- *
- *     Linux driver for the D-Link DE-600 Ethernet pocket adapter.
- *
- *     Portions (C) Copyright 1993, 1994 by Bjorn Ekwall
- *     The Author may be reached as bj0rn@blox.se
- *
- *     Based on adapter information gathered from DE600.ASM by D-Link Inc.,
- *     as included on disk C in the v.2.11 of PC/TCP from FTP Software.
- *     For DE600.asm:
- *             Portions (C) Copyright 1990 D-Link, Inc.
- *             Copyright, 1988-1992, Russell Nelson, Crynwr Software
- *
- *     Adapted to the sample network driver core for linux,
- *     written by: Donald Becker <becker@super.org>
- *             (Now at <becker@scyld.com>)
- *
- **************************************************************/
-/*
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2, or (at your option)
- *     any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- **************************************************************/
-
-/* Add more time here if your adapter won't work OK: */
-#define DE600_SLOW_DOWN        udelay(delay_time)
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/string.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-
-#include <asm/io.h>
-
-#include "de600.h"
-
-static bool check_lost = true;
-module_param(check_lost, bool, 0);
-MODULE_PARM_DESC(check_lost, "If set then check for unplugged de600");
-
-static unsigned int delay_time = 10;
-module_param(delay_time, int, 0);
-MODULE_PARM_DESC(delay_time, "DE-600 deley on I/O in microseconds");
-
-
-/*
- * D-Link driver variables:
- */
-
-static volatile int            rx_page;
-
-#define TX_PAGES 2
-static volatile int            tx_fifo[TX_PAGES];
-static volatile int            tx_fifo_in;
-static volatile int            tx_fifo_out;
-static volatile int            free_tx_pages = TX_PAGES;
-static int                     was_down;
-static DEFINE_SPINLOCK(de600_lock);
-
-static inline u8 de600_read_status(struct net_device *dev)
-{
-       u8 status;
-
-       outb_p(STATUS, DATA_PORT);
-       status = inb(STATUS_PORT);
-       outb_p(NULL_COMMAND | HI_NIBBLE, DATA_PORT);
-
-       return status;
-}
-
-static inline u8 de600_read_byte(unsigned char type, struct net_device *dev)
-{
-       /* dev used by macros */
-       u8 lo;
-       outb_p((type), DATA_PORT);
-       lo = ((unsigned char)inb(STATUS_PORT)) >> 4;
-       outb_p((type) | HI_NIBBLE, DATA_PORT);
-       return ((unsigned char)inb(STATUS_PORT) & (unsigned char)0xf0) | lo;
-}
-
-/*
- * Open/initialize the board.  This is called (in the current kernel)
- * after booting when 'ifconfig <dev->name> $IP_ADDR' is run (in rc.inet1).
- *
- * This routine should set everything up anew at each open, even
- * registers that "should" only need to be set once at boot, so that
- * there is a non-reboot way to recover if something goes wrong.
- */
-
-static int de600_open(struct net_device *dev)
-{
-       unsigned long flags;
-       int ret = request_irq(DE600_IRQ, de600_interrupt, 0, dev->name, dev);
-       if (ret) {
-               printk(KERN_ERR "%s: unable to get IRQ %d\n", dev->name, DE600_IRQ);
-               return ret;
-       }
-       spin_lock_irqsave(&de600_lock, flags);
-       ret = adapter_init(dev);
-       spin_unlock_irqrestore(&de600_lock, flags);
-       return ret;
-}
-
-/*
- * The inverse routine to de600_open().
- */
-
-static int de600_close(struct net_device *dev)
-{
-       select_nic();
-       rx_page = 0;
-       de600_put_command(RESET);
-       de600_put_command(STOP_RESET);
-       de600_put_command(0);
-       select_prn();
-       free_irq(DE600_IRQ, dev);
-       return 0;
-}
-
-static inline void trigger_interrupt(struct net_device *dev)
-{
-       de600_put_command(FLIP_IRQ);
-       select_prn();
-       DE600_SLOW_DOWN;
-       select_nic();
-       de600_put_command(0);
-}
-
-/*
- * Copy a buffer to the adapter transmit page memory.
- * Start sending.
- */
-
-static int de600_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       unsigned long flags;
-       int     transmit_from;
-       int     len;
-       int     tickssofar;
-       u8      *buffer = skb->data;
-       int     i;
-
-       if (free_tx_pages <= 0) {       /* Do timeouts, to avoid hangs. */
-               tickssofar = jiffies - dev_trans_start(dev);
-               if (tickssofar < HZ/20)
-                       return NETDEV_TX_BUSY;
-               /* else */
-               printk(KERN_WARNING "%s: transmit timed out (%d), %s?\n", dev->name, tickssofar, "network cable problem");
-               /* Restart the adapter. */
-               spin_lock_irqsave(&de600_lock, flags);
-               if (adapter_init(dev)) {
-                       spin_unlock_irqrestore(&de600_lock, flags);
-                       return NETDEV_TX_BUSY;
-               }
-               spin_unlock_irqrestore(&de600_lock, flags);
-       }
-
-       /* Start real output */
-       pr_debug("de600_start_xmit:len=%d, page %d/%d\n", skb->len, tx_fifo_in, free_tx_pages);
-
-       if ((len = skb->len) < RUNT)
-               len = RUNT;
-
-       spin_lock_irqsave(&de600_lock, flags);
-       select_nic();
-       tx_fifo[tx_fifo_in] = transmit_from = tx_page_adr(tx_fifo_in) - len;
-       tx_fifo_in = (tx_fifo_in + 1) % TX_PAGES; /* Next free tx page */
-
-       if(check_lost)
-       {
-               /* This costs about 40 instructions per packet... */
-               de600_setup_address(NODE_ADDRESS, RW_ADDR);
-               de600_read_byte(READ_DATA, dev);
-               if (was_down || (de600_read_byte(READ_DATA, dev) != 0xde)) {
-                       if (adapter_init(dev)) {
-                               spin_unlock_irqrestore(&de600_lock, flags);
-                               return NETDEV_TX_BUSY;
-                       }
-               }
-       }
-
-       de600_setup_address(transmit_from, RW_ADDR);
-       for (i = 0;  i < skb->len ; ++i, ++buffer)
-               de600_put_byte(*buffer);
-       for (; i < len; ++i)
-               de600_put_byte(0);
-
-       if (free_tx_pages-- == TX_PAGES) { /* No transmission going on */
-               dev->trans_start = jiffies;
-               netif_start_queue(dev); /* allow more packets into adapter */
-               /* Send page and generate a faked interrupt */
-               de600_setup_address(transmit_from, TX_ADDR);
-               de600_put_command(TX_ENABLE);
-       }
-       else {
-               if (free_tx_pages)
-                       netif_start_queue(dev);
-               else
-                       netif_stop_queue(dev);
-               select_prn();
-       }
-       spin_unlock_irqrestore(&de600_lock, flags);
-       dev_kfree_skb(skb);
-       return NETDEV_TX_OK;
-}
-
-/*
- * The typical workload of the driver:
- * Handle the network interface interrupts.
- */
-
-static irqreturn_t de600_interrupt(int irq, void *dev_id)
-{
-       struct net_device       *dev = dev_id;
-       u8              irq_status;
-       int             retrig = 0;
-       int             boguscount = 0;
-
-       spin_lock(&de600_lock);
-
-       select_nic();
-       irq_status = de600_read_status(dev);
-
-       do {
-               pr_debug("de600_interrupt (%02X)\n", irq_status);
-
-               if (irq_status & RX_GOOD)
-                       de600_rx_intr(dev);
-               else if (!(irq_status & RX_BUSY))
-                       de600_put_command(RX_ENABLE);
-
-               /* Any transmission in progress? */
-               if (free_tx_pages < TX_PAGES)
-                       retrig = de600_tx_intr(dev, irq_status);
-               else
-                       retrig = 0;
-
-               irq_status = de600_read_status(dev);
-       } while ( (irq_status & RX_GOOD) || ((++boguscount < 100) && retrig) );
-       /*
-        * Yeah, it _looks_ like busy waiting, smells like busy waiting
-        * and I know it's not PC, but please, it will only occur once
-        * in a while and then only for a loop or so (< 1ms for sure!)
-        */
-
-       /* Enable adapter interrupts */
-       select_prn();
-       if (retrig)
-               trigger_interrupt(dev);
-       spin_unlock(&de600_lock);
-       return IRQ_HANDLED;
-}
-
-static int de600_tx_intr(struct net_device *dev, int irq_status)
-{
-       /*
-        * Returns 1 if tx still not done
-        */
-
-       /* Check if current transmission is done yet */
-       if (irq_status & TX_BUSY)
-               return 1; /* tx not done, try again */
-
-       /* else */
-       /* If last transmission OK then bump fifo index */
-       if (!(irq_status & TX_FAILED16)) {
-               tx_fifo_out = (tx_fifo_out + 1) % TX_PAGES;
-               ++free_tx_pages;
-               dev->stats.tx_packets++;
-               netif_wake_queue(dev);
-       }
-
-       /* More to send, or resend last packet? */
-       if ((free_tx_pages < TX_PAGES) || (irq_status & TX_FAILED16)) {
-               dev->trans_start = jiffies;
-               de600_setup_address(tx_fifo[tx_fifo_out], TX_ADDR);
-               de600_put_command(TX_ENABLE);
-               return 1;
-       }
-       /* else */
-
-       return 0;
-}
-
-/*
- * We have a good packet, get it out of the adapter.
- */
-static void de600_rx_intr(struct net_device *dev)
-{
-       struct sk_buff  *skb;
-       int             i;
-       int             read_from;
-       int             size;
-       unsigned char   *buffer;
-
-       /* Get size of received packet */
-       size = de600_read_byte(RX_LEN, dev);    /* low byte */
-       size += (de600_read_byte(RX_LEN, dev) << 8);    /* high byte */
-       size -= 4;      /* Ignore trailing 4 CRC-bytes */
-
-       /* Tell adapter where to store next incoming packet, enable receiver */
-       read_from = rx_page_adr();
-       next_rx_page();
-       de600_put_command(RX_ENABLE);
-
-       if ((size < 32)  ||  (size > 1535)) {
-               printk(KERN_WARNING "%s: Bogus packet size %d.\n", dev->name, size);
-               if (size > 10000)
-                       adapter_init(dev);
-               return;
-       }
-
-       skb = netdev_alloc_skb(dev, size + 2);
-       if (skb == NULL) {
-               printk("%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size);
-               return;
-       }
-       /* else */
-
-       skb_reserve(skb,2);     /* Align */
-
-       /* 'skb->data' points to the start of sk_buff data area. */
-       buffer = skb_put(skb,size);
-
-       /* copy the packet into the buffer */
-       de600_setup_address(read_from, RW_ADDR);
-       for (i = size; i > 0; --i, ++buffer)
-               *buffer = de600_read_byte(READ_DATA, dev);
-
-       skb->protocol=eth_type_trans(skb,dev);
-
-       netif_rx(skb);
-
-       /* update stats */
-       dev->stats.rx_packets++; /* count all receives */
-       dev->stats.rx_bytes += size; /* count all received bytes */
-
-       /*
-        * If any worth-while packets have been received, netif_rx()
-        * will work on them when we get to the tasklets.
-        */
-}
-
-static const struct net_device_ops de600_netdev_ops = {
-       .ndo_open               = de600_open,
-       .ndo_stop               = de600_close,
-       .ndo_start_xmit         = de600_start_xmit,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-
-static struct net_device * __init de600_probe(void)
-{
-       int     i;
-       struct net_device *dev;
-       int err;
-
-       dev = alloc_etherdev(0);
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-
-       if (!request_region(DE600_IO, 3, "de600")) {
-               printk(KERN_WARNING "DE600: port 0x%x busy\n", DE600_IO);
-               err = -EBUSY;
-               goto out;
-       }
-
-       printk(KERN_INFO "%s: D-Link DE-600 pocket adapter", dev->name);
-       /* Alpha testers must have the version number to report bugs. */
-       pr_debug("%s", version);
-
-       /* probe for adapter */
-       err = -ENODEV;
-       rx_page = 0;
-       select_nic();
-       (void)de600_read_status(dev);
-       de600_put_command(RESET);
-       de600_put_command(STOP_RESET);
-       if (de600_read_status(dev) & 0xf0) {
-               printk(": not at I/O %#3x.\n", DATA_PORT);
-               goto out1;
-       }
-
-       /*
-        * Maybe we found one,
-        * have to check if it is a D-Link DE-600 adapter...
-        */
-
-       /* Get the adapter ethernet address from the ROM */
-       de600_setup_address(NODE_ADDRESS, RW_ADDR);
-       for (i = 0; i < ETH_ALEN; i++) {
-               dev->dev_addr[i] = de600_read_byte(READ_DATA, dev);
-               dev->broadcast[i] = 0xff;
-       }
-
-       /* Check magic code */
-       if ((dev->dev_addr[1] == 0xde) && (dev->dev_addr[2] == 0x15)) {
-               /* OK, install real address */
-               dev->dev_addr[0] = 0x00;
-               dev->dev_addr[1] = 0x80;
-               dev->dev_addr[2] = 0xc8;
-               dev->dev_addr[3] &= 0x0f;
-               dev->dev_addr[3] |= 0x70;
-       } else {
-               printk(" not identified in the printer port\n");
-               goto out1;
-       }
-
-       printk(", Ethernet Address: %pM\n", dev->dev_addr);
-
-       dev->netdev_ops = &de600_netdev_ops;
-
-       dev->flags&=~IFF_MULTICAST;
-
-       select_prn();
-
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-
-       return dev;
-
-out1:
-       release_region(DE600_IO, 3);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-static int adapter_init(struct net_device *dev)
-{
-       int     i;
-
-       select_nic();
-       rx_page = 0; /* used by RESET */
-       de600_put_command(RESET);
-       de600_put_command(STOP_RESET);
-
-       /* Check if it is still there... */
-       /* Get the some bytes of the adapter ethernet address from the ROM */
-       de600_setup_address(NODE_ADDRESS, RW_ADDR);
-       de600_read_byte(READ_DATA, dev);
-       if ((de600_read_byte(READ_DATA, dev) != 0xde) ||
-           (de600_read_byte(READ_DATA, dev) != 0x15)) {
-       /* was: if (de600_read_status(dev) & 0xf0) { */
-               printk("Something has happened to the DE-600!  Please check it and do a new ifconfig!\n");
-               /* Goodbye, cruel world... */
-               dev->flags &= ~IFF_UP;
-               de600_close(dev);
-               was_down = 1;
-               netif_stop_queue(dev); /* Transmit busy...  */
-               return 1; /* failed */
-       }
-
-       if (was_down) {
-               printk(KERN_INFO "%s: Thanks, I feel much better now!\n", dev->name);
-               was_down = 0;
-       }
-
-       tx_fifo_in = 0;
-       tx_fifo_out = 0;
-       free_tx_pages = TX_PAGES;
-
-
-       /* set the ether address. */
-       de600_setup_address(NODE_ADDRESS, RW_ADDR);
-       for (i = 0; i < ETH_ALEN; i++)
-               de600_put_byte(dev->dev_addr[i]);
-
-       /* where to start saving incoming packets */
-       rx_page = RX_BP | RX_BASE_PAGE;
-       de600_setup_address(MEM_4K, RW_ADDR);
-       /* Enable receiver */
-       de600_put_command(RX_ENABLE);
-       select_prn();
-
-       netif_start_queue(dev);
-
-       return 0; /* OK */
-}
-
-static struct net_device *de600_dev;
-
-static int __init de600_init(void)
-{
-       de600_dev = de600_probe();
-       if (IS_ERR(de600_dev))
-               return PTR_ERR(de600_dev);
-       return 0;
-}
-
-static void __exit de600_exit(void)
-{
-       unregister_netdev(de600_dev);
-       release_region(DE600_IO, 3);
-       free_netdev(de600_dev);
-}
-
-module_init(de600_init);
-module_exit(de600_exit);
-
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/dlink/de600.h b/drivers/net/ethernet/dlink/de600.h
deleted file mode 100644 (file)
index e80ecba..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-/**************************************************
- *                                                *
- * Definition of D-Link Ethernet Pocket adapter   *
- *                                                *
- **************************************************/
-/*
- * D-Link Ethernet pocket adapter ports
- */
-/*
- * OK, so I'm cheating, but there are an awful lot of
- * reads and writes in order to get anything in and out
- * of the DE-600 with 4 bits at a time in the parallel port,
- * so every saved instruction really helps :-)
- */
-
-#ifndef DE600_IO
-#define DE600_IO       0x378
-#endif
-
-#define DATA_PORT      (DE600_IO)
-#define STATUS_PORT    (DE600_IO + 1)
-#define COMMAND_PORT   (DE600_IO + 2)
-
-#ifndef DE600_IRQ
-#define DE600_IRQ      7
-#endif
-/*
- * It really should look like this, and autoprobing as well...
- *
-#define DATA_PORT      (dev->base_addr + 0)
-#define STATUS_PORT    (dev->base_addr + 1)
-#define COMMAND_PORT   (dev->base_addr + 2)
-#define DE600_IRQ      dev->irq
- */
-
-/*
- * D-Link COMMAND_PORT commands
- */
-#define SELECT_NIC     0x04 /* select Network Interface Card */
-#define SELECT_PRN     0x1c /* select Printer */
-#define NML_PRN                0xec /* normal Printer situation */
-#define IRQEN          0x10 /* enable IRQ line */
-
-/*
- * D-Link STATUS_PORT
- */
-#define RX_BUSY                0x80
-#define RX_GOOD                0x40
-#define TX_FAILED16    0x10
-#define TX_BUSY                0x08
-
-/*
- * D-Link DATA_PORT commands
- * command in low 4 bits
- * data in high 4 bits
- * select current data nibble with HI_NIBBLE bit
- */
-#define WRITE_DATA     0x00 /* write memory */
-#define READ_DATA      0x01 /* read memory */
-#define STATUS         0x02 /* read  status register */
-#define COMMAND                0x03 /* write command register (see COMMAND below) */
-#define NULL_COMMAND   0x04 /* null command */
-#define RX_LEN         0x05 /* read  received packet length */
-#define TX_ADDR                0x06 /* set adapter transmit memory address */
-#define RW_ADDR                0x07 /* set adapter read/write memory address */
-#define HI_NIBBLE      0x08 /* read/write the high nibble of data,
-                               or-ed with rest of command */
-
-/*
- * command register, accessed through DATA_PORT with low bits = COMMAND
- */
-#define RX_ALL         0x01 /* PROMISCUOUS */
-#define RX_BP          0x02 /* default: BROADCAST & PHYSICAL ADDRESS */
-#define RX_MBP         0x03 /* MULTICAST, BROADCAST & PHYSICAL ADDRESS */
-
-#define TX_ENABLE      0x04 /* bit 2 */
-#define RX_ENABLE      0x08 /* bit 3 */
-
-#define RESET          0x80 /* set bit 7 high */
-#define STOP_RESET     0x00 /* set bit 7 low */
-
-/*
- * data to command register
- * (high 4 bits in write to DATA_PORT)
- */
-#define RX_PAGE2_SELECT        0x10 /* bit 4, only 2 pages to select */
-#define RX_BASE_PAGE   0x20 /* bit 5, always set when specifying RX_ADDR */
-#define FLIP_IRQ       0x40 /* bit 6 */
-
-/*
- * D-Link adapter internal memory:
- *
- * 0-2K 1:st transmit page (send from pointer up to 2K)
- * 2-4K        2:nd transmit page (send from pointer up to 4K)
- *
- * 4-6K 1:st receive page (data from 4K upwards)
- * 6-8K 2:nd receive page (data from 6K upwards)
- *
- * 8K+ Adapter ROM (contains magic code and last 3 bytes of Ethernet address)
- */
-#define MEM_2K         0x0800 /* 2048 */
-#define MEM_4K         0x1000 /* 4096 */
-#define MEM_6K         0x1800 /* 6144 */
-#define NODE_ADDRESS   0x2000 /* 8192 */
-
-#define RUNT 60                /* Too small Ethernet packet */
-
-/**************************************************
- *                                                *
- *             End of definition                  *
- *                                                *
- **************************************************/
-
-/*
- * Index to functions, as function prototypes.
- */
-/* Routines used internally. (See "convenience macros") */
-static u8      de600_read_status(struct net_device *dev);
-static u8      de600_read_byte(unsigned char type, struct net_device *dev);
-
-/* Put in the device structure. */
-static int     de600_open(struct net_device *dev);
-static int     de600_close(struct net_device *dev);
-static int     de600_start_xmit(struct sk_buff *skb, struct net_device *dev);
-
-/* Dispatch from interrupts. */
-static irqreturn_t de600_interrupt(int irq, void *dev_id);
-static int     de600_tx_intr(struct net_device *dev, int irq_status);
-static void    de600_rx_intr(struct net_device *dev);
-
-/* Initialization */
-static void    trigger_interrupt(struct net_device *dev);
-static int     adapter_init(struct net_device *dev);
-
-/*
- * Convenience macros/functions for D-Link adapter
- */
-
-#define select_prn() outb_p(SELECT_PRN, COMMAND_PORT); DE600_SLOW_DOWN
-#define select_nic() outb_p(SELECT_NIC, COMMAND_PORT); DE600_SLOW_DOWN
-
-/* Thanks for hints from Mark Burton <markb@ordern.demon.co.uk> */
-#define de600_put_byte(data) ( \
-       outb_p(((data) << 4)   | WRITE_DATA            , DATA_PORT), \
-       outb_p(((data) & 0xf0) | WRITE_DATA | HI_NIBBLE, DATA_PORT))
-
-/*
- * The first two outb_p()'s below could perhaps be deleted if there
- * would be more delay in the last two. Not certain about it yet...
- */
-#define de600_put_command(cmd) ( \
-       outb_p(( rx_page        << 4)   | COMMAND            , DATA_PORT), \
-       outb_p(( rx_page        & 0xf0) | COMMAND | HI_NIBBLE, DATA_PORT), \
-       outb_p(((rx_page | cmd) << 4)   | COMMAND            , DATA_PORT), \
-       outb_p(((rx_page | cmd) & 0xf0) | COMMAND | HI_NIBBLE, DATA_PORT))
-
-#define de600_setup_address(addr,type) ( \
-       outb_p((((addr) << 4) & 0xf0) | type            , DATA_PORT), \
-       outb_p(( (addr)       & 0xf0) | type | HI_NIBBLE, DATA_PORT), \
-       outb_p((((addr) >> 4) & 0xf0) | type            , DATA_PORT), \
-       outb_p((((addr) >> 8) & 0xf0) | type | HI_NIBBLE, DATA_PORT))
-
-#define rx_page_adr() ((rx_page & RX_PAGE2_SELECT)?(MEM_6K):(MEM_4K))
-
-/* Flip bit, only 2 pages */
-#define next_rx_page() (rx_page ^= RX_PAGE2_SELECT)
-
-#define tx_page_adr(a) (((a) + 1) * MEM_2K)
diff --git a/drivers/net/ethernet/dlink/de620.c b/drivers/net/ethernet/dlink/de620.c
deleted file mode 100644 (file)
index 2e2bc60..0000000
+++ /dev/null
@@ -1,987 +0,0 @@
-/*
- *     de620.c $Revision: 1.40 $ BETA
- *
- *
- *     Linux driver for the D-Link DE-620 Ethernet pocket adapter.
- *
- *     Portions (C) Copyright 1993, 1994 by Bjorn Ekwall <bj0rn@blox.se>
- *
- *     Based on adapter information gathered from DOS packetdriver
- *     sources from D-Link Inc:  (Special thanks to Henry Ngai of D-Link.)
- *             Portions (C) Copyright D-Link SYSTEM Inc. 1991, 1992
- *             Copyright, 1988, Russell Nelson, Crynwr Software
- *
- *     Adapted to the sample network driver core for linux,
- *     written by: Donald Becker <becker@super.org>
- *             (Now at <becker@scyld.com>)
- *
- *     Valuable assistance from:
- *             J. Joshua Kopper <kopper@rtsg.mot.com>
- *             Olav Kvittem <Olav.Kvittem@uninett.no>
- *             Germano Caronni <caronni@nessie.cs.id.ethz.ch>
- *             Jeremy Fitzhardinge <jeremy@suite.sw.oz.au>
- *
- *****************************************************************************/
-/*
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2, or (at your option)
- *     any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *****************************************************************************/
-static const char version[] =
-       "de620.c: $Revision: 1.40 $,  Bjorn Ekwall <bj0rn@blox.se>\n";
-
-/***********************************************************************
- *
- * "Tuning" section.
- *
- * Compile-time options: (see below for descriptions)
- * -DDE620_IO=0x378    (lpt1)
- * -DDE620_IRQ=7       (lpt1)
- * -DSHUTDOWN_WHEN_LOST
- * -DCOUNT_LOOPS
- * -DLOWSPEED
- * -DREAD_DELAY
- * -DWRITE_DELAY
- */
-
-/*
- * This driver assumes that the printer port is a "normal",
- * dumb, uni-directional port!
- * If your port is "fancy" in any way, please try to set it to "normal"
- * with your BIOS setup.  I have no access to machines with bi-directional
- * ports, so I can't test such a driver :-(
- * (Yes, I _know_ it is possible to use DE620 with bidirectional ports...)
- *
- * There are some clones of DE620 out there, with different names.
- * If the current driver does not recognize a clone, try to change
- * the following #define to:
- *
- * #define DE620_CLONE 1
- */
-#define DE620_CLONE 0
-
-/*
- * If the adapter has problems with high speeds, enable this #define
- * otherwise full printerport speed will be attempted.
- *
- * You can tune the READ_DELAY/WRITE_DELAY below if you enable LOWSPEED
- *
-#define LOWSPEED
- */
-
-#ifndef READ_DELAY
-#define READ_DELAY 100 /* adapter internal read delay in 100ns units */
-#endif
-
-#ifndef WRITE_DELAY
-#define WRITE_DELAY 100        /* adapter internal write delay in 100ns units */
-#endif
-
-/*
- * Enable this #define if you want the adapter to do a "ifconfig down" on
- * itself when we have detected that something is possibly wrong with it.
- * The default behaviour is to retry with "adapter_init()" until success.
- * This should be used for debugging purposes only.
- *
-#define SHUTDOWN_WHEN_LOST
- */
-
-#ifdef LOWSPEED
-/*
- * Enable this #define if you want to see debugging output that show how long
- * we have to wait before the DE-620 is ready for the next read/write/command.
- *
-#define COUNT_LOOPS
- */
-#endif
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/string.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-
-#include <asm/io.h>
-
-/* Constant definitions for the DE-620 registers, commands and bits */
-#include "de620.h"
-
-typedef unsigned char byte;
-
-/*******************************************************
- *                                                     *
- * Definition of D-Link DE-620 Ethernet Pocket adapter *
- * See also "de620.h"                                  *
- *                                                     *
- *******************************************************/
-#ifndef DE620_IO /* Compile-time configurable */
-#define DE620_IO 0x378
-#endif
-
-#ifndef DE620_IRQ /* Compile-time configurable */
-#define DE620_IRQ      7
-#endif
-
-#define DATA_PORT      (dev->base_addr)
-#define STATUS_PORT    (dev->base_addr + 1)
-#define COMMAND_PORT   (dev->base_addr + 2)
-
-#define RUNT 60                /* Too small Ethernet packet */
-#define GIANT 1514     /* largest legal size packet, no fcs */
-
-/*
- * Force media with insmod:
- *     insmod de620.o bnc=1
- * or
- *     insmod de620.o utp=1
- *
- * Force io and/or irq with insmod:
- *     insmod de620.o io=0x378 irq=7
- *
- * Make a clone skip the Ethernet-address range check:
- *     insmod de620.o clone=1
- */
-static int bnc;
-static int utp;
-static int io  = DE620_IO;
-static int irq = DE620_IRQ;
-static int clone = DE620_CLONE;
-
-static spinlock_t de620_lock;
-
-module_param(bnc, int, 0);
-module_param(utp, int, 0);
-module_param(io, int, 0);
-module_param(irq, int, 0);
-module_param(clone, int, 0);
-MODULE_PARM_DESC(bnc, "DE-620 set BNC medium (0-1)");
-MODULE_PARM_DESC(utp, "DE-620 set UTP medium (0-1)");
-MODULE_PARM_DESC(io, "DE-620 I/O base address,required");
-MODULE_PARM_DESC(irq, "DE-620 IRQ number,required");
-MODULE_PARM_DESC(clone, "Check also for non-D-Link DE-620 clones (0-1)");
-
-/***********************************************
- *                                             *
- * Index to functions, as function prototypes. *
- *                                             *
- ***********************************************/
-
-/*
- * Routines used internally. (See also "convenience macros.. below")
- */
-
-/* Put in the device structure. */
-static int     de620_open(struct net_device *);
-static int     de620_close(struct net_device *);
-static void    de620_set_multicast_list(struct net_device *);
-static int     de620_start_xmit(struct sk_buff *, struct net_device *);
-
-/* Dispatch from interrupts. */
-static irqreturn_t de620_interrupt(int, void *);
-static int     de620_rx_intr(struct net_device *);
-
-/* Initialization */
-static int     adapter_init(struct net_device *);
-static int     read_eeprom(struct net_device *);
-
-
-/*
- * D-Link driver variables:
- */
-#define SCR_DEF NIBBLEMODE |INTON | SLEEP | AUTOTX
-#define        TCR_DEF RXPB                    /* not used: | TXSUCINT | T16INT */
-#define DE620_RX_START_PAGE 12         /* 12 pages (=3k) reserved for tx */
-#define DEF_NIC_CMD IRQEN | ICEN | DS1
-
-static volatile byte   NIC_Cmd;
-static volatile byte   next_rx_page;
-static byte            first_rx_page;
-static byte            last_rx_page;
-static byte            EIPRegister;
-
-static struct nic {
-       byte    NodeID[6];
-       byte    RAM_Size;
-       byte    Model;
-       byte    Media;
-       byte    SCR;
-} nic_data;
-
-/**********************************************************
- *                                                        *
- * Convenience macros/functions for D-Link DE-620 adapter *
- *                                                        *
- **********************************************************/
-#define de620_tx_buffs(dd) (inb(STATUS_PORT) & (TXBF0 | TXBF1))
-#define de620_flip_ds(dd) NIC_Cmd ^= DS0 | DS1; outb(NIC_Cmd, COMMAND_PORT);
-
-/* Check for ready-status, and return a nibble (high 4 bits) for data input */
-#ifdef COUNT_LOOPS
-static int tot_cnt;
-#endif
-static inline byte
-de620_ready(struct net_device *dev)
-{
-       byte value;
-       register short int cnt = 0;
-
-       while ((((value = inb(STATUS_PORT)) & READY) == 0) && (cnt <= 1000))
-               ++cnt;
-
-#ifdef COUNT_LOOPS
-       tot_cnt += cnt;
-#endif
-       return value & 0xf0; /* nibble */
-}
-
-static inline void
-de620_send_command(struct net_device *dev, byte cmd)
-{
-       de620_ready(dev);
-       if (cmd == W_DUMMY)
-               outb(NIC_Cmd, COMMAND_PORT);
-
-       outb(cmd, DATA_PORT);
-
-       outb(NIC_Cmd ^ CS0, COMMAND_PORT);
-       de620_ready(dev);
-       outb(NIC_Cmd, COMMAND_PORT);
-}
-
-static inline void
-de620_put_byte(struct net_device *dev, byte value)
-{
-       /* The de620_ready() makes 7 loops, on the average, on a DX2/66 */
-       de620_ready(dev);
-       outb(value, DATA_PORT);
-       de620_flip_ds(dev);
-}
-
-static inline byte
-de620_read_byte(struct net_device *dev)
-{
-       byte value;
-
-       /* The de620_ready() makes 7 loops, on the average, on a DX2/66 */
-       value = de620_ready(dev); /* High nibble */
-       de620_flip_ds(dev);
-       value |= de620_ready(dev) >> 4; /* Low nibble */
-       return value;
-}
-
-static inline void
-de620_write_block(struct net_device *dev, byte *buffer, int count, int pad)
-{
-#ifndef LOWSPEED
-       byte uflip = NIC_Cmd ^ (DS0 | DS1);
-       byte dflip = NIC_Cmd;
-#else /* LOWSPEED */
-#ifdef COUNT_LOOPS
-       int bytes = count;
-#endif /* COUNT_LOOPS */
-#endif /* LOWSPEED */
-
-#ifdef LOWSPEED
-#ifdef COUNT_LOOPS
-       tot_cnt = 0;
-#endif /* COUNT_LOOPS */
-       /* No further optimization useful, the limit is in the adapter. */
-       for ( ; count > 0; --count, ++buffer) {
-               de620_put_byte(dev,*buffer);
-       }
-       for ( count = pad ; count > 0; --count, ++buffer) {
-               de620_put_byte(dev, 0);
-       }
-       de620_send_command(dev,W_DUMMY);
-#ifdef COUNT_LOOPS
-       /* trial debug output: loops per byte in de620_ready() */
-       printk("WRITE(%d)\n", tot_cnt/((bytes?bytes:1)));
-#endif /* COUNT_LOOPS */
-#else /* not LOWSPEED */
-       for ( ; count > 0; count -=2) {
-               outb(*buffer++, DATA_PORT);
-               outb(uflip, COMMAND_PORT);
-               outb(*buffer++, DATA_PORT);
-               outb(dflip, COMMAND_PORT);
-       }
-       de620_send_command(dev,W_DUMMY);
-#endif /* LOWSPEED */
-}
-
-static inline void
-de620_read_block(struct net_device *dev, byte *data, int count)
-{
-#ifndef LOWSPEED
-       byte value;
-       byte uflip = NIC_Cmd ^ (DS0 | DS1);
-       byte dflip = NIC_Cmd;
-#else /* LOWSPEED */
-#ifdef COUNT_LOOPS
-       int bytes = count;
-
-       tot_cnt = 0;
-#endif /* COUNT_LOOPS */
-#endif /* LOWSPEED */
-
-#ifdef LOWSPEED
-       /* No further optimization useful, the limit is in the adapter. */
-       while (count-- > 0) {
-               *data++ = de620_read_byte(dev);
-               de620_flip_ds(dev);
-       }
-#ifdef COUNT_LOOPS
-       /* trial debug output: loops per byte in de620_ready() */
-       printk("READ(%d)\n", tot_cnt/(2*(bytes?bytes:1)));
-#endif /* COUNT_LOOPS */
-#else /* not LOWSPEED */
-       while (count-- > 0) {
-               value = inb(STATUS_PORT) & 0xf0; /* High nibble */
-               outb(uflip, COMMAND_PORT);
-               *data++ = value | inb(STATUS_PORT) >> 4; /* Low nibble */
-               outb(dflip , COMMAND_PORT);
-       }
-#endif /* LOWSPEED */
-}
-
-static inline void
-de620_set_delay(struct net_device *dev)
-{
-       de620_ready(dev);
-       outb(W_DFR, DATA_PORT);
-       outb(NIC_Cmd ^ CS0, COMMAND_PORT);
-
-       de620_ready(dev);
-#ifdef LOWSPEED
-       outb(WRITE_DELAY, DATA_PORT);
-#else
-       outb(0, DATA_PORT);
-#endif
-       de620_flip_ds(dev);
-
-       de620_ready(dev);
-#ifdef LOWSPEED
-       outb(READ_DELAY, DATA_PORT);
-#else
-       outb(0, DATA_PORT);
-#endif
-       de620_flip_ds(dev);
-}
-
-static inline void
-de620_set_register(struct net_device *dev, byte reg, byte value)
-{
-       de620_ready(dev);
-       outb(reg, DATA_PORT);
-       outb(NIC_Cmd ^ CS0, COMMAND_PORT);
-
-       de620_put_byte(dev, value);
-}
-
-static inline byte
-de620_get_register(struct net_device *dev, byte reg)
-{
-       byte value;
-
-       de620_send_command(dev,reg);
-       value = de620_read_byte(dev);
-       de620_send_command(dev,W_DUMMY);
-
-       return value;
-}
-
-/*********************************************************************
- *
- * Open/initialize the board.
- *
- * This routine should set everything up anew at each open, even
- * registers that "should" only need to be set once at boot, so that
- * there is a non-reboot way to recover if something goes wrong.
- *
- */
-static int de620_open(struct net_device *dev)
-{
-       int ret = request_irq(dev->irq, de620_interrupt, 0, dev->name, dev);
-       if (ret) {
-               printk (KERN_ERR "%s: unable to get IRQ %d\n", dev->name, dev->irq);
-               return ret;
-       }
-
-       if (adapter_init(dev)) {
-               ret = -EIO;
-               goto out_free_irq;
-       }
-
-       netif_start_queue(dev);
-       return 0;
-
-out_free_irq:
-       free_irq(dev->irq, dev);
-       return ret;
-}
-
-/************************************************
- *
- * The inverse routine to de620_open().
- *
- */
-
-static int de620_close(struct net_device *dev)
-{
-       netif_stop_queue(dev);
-       /* disable recv */
-       de620_set_register(dev, W_TCR, RXOFF);
-       free_irq(dev->irq, dev);
-       return 0;
-}
-
-/*********************************************
- *
- * Set or clear the multicast filter for this adaptor.
- * (no real multicast implemented for the DE-620, but she can be promiscuous...)
- *
- */
-
-static void de620_set_multicast_list(struct net_device *dev)
-{
-       if (!netdev_mc_empty(dev) || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
-       { /* Enable promiscuous mode */
-               de620_set_register(dev, W_TCR, (TCR_DEF & ~RXPBM) | RXALL);
-       }
-       else
-       { /* Disable promiscuous mode, use normal mode */
-               de620_set_register(dev, W_TCR, TCR_DEF);
-       }
-}
-
-/*******************************************************
- *
- * Handle timeouts on transmit
- */
-
-static void de620_timeout(struct net_device *dev)
-{
-       printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name, "network cable problem");
-       /* Restart the adapter. */
-       if (!adapter_init(dev)) /* maybe close it */
-               netif_wake_queue(dev);
-}
-
-/*******************************************************
- *
- * Copy a buffer to the adapter transmit page memory.
- * Start sending.
- */
-static int de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       unsigned long flags;
-       int len;
-       byte *buffer = skb->data;
-       byte using_txbuf;
-
-       using_txbuf = de620_tx_buffs(dev); /* Peek at the adapter */
-
-       netif_stop_queue(dev);
-
-
-       if ((len = skb->len) < RUNT)
-               len = RUNT;
-       if (len & 1) /* send an even number of bytes */
-               ++len;
-
-       /* Start real output */
-
-       spin_lock_irqsave(&de620_lock, flags);
-       pr_debug("de620_start_xmit: len=%d, bufs 0x%02x\n",
-               (int)skb->len, using_txbuf);
-
-       /* select a free tx buffer. if there is one... */
-       switch (using_txbuf) {
-       default: /* both are free: use TXBF0 */
-       case TXBF1: /* use TXBF0 */
-               de620_send_command(dev,W_CR | RW0);
-               using_txbuf |= TXBF0;
-               break;
-
-       case TXBF0: /* use TXBF1 */
-               de620_send_command(dev,W_CR | RW1);
-               using_txbuf |= TXBF1;
-               break;
-
-       case (TXBF0 | TXBF1): /* NONE!!! */
-               printk(KERN_WARNING "%s: No tx-buffer available!\n", dev->name);
-               spin_unlock_irqrestore(&de620_lock, flags);
-               return NETDEV_TX_BUSY;
-       }
-       de620_write_block(dev, buffer, skb->len, len-skb->len);
-
-       if(!(using_txbuf == (TXBF0 | TXBF1)))
-               netif_wake_queue(dev);
-
-       dev->stats.tx_packets++;
-       spin_unlock_irqrestore(&de620_lock, flags);
-       dev_kfree_skb (skb);
-       return NETDEV_TX_OK;
-}
-
-/*****************************************************
- *
- * Handle the network interface interrupts.
- *
- */
-static irqreturn_t
-de620_interrupt(int irq_in, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       byte irq_status;
-       int bogus_count = 0;
-       int again = 0;
-
-       spin_lock(&de620_lock);
-
-       /* Read the status register (_not_ the status port) */
-       irq_status = de620_get_register(dev, R_STS);
-
-       pr_debug("de620_interrupt (%2.2X)\n", irq_status);
-
-       if (irq_status & RXGOOD) {
-               do {
-                       again = de620_rx_intr(dev);
-                       pr_debug("again=%d\n", again);
-               }
-               while (again && (++bogus_count < 100));
-       }
-
-       if(de620_tx_buffs(dev) != (TXBF0 | TXBF1))
-               netif_wake_queue(dev);
-
-       spin_unlock(&de620_lock);
-       return IRQ_HANDLED;
-}
-
-/**************************************
- *
- * Get a packet from the adapter
- *
- * Send it "upstairs"
- *
- */
-static int de620_rx_intr(struct net_device *dev)
-{
-       struct header_buf {
-               byte            status;
-               byte            Rx_NextPage;
-               unsigned short  Rx_ByteCount;
-       } header_buf;
-       struct sk_buff *skb;
-       int size;
-       byte *buffer;
-       byte pagelink;
-       byte curr_page;
-
-       pr_debug("de620_rx_intr: next_rx_page = %d\n", next_rx_page);
-
-       /* Tell the adapter that we are going to read data, and from where */
-       de620_send_command(dev, W_CR | RRN);
-       de620_set_register(dev, W_RSA1, next_rx_page);
-       de620_set_register(dev, W_RSA0, 0);
-
-       /* Deep breath, and away we goooooo */
-       de620_read_block(dev, (byte *)&header_buf, sizeof(struct header_buf));
-       pr_debug("page status=0x%02x, nextpage=%d, packetsize=%d\n",
-               header_buf.status, header_buf.Rx_NextPage,
-               header_buf.Rx_ByteCount);
-
-       /* Plausible page header? */
-       pagelink = header_buf.Rx_NextPage;
-       if ((pagelink < first_rx_page) || (last_rx_page < pagelink)) {
-               /* Ouch... Forget it! Skip all and start afresh... */
-               printk(KERN_WARNING "%s: Ring overrun? Restoring...\n", dev->name);
-               /* You win some, you lose some. And sometimes plenty... */
-               adapter_init(dev);
-               netif_wake_queue(dev);
-               dev->stats.rx_over_errors++;
-               return 0;
-       }
-
-       /* OK, this look good, so far. Let's see if it's consistent... */
-       /* Let's compute the start of the next packet, based on where we are */
-       pagelink = next_rx_page +
-               ((header_buf.Rx_ByteCount + (4 - 1 + 0x100)) >> 8);
-
-       /* Are we going to wrap around the page counter? */
-       if (pagelink > last_rx_page)
-               pagelink -= (last_rx_page - first_rx_page + 1);
-
-       /* Is the _computed_ next page number equal to what the adapter says? */
-       if (pagelink != header_buf.Rx_NextPage) {
-               /* Naah, we'll skip this packet. Probably bogus data as well */
-               printk(KERN_WARNING "%s: Page link out of sync! Restoring...\n", dev->name);
-               next_rx_page = header_buf.Rx_NextPage; /* at least a try... */
-               de620_send_command(dev, W_DUMMY);
-               de620_set_register(dev, W_NPRF, next_rx_page);
-               dev->stats.rx_over_errors++;
-               return 0;
-       }
-       next_rx_page = pagelink;
-
-       size = header_buf.Rx_ByteCount - 4;
-       if ((size < RUNT) || (GIANT < size)) {
-               printk(KERN_WARNING "%s: Illegal packet size: %d!\n", dev->name, size);
-       }
-       else { /* Good packet? */
-               skb = netdev_alloc_skb(dev, size + 2);
-               if (skb == NULL) { /* Yeah, but no place to put it... */
-                       printk(KERN_WARNING "%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size);
-                       dev->stats.rx_dropped++;
-               }
-               else { /* Yep! Go get it! */
-                       skb_reserve(skb,2);     /* Align */
-                       /* skb->data points to the start of sk_buff data area */
-                       buffer = skb_put(skb,size);
-                       /* copy the packet into the buffer */
-                       de620_read_block(dev, buffer, size);
-                       pr_debug("Read %d bytes\n", size);
-                       skb->protocol=eth_type_trans(skb,dev);
-                       netif_rx(skb); /* deliver it "upstairs" */
-                       /* count all receives */
-                       dev->stats.rx_packets++;
-                       dev->stats.rx_bytes += size;
-               }
-       }
-
-       /* Let's peek ahead to see if we have read the last current packet */
-       /* NOTE! We're _not_ checking the 'EMPTY'-flag! This seems better... */
-       curr_page = de620_get_register(dev, R_CPR);
-       de620_set_register(dev, W_NPRF, next_rx_page);
-       pr_debug("next_rx_page=%d CPR=%d\n", next_rx_page, curr_page);
-
-       return next_rx_page != curr_page; /* That was slightly tricky... */
-}
-
-/*********************************************
- *
- * Reset the adapter to a known state
- *
- */
-static int adapter_init(struct net_device *dev)
-{
-       int i;
-       static int was_down;
-
-       if ((nic_data.Model == 3) || (nic_data.Model == 0)) { /* CT */
-               EIPRegister = NCTL0;
-               if (nic_data.Media != 1)
-                       EIPRegister |= NIS0;    /* not BNC */
-       }
-       else if (nic_data.Model == 2) { /* UTP */
-               EIPRegister = NCTL0 | NIS0;
-       }
-
-       if (utp)
-               EIPRegister = NCTL0 | NIS0;
-       if (bnc)
-               EIPRegister = NCTL0;
-
-       de620_send_command(dev, W_CR | RNOP | CLEAR);
-       de620_send_command(dev, W_CR | RNOP);
-
-       de620_set_register(dev, W_SCR, SCR_DEF);
-       /* disable recv to wait init */
-       de620_set_register(dev, W_TCR, RXOFF);
-
-       /* Set the node ID in the adapter */
-       for (i = 0; i < 6; ++i) { /* W_PARn = 0xaa + n */
-               de620_set_register(dev, W_PAR0 + i, dev->dev_addr[i]);
-       }
-
-       de620_set_register(dev, W_EIP, EIPRegister);
-
-       next_rx_page = first_rx_page = DE620_RX_START_PAGE;
-       if (nic_data.RAM_Size)
-               last_rx_page = nic_data.RAM_Size - 1;
-       else /* 64k RAM */
-               last_rx_page = 255;
-
-       de620_set_register(dev, W_SPR, first_rx_page); /* Start Page Register*/
-       de620_set_register(dev, W_EPR, last_rx_page);  /* End Page Register */
-       de620_set_register(dev, W_CPR, first_rx_page);/*Current Page Register*/
-       de620_send_command(dev, W_NPR | first_rx_page); /* Next Page Register*/
-       de620_send_command(dev, W_DUMMY);
-       de620_set_delay(dev);
-
-       /* Final sanity check: Anybody out there? */
-       /* Let's hope some bits from the statusregister make a good check */
-#define CHECK_MASK (  0 | TXSUC |  T16  |  0  | RXCRC | RXSHORT |  0  |  0  )
-#define CHECK_OK   (  0 |   0   |  0    |  0  |   0   |   0     |  0  |  0  )
-        /* success:   X     0      0       X      0       0        X     X  */
-        /* ignore:   EEDI                RXGOOD                   COLS  LNKS*/
-
-       if (((i = de620_get_register(dev, R_STS)) & CHECK_MASK) != CHECK_OK) {
-               printk(KERN_ERR "%s: Something has happened to the DE-620!  Please check it"
-#ifdef SHUTDOWN_WHEN_LOST
-                       " and do a new ifconfig"
-#endif
-                       "! (%02x)\n", dev->name, i);
-#ifdef SHUTDOWN_WHEN_LOST
-               /* Goodbye, cruel world... */
-               dev->flags &= ~IFF_UP;
-               de620_close(dev);
-#endif
-               was_down = 1;
-               return 1; /* failed */
-       }
-       if (was_down) {
-               printk(KERN_WARNING "%s: Thanks, I feel much better now!\n", dev->name);
-               was_down = 0;
-       }
-
-       /* All OK, go ahead... */
-       de620_set_register(dev, W_TCR, TCR_DEF);
-
-       return 0; /* all ok */
-}
-
-static const struct net_device_ops de620_netdev_ops = {
-       .ndo_open               = de620_open,
-       .ndo_stop               = de620_close,
-       .ndo_start_xmit         = de620_start_xmit,
-       .ndo_tx_timeout         = de620_timeout,
-       .ndo_set_rx_mode        = de620_set_multicast_list,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-/******************************************************************************
- *
- * Only start-up code below
- *
- */
-/****************************************
- *
- * Check if there is a DE-620 connected
- */
-struct net_device * __init de620_probe(int unit)
-{
-       byte checkbyte = 0xa5;
-       struct net_device *dev;
-       int err = -ENOMEM;
-       int i;
-
-       dev = alloc_etherdev(0);
-       if (!dev)
-               goto out;
-
-       spin_lock_init(&de620_lock);
-
-       /*
-        * This is where the base_addr and irq gets set.
-        * Tunable at compile-time and insmod-time
-        */
-       dev->base_addr = io;
-       dev->irq       = irq;
-
-       /* allow overriding parameters on command line */
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-       }
-
-       pr_debug("%s", version);
-
-       printk(KERN_INFO "D-Link DE-620 pocket adapter");
-
-       if (!request_region(dev->base_addr, 3, "de620")) {
-               printk(" io 0x%3lX, which is busy.\n", dev->base_addr);
-               err = -EBUSY;
-               goto out1;
-       }
-
-       /* Initially, configure basic nibble mode, so we can read the EEPROM */
-       NIC_Cmd = DEF_NIC_CMD;
-       de620_set_register(dev, W_EIP, EIPRegister);
-
-       /* Anybody out there? */
-       de620_set_register(dev, W_CPR, checkbyte);
-       checkbyte = de620_get_register(dev, R_CPR);
-
-       if ((checkbyte != 0xa5) || (read_eeprom(dev) != 0)) {
-               printk(" not identified in the printer port\n");
-               err = -ENODEV;
-               goto out2;
-       }
-
-       /* else, got it! */
-       dev->dev_addr[0] = nic_data.NodeID[0];
-       for (i = 1; i < ETH_ALEN; i++) {
-               dev->dev_addr[i] = nic_data.NodeID[i];
-               dev->broadcast[i] = 0xff;
-       }
-
-       printk(", Ethernet Address: %pM", dev->dev_addr);
-
-       printk(" (%dk RAM,",
-               (nic_data.RAM_Size) ? (nic_data.RAM_Size >> 2) : 64);
-
-       if (nic_data.Media == 1)
-               printk(" BNC)\n");
-       else
-               printk(" UTP)\n");
-
-       dev->netdev_ops = &de620_netdev_ops;
-       dev->watchdog_timeo     = HZ*2;
-
-       /* base_addr and irq are already set, see above! */
-
-       /* dump eeprom */
-       pr_debug("\nEEPROM contents:\n"
-               "RAM_Size = 0x%02X\n"
-               "NodeID = %pM\n"
-               "Model = %d\n"
-               "Media = %d\n"
-               "SCR = 0x%02x\n", nic_data.RAM_Size, nic_data.NodeID,
-               nic_data.Model, nic_data.Media, nic_data.SCR);
-
-       err = register_netdev(dev);
-       if (err)
-               goto out2;
-       return dev;
-
-out2:
-       release_region(dev->base_addr, 3);
-out1:
-       free_netdev(dev);
-out:
-       return ERR_PTR(err);
-}
-
-/**********************************
- *
- * Read info from on-board EEPROM
- *
- * Note: Bitwise serial I/O to/from the EEPROM vi the status _register_!
- */
-#define sendit(dev,data) de620_set_register(dev, W_EIP, data | EIPRegister);
-
-static unsigned short __init ReadAWord(struct net_device *dev, int from)
-{
-       unsigned short data;
-       int nbits;
-
-       /* cs   [__~~] SET SEND STATE */
-       /* di   [____]                */
-       /* sck  [_~~_]                */
-       sendit(dev, 0); sendit(dev, 1); sendit(dev, 5); sendit(dev, 4);
-
-       /* Send the 9-bit address from where we want to read the 16-bit word */
-       for (nbits = 9; nbits > 0; --nbits, from <<= 1) {
-               if (from & 0x0100) { /* bit set? */
-                       /* cs    [~~~~] SEND 1 */
-                       /* di    [~~~~]        */
-                       /* sck   [_~~_]        */
-                       sendit(dev, 6); sendit(dev, 7); sendit(dev, 7); sendit(dev, 6);
-               }
-               else {
-                       /* cs    [~~~~] SEND 0 */
-                       /* di    [____]        */
-                       /* sck   [_~~_]        */
-                       sendit(dev, 4); sendit(dev, 5); sendit(dev, 5); sendit(dev, 4);
-               }
-       }
-
-       /* Shift in the 16-bit word. The bits appear serially in EEDI (=0x80) */
-       for (data = 0, nbits = 16; nbits > 0; --nbits) {
-               /* cs    [~~~~] SEND 0 */
-               /* di    [____]        */
-               /* sck   [_~~_]        */
-               sendit(dev, 4); sendit(dev, 5); sendit(dev, 5); sendit(dev, 4);
-               data = (data << 1) | ((de620_get_register(dev, R_STS) & EEDI) >> 7);
-       }
-       /* cs    [____] RESET SEND STATE */
-       /* di    [____]                  */
-       /* sck   [_~~_]                  */
-       sendit(dev, 0); sendit(dev, 1); sendit(dev, 1); sendit(dev, 0);
-
-       return data;
-}
-
-static int __init read_eeprom(struct net_device *dev)
-{
-       unsigned short wrd;
-
-       /* D-Link Ethernet addresses are in the series  00:80:c8:7X:XX:XX:XX */
-       wrd = ReadAWord(dev, 0x1aa);    /* bytes 0 + 1 of NodeID */
-       if (!clone && (wrd != htons(0x0080))) /* Valid D-Link ether sequence? */
-               return -1; /* Nope, not a DE-620 */
-       nic_data.NodeID[0] = wrd & 0xff;
-       nic_data.NodeID[1] = wrd >> 8;
-
-       wrd = ReadAWord(dev, 0x1ab);    /* bytes 2 + 3 of NodeID */
-       if (!clone && ((wrd & 0xff) != 0xc8)) /* Valid D-Link ether sequence? */
-               return -1; /* Nope, not a DE-620 */
-       nic_data.NodeID[2] = wrd & 0xff;
-       nic_data.NodeID[3] = wrd >> 8;
-
-       wrd = ReadAWord(dev, 0x1ac);    /* bytes 4 + 5 of NodeID */
-       nic_data.NodeID[4] = wrd & 0xff;
-       nic_data.NodeID[5] = wrd >> 8;
-
-       wrd = ReadAWord(dev, 0x1ad);    /* RAM size in pages (256 bytes). 0 = 64k */
-       nic_data.RAM_Size = (wrd >> 8);
-
-       wrd = ReadAWord(dev, 0x1ae);    /* hardware model (CT = 3) */
-       nic_data.Model = (wrd & 0xff);
-
-       wrd = ReadAWord(dev, 0x1af); /* media (indicates BNC/UTP) */
-       nic_data.Media = (wrd & 0xff);
-
-       wrd = ReadAWord(dev, 0x1a8); /* System Configuration Register */
-       nic_data.SCR = (wrd >> 8);
-
-       return 0; /* no errors */
-}
-
-/******************************************************************************
- *
- * Loadable module skeleton
- *
- */
-#ifdef MODULE
-static struct net_device *de620_dev;
-
-int __init init_module(void)
-{
-       de620_dev = de620_probe(-1);
-       if (IS_ERR(de620_dev))
-               return PTR_ERR(de620_dev);
-       return 0;
-}
-
-void cleanup_module(void)
-{
-       unregister_netdev(de620_dev);
-       release_region(de620_dev->base_addr, 3);
-       free_netdev(de620_dev);
-}
-#endif /* MODULE */
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/dlink/de620.h b/drivers/net/ethernet/dlink/de620.h
deleted file mode 100644 (file)
index e8d9a88..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*********************************************************
- *                                                       *
- * Definition of D-Link DE-620 Ethernet Pocket adapter   *
- *                                                       *
- *********************************************************/
-
-/* DE-620's CMD port Command */
-#define CS0            0x08    /* 1->0 command strobe */
-#define ICEN           0x04    /* 0=enable DL3520 host interface */
-#define DS0            0x02    /* 1->0 data strobe 0 */
-#define DS1            0x01    /* 1->0 data strobe 1 */
-
-#define WDIR           0x20    /* general 0=read  1=write */
-#define RDIR           0x00    /*  (not 100% confirm ) */
-#define PS2WDIR                0x00    /* ps/2 mode 1=read, 0=write */
-#define PS2RDIR                0x20
-
-#define IRQEN          0x10    /* 1 = enable printer IRQ line */
-#define SELECTIN       0x08    /* 1 = select printer */
-#define INITP          0x04    /* 0 = initial printer */
-#define AUTOFEED       0x02    /* 1 = printer auto form feed */
-#define STROBE         0x01    /* 0->1 data strobe */
-
-#define RESET          0x08
-#define NIS0           0x20    /* 0 = BNC, 1 = UTP */
-#define NCTL0          0x10
-
-/* DE-620 DIC Command */
-#define W_DUMMY                0x00    /* DIC reserved command */
-#define W_CR           0x20    /* DIC write command register */
-#define W_NPR          0x40    /* DIC write Next Page Register */
-#define W_TBR          0x60    /* DIC write Tx Byte Count 1 reg */
-#define W_RSA          0x80    /* DIC write Remote Start Addr 1 */
-
-/* DE-620's STAT port bits 7-4 */
-#define EMPTY          0x80    /* 1 = receive buffer empty */
-#define INTLEVEL       0x40    /* 1 = interrupt level is high */
-#define TXBF1          0x20    /* 1 = transmit buffer 1 is in use */
-#define TXBF0          0x10    /* 1 = transmit buffer 0 is in use */
-#define READY          0x08    /* 1 = h/w ready to accept cmd/data */
-
-/* IDC 1 Command */
-#define        W_RSA1          0xa0    /* write remote start address 1 */
-#define        W_RSA0          0xa1    /* write remote start address 0 */
-#define        W_NPRF          0xa2    /* write next page register NPR15-NPR8 */
-#define        W_DFR           0xa3    /* write delay factor register */
-#define        W_CPR           0xa4    /* write current page register */
-#define        W_SPR           0xa5    /* write start page register */
-#define        W_EPR           0xa6    /* write end page register */
-#define        W_SCR           0xa7    /* write system configuration register */
-#define        W_TCR           0xa8    /* write Transceiver Configuration reg */
-#define        W_EIP           0xa9    /* write EEPM Interface port */
-#define        W_PAR0          0xaa    /* write physical address register 0 */
-#define        W_PAR1          0xab    /* write physical address register 1 */
-#define        W_PAR2          0xac    /* write physical address register 2 */
-#define        W_PAR3          0xad    /* write physical address register 3 */
-#define        W_PAR4          0xae    /* write physical address register 4 */
-#define        W_PAR5          0xaf    /* write physical address register 5 */
-
-/* IDC 2 Command */
-#define        R_STS           0xc0    /* read status register */
-#define        R_CPR           0xc1    /* read current page register */
-#define        R_BPR           0xc2    /* read boundary page register */
-#define        R_TDR           0xc3    /* read time domain reflectometry reg */
-
-/* STATUS Register */
-#define EEDI           0x80    /* EEPM DO pin */
-#define TXSUC          0x40    /* tx success */
-#define T16            0x20    /* tx fail 16 times */
-#define TS1            0x40    /* 0=Tx success, 1=T16 */
-#define TS0            0x20    /* 0=Tx success, 1=T16 */
-#define RXGOOD         0x10    /* rx a good packet */
-#define RXCRC          0x08    /* rx a CRC error packet */
-#define RXSHORT                0x04    /* rx a short packet */
-#define COLS           0x02    /* coaxial collision status */
-#define LNKS           0x01    /* UTP link status */
-
-/* Command Register */
-#define CLEAR          0x10    /* reset part of hardware */
-#define NOPER          0x08    /* No Operation */
-#define RNOP           0x08
-#define RRA            0x06    /* After RR then auto-advance NPR & BPR(=NPR-1) */
-#define RRN            0x04    /* Normal Remote Read mode */
-#define RW1            0x02    /* Remote Write tx buffer 1  ( page 6 - 11 ) */
-#define RW0            0x00    /* Remote Write tx buffer 0  ( page 0 - 5 ) */
-#define TXEN           0x01    /* 0->1 tx enable */
-
-/* System Configuration Register */
-#define TESTON         0x80    /* test host data transfer reliability */
-#define SLEEP          0x40    /* sleep mode */
-#if 0
-#define FASTMODE       0x04    /* fast mode for intel 82360SL fast mode */
-#define BYTEMODE       0x02    /* byte mode */
-#else
-#define FASTMODE       0x20    /* fast mode for intel 82360SL fast mode */
-#define BYTEMODE       0x10    /* byte mode */
-#endif
-#define NIBBLEMODE     0x00    /* nibble mode */
-#define IRQINV         0x08    /* turn off IRQ line inverter */
-#define IRQNML         0x00    /* turn on IRQ line inverter */
-#define INTON          0x04
-#define AUTOFFSET      0x02    /* auto shift address to TPR+12 */
-#define AUTOTX         0x01    /* auto tx when leave RW mode */
-
-/* Transceiver Configuration Register */
-#define JABBER         0x80    /* generate jabber condition */
-#define TXSUCINT       0x40    /* enable tx success interrupt */
-#define T16INT         0x20    /* enable T16 interrupt */
-#define RXERRPKT       0x10    /* accept CRC error or short packet */
-#define EXTERNALB2     0x0C    /* external loopback 2 */
-#define EXTERNALB1     0x08    /* external loopback 1 */
-#define INTERNALB      0x04    /* internal loopback */
-#define NMLOPERATE     0x00    /* normal operation */
-#define RXPBM          0x03    /* rx physical, broadcast, multicast */
-#define RXPB           0x02    /* rx physical, broadcast */
-#define RXALL          0x01    /* rx all packet */
-#define RXOFF          0x00    /* rx disable */
index 28fc11b2f1ea9235ce8c9fdb3ac8abbb35b72bac..50d9c631593090e8d2b335fcb4d947346091fa42 100644 (file)
@@ -530,7 +530,6 @@ static int sundance_probe1(struct pci_dev *pdev,
        for (i = 0; i < 3; i++)
                ((__le16 *)dev->dev_addr)[i] =
                        cpu_to_le16(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET));
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        np = netdev_priv(dev);
        np->base = ioaddr;
index 2c177b329c8bd4ccd1bad6ffef72deab6b3dc8a1..f3d60eb13c3aea0b1e1141294655b398a19ba159 100644 (file)
@@ -281,11 +281,11 @@ static int dnet_mii_probe(struct net_device *dev)
        /* attach the mac to the phy */
        if (bp->capabilities & DNET_HAS_RMII) {
                phydev = phy_connect(dev, dev_name(&phydev->dev),
-                                    &dnet_handle_link_change, 0,
+                                    &dnet_handle_link_change,
                                     PHY_INTERFACE_MODE_RMII);
        } else {
                phydev = phy_connect(dev, dev_name(&phydev->dev),
-                                    &dnet_handle_link_change, 0,
+                                    &dnet_handle_link_change,
                                     PHY_INTERFACE_MODE_MII);
        }
 
index 3bc1912afba936a629b16c7193b2ccacedbe9f76..4eba17b83ba8dae6ce466dd3eecbc957a1c25d0d 100644 (file)
@@ -190,6 +190,7 @@ struct be_eq_obj {
 
        u8 idx;                 /* array index */
        u16 tx_budget;
+       u16 spurious_intr;
        struct napi_struct napi;
        struct be_adapter *adapter;
 } ____cacheline_aligned_in_smp;
index 9dca22be81253bc1a66f5e9e136c4462acdeaed9..5c995700e53440331a9fe4cef3a8f68886fae466 100644 (file)
@@ -2026,19 +2026,30 @@ static irqreturn_t be_intx(int irq, void *dev)
        struct be_adapter *adapter = eqo->adapter;
        int num_evts = 0;
 
-       /* On Lancer, clear-intr bit of the EQ DB does not work.
-        * INTx is de-asserted only on notifying num evts.
+       /* IRQ is not expected when NAPI is scheduled as the EQ
+        * will not be armed.
+        * But, this can happen on Lancer INTx where it takes
+        * a while to de-assert INTx or in BE2 where occasionaly
+        * an interrupt may be raised even when EQ is unarmed.
+        * If NAPI is already scheduled, then counting & notifying
+        * events will orphan them.
         */
-       if (lancer_chip(adapter))
+       if (napi_schedule_prep(&eqo->napi)) {
                num_evts = events_get(eqo);
+               __napi_schedule(&eqo->napi);
+               if (num_evts)
+                       eqo->spurious_intr = 0;
+       }
+       be_eq_notify(adapter, eqo->q.id, false, true, num_evts);
 
-       /* The EQ-notify may not de-assert INTx rightaway, causing
-        * the ISR to be invoked again. So, return HANDLED even when
-        * num_evts is zero.
+       /* Return IRQ_HANDLED only for the the first spurious intr
+        * after a valid intr to stop the kernel from branding
+        * this irq as a bad one!
         */
-       be_eq_notify(adapter, eqo->q.id, false, true, num_evts);
-       napi_schedule(&eqo->napi);
-       return IRQ_HANDLED;
+       if (num_evts || eqo->spurious_intr++ == 0)
+               return IRQ_HANDLED;
+       else
+               return IRQ_NONE;
 }
 
 static irqreturn_t be_msix(int irq, void *dev)
index b51c81ac0b6ff0d710b8a62270d2604eaff1e3c9..aa47ef9689a8fdf643d80f572acb3fdd23be364a 100644 (file)
@@ -682,8 +682,8 @@ static int ethoc_mdio_probe(struct net_device *dev)
                return -ENXIO;
        }
 
-       err = phy_connect_direct(dev, phy, ethoc_mdio_poll, 0,
-                       PHY_INTERFACE_MODE_GMII);
+       err = phy_connect_direct(dev, phy, ethoc_mdio_poll,
+                                PHY_INTERFACE_MODE_GMII);
        if (err) {
                dev_err(&dev->dev, "could not attach to PHY\n");
                return err;
index 96454b5fca634df8adbe7307b04e39b062b7352d..7c361d1db94cbccdb937368044b30913d891ba7f 100644 (file)
@@ -858,8 +858,7 @@ static int ftgmac100_mii_probe(struct ftgmac100 *priv)
        }
 
        phydev = phy_connect(netdev, dev_name(&phydev->dev),
-                            &ftgmac100_adjust_link, 0,
-                            PHY_INTERFACE_MODE_GMII);
+                            &ftgmac100_adjust_link, PHY_INTERFACE_MODE_GMII);
 
        if (IS_ERR(phydev)) {
                netdev_err(netdev, "%s: Could not attach to PHY\n", netdev->name);
index 0a9748b64c24ba48a670da452e87e9e6a6c819cb..f52ba338d2c7c0bedca1d1d1e684c129acbd0ed5 100644 (file)
 
 #define DRIVER_NAME    "fec"
 
+/* Pause frame feild and FIFO threshold */
+#define FEC_ENET_FCE   (1 << 5)
+#define FEC_ENET_RSEM_V        0x84
+#define FEC_ENET_RSFL_V        16
+#define FEC_ENET_RAEM_V        0x8
+#define FEC_ENET_RAFL_V        0x8
+#define FEC_ENET_OPD_V 0xFFF0
+
 /* Controller is ENET-MAC */
 #define FEC_QUIRK_ENET_MAC             (1 << 0)
 /* Controller needs driver to swap frame */
@@ -193,6 +201,9 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
 /* Transmitter timeout */
 #define TX_TIMEOUT (2 * HZ)
 
+#define FEC_PAUSE_FLAG_AUTONEG 0x1
+#define FEC_PAUSE_FLAG_ENABLE  0x2
+
 static int mii_cnt;
 
 static struct bufdesc *fec_enet_get_nextdesc(struct bufdesc *bdp, int is_ex)
@@ -470,6 +481,25 @@ fec_restart(struct net_device *ndev, int duplex)
                }
 #endif
        }
+
+       /* enable pause frame*/
+       if ((fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) ||
+           ((fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) &&
+            fep->phy_dev && fep->phy_dev->pause)) {
+               rcntl |= FEC_ENET_FCE;
+
+               /* set FIFO thresh hold parameter to reduce overrun */
+               writel(FEC_ENET_RSEM_V, fep->hwp + FEC_R_FIFO_RSEM);
+               writel(FEC_ENET_RSFL_V, fep->hwp + FEC_R_FIFO_RSFL);
+               writel(FEC_ENET_RAEM_V, fep->hwp + FEC_R_FIFO_RAEM);
+               writel(FEC_ENET_RAFL_V, fep->hwp + FEC_R_FIFO_RAFL);
+
+               /* OPD */
+               writel(FEC_ENET_OPD_V, fep->hwp + FEC_OPD);
+       } else {
+               rcntl &= ~FEC_ENET_FCE;
+       }
+
        writel(rcntl, fep->hwp + FEC_R_CNTRL);
 
        if (id_entry->driver_data & FEC_QUIRK_ENET_MAC) {
@@ -807,7 +837,7 @@ fec_enet_interrupt(int irq, void *dev_id)
 
 
 /* ------------------------------------------------------------------------- */
-static void __inline__ fec_get_mac(struct net_device *ndev)
+static void fec_get_mac(struct net_device *ndev)
 {
        struct fec_enet_private *fep = netdev_priv(ndev);
        struct fec_platform_data *pdata = fep->pdev->dev.platform_data;
@@ -1008,7 +1038,7 @@ static int fec_enet_mii_probe(struct net_device *ndev)
        }
 
        snprintf(phy_name, sizeof(phy_name), PHY_ID_FMT, mdio_bus_id, phy_id);
-       phy_dev = phy_connect(ndev, phy_name, &fec_enet_adjust_link, 0,
+       phy_dev = phy_connect(ndev, phy_name, &fec_enet_adjust_link,
                              fep->phy_interface);
        if (IS_ERR(phy_dev)) {
                printk(KERN_ERR "%s: could not attach to PHY\n", ndev->name);
@@ -1016,8 +1046,10 @@ static int fec_enet_mii_probe(struct net_device *ndev)
        }
 
        /* mask with MAC supported features */
-       if (id_entry->driver_data & FEC_QUIRK_HAS_GBIT)
+       if (id_entry->driver_data & FEC_QUIRK_HAS_GBIT) {
                phy_dev->supported &= PHY_GBIT_FEATURES;
+               phy_dev->supported |= SUPPORTED_Pause;
+       }
        else
                phy_dev->supported &= PHY_BASIC_FEATURES;
 
@@ -1174,12 +1206,89 @@ static void fec_enet_get_drvinfo(struct net_device *ndev,
        strlcpy(info->bus_info, dev_name(&ndev->dev), sizeof(info->bus_info));
 }
 
+static int fec_enet_get_ts_info(struct net_device *ndev,
+                               struct ethtool_ts_info *info)
+{
+       struct fec_enet_private *fep = netdev_priv(ndev);
+
+       if (fep->bufdesc_ex) {
+
+               info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
+                                       SOF_TIMESTAMPING_RX_SOFTWARE |
+                                       SOF_TIMESTAMPING_SOFTWARE |
+                                       SOF_TIMESTAMPING_TX_HARDWARE |
+                                       SOF_TIMESTAMPING_RX_HARDWARE |
+                                       SOF_TIMESTAMPING_RAW_HARDWARE;
+               if (fep->ptp_clock)
+                       info->phc_index = ptp_clock_index(fep->ptp_clock);
+               else
+                       info->phc_index = -1;
+
+               info->tx_types = (1 << HWTSTAMP_TX_OFF) |
+                                (1 << HWTSTAMP_TX_ON);
+
+               info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
+                                  (1 << HWTSTAMP_FILTER_ALL);
+               return 0;
+       } else {
+               return ethtool_op_get_ts_info(ndev, info);
+       }
+}
+
+static void fec_enet_get_pauseparam(struct net_device *ndev,
+                                   struct ethtool_pauseparam *pause)
+{
+       struct fec_enet_private *fep = netdev_priv(ndev);
+
+       pause->autoneg = (fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) != 0;
+       pause->tx_pause = (fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) != 0;
+       pause->rx_pause = pause->tx_pause;
+}
+
+static int fec_enet_set_pauseparam(struct net_device *ndev,
+                                  struct ethtool_pauseparam *pause)
+{
+       struct fec_enet_private *fep = netdev_priv(ndev);
+
+       if (pause->tx_pause != pause->rx_pause) {
+               netdev_info(ndev,
+                       "hardware only support enable/disable both tx and rx");
+               return -EINVAL;
+       }
+
+       fep->pause_flag = 0;
+
+       /* tx pause must be same as rx pause */
+       fep->pause_flag |= pause->rx_pause ? FEC_PAUSE_FLAG_ENABLE : 0;
+       fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0;
+
+       if (pause->rx_pause || pause->autoneg) {
+               fep->phy_dev->supported |= ADVERTISED_Pause;
+               fep->phy_dev->advertising |= ADVERTISED_Pause;
+       } else {
+               fep->phy_dev->supported &= ~ADVERTISED_Pause;
+               fep->phy_dev->advertising &= ~ADVERTISED_Pause;
+       }
+
+       if (pause->autoneg) {
+               if (netif_running(ndev))
+                       fec_stop(ndev);
+               phy_start_aneg(fep->phy_dev);
+       }
+       if (netif_running(ndev))
+               fec_restart(ndev, 0);
+
+       return 0;
+}
+
 static const struct ethtool_ops fec_enet_ethtool_ops = {
+       .get_pauseparam         = fec_enet_get_pauseparam,
+       .set_pauseparam         = fec_enet_set_pauseparam,
        .get_settings           = fec_enet_get_settings,
        .set_settings           = fec_enet_set_settings,
        .get_drvinfo            = fec_enet_get_drvinfo,
        .get_link               = ethtool_op_get_link,
-       .get_ts_info            = ethtool_op_get_ts_info,
+       .get_ts_info            = fec_enet_get_ts_info,
 };
 
 static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
@@ -1563,12 +1672,12 @@ static void fec_reset_phy(struct platform_device *pdev)
        gpio_set_value(phy_reset, 1);
 }
 #else /* CONFIG_OF */
-static inline int fec_get_phy_mode_dt(struct platform_device *pdev)
+static int fec_get_phy_mode_dt(struct platform_device *pdev)
 {
        return -ENODEV;
 }
 
-static inline void fec_reset_phy(struct platform_device *pdev)
+static void fec_reset_phy(struct platform_device *pdev)
 {
        /*
         * In case of platform probe, the reset has been done
@@ -1614,6 +1723,11 @@ fec_probe(struct platform_device *pdev)
        /* setup board info structure */
        fep = netdev_priv(ndev);
 
+       /* default enable pause frame auto negotiation */
+       if (pdev->id_entry &&
+           (pdev->id_entry->driver_data & FEC_QUIRK_HAS_GBIT))
+               fep->pause_flag |= FEC_PAUSE_FLAG_AUTONEG;
+
        fep->hwp = ioremap(r->start, resource_size(r));
        fep->pdev = pdev;
        fep->dev_id = dev_id++;
index 48623947d9562d8a7dd355a27fe70e602ec4b906..2ebedaf7ad810d9efb5fafa7123a271f2101192a 100644 (file)
 #define FEC_R_DES_START                0x180 /* Receive descriptor ring */
 #define FEC_X_DES_START                0x184 /* Transmit descriptor ring */
 #define FEC_R_BUFF_SIZE                0x188 /* Maximum receive buff size */
+#define FEC_R_FIFO_RSFL                0x190 /* Receive FIFO section full threshold */
+#define FEC_R_FIFO_RSEM                0x194 /* Receive FIFO section empty threshold */
+#define FEC_R_FIFO_RAEM                0x198 /* Receive FIFO almost empty threshold */
+#define FEC_R_FIFO_RAFL                0x19c /* Receive FIFO almost full threshold */
 #define FEC_MIIGSK_CFGR                0x300 /* MIIGSK Configuration reg */
 #define FEC_MIIGSK_ENR         0x308 /* MIIGSK Enable reg */
 
@@ -243,6 +247,7 @@ struct fec_enet_private {
        struct  completion mdio_done;
        int     irq[FEC_IRQ_NUM];
        int     bufdesc_ex;
+       int     pause_flag;
 
        struct ptp_clock *ptp_clock;
        struct ptp_clock_info ptp_caps;
index bffb2edd68584633aa8b5248fc27faf0990a05d5..e765b9b49a2066946ecc96a91de3b0081cb118b9 100644 (file)
@@ -355,6 +355,10 @@ static void gfar_init_mac(struct net_device *ndev)
                gfar_write(&regs->rir0, DEFAULT_RIR0);
        }
 
+       /* Restore PROMISC mode */
+       if (ndev->flags & IFF_PROMISC)
+               rctrl |= RCTRL_PROM;
+
        if (ndev->features & NETIF_F_RXCSUM)
                rctrl |= RCTRL_CHECKSUMMING;
 
index 1b6a67cf8bf636e9a63bfc213549ac15ec3c29dd..91bb2de9ba8d8062e154bc541bc2907214fc9334 100644 (file)
@@ -1136,16 +1136,16 @@ static inline int gfar_has_errata(struct gfar_private *priv,
        return priv->errata & err;
 }
 
-static inline u32 gfar_read(volatile unsigned __iomem *addr)
+static inline u32 gfar_read(unsigned __iomem *addr)
 {
        u32 val;
-       val = in_be32(addr);
+       val = ioread32be(addr);
        return val;
 }
 
-static inline void gfar_write(volatile unsigned __iomem *addr, u32 val)
+static inline void gfar_write(unsigned __iomem *addr, u32 val)
 {
-       out_be32(addr, val);
+       iowrite32be(val, addr);
 }
 
 static inline void gfar_write_filer(struct gfar_private *priv,
index aca156888fd894f7d9eacb64b2de45c936bdb9f1..c6a87625898a18bf3b87c1841020d9bdc02ec515 100644 (file)
@@ -17,18 +17,6 @@ config NET_VENDOR_FUJITSU
 
 if NET_VENDOR_FUJITSU
 
-config AT1700
-       tristate "AT1700/1720 support (EXPERIMENTAL)"
-       depends on ISA && EXPERIMENTAL
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called at1700.
-
 config PCMCIA_FMVJ18X
        tristate "Fujitsu FMV-J18x PCMCIA support"
        depends on PCMCIA
@@ -40,15 +28,4 @@ config PCMCIA_FMVJ18X
          To compile this driver as a module, choose M here: the module will be
          called fmvj18x_cs.  If unsure, say N.
 
-config ETH16I
-       tristate "ICL EtherTeam 16i/32 support"
-       depends on ISA
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called eth16i.
-
 endif # NET_VENDOR_FUJITSU
index 2730ae67d3aa2028633ceb17557607b6b6e8ba76..21561fdcc69f75d1db9c716ca897d46c9b901019 100644 (file)
@@ -2,6 +2,4 @@
 # Makefile for the Fujitsu network device drivers.
 #
 
-obj-$(CONFIG_AT1700) += at1700.o
-obj-$(CONFIG_ETH16I) += eth16i.o
 obj-$(CONFIG_PCMCIA_FMVJ18X) += fmvj18x_cs.o
diff --git a/drivers/net/ethernet/fujitsu/at1700.c b/drivers/net/ethernet/fujitsu/at1700.c
deleted file mode 100644 (file)
index 4b80dc4..0000000
+++ /dev/null
@@ -1,791 +0,0 @@
-/* at1700.c: A network device driver for  the Allied Telesis AT1700.
-
-       Written 1993-98 by Donald Becker.
-
-       Copyright 1993 United States Government as represented by the
-       Director, National Security Agency.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-       This is a device driver for the Allied Telesis AT1700, and
-        Fujitsu FMV-181/182/181A/182A/183/184/183A/184A, which are
-       straight-forward Fujitsu MB86965 implementations.
-
-       Modification for Fujitsu FMV-18X cards is done by Yutaka Tamiya
-       (tamy@flab.fujitsu.co.jp).
-
-  Sources:
-    The Fujitsu MB86965 datasheet.
-
-       After the initial version of this driver was written Gerry Sawkins of
-       ATI provided their EEPROM configuration code header file.
-    Thanks to NIIBE Yutaka <gniibe@mri.co.jp> for bug fixes.
-
-    MCA bus (AT1720) support (now deleted) by Rene Schmit <rene@bss.lu>
-
-  Bugs:
-       The MB86965 has a design flaw that makes all probes unreliable.  Not
-       only is it difficult to detect, it also moves around in I/O space in
-       response to inb()s from other device probes!
-*/
-
-#include <linux/errno.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/skbuff.h>
-#include <linux/string.h>
-#include <linux/init.h>
-#include <linux/crc32.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-
-static char version[] __initdata =
-       "at1700.c:v1.16 9/11/06  Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
-
-#define DRV_NAME "at1700"
-
-/* Tunable parameters. */
-
-/* When to switch from the 64-entry multicast filter to Rx-all-multicast. */
-#define MC_FILTERBREAK 64
-
-/* These unusual address orders are used to verify the CONFIG register. */
-
-static int fmv18x_probe_list[] __initdata = {
-       0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
-};
-
-/*
- *     ISA
- */
-
-static unsigned at1700_probe_list[] __initdata = {
-       0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
-};
-
-/* use 0 for production, 1 for verification, >2 for debug */
-#ifndef NET_DEBUG
-#define NET_DEBUG 1
-#endif
-static unsigned int net_debug = NET_DEBUG;
-
-typedef unsigned char uchar;
-
-/* Information that need to be kept for each board. */
-struct net_local {
-       spinlock_t lock;
-       unsigned char mc_filter[8];
-       uint jumpered:1;                        /* Set iff the board has jumper config. */
-       uint tx_started:1;                      /* Packets are on the Tx queue. */
-       uint tx_queue_ready:1;                  /* Tx queue is ready to be sent. */
-       uint rx_started:1;                      /* Packets are Rxing. */
-       uchar tx_queue;                         /* Number of packet on the Tx queue. */
-       ushort tx_queue_len;                    /* Current length of the Tx queue. */
-};
-
-
-/* Offsets from the base address. */
-#define STATUS                 0
-#define TX_STATUS              0
-#define RX_STATUS              1
-#define TX_INTR                        2               /* Bit-mapped interrupt enable registers. */
-#define RX_INTR                        3
-#define TX_MODE                        4
-#define RX_MODE                        5
-#define CONFIG_0               6               /* Misc. configuration settings. */
-#define CONFIG_1               7
-/* Run-time register bank 2 definitions. */
-#define DATAPORT               8               /* Word-wide DMA or programmed-I/O dataport. */
-#define TX_START               10
-#define COL16CNTL              11              /* Control Reg for 16 collisions */
-#define MODE13                 13
-#define RX_CTRL                        14
-/* Configuration registers only on the '865A/B chips. */
-#define EEPROM_Ctrl    16
-#define EEPROM_Data    17
-#define CARDSTATUS     16                      /* FMV-18x Card Status */
-#define CARDSTATUS1    17                      /* FMV-18x Card Status */
-#define IOCONFIG               18              /* Either read the jumper, or move the I/O. */
-#define IOCONFIG1              19
-#define        SAPROM                  20              /* The station address PROM, if no EEPROM. */
-#define MODE24                 24
-#define RESET                  31              /* Write to reset some parts of the chip. */
-#define AT1700_IO_EXTENT       32
-#define PORT_OFFSET(o) (o)
-
-
-#define TX_TIMEOUT             (HZ/10)
-
-
-/* Index to functions, as function prototypes. */
-
-static int at1700_probe1(struct net_device *dev, int ioaddr);
-static int read_eeprom(long ioaddr, int location);
-static int net_open(struct net_device *dev);
-static netdev_tx_t net_send_packet(struct sk_buff *skb,
-                                  struct net_device *dev);
-static irqreturn_t net_interrupt(int irq, void *dev_id);
-static void net_rx(struct net_device *dev);
-static int net_close(struct net_device *dev);
-static void set_rx_mode(struct net_device *dev);
-static void net_tx_timeout (struct net_device *dev);
-
-
-/* Check for a network adaptor of this type, and return '0' iff one exists.
-   If dev->base_addr == 0, probe all likely locations.
-   If dev->base_addr == 1, always return failure.
-   If dev->base_addr == 2, allocate space for the device and return success
-   (detachable devices only).
-   */
-
-static int io = 0x260;
-
-static int irq;
-
-static void cleanup_card(struct net_device *dev)
-{
-       free_irq(dev->irq, NULL);
-       release_region(dev->base_addr, AT1700_IO_EXTENT);
-}
-
-struct net_device * __init at1700_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-       unsigned *port;
-       int err = 0;
-
-       if (!dev)
-               return ERR_PTR(-ENODEV);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-               io = dev->base_addr;
-               irq = dev->irq;
-       } else {
-               dev->base_addr = io;
-               dev->irq = irq;
-       }
-
-       if (io > 0x1ff) {       /* Check a single specified location. */
-               err = at1700_probe1(dev, io);
-       } else if (io != 0) {   /* Don't probe at all. */
-               err = -ENXIO;
-       } else {
-               for (port = at1700_probe_list; *port; port++) {
-                       if (at1700_probe1(dev, *port) == 0)
-                               break;
-                       dev->irq = irq;
-               }
-               if (!*port)
-                       err = -ENODEV;
-       }
-       if (err)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-       cleanup_card(dev);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-static const struct net_device_ops at1700_netdev_ops = {
-       .ndo_open               = net_open,
-       .ndo_stop               = net_close,
-       .ndo_start_xmit         = net_send_packet,
-       .ndo_set_rx_mode        = set_rx_mode,
-       .ndo_tx_timeout         = net_tx_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-/* The Fujitsu datasheet suggests that the NIC be probed for by checking its
-   "signature", the default bit pattern after a reset.  This *doesn't* work --
-   there is no way to reset the bus interface without a complete power-cycle!
-
-   It turns out that ATI came to the same conclusion I did: the only thing
-   that can be done is checking a few bits and then diving right into an
-   EEPROM read. */
-
-static int __init at1700_probe1(struct net_device *dev, int ioaddr)
-{
-       static const char fmv_irqmap[4] = {3, 7, 10, 15};
-       static const char fmv_irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
-       static const char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15};
-       unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0;
-       int ret = -ENODEV;
-       struct net_local *lp = netdev_priv(dev);
-
-       if (!request_region(ioaddr, AT1700_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       /* Resetting the chip doesn't reset the ISA interface, so don't bother.
-          That means we have to be careful with the register values we probe
-          for.
-        */
-#ifdef notdef
-       printk("at1700 probe at %#x, eeprom is %4.4x %4.4x %4.4x ctrl %4.4x.\n",
-                  ioaddr, read_eeprom(ioaddr, 4), read_eeprom(ioaddr, 5),
-                  read_eeprom(ioaddr, 6), inw(ioaddr + EEPROM_Ctrl));
-#endif
-       /* We must check for the EEPROM-config boards first, else accessing
-          IOCONFIG0 will move the board! */
-       if (at1700_probe_list[inb(ioaddr + IOCONFIG1) & 0x07] == ioaddr &&
-           read_eeprom(ioaddr, 4) == 0x0000 &&
-           (read_eeprom(ioaddr, 5) & 0xff00) == 0xF400)
-               is_at1700 = 1;
-       else if (inb(ioaddr + SAPROM    ) == 0x00 &&
-                inb(ioaddr + SAPROM + 1) == 0x00 &&
-                inb(ioaddr + SAPROM + 2) == 0x0e)
-               is_fmv18x = 1;
-       else {
-               goto err_out;
-       }
-
-       /* Reset the internal state machines. */
-       outb(0, ioaddr + RESET);
-
-       if (is_at1700) {
-               irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04)
-                                                  | (read_eeprom(ioaddr, 0)>>14)];
-       } else {
-               /* Check PnP mode for FMV-183/184/183A/184A. */
-               /* This PnP routine is very poor. IO and IRQ should be known. */
-               if (inb(ioaddr + CARDSTATUS1) & 0x20) {
-                       irq = dev->irq;
-                       for (i = 0; i < 8; i++) {
-                               if (irq == fmv_irqmap_pnp[i])
-                                       break;
-                       }
-                       if (i == 8) {
-                               goto err_out;
-                       }
-               } else {
-                       if (fmv18x_probe_list[inb(ioaddr + IOCONFIG) & 0x07] != ioaddr)
-                               goto err_out;
-                       irq = fmv_irqmap[(inb(ioaddr + IOCONFIG)>>6) & 0x03];
-               }
-       }
-
-       printk("%s: %s found at %#3x, IRQ %d, address ", dev->name,
-                  is_at1700 ? "AT1700" : "FMV-18X", ioaddr, irq);
-
-       dev->base_addr = ioaddr;
-       dev->irq = irq;
-
-       if (is_at1700) {
-               for(i = 0; i < 3; i++) {
-                       unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
-                       ((unsigned short *)dev->dev_addr)[i] = ntohs(eeprom_val);
-               }
-       } else {
-               for(i = 0; i < 6; i++) {
-                       unsigned char val = inb(ioaddr + SAPROM + i);
-                       dev->dev_addr[i] = val;
-               }
-       }
-       printk("%pM", dev->dev_addr);
-
-       /* The EEPROM word 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
-          rather than 150 ohm shielded twisted pair compensation.
-          0x0000 == auto-sense the interface
-          0x0800 == use TP interface
-          0x1800 == use coax interface
-          */
-       {
-               const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2"};
-               if (is_at1700) {
-                       ushort setup_value = read_eeprom(ioaddr, 12);
-                       dev->if_port = setup_value >> 8;
-               } else {
-                       ushort setup_value = inb(ioaddr + CARDSTATUS);
-                       switch (setup_value & 0x07) {
-                       case 0x01: /* 10base5 */
-                       case 0x02: /* 10base2 */
-                               dev->if_port = 0x18; break;
-                       case 0x04: /* 10baseT */
-                               dev->if_port = 0x08; break;
-                       default:   /* auto-sense */
-                               dev->if_port = 0x00; break;
-                       }
-               }
-               printk(" %s interface.\n", porttype[(dev->if_port>>3) & 3]);
-       }
-
-       /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
-          bus access, two 4K Tx queues, and disabled Tx and Rx. */
-       outb(0xda, ioaddr + CONFIG_0);
-
-       /* Set the station address in bank zero. */
-       outb(0x00, ioaddr + CONFIG_1);
-       for (i = 0; i < 6; i++)
-               outb(dev->dev_addr[i], ioaddr + PORT_OFFSET(8 + i));
-
-       /* Switch to bank 1 and set the multicast table to accept none. */
-       outb(0x04, ioaddr + CONFIG_1);
-       for (i = 0; i < 8; i++)
-               outb(0x00, ioaddr + PORT_OFFSET(8 + i));
-
-
-       /* Switch to bank 2 */
-       /* Lock our I/O address, and set manual processing mode for 16 collisions. */
-       outb(0x08, ioaddr + CONFIG_1);
-       outb(dev->if_port, ioaddr + MODE13);
-       outb(0x00, ioaddr + COL16CNTL);
-
-       if (net_debug)
-               printk(version);
-
-       dev->netdev_ops = &at1700_netdev_ops;
-       dev->watchdog_timeo = TX_TIMEOUT;
-
-       spin_lock_init(&lp->lock);
-
-       lp->jumpered = is_fmv18x;
-       /* Snarf the interrupt vector now. */
-       ret = request_irq(irq, net_interrupt, 0, DRV_NAME, dev);
-       if (ret) {
-               printk(KERN_ERR "AT1700 at %#3x is unusable due to a "
-                      "conflict on IRQ %d.\n",
-                      ioaddr, irq);
-               goto err_out;
-       }
-
-       return 0;
-
-err_out:
-       release_region(ioaddr, AT1700_IO_EXTENT);
-       return ret;
-}
-
-
-/*  EEPROM_Ctrl bits. */
-#define EE_SHIFT_CLK   0x40    /* EEPROM shift clock, in reg. 16. */
-#define EE_CS                  0x20    /* EEPROM chip select, in reg. 16. */
-#define EE_DATA_WRITE  0x80    /* EEPROM chip data in, in reg. 17. */
-#define EE_DATA_READ   0x80    /* EEPROM chip data out, in reg. 17. */
-
-/* The EEPROM commands include the alway-set leading bit. */
-#define EE_WRITE_CMD   (5 << 6)
-#define EE_READ_CMD            (6 << 6)
-#define EE_ERASE_CMD   (7 << 6)
-
-static int __init read_eeprom(long ioaddr, int location)
-{
-       int i;
-       unsigned short retval = 0;
-       long ee_addr = ioaddr + EEPROM_Ctrl;
-       long ee_daddr = ioaddr + EEPROM_Data;
-       int read_cmd = location | EE_READ_CMD;
-
-       /* Shift the read command bits out. */
-       for (i = 9; i >= 0; i--) {
-               short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
-               outb(EE_CS, ee_addr);
-               outb(dataval, ee_daddr);
-               outb(EE_CS | EE_SHIFT_CLK, ee_addr);    /* EEPROM clock tick. */
-       }
-       outb(EE_DATA_WRITE, ee_daddr);
-       for (i = 16; i > 0; i--) {
-               outb(EE_CS, ee_addr);
-               outb(EE_CS | EE_SHIFT_CLK, ee_addr);
-               retval = (retval << 1) | ((inb(ee_daddr) & EE_DATA_READ) ? 1 : 0);
-       }
-
-       /* Terminate the EEPROM access. */
-       outb(EE_CS, ee_addr);
-       outb(EE_SHIFT_CLK, ee_addr);
-       outb(0, ee_addr);
-       return retval;
-}
-
-
-
-static int net_open(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
-          bus access, and two 4K Tx queues. */
-       outb(0x5a, ioaddr + CONFIG_0);
-
-       /* Powerup, switch to register bank 2, and enable the Rx and Tx. */
-       outb(0xe8, ioaddr + CONFIG_1);
-
-       lp->tx_started = 0;
-       lp->tx_queue_ready = 1;
-       lp->rx_started = 0;
-       lp->tx_queue = 0;
-       lp->tx_queue_len = 0;
-
-       /* Turn on hardware Tx and Rx interrupts. */
-       outb(0x82, ioaddr + TX_INTR);
-       outb(0x81, ioaddr + RX_INTR);
-
-       /* Enable the IRQ on boards of fmv18x it is feasible. */
-       if (lp->jumpered) {
-               outb(0x80, ioaddr + IOCONFIG1);
-       }
-
-       netif_start_queue(dev);
-       return 0;
-}
-
-static void net_tx_timeout (struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       printk ("%s: transmit timed out with status %04x, %s?\n", dev->name,
-               inw (ioaddr + STATUS), inb (ioaddr + TX_STATUS) & 0x80
-               ? "IRQ conflict" : "network cable problem");
-       printk ("%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
-        dev->name, inw(ioaddr + TX_STATUS), inw(ioaddr + TX_INTR), inw(ioaddr + TX_MODE),
-               inw(ioaddr + CONFIG_0), inw(ioaddr + DATAPORT), inw(ioaddr + TX_START),
-               inw(ioaddr + MODE13 - 1), inw(ioaddr + RX_CTRL));
-       dev->stats.tx_errors++;
-       /* ToDo: We should try to restart the adaptor... */
-       outw(0xffff, ioaddr + MODE24);
-       outw (0xffff, ioaddr + TX_STATUS);
-       outb (0x5a, ioaddr + CONFIG_0);
-       outb (0xe8, ioaddr + CONFIG_1);
-       outw (0x8182, ioaddr + TX_INTR);
-       outb (0x00, ioaddr + TX_START);
-       outb (0x03, ioaddr + COL16CNTL);
-
-       dev->trans_start = jiffies; /* prevent tx timeout */
-
-       lp->tx_started = 0;
-       lp->tx_queue_ready = 1;
-       lp->rx_started = 0;
-       lp->tx_queue = 0;
-       lp->tx_queue_len = 0;
-
-       netif_wake_queue(dev);
-}
-
-
-static netdev_tx_t net_send_packet (struct sk_buff *skb,
-                                   struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
-       short len = skb->len;
-       unsigned char *buf = skb->data;
-       static u8 pad[ETH_ZLEN];
-
-       netif_stop_queue (dev);
-
-       /* We may not start transmitting unless we finish transferring
-          a packet into the Tx queue. During executing the following
-          codes we possibly catch a Tx interrupt. Thus we flag off
-          tx_queue_ready, so that we prevent the interrupt routine
-          (net_interrupt) to start transmitting. */
-       lp->tx_queue_ready = 0;
-       {
-               outw (length, ioaddr + DATAPORT);
-               /* Packet data */
-               outsw (ioaddr + DATAPORT, buf, len >> 1);
-               /* Check for dribble byte */
-               if (len & 1) {
-                       outw(skb->data[skb->len-1], ioaddr + DATAPORT);
-                       len++;
-               }
-               /* Check for packet padding */
-               if (length != skb->len)
-                       outsw(ioaddr + DATAPORT, pad, (length - len + 1) >> 1);
-
-               lp->tx_queue++;
-               lp->tx_queue_len += length + 2;
-       }
-       lp->tx_queue_ready = 1;
-
-       if (lp->tx_started == 0) {
-               /* If the Tx is idle, always trigger a transmit. */
-               outb (0x80 | lp->tx_queue, ioaddr + TX_START);
-               lp->tx_queue = 0;
-               lp->tx_queue_len = 0;
-               lp->tx_started = 1;
-               netif_start_queue (dev);
-       } else if (lp->tx_queue_len < 4096 - 1502)
-               /* Yes, there is room for one more packet. */
-               netif_start_queue (dev);
-       dev_kfree_skb (skb);
-
-       return NETDEV_TX_OK;
-}
-
-/* The typical workload of the driver:
-   Handle the network interface interrupts. */
-static irqreturn_t net_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct net_local *lp;
-       int ioaddr, status;
-       int handled = 0;
-
-       if (dev == NULL) {
-               printk ("at1700_interrupt(): irq %d for unknown device.\n", irq);
-               return IRQ_NONE;
-       }
-
-       ioaddr = dev->base_addr;
-       lp = netdev_priv(dev);
-
-       spin_lock (&lp->lock);
-
-       status = inw(ioaddr + TX_STATUS);
-       outw(status, ioaddr + TX_STATUS);
-
-       if (net_debug > 4)
-               printk("%s: Interrupt with status %04x.\n", dev->name, status);
-       if (lp->rx_started == 0 &&
-           (status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
-               /* Got a packet(s).
-                  We cannot execute net_rx more than once at the same time for
-                  the same device. During executing net_rx, we possibly catch a
-                  Tx interrupt. Thus we flag on rx_started, so that we prevent
-                  the interrupt routine (net_interrupt) to dive into net_rx
-                  again. */
-               handled = 1;
-               lp->rx_started = 1;
-               outb(0x00, ioaddr + RX_INTR);   /* Disable RX intr. */
-               net_rx(dev);
-               outb(0x81, ioaddr + RX_INTR);   /* Enable  RX intr. */
-               lp->rx_started = 0;
-       }
-       if (status & 0x00ff) {
-               handled = 1;
-               if (status & 0x02) {
-                       /* More than 16 collisions occurred */
-                       if (net_debug > 4)
-                               printk("%s: 16 Collision occur during Txing.\n", dev->name);
-                       /* Cancel sending a packet. */
-                       outb(0x03, ioaddr + COL16CNTL);
-                       dev->stats.collisions++;
-               }
-               if (status & 0x82) {
-                       dev->stats.tx_packets++;
-                       /* The Tx queue has any packets and is not being
-                          transferred a packet from the host, start
-                          transmitting. */
-                       if (lp->tx_queue && lp->tx_queue_ready) {
-                               outb(0x80 | lp->tx_queue, ioaddr + TX_START);
-                               lp->tx_queue = 0;
-                               lp->tx_queue_len = 0;
-                               dev->trans_start = jiffies;
-                               netif_wake_queue (dev);
-                       } else {
-                               lp->tx_started = 0;
-                               netif_wake_queue (dev);
-                       }
-               }
-       }
-
-       spin_unlock (&lp->lock);
-       return IRQ_RETVAL(handled);
-}
-
-/* We have a good packet(s), get it/them out of the buffers. */
-static void
-net_rx(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       int boguscount = 5;
-
-       while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
-               ushort status = inw(ioaddr + DATAPORT);
-               ushort pkt_len = inw(ioaddr + DATAPORT);
-
-               if (net_debug > 4)
-                       printk("%s: Rxing packet mode %02x status %04x.\n",
-                                  dev->name, inb(ioaddr + RX_MODE), status);
-#ifndef final_version
-               if (status == 0) {
-                       outb(0x05, ioaddr + RX_CTRL);
-                       break;
-               }
-#endif
-
-               if ((status & 0xF0) != 0x20) {  /* There was an error. */
-                       dev->stats.rx_errors++;
-                       if (status & 0x08) dev->stats.rx_length_errors++;
-                       if (status & 0x04) dev->stats.rx_frame_errors++;
-                       if (status & 0x02) dev->stats.rx_crc_errors++;
-                       if (status & 0x01) dev->stats.rx_over_errors++;
-               } else {
-                       /* Malloc up new buffer. */
-                       struct sk_buff *skb;
-
-                       if (pkt_len > 1550) {
-                               printk("%s: The AT1700 claimed a very large packet, size %d.\n",
-                                          dev->name, pkt_len);
-                               /* Prime the FIFO and then flush the packet. */
-                               inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
-                               outb(0x05, ioaddr + RX_CTRL);
-                               dev->stats.rx_errors++;
-                               break;
-                       }
-                       skb = netdev_alloc_skb(dev, pkt_len + 3);
-                       if (skb == NULL) {
-                               printk("%s: Memory squeeze, dropping packet (len %d).\n",
-                                          dev->name, pkt_len);
-                               /* Prime the FIFO and then flush the packet. */
-                               inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
-                               outb(0x05, ioaddr + RX_CTRL);
-                               dev->stats.rx_dropped++;
-                               break;
-                       }
-                       skb_reserve(skb,2);
-
-                       insw(ioaddr + DATAPORT, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
-                       skb->protocol=eth_type_trans(skb, dev);
-                       netif_rx(skb);
-                       dev->stats.rx_packets++;
-                       dev->stats.rx_bytes += pkt_len;
-               }
-               if (--boguscount <= 0)
-                       break;
-       }
-
-       /* If any worth-while packets have been received, dev_rint()
-          has done a mark_bh(NET_BH) for us and will work on them
-          when we get to the bottom-half routine. */
-       {
-               int i;
-               for (i = 0; i < 20; i++) {
-                       if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
-                               break;
-                       inw(ioaddr + DATAPORT);                         /* dummy status read */
-                       outb(0x05, ioaddr + RX_CTRL);
-               }
-
-               if (net_debug > 5)
-                       printk("%s: Exint Rx packet with mode %02x after %d ticks.\n",
-                                  dev->name, inb(ioaddr + RX_MODE), i);
-       }
-}
-
-/* The inverse routine to net_open(). */
-static int net_close(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       netif_stop_queue(dev);
-
-       /* Set configuration register 0 to disable Tx and Rx. */
-       outb(0xda, ioaddr + CONFIG_0);
-
-       /* No statistic counters on the chip to update. */
-
-       /* Disable the IRQ on boards of fmv18x where it is feasible. */
-       if (lp->jumpered)
-               outb(0x00, ioaddr + IOCONFIG1);
-
-       /* Power-down the chip.  Green, green, green! */
-       outb(0x00, ioaddr + CONFIG_1);
-       return 0;
-}
-
-/*
-  Set the multicast/promiscuous mode for this adaptor.
-*/
-
-static void
-set_rx_mode(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       struct net_local *lp = netdev_priv(dev);
-       unsigned char mc_filter[8];              /* Multicast hash filter */
-       unsigned long flags;
-
-       if (dev->flags & IFF_PROMISC) {
-               memset(mc_filter, 0xff, sizeof(mc_filter));
-               outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
-       } else if (netdev_mc_count(dev) > MC_FILTERBREAK ||
-                          (dev->flags & IFF_ALLMULTI)) {
-               /* Too many to filter perfectly -- accept all multicasts. */
-               memset(mc_filter, 0xff, sizeof(mc_filter));
-               outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
-       } else if (netdev_mc_empty(dev)) {
-               memset(mc_filter, 0x00, sizeof(mc_filter));
-               outb(1, ioaddr + RX_MODE);      /* Ignore almost all multicasts. */
-       } else {
-               struct netdev_hw_addr *ha;
-
-               memset(mc_filter, 0, sizeof(mc_filter));
-               netdev_for_each_mc_addr(ha, dev) {
-                       unsigned int bit =
-                               ether_crc_le(ETH_ALEN, ha->addr) >> 26;
-                       mc_filter[bit >> 3] |= (1 << bit);
-               }
-               outb(0x02, ioaddr + RX_MODE);   /* Use normal mode. */
-       }
-
-       spin_lock_irqsave (&lp->lock, flags);
-       if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
-               int i;
-               int saved_bank = inw(ioaddr + CONFIG_0);
-               /* Switch to bank 1 and set the multicast table. */
-               outw((saved_bank & ~0x0C00) | 0x0480, ioaddr + CONFIG_0);
-               for (i = 0; i < 8; i++)
-                       outb(mc_filter[i], ioaddr + PORT_OFFSET(8 + i));
-               memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
-               outw(saved_bank, ioaddr + CONFIG_0);
-       }
-       spin_unlock_irqrestore (&lp->lock, flags);
-}
-
-#ifdef MODULE
-static struct net_device *dev_at1700;
-
-module_param(io, int, 0);
-module_param(irq, int, 0);
-module_param(net_debug, int, 0);
-MODULE_PARM_DESC(io, "AT1700/FMV18X I/O base address");
-MODULE_PARM_DESC(irq, "AT1700/FMV18X IRQ number");
-MODULE_PARM_DESC(net_debug, "AT1700/FMV18X debug level (0-6)");
-
-static int __init at1700_module_init(void)
-{
-       if (io == 0)
-               printk("at1700: You should not use auto-probing with insmod!\n");
-       dev_at1700 = at1700_probe(-1);
-       if (IS_ERR(dev_at1700))
-               return PTR_ERR(dev_at1700);
-       return 0;
-}
-
-static void __exit at1700_module_exit(void)
-{
-       unregister_netdev(dev_at1700);
-       cleanup_card(dev_at1700);
-       free_netdev(dev_at1700);
-}
-module_init(at1700_module_init);
-module_exit(at1700_module_exit);
-#endif /* MODULE */
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/fujitsu/eth16i.c b/drivers/net/ethernet/fujitsu/eth16i.c
deleted file mode 100644 (file)
index a992d1f..0000000
+++ /dev/null
@@ -1,1483 +0,0 @@
-/* eth16i.c An ICL EtherTeam 16i and 32 EISA ethernet driver for Linux
-
-   Written 1994-1999 by Mika Kuoppala
-
-   Copyright (C) 1994-1999 by Mika Kuoppala
-   Based on skeleton.c and heavily on at1700.c by Donald Becker
-
-   This software may be used and distributed according to the terms
-   of the GNU General Public License, incorporated herein by reference.
-
-   The author may be reached as miku@iki.fi
-
-   This driver supports following cards :
-       - ICL EtherTeam 16i
-       - ICL EtherTeam 32 EISA
-         (Uses true 32 bit transfers rather than 16i compatibility mode)
-
-   Example Module usage:
-        insmod eth16i.o io=0x2a0 mediatype=bnc
-
-       mediatype can be one of the following: bnc,tp,dix,auto,eprom
-
-       'auto' will try to autoprobe mediatype.
-       'eprom' will use whatever type defined in eprom.
-
-   I have benchmarked driver with PII/300Mhz as a ftp client
-   and 486/33Mhz as a ftp server. Top speed was 1128.37 kilobytes/sec.
-
-   Sources:
-     - skeleton.c  a sample network driver core for linux,
-       written by Donald Becker <becker@scyld.com>
-     - at1700.c a driver for Allied Telesis AT1700, written
-       by Donald Becker.
-     - e16iSRV.asm a Netware 3.X Server Driver for ICL EtherTeam16i
-       written by Markku Viima
-     - The Fujitsu MB86965 databook.
-
-   Author thanks following persons due to their valueble assistance:
-        Markku Viima (ICL)
-       Ari Valve (ICL)
-       Donald Becker
-       Kurt Huwig <kurt@huwig.de>
-
-   Revision history:
-
-   Version     Date            Description
-
-   0.01         15.12-94        Initial version (card detection)
-   0.02         23.01-95        Interrupt is now hooked correctly
-   0.03         01.02-95        Rewrote initialization part
-   0.04         07.02-95        Base skeleton done...
-                                Made a few changes to signature checking
-                                to make it a bit reliable.
-                                - fixed bug in tx_buf mapping
-                                - fixed bug in initialization (DLC_EN
-                                  wasn't enabled when initialization
-                                  was done.)
-   0.05         08.02-95        If there were more than one packet to send,
-                                transmit was jammed due to invalid
-                                register write...now fixed
-   0.06         19.02-95        Rewrote interrupt handling
-   0.07         13.04-95        Wrote EEPROM read routines
-                                Card configuration now set according to
-                                data read from EEPROM
-   0.08         23.06-95        Wrote part that tries to probe used interface
-                                port if AUTO is selected
-
-   0.09         01.09-95        Added module support
-
-   0.10         04.09-95        Fixed receive packet allocation to work
-                                with kernels > 1.3.x
-
-   0.20                20.09-95        Added support for EtherTeam32 EISA
-
-   0.21         17.10-95        Removed the unnecessary extern
-                               init_etherdev() declaration. Some
-                               other cleanups.
-
-   0.22                22.02-96        Receive buffer was not flushed
-                               correctly when faulty packet was
-                               received. Now fixed.
-
-   0.23                26.02-96        Made resetting the adapter
-                               more reliable.
-
-   0.24                27.02-96        Rewrote faulty packet handling in eth16i_rx
-
-   0.25                22.05-96        kfree() was missing from cleanup_module.
-
-   0.26                11.06-96        Sometimes card was not found by
-                               check_signature(). Now made more reliable.
-
-   0.27                23.06-96        Oops. 16 consecutive collisions halted
-                               adapter. Now will try to retransmit
-                               MAX_COL_16 times before finally giving up.
-
-   0.28                28.10-97        Added dev_id parameter (NULL) for free_irq
-
-   0.29         29.10-97        Multiple card support for module users
-
-   0.30         30.10-97        Fixed irq allocation bug.
-                                (request_irq moved from probe to open)
-
-   0.30a        21.08-98        Card detection made more relaxed. Driver
-                                had problems with some TCP/IP-PROM boots
-                               to find the card. Suggested by
-                               Kurt Huwig <kurt@huwig.de>
-
-   0.31         28.08-98        Media interface port can now be selected
-                                with module parameters or kernel
-                               boot parameters.
-
-   0.32         31.08-98        IRQ was never freed if open/close
-                                pair wasn't called. Now fixed.
-
-   0.33         10.09-98        When eth16i_open() was called after
-                                eth16i_close() chip never recovered.
-                               Now more shallow reset is made on
-                               close.
-
-   0.34         29.06-99       Fixed one bad #ifdef.
-                               Changed ioaddr -> io for consistency
-
-   0.35         01.07-99        transmit,-receive bytes were never
-                                updated in stats.
-
-   Bugs:
-       In some cases the media interface autoprobing code doesn't find
-       the correct interface type. In this case you can
-       manually choose the interface type in DOS with E16IC.EXE which is
-       configuration software for EtherTeam16i and EtherTeam32 cards.
-       This is also true for IRQ setting. You cannot use module
-       parameter to configure IRQ of the card (yet).
-
-   To do:
-       - Real multicast support
-       - Rewrite the media interface autoprobing code. Its _horrible_ !
-       - Possibly merge all the MB86965 specific code to external
-         module for use by eth16.c and Donald's at1700.c
-       - IRQ configuration with module parameter. I will do
-         this when i will get enough info about setting
-         irq without configuration utility.
-*/
-
-static char *version =
-    "eth16i.c: v0.35 01-Jul-1999 Mika Kuoppala (miku@iki.fi)\n";
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/spinlock.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/bitops.h>
-#include <linux/jiffies.h>
-#include <linux/io.h>
-
-#include <asm/dma.h>
-
-
-
-/* Few macros */
-#define BITSET(ioaddr, bnum)   ((outb(((inb(ioaddr)) | (bnum)), ioaddr)))
-#define BITCLR(ioaddr, bnum)   ((outb(((inb(ioaddr)) & (~(bnum))), ioaddr)))
-
-/* This is the I/O address space for Etherteam 16i adapter. */
-#define ETH16I_IO_EXTENT       32
-
-/* Ticks before deciding that transmit has timed out */
-#define TX_TIMEOUT             (400*HZ/1000)
-
-/* Maximum loop count when receiving packets */
-#define MAX_RX_LOOP            20
-
-/* Some interrupt masks */
-#define ETH16I_INTR_ON        0xef8a       /* Higher is receive mask */
-#define ETH16I_INTR_OFF               0x0000
-
-/* Buffers header status byte meanings */
-#define PKT_GOOD               BIT(5)
-#define PKT_GOOD_RMT           BIT(4)
-#define PKT_SHORT              BIT(3)
-#define PKT_ALIGN_ERR          BIT(2)
-#define PKT_CRC_ERR            BIT(1)
-#define PKT_RX_BUF_OVERFLOW    BIT(0)
-
-/* Transmit status register (DLCR0) */
-#define TX_STATUS_REG          0
-#define TX_DONE                BIT(7)
-#define NET_BUSY               BIT(6)
-#define TX_PKT_RCD             BIT(5)
-#define CR_LOST                BIT(4)
-#define TX_JABBER_ERR         BIT(3)
-#define COLLISION              BIT(2)
-#define COLLISIONS_16          BIT(1)
-
-/* Receive status register (DLCR1) */
-#define RX_STATUS_REG          1
-#define RX_PKT                 BIT(7)  /* Packet received */
-#define BUS_RD_ERR             BIT(6)
-#define SHORT_PKT_ERR          BIT(3)
-#define ALIGN_ERR              BIT(2)
-#define CRC_ERR                BIT(1)
-#define RX_BUF_OVERFLOW        BIT(0)
-
-/* Transmit Interrupt Enable Register (DLCR2) */
-#define TX_INTR_REG            2
-#define TX_INTR_DONE           BIT(7)
-#define TX_INTR_COL            BIT(2)
-#define TX_INTR_16_COL         BIT(1)
-
-/* Receive Interrupt Enable Register (DLCR3) */
-#define RX_INTR_REG            3
-#define RX_INTR_RECEIVE        BIT(7)
-#define RX_INTR_SHORT_PKT      BIT(3)
-#define RX_INTR_CRC_ERR        BIT(1)
-#define RX_INTR_BUF_OVERFLOW   BIT(0)
-
-/* Transmit Mode Register (DLCR4) */
-#define TRANSMIT_MODE_REG      4
-#define LOOPBACK_CONTROL       BIT(1)
-#define CONTROL_OUTPUT         BIT(2)
-
-/* Receive Mode Register (DLCR5) */
-#define RECEIVE_MODE_REG       5
-#define RX_BUFFER_EMPTY        BIT(6)
-#define ACCEPT_BAD_PACKETS     BIT(5)
-#define RECEIVE_SHORT_ADDR     BIT(4)
-#define ACCEPT_SHORT_PACKETS   BIT(3)
-#define REMOTE_RESET           BIT(2)
-
-#define ADDRESS_FILTER_MODE    BIT(1) | BIT(0)
-#define REJECT_ALL             0
-#define ACCEPT_ALL             3
-#define MODE_1                 1            /* NODE ID, BC, MC, 2-24th bit */
-#define MODE_2                 2            /* NODE ID, BC, MC, Hash Table */
-
-/* Configuration Register 0 (DLCR6) */
-#define CONFIG_REG_0           6
-#define DLC_EN                 BIT(7)
-#define SRAM_CYCLE_TIME_100NS  BIT(6)
-#define SYSTEM_BUS_WIDTH_8     BIT(5)       /* 1 = 8bit, 0 = 16bit */
-#define BUFFER_WIDTH_8         BIT(4)       /* 1 = 8bit, 0 = 16bit */
-#define TBS1                   BIT(3)
-#define TBS0                   BIT(2)
-#define SRAM_BS1               BIT(1)       /* 00=8kb,  01=16kb  */
-#define SRAM_BS0               BIT(0)       /* 10=32kb, 11=64kb  */
-
-#ifndef ETH16I_TX_BUF_SIZE                   /* 0 = 2kb, 1 = 4kb  */
-#define ETH16I_TX_BUF_SIZE     3             /* 2 = 8kb, 3 = 16kb */
-#endif
-#define TX_BUF_1x2048          0
-#define TX_BUF_2x2048          1
-#define TX_BUF_2x4098          2
-#define TX_BUF_2x8192          3
-
-/* Configuration Register 1 (DLCR7) */
-#define CONFIG_REG_1           7
-#define POWERUP                BIT(5)
-
-/* Transmit start register */
-#define TRANSMIT_START_REG     10
-#define TRANSMIT_START_RB      2
-#define TX_START               BIT(7)       /* Rest of register bit indicate*/
-                                            /* number of packets in tx buffer*/
-/* Node ID registers (DLCR8-13) */
-#define NODE_ID_0              8
-#define NODE_ID_RB             0
-
-/* Hash Table registers (HT8-15) */
-#define HASH_TABLE_0           8
-#define HASH_TABLE_RB          1
-
-/* Buffer memory ports */
-#define BUFFER_MEM_PORT_LB     8
-#define DATAPORT               BUFFER_MEM_PORT_LB
-#define BUFFER_MEM_PORT_HB     9
-
-/* 16 Collision control register (BMPR11) */
-#define COL_16_REG             11
-#define HALT_ON_16             0x00
-#define RETRANS_AND_HALT_ON_16 0x02
-
-/* Maximum number of attempts to send after 16 concecutive collisions */
-#define MAX_COL_16            10
-
-/* DMA Burst and Transceiver Mode Register (BMPR13) */
-#define TRANSCEIVER_MODE_REG   13
-#define TRANSCEIVER_MODE_RB    2
-#define IO_BASE_UNLOCK        BIT(7)
-#define LOWER_SQUELCH_TRESH    BIT(6)
-#define LINK_TEST_DISABLE      BIT(5)
-#define AUI_SELECT             BIT(4)
-#define DIS_AUTO_PORT_SEL      BIT(3)
-
-/* Filter Self Receive Register (BMPR14)  */
-#define FILTER_SELF_RX_REG     14
-#define SKIP_RX_PACKET         BIT(2)
-#define FILTER_SELF_RECEIVE    BIT(0)
-
-/* EEPROM Control Register (BMPR 16) */
-#define EEPROM_CTRL_REG        16
-
-/* EEPROM Data Register (BMPR 17) */
-#define EEPROM_DATA_REG        17
-
-/* NMC93CSx6 EEPROM Control Bits */
-#define CS_0                   0x00
-#define CS_1                   0x20
-#define SK_0                   0x00
-#define SK_1                   0x40
-#define DI_0                   0x00
-#define DI_1                   0x80
-
-/* NMC93CSx6 EEPROM Instructions */
-#define EEPROM_READ            0x80
-
-/* NMC93CSx6 EEPROM Addresses */
-#define E_NODEID_0             0x02
-#define E_NODEID_1             0x03
-#define E_NODEID_2             0x04
-#define E_PORT_SELECT          0x14
-  #define E_PORT_BNC           0x00
-  #define E_PORT_DIX           0x01
-  #define E_PORT_TP            0x02
-  #define E_PORT_AUTO          0x03
-  #define E_PORT_FROM_EPROM    0x04
-#define E_PRODUCT_CFG          0x30
-
-
-/* Macro to slow down io between EEPROM clock transitions */
-#define eeprom_slow_io() do { int _i = 40; while(--_i > 0) { inb(0x80); }}while(0)
-
-/* Jumperless Configuration Register (BMPR19) */
-#define JUMPERLESS_CONFIG      19
-
-/* ID ROM registers, writing to them also resets some parts of chip */
-#define ID_ROM_0               24
-#define ID_ROM_7               31
-#define RESET                  ID_ROM_0
-
-/* This is the I/O address list to be probed when seeking the card */
-static unsigned int eth16i_portlist[] __initdata = {
-       0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
-};
-
-static unsigned int eth32i_portlist[] __initdata = {
-       0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 0x8000,
-       0x9000, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000, 0
-};
-
-/* This is the Interrupt lookup table for Eth16i card */
-static unsigned int eth16i_irqmap[] __initdata = { 9, 10, 5, 15, 0 };
-#define NUM_OF_ISA_IRQS    4
-
-/* This is the Interrupt lookup table for Eth32i card */
-static unsigned int eth32i_irqmap[] __initdata = { 3, 5, 7, 9, 10, 11, 12, 15, 0 };
-#define EISA_IRQ_REG   0xc89
-#define NUM_OF_EISA_IRQS   8
-
-static unsigned int eth16i_tx_buf_map[] = { 2048, 2048, 4096, 8192 };
-
-/* Use 0 for production, 1 for verification, >2 for debug */
-#ifndef ETH16I_DEBUG
-#define ETH16I_DEBUG 0
-#endif
-static unsigned int eth16i_debug = ETH16I_DEBUG;
-
-/* Information for each board */
-
-struct eth16i_local {
-       unsigned char     tx_started;
-       unsigned char     tx_buf_busy;
-       unsigned short    tx_queue;  /* Number of packets in transmit buffer */
-       unsigned short    tx_queue_len;
-       unsigned int      tx_buf_size;
-       unsigned long     open_time;
-       unsigned long     tx_buffered_packets;
-       unsigned long     tx_buffered_bytes;
-       unsigned long     col_16;
-       spinlock_t        lock;
-};
-
-/* Function prototypes */
-
-static int     eth16i_probe1(struct net_device *dev, int ioaddr);
-static int     eth16i_check_signature(int ioaddr);
-static int     eth16i_probe_port(int ioaddr);
-static void    eth16i_set_port(int ioaddr, int porttype);
-static int     eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l);
-static int     eth16i_receive_probe_packet(int ioaddr);
-static int     eth16i_get_irq(int ioaddr);
-static int     eth16i_read_eeprom(int ioaddr, int offset);
-static int     eth16i_read_eeprom_word(int ioaddr);
-static void    eth16i_eeprom_cmd(int ioaddr, unsigned char command);
-static int     eth16i_open(struct net_device *dev);
-static int     eth16i_close(struct net_device *dev);
-static netdev_tx_t eth16i_tx(struct sk_buff *skb, struct net_device *dev);
-static void    eth16i_rx(struct net_device *dev);
-static void    eth16i_timeout(struct net_device *dev);
-static irqreturn_t eth16i_interrupt(int irq, void *dev_id);
-static void    eth16i_reset(struct net_device *dev);
-static void    eth16i_timeout(struct net_device *dev);
-static void    eth16i_skip_packet(struct net_device *dev);
-static void    eth16i_multicast(struct net_device *dev);
-static void    eth16i_select_regbank(unsigned char regbank, int ioaddr);
-static void    eth16i_initialize(struct net_device *dev, int boot);
-
-#if 0
-static int     eth16i_set_irq(struct net_device *dev);
-#endif
-
-#ifdef MODULE
-static ushort  eth16i_parse_mediatype(const char* s);
-#endif
-
-static char cardname[] __initdata = "ICL EtherTeam 16i/32";
-
-static int __init do_eth16i_probe(struct net_device *dev)
-{
-       int i;
-       int ioaddr;
-       int base_addr = dev->base_addr;
-
-       if(eth16i_debug > 4)
-               printk(KERN_DEBUG "Probing started for %s\n", cardname);
-
-       if(base_addr > 0x1ff)           /* Check only single location */
-               return eth16i_probe1(dev, base_addr);
-       else if(base_addr != 0)         /* Don't probe at all */
-               return -ENXIO;
-
-       /* Seek card from the ISA io address space */
-       for(i = 0; (ioaddr = eth16i_portlist[i]) ; i++)
-               if(eth16i_probe1(dev, ioaddr) == 0)
-                       return 0;
-
-       /* Seek card from the EISA io address space */
-       for(i = 0; (ioaddr = eth32i_portlist[i]) ; i++)
-               if(eth16i_probe1(dev, ioaddr) == 0)
-                       return 0;
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init eth16i_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct eth16i_local));
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_eth16i_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static const struct net_device_ops eth16i_netdev_ops = {
-       .ndo_open               = eth16i_open,
-       .ndo_stop               = eth16i_close,
-       .ndo_start_xmit         = eth16i_tx,
-       .ndo_set_rx_mode        = eth16i_multicast,
-       .ndo_tx_timeout         = eth16i_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-static int __init eth16i_probe1(struct net_device *dev, int ioaddr)
-{
-       struct eth16i_local *lp = netdev_priv(dev);
-       static unsigned version_printed;
-       int retval;
-
-       /* Let's grab the region */
-       if (!request_region(ioaddr, ETH16I_IO_EXTENT, cardname))
-               return -EBUSY;
-
-       /*
-         The MB86985 chip has on register which holds information in which
-         io address the chip lies. First read this register and compare
-         it to our current io address and if match then this could
-         be our chip.
-         */
-
-       if(ioaddr < 0x1000) {
-               if(eth16i_portlist[(inb(ioaddr + JUMPERLESS_CONFIG) & 0x07)]
-                  != ioaddr) {
-                       retval = -ENODEV;
-                       goto out;
-               }
-       }
-
-       /* Now we will go a bit deeper and try to find the chip's signature */
-
-       if(eth16i_check_signature(ioaddr) != 0) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /*
-          Now it seems that we have found a ethernet chip in this particular
-          ioaddr. The MB86985 chip has this feature, that when you read a
-          certain register it will increase it's io base address to next
-          configurable slot. Now when we have found the chip, first thing is
-          to make sure that the chip's ioaddr will hold still here.
-          */
-
-       eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
-       outb(0x00, ioaddr + TRANSCEIVER_MODE_REG);
-
-       outb(0x00, ioaddr + RESET);             /* Reset some parts of chip */
-       BITSET(ioaddr + CONFIG_REG_0, BIT(7));  /* Disable the data link */
-
-       if( (eth16i_debug & version_printed++) == 0)
-               printk(KERN_INFO "%s", version);
-
-       dev->base_addr = ioaddr;
-       dev->irq = eth16i_get_irq(ioaddr);
-
-       /* Try to obtain interrupt vector */
-
-       if ((retval = request_irq(dev->irq, (void *)&eth16i_interrupt, 0, cardname, dev))) {
-               printk(KERN_WARNING "%s at %#3x, but is unusable due to conflicting IRQ %d.\n",
-                      cardname, ioaddr, dev->irq);
-               goto out;
-       }
-
-       printk(KERN_INFO "%s: %s at %#3x, IRQ %d, ",
-              dev->name, cardname, ioaddr, dev->irq);
-
-
-       /* Now we will have to lock the chip's io address */
-       eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
-       outb(0x38, ioaddr + TRANSCEIVER_MODE_REG);
-
-       eth16i_initialize(dev, 1); /* Initialize rest of the chip's registers */
-
-       /* Now let's same some energy by shutting down the chip ;) */
-       BITCLR(ioaddr + CONFIG_REG_1, POWERUP);
-
-       /* Initialize the device structure */
-       dev->netdev_ops         = &eth16i_netdev_ops;
-       dev->watchdog_timeo     = TX_TIMEOUT;
-       spin_lock_init(&lp->lock);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out1;
-       return 0;
-out1:
-       free_irq(dev->irq, dev);
-out:
-       release_region(ioaddr, ETH16I_IO_EXTENT);
-       return retval;
-}
-
-
-static void eth16i_initialize(struct net_device *dev, int boot)
-{
-       int ioaddr = dev->base_addr;
-       int i, node_w = 0;
-       unsigned char node_byte = 0;
-
-       /* Setup station address */
-       eth16i_select_regbank(NODE_ID_RB, ioaddr);
-       for(i = 0 ; i < 3 ; i++) {
-               unsigned short node_val = eth16i_read_eeprom(ioaddr, E_NODEID_0 + i);
-               ((unsigned short *)dev->dev_addr)[i] = ntohs(node_val);
-       }
-
-       for(i = 0; i < 6; i++) {
-               outb( ((unsigned char *)dev->dev_addr)[i], ioaddr + NODE_ID_0 + i);
-               if(boot) {
-                       printk("%02x", inb(ioaddr + NODE_ID_0 + i));
-                       if(i != 5)
-                               printk(":");
-               }
-       }
-
-       /* Now we will set multicast addresses to accept none */
-       eth16i_select_regbank(HASH_TABLE_RB, ioaddr);
-       for(i = 0; i < 8; i++)
-               outb(0x00, ioaddr + HASH_TABLE_0 + i);
-
-       /*
-         Now let's disable the transmitter and receiver, set the buffer ram
-         cycle time, bus width and buffer data path width. Also we shall
-         set transmit buffer size and total buffer size.
-         */
-
-       eth16i_select_regbank(2, ioaddr);
-
-       node_byte = 0;
-       node_w = eth16i_read_eeprom(ioaddr, E_PRODUCT_CFG);
-
-       if( (node_w & 0xFF00) == 0x0800)
-               node_byte |= BUFFER_WIDTH_8;
-
-       node_byte |= SRAM_BS1;
-
-       if( (node_w & 0x00FF) == 64)
-               node_byte |= SRAM_BS0;
-
-       node_byte |= DLC_EN | SRAM_CYCLE_TIME_100NS | (ETH16I_TX_BUF_SIZE << 2);
-
-       outb(node_byte, ioaddr + CONFIG_REG_0);
-
-       /* We shall halt the transmitting, if 16 collisions are detected */
-       outb(HALT_ON_16, ioaddr + COL_16_REG);
-
-#ifdef MODULE
-       /* if_port already set by init_module() */
-#else
-       dev->if_port = (dev->mem_start < E_PORT_FROM_EPROM) ?
-               dev->mem_start : E_PORT_FROM_EPROM;
-#endif
-
-       /* Set interface port type */
-       if(boot) {
-               static const char * const porttype[] = {
-                       "BNC", "DIX", "TP", "AUTO", "FROM_EPROM"
-               };
-
-               switch(dev->if_port)
-               {
-
-               case E_PORT_FROM_EPROM:
-                       dev->if_port = eth16i_read_eeprom(ioaddr, E_PORT_SELECT);
-                       break;
-
-               case E_PORT_AUTO:
-                       dev->if_port = eth16i_probe_port(ioaddr);
-                       break;
-
-               case E_PORT_BNC:
-               case E_PORT_TP:
-               case E_PORT_DIX:
-                       break;
-               }
-
-               printk(" %s interface.\n", porttype[dev->if_port]);
-
-               eth16i_set_port(ioaddr, dev->if_port);
-       }
-
-       /* Set Receive Mode to normal operation */
-       outb(MODE_2, ioaddr + RECEIVE_MODE_REG);
-}
-
-static int eth16i_probe_port(int ioaddr)
-{
-       int i;
-       int retcode;
-       unsigned char dummy_packet[64];
-
-       /* Powerup the chip */
-       outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
-
-       BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
-
-       eth16i_select_regbank(NODE_ID_RB, ioaddr);
-
-       for(i = 0; i < 6; i++) {
-               dummy_packet[i] = inb(ioaddr + NODE_ID_0 + i);
-               dummy_packet[i+6] = inb(ioaddr + NODE_ID_0 + i);
-       }
-
-       dummy_packet[12] = 0x00;
-       dummy_packet[13] = 0x04;
-       memset(dummy_packet + 14, 0, sizeof(dummy_packet) - 14);
-
-       eth16i_select_regbank(2, ioaddr);
-
-       for(i = 0; i < 3; i++) {
-               BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
-               BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
-               eth16i_set_port(ioaddr, i);
-
-               if(eth16i_debug > 1)
-                       printk(KERN_DEBUG "Set port number %d\n", i);
-
-               retcode = eth16i_send_probe_packet(ioaddr, dummy_packet, 64);
-               if(retcode == 0) {
-                       retcode = eth16i_receive_probe_packet(ioaddr);
-                       if(retcode != -1) {
-                               if(eth16i_debug > 1)
-                                       printk(KERN_DEBUG "Eth16i interface port found at %d\n", i);
-                               return i;
-                       }
-               }
-               else {
-                       if(eth16i_debug > 1)
-                               printk(KERN_DEBUG "TRANSMIT_DONE timeout when probing interface port\n");
-               }
-       }
-
-       if( eth16i_debug > 1)
-               printk(KERN_DEBUG "Using default port\n");
-
-       return E_PORT_BNC;
-}
-
-static void eth16i_set_port(int ioaddr, int porttype)
-{
-       unsigned short temp = 0;
-
-       eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
-       outb(LOOPBACK_CONTROL, ioaddr + TRANSMIT_MODE_REG);
-
-       temp |= DIS_AUTO_PORT_SEL;
-
-       switch(porttype) {
-
-       case E_PORT_BNC :
-               temp |= AUI_SELECT;
-               break;
-
-       case E_PORT_TP :
-               break;
-
-       case E_PORT_DIX :
-               temp |= AUI_SELECT;
-               BITSET(ioaddr + TRANSMIT_MODE_REG, CONTROL_OUTPUT);
-               break;
-       }
-
-       outb(temp, ioaddr + TRANSCEIVER_MODE_REG);
-
-       if(eth16i_debug > 1) {
-               printk(KERN_DEBUG "TRANSMIT_MODE_REG = %x\n", inb(ioaddr + TRANSMIT_MODE_REG));
-               printk(KERN_DEBUG "TRANSCEIVER_MODE_REG = %x\n",
-                      inb(ioaddr+TRANSCEIVER_MODE_REG));
-       }
-}
-
-static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
-{
-       unsigned long starttime;
-
-       outb(0xff, ioaddr + TX_STATUS_REG);
-
-       outw(l, ioaddr + DATAPORT);
-       outsw(ioaddr + DATAPORT, (unsigned short *)b, (l + 1) >> 1);
-
-       starttime = jiffies;
-       outb(TX_START | 1, ioaddr + TRANSMIT_START_REG);
-
-       while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) {
-               if( time_after(jiffies, starttime + TX_TIMEOUT)) {
-                       return -1;
-               }
-       }
-
-       return 0;
-}
-
-static int eth16i_receive_probe_packet(int ioaddr)
-{
-       unsigned long starttime;
-
-       starttime = jiffies;
-
-       while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) {
-               if( time_after(jiffies, starttime + TX_TIMEOUT)) {
-
-                       if(eth16i_debug > 1)
-                               printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n");
-                       starttime = jiffies;
-                       while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
-                               if( time_after(jiffies, starttime + TX_TIMEOUT)) {
-                                       if(eth16i_debug > 1)
-                                               printk(KERN_DEBUG "Timeout occurred waiting receive packet\n");
-                                       return -1;
-                               }
-                       }
-
-                       if(eth16i_debug > 1)
-                               printk(KERN_DEBUG "RECEIVE_PACKET\n");
-                       return 0; /* Found receive packet */
-               }
-       }
-
-       if(eth16i_debug > 1) {
-               printk(KERN_DEBUG "TRANSMIT_PACKET_RECEIVED %x\n", inb(ioaddr + TX_STATUS_REG));
-               printk(KERN_DEBUG "RX_STATUS_REG = %x\n", inb(ioaddr + RX_STATUS_REG));
-       }
-
-       return 0; /* Return success */
-}
-
-#if 0
-static int eth16i_set_irq(struct net_device* dev)
-{
-       const int ioaddr = dev->base_addr;
-       const int irq = dev->irq;
-       int i = 0;
-
-       if(ioaddr < 0x1000) {
-               while(eth16i_irqmap[i] && eth16i_irqmap[i] != irq)
-                       i++;
-
-               if(i < NUM_OF_ISA_IRQS) {
-                       u8 cbyte = inb(ioaddr + JUMPERLESS_CONFIG);
-                       cbyte = (cbyte & 0x3F) | (i << 6);
-                       outb(cbyte, ioaddr + JUMPERLESS_CONFIG);
-                       return 0;
-               }
-       }
-       else {
-               printk(KERN_NOTICE "%s: EISA Interrupt cannot be set. Use EISA Configuration utility.\n", dev->name);
-       }
-
-       return -1;
-
-}
-#endif
-
-static int __init eth16i_get_irq(int ioaddr)
-{
-       unsigned char cbyte;
-
-       if( ioaddr < 0x1000) {
-               cbyte = inb(ioaddr + JUMPERLESS_CONFIG);
-               return eth16i_irqmap[((cbyte & 0xC0) >> 6)];
-       } else {  /* Oh..the card is EISA so method getting IRQ different */
-               unsigned short index = 0;
-               cbyte = inb(ioaddr + EISA_IRQ_REG);
-               while( (cbyte & 0x01) == 0) {
-                       cbyte = cbyte >> 1;
-                       index++;
-               }
-               return eth32i_irqmap[index];
-       }
-}
-
-static int __init eth16i_check_signature(int ioaddr)
-{
-       int i;
-       unsigned char creg[4] = { 0 };
-
-       for(i = 0; i < 4 ; i++) {
-
-               creg[i] = inb(ioaddr + TRANSMIT_MODE_REG + i);
-
-               if(eth16i_debug > 1)
-                       printk("eth16i: read signature byte %x at %x\n",
-                              creg[i],
-                              ioaddr + TRANSMIT_MODE_REG + i);
-       }
-
-       creg[0] &= 0x0F;      /* Mask collision cnr */
-       creg[2] &= 0x7F;      /* Mask DCLEN bit */
-
-#if 0
-       /*
-          This was removed because the card was sometimes left to state
-          from which it couldn't be find anymore. If there is need
-          to more strict check still this have to be fixed.
-          */
-       if( ! ((creg[0] == 0x06) && (creg[1] == 0x41)) ) {
-               if(creg[1] != 0x42)
-                       return -1;
-       }
-#endif
-
-       if( !((creg[2] == 0x36) && (creg[3] == 0xE0)) ) {
-               creg[2] &= 0x40;
-               creg[3] &= 0x03;
-
-               if( !((creg[2] == 0x40) && (creg[3] == 0x00)) )
-                       return -1;
-       }
-
-       if(eth16i_read_eeprom(ioaddr, E_NODEID_0) != 0)
-               return -1;
-
-       if((eth16i_read_eeprom(ioaddr, E_NODEID_1) & 0xFF00) != 0x4B00)
-               return -1;
-
-       return 0;
-}
-
-static int eth16i_read_eeprom(int ioaddr, int offset)
-{
-       int data = 0;
-
-       eth16i_eeprom_cmd(ioaddr, EEPROM_READ | offset);
-       outb(CS_1, ioaddr + EEPROM_CTRL_REG);
-       data = eth16i_read_eeprom_word(ioaddr);
-       outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
-
-       return data;
-}
-
-static int eth16i_read_eeprom_word(int ioaddr)
-{
-       int i;
-       int data = 0;
-
-       for(i = 16; i > 0; i--) {
-               outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
-               eeprom_slow_io();
-               outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
-               eeprom_slow_io();
-               data = (data << 1) |
-                       ((inb(ioaddr + EEPROM_DATA_REG) & DI_1) ? 1 : 0);
-
-               eeprom_slow_io();
-       }
-
-       return data;
-}
-
-static void eth16i_eeprom_cmd(int ioaddr, unsigned char command)
-{
-       int i;
-
-       outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
-       outb(DI_0, ioaddr + EEPROM_DATA_REG);
-       outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
-       outb(DI_1, ioaddr + EEPROM_DATA_REG);
-       outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
-
-       for(i = 7; i >= 0; i--) {
-               short cmd = ( (command & (1 << i)) ? DI_1 : DI_0 );
-               outb(cmd, ioaddr + EEPROM_DATA_REG);
-               outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
-               eeprom_slow_io();
-               outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
-               eeprom_slow_io();
-       }
-}
-
-static int eth16i_open(struct net_device *dev)
-{
-       struct eth16i_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       /* Powerup the chip */
-       outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
-
-       /* Initialize the chip */
-       eth16i_initialize(dev, 0);
-
-       /* Set the transmit buffer size */
-       lp->tx_buf_size = eth16i_tx_buf_map[ETH16I_TX_BUF_SIZE & 0x03];
-
-       if(eth16i_debug > 0)
-               printk(KERN_DEBUG "%s: transmit buffer size %d\n",
-                      dev->name, lp->tx_buf_size);
-
-       /* Now enable Transmitter and Receiver sections */
-       BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
-
-       /* Now switch to register bank 2, for run time operation */
-       eth16i_select_regbank(2, ioaddr);
-
-       lp->open_time = jiffies;
-       lp->tx_started = 0;
-       lp->tx_queue = 0;
-       lp->tx_queue_len = 0;
-
-       /* Turn on interrupts*/
-       outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
-
-       netif_start_queue(dev);
-       return 0;
-}
-
-static int eth16i_close(struct net_device *dev)
-{
-       struct eth16i_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       eth16i_reset(dev);
-
-       /* Turn off interrupts*/
-       outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
-
-       netif_stop_queue(dev);
-
-       lp->open_time = 0;
-
-       /* Disable transmit and receive */
-       BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
-
-       /* Reset the chip */
-       /* outb(0xff, ioaddr + RESET); */
-       /* outw(0xffff, ioaddr + TX_STATUS_REG);    */
-
-       outb(0x00, ioaddr + CONFIG_REG_1);
-
-       return 0;
-}
-
-static void eth16i_timeout(struct net_device *dev)
-{
-       struct eth16i_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       /*
-          If we get here, some higher level has decided that
-          we are broken. There should really be a "kick me"
-          function call instead.
-          */
-
-       outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
-       printk(KERN_WARNING "%s: transmit timed out with status %04x, %s ?\n",
-              dev->name,
-       inw(ioaddr + TX_STATUS_REG),  (inb(ioaddr + TX_STATUS_REG) & TX_DONE) ?
-                      "IRQ conflict" : "network cable problem");
-
-       dev->trans_start = jiffies; /* prevent tx timeout */
-
-       /* Let's dump all registers */
-       if(eth16i_debug > 0) {
-               printk(KERN_DEBUG "%s: timeout: %02x %02x %02x %02x %02x %02x %02x %02x.\n",
-                      dev->name, inb(ioaddr + 0),
-                      inb(ioaddr + 1), inb(ioaddr + 2),
-                      inb(ioaddr + 3), inb(ioaddr + 4),
-                      inb(ioaddr + 5),
-                      inb(ioaddr + 6), inb(ioaddr + 7));
-
-               printk(KERN_DEBUG "%s: transmit start reg: %02x. collision reg %02x\n",
-                      dev->name, inb(ioaddr + TRANSMIT_START_REG),
-                      inb(ioaddr + COL_16_REG));
-                       printk(KERN_DEBUG "lp->tx_queue = %d\n", lp->tx_queue);
-               printk(KERN_DEBUG "lp->tx_queue_len = %d\n", lp->tx_queue_len);
-               printk(KERN_DEBUG "lp->tx_started = %d\n", lp->tx_started);
-       }
-       dev->stats.tx_errors++;
-       eth16i_reset(dev);
-       dev->trans_start = jiffies; /* prevent tx timeout */
-       outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
-       netif_wake_queue(dev);
-}
-
-static netdev_tx_t eth16i_tx(struct sk_buff *skb, struct net_device *dev)
-{
-       struct eth16i_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       int status = 0;
-       ushort length = skb->len;
-       unsigned char *buf;
-       unsigned long flags;
-
-       if (length < ETH_ZLEN) {
-               if (skb_padto(skb, ETH_ZLEN))
-                       return NETDEV_TX_OK;
-               length = ETH_ZLEN;
-       }
-       buf = skb->data;
-
-       netif_stop_queue(dev);
-
-       /* Turn off TX interrupts */
-       outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
-
-       /* We would be better doing the disable_irq tricks the 3c509 does,
-          that would make this suck a lot less */
-
-       spin_lock_irqsave(&lp->lock, flags);
-
-       if( (length + 2) > (lp->tx_buf_size - lp->tx_queue_len)) {
-               if(eth16i_debug > 0)
-                       printk(KERN_WARNING "%s: Transmit buffer full.\n", dev->name);
-       }
-       else {
-               outw(length, ioaddr + DATAPORT);
-
-               if( ioaddr < 0x1000 )
-                       outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
-               else {
-                       unsigned char frag = length % 4;
-                       outsl(ioaddr + DATAPORT, buf, length >> 2);
-                       if( frag != 0 ) {
-                               outsw(ioaddr + DATAPORT, (buf + (length & 0xFFFC)), 1);
-                               if( frag == 3 )
-                                       outsw(ioaddr + DATAPORT,
-                                             (buf + (length & 0xFFFC) + 2), 1);
-                       }
-               }
-               lp->tx_buffered_packets++;
-               lp->tx_buffered_bytes = length;
-               lp->tx_queue++;
-               lp->tx_queue_len += length + 2;
-       }
-       lp->tx_buf_busy = 0;
-
-       if(lp->tx_started == 0) {
-               /* If the transmitter is idle..always trigger a transmit */
-               outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
-               lp->tx_queue = 0;
-               lp->tx_queue_len = 0;
-               lp->tx_started = 1;
-               netif_wake_queue(dev);
-       }
-       else if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) {
-               /* There is still more room for one more packet in tx buffer */
-               netif_wake_queue(dev);
-       }
-
-       spin_unlock_irqrestore(&lp->lock, flags);
-
-       outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
-       /* Turn TX interrupts back on */
-       /* outb(TX_INTR_DONE | TX_INTR_16_COL, ioaddr + TX_INTR_REG); */
-       status = 0;
-       dev_kfree_skb(skb);
-       return NETDEV_TX_OK;
-}
-
-static void eth16i_rx(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       int boguscount = MAX_RX_LOOP;
-
-       /* Loop until all packets have been read */
-       while( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) {
-
-               /* Read status byte from receive buffer */
-               ushort status = inw(ioaddr + DATAPORT);
-
-               /* Get the size of the packet from receive buffer */
-               ushort pkt_len = inw(ioaddr + DATAPORT);
-
-               if(eth16i_debug > 4)
-                       printk(KERN_DEBUG "%s: Receiving packet mode %02x status %04x.\n",
-                              dev->name,
-                              inb(ioaddr + RECEIVE_MODE_REG), status);
-
-               if( !(status & PKT_GOOD) ) {
-                       dev->stats.rx_errors++;
-
-                       if( (pkt_len < ETH_ZLEN) || (pkt_len > ETH_FRAME_LEN) ) {
-                               dev->stats.rx_length_errors++;
-                               eth16i_reset(dev);
-                               return;
-                       }
-                       else {
-                               eth16i_skip_packet(dev);
-                               dev->stats.rx_dropped++;
-                       }
-               }
-               else {   /* Ok so now we should have a good packet */
-                       struct sk_buff *skb;
-
-                       skb = netdev_alloc_skb(dev, pkt_len + 3);
-                       if( skb == NULL ) {
-                               printk(KERN_WARNING "%s: Could'n allocate memory for packet (len %d)\n",
-                                      dev->name, pkt_len);
-                               eth16i_skip_packet(dev);
-                               dev->stats.rx_dropped++;
-                               break;
-                       }
-
-                       skb_reserve(skb,2);
-
-                       /*
-                          Now let's get the packet out of buffer.
-                          size is (pkt_len + 1) >> 1, cause we are now reading words
-                          and it have to be even aligned.
-                          */
-
-                       if(ioaddr < 0x1000)
-                               insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
-                                    (pkt_len + 1) >> 1);
-                       else {
-                               unsigned char *buf = skb_put(skb, pkt_len);
-                               unsigned char frag = pkt_len % 4;
-
-                               insl(ioaddr + DATAPORT, buf, pkt_len >> 2);
-
-                               if(frag != 0) {
-                                       unsigned short rest[2];
-                                       rest[0] = inw( ioaddr + DATAPORT );
-                                       if(frag == 3)
-                                               rest[1] = inw( ioaddr + DATAPORT );
-
-                                       memcpy(buf + (pkt_len & 0xfffc), (char *)rest, frag);
-                               }
-                       }
-
-                       skb->protocol=eth_type_trans(skb, dev);
-
-                       if( eth16i_debug > 5 ) {
-                               int i;
-                               printk(KERN_DEBUG "%s: Received packet of length %d.\n",
-                                      dev->name, pkt_len);
-                               for(i = 0; i < 14; i++)
-                                       printk(KERN_DEBUG " %02x", skb->data[i]);
-                               printk(KERN_DEBUG ".\n");
-                       }
-                       netif_rx(skb);
-                       dev->stats.rx_packets++;
-                       dev->stats.rx_bytes += pkt_len;
-
-               } /* else */
-
-               if(--boguscount <= 0)
-                       break;
-
-       } /* while */
-}
-
-static irqreturn_t eth16i_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct eth16i_local *lp;
-       int ioaddr = 0, status;
-       int handled = 0;
-
-       ioaddr = dev->base_addr;
-       lp = netdev_priv(dev);
-
-       /* Turn off all interrupts from adapter */
-       outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
-
-       /* eth16i_tx won't be called */
-       spin_lock(&lp->lock);
-
-       status = inw(ioaddr + TX_STATUS_REG);      /* Get the status */
-       outw(status, ioaddr + TX_STATUS_REG);      /* Clear status bits */
-
-       if (status)
-               handled = 1;
-
-       if(eth16i_debug > 3)
-               printk(KERN_DEBUG "%s: Interrupt with status %04x.\n", dev->name, status);
-
-       if( status & 0x7f00 ) {
-
-               dev->stats.rx_errors++;
-
-               if(status & (BUS_RD_ERR << 8) )
-                       printk(KERN_WARNING "%s: Bus read error.\n",dev->name);
-               if(status & (SHORT_PKT_ERR << 8) )   dev->stats.rx_length_errors++;
-               if(status & (ALIGN_ERR << 8) )       dev->stats.rx_frame_errors++;
-               if(status & (CRC_ERR << 8) )        dev->stats.rx_crc_errors++;
-               if(status & (RX_BUF_OVERFLOW << 8) ) dev->stats.rx_over_errors++;
-       }
-       if( status & 0x001a) {
-
-               dev->stats.tx_errors++;
-
-               if(status & CR_LOST) dev->stats.tx_carrier_errors++;
-               if(status & TX_JABBER_ERR) dev->stats.tx_window_errors++;
-
-#if 0
-               if(status & COLLISION) {
-                       dev->stats.collisions +=
-                               ((inb(ioaddr+TRANSMIT_MODE_REG) & 0xF0) >> 4);
-               }
-#endif
-               if(status & COLLISIONS_16) {
-                       if(lp->col_16 < MAX_COL_16) {
-                               lp->col_16++;
-                               dev->stats.collisions++;
-                               /* Resume transmitting, skip failed packet */
-                               outb(0x02, ioaddr + COL_16_REG);
-                       }
-                       else {
-                               printk(KERN_WARNING "%s: bailing out due to many consecutive 16-in-a-row collisions. Network cable problem?\n", dev->name);
-                       }
-               }
-       }
-
-       if( status & 0x00ff ) {          /* Let's check the transmit status reg */
-
-               if(status & TX_DONE) {         /* The transmit has been done */
-                       dev->stats.tx_packets = lp->tx_buffered_packets;
-                       dev->stats.tx_bytes += lp->tx_buffered_bytes;
-                       lp->col_16 = 0;
-
-                       if(lp->tx_queue) {           /* Is there still packets ? */
-                               /* There was packet(s) so start transmitting and write also
-                                  how many packets there is to be sended */
-                               outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
-                               lp->tx_queue = 0;
-                               lp->tx_queue_len = 0;
-                               lp->tx_started = 1;
-                       }
-                       else {
-                               lp->tx_started = 0;
-                       }
-                       netif_wake_queue(dev);
-               }
-       }
-
-       if( ( status & 0x8000 ) ||
-           ( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) ) {
-               eth16i_rx(dev);  /* We have packet in receive buffer */
-       }
-
-       /* Turn interrupts back on */
-       outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
-
-       if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) {
-               /* There is still more room for one more packet in tx buffer */
-               netif_wake_queue(dev);
-       }
-
-       spin_unlock(&lp->lock);
-
-       return IRQ_RETVAL(handled);
-}
-
-static void eth16i_skip_packet(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       inw(ioaddr + DATAPORT);
-       inw(ioaddr + DATAPORT);
-       inw(ioaddr + DATAPORT);
-
-       outb(SKIP_RX_PACKET, ioaddr + FILTER_SELF_RX_REG);
-       while( inb( ioaddr + FILTER_SELF_RX_REG ) != 0);
-}
-
-static void eth16i_reset(struct net_device *dev)
-{
-       struct eth16i_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       if(eth16i_debug > 1)
-               printk(KERN_DEBUG "%s: Resetting device.\n", dev->name);
-
-       BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
-       outw(0xffff, ioaddr + TX_STATUS_REG);
-       eth16i_select_regbank(2, ioaddr);
-
-       lp->tx_started = 0;
-       lp->tx_buf_busy = 0;
-       lp->tx_queue = 0;
-       lp->tx_queue_len = 0;
-       BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
-}
-
-static void eth16i_multicast(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       if (!netdev_mc_empty(dev) || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
-       {
-               outb(3, ioaddr + RECEIVE_MODE_REG);
-       } else {
-               outb(2, ioaddr + RECEIVE_MODE_REG);
-       }
-}
-
-static void eth16i_select_regbank(unsigned char banknbr, int ioaddr)
-{
-       unsigned char data;
-
-       data = inb(ioaddr + CONFIG_REG_1);
-       outb( ((data & 0xF3) | ( (banknbr & 0x03) << 2)), ioaddr + CONFIG_REG_1);
-}
-
-#ifdef MODULE
-
-static ushort eth16i_parse_mediatype(const char* s)
-{
-       if(!s)
-               return E_PORT_FROM_EPROM;
-
-        if (!strncmp(s, "bnc", 3))
-               return E_PORT_BNC;
-        else if (!strncmp(s, "tp", 2))
-                return E_PORT_TP;
-        else if (!strncmp(s, "dix", 3))
-                return E_PORT_DIX;
-        else if (!strncmp(s, "auto", 4))
-               return E_PORT_AUTO;
-       else
-               return E_PORT_FROM_EPROM;
-}
-
-#define MAX_ETH16I_CARDS 4  /* Max number of Eth16i cards per module */
-
-static struct net_device *dev_eth16i[MAX_ETH16I_CARDS];
-static int io[MAX_ETH16I_CARDS];
-#if 0
-static int irq[MAX_ETH16I_CARDS];
-#endif
-static char* mediatype[MAX_ETH16I_CARDS];
-static int debug = -1;
-
-MODULE_AUTHOR("Mika Kuoppala <miku@iki.fi>");
-MODULE_DESCRIPTION("ICL EtherTeam 16i/32 driver");
-MODULE_LICENSE("GPL");
-
-
-module_param_array(io, int, NULL, 0);
-MODULE_PARM_DESC(io, "eth16i I/O base address(es)");
-
-#if 0
-module_param_array(irq, int, NULL, 0);
-MODULE_PARM_DESC(irq, "eth16i interrupt request number");
-#endif
-
-module_param_array(mediatype, charp, NULL, 0);
-MODULE_PARM_DESC(mediatype, "eth16i media type of interface(s) (bnc,tp,dix,auto,eprom)");
-
-module_param(debug, int, 0);
-MODULE_PARM_DESC(debug, "eth16i debug level (0-6)");
-
-int __init init_module(void)
-{
-       int this_dev, found = 0;
-       struct net_device *dev;
-
-       for (this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) {
-               dev = alloc_etherdev(sizeof(struct eth16i_local));
-               if (!dev)
-                       break;
-
-               dev->base_addr = io[this_dev];
-
-               if(debug != -1)
-                       eth16i_debug = debug;
-
-               if(eth16i_debug > 1)
-                       printk(KERN_NOTICE "eth16i(%d): interface type %s\n", this_dev, mediatype[this_dev] ? mediatype[this_dev] : "none" );
-
-               dev->if_port = eth16i_parse_mediatype(mediatype[this_dev]);
-
-               if(io[this_dev] == 0) {
-                       if (this_dev != 0) { /* Only autoprobe 1st one */
-                               free_netdev(dev);
-                               break;
-                       }
-
-                       printk(KERN_NOTICE "eth16i.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-
-               if (do_eth16i_probe(dev) == 0) {
-                       dev_eth16i[found++] = dev;
-                       continue;
-               }
-               printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n",
-                      io[this_dev]);
-               free_netdev(dev);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-void __exit cleanup_module(void)
-{
-       int this_dev;
-
-       for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) {
-               struct net_device *dev = dev_eth16i[this_dev];
-
-               if (netdev_priv(dev)) {
-                       unregister_netdev(dev);
-                       free_irq(dev->irq, dev);
-                       release_region(dev->base_addr, ETH16I_IO_EXTENT);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/i825xx/3c505.c b/drivers/net/ethernet/i825xx/3c505.c
deleted file mode 100644 (file)
index 6d000d6..0000000
+++ /dev/null
@@ -1,1672 +0,0 @@
-/*
- * Linux Ethernet device driver for the 3Com Etherlink Plus (3C505)
- *      By Craig Southeren, Juha Laiho and Philip Blundell
- *
- * 3c505.c      This module implements an interface to the 3Com
- *              Etherlink Plus (3c505) Ethernet card. Linux device
- *              driver interface reverse engineered from the Linux 3C509
- *              device drivers. Some 3C505 information gleaned from
- *              the Crynwr packet driver. Still this driver would not
- *              be here without 3C505 technical reference provided by
- *              3Com.
- *
- * $Id: 3c505.c,v 1.10 1996/04/16 13:06:27 phil Exp $
- *
- * Authors:     Linux 3c505 device driver by
- *                      Craig Southeren, <craigs@ineluki.apana.org.au>
- *              Final debugging by
- *                      Andrew Tridgell, <tridge@nimbus.anu.edu.au>
- *              Auto irq/address, tuning, cleanup and v1.1.4+ kernel mods by
- *                      Juha Laiho, <jlaiho@ichaos.nullnet.fi>
- *              Linux 3C509 driver by
- *                      Donald Becker, <becker@super.org>
- *                     (Now at <becker@scyld.com>)
- *              Crynwr packet driver by
- *                      Krishnan Gopalan and Gregg Stefancik,
- *                      Clemson University Engineering Computer Operations.
- *                      Portions of the code have been adapted from the 3c505
- *                         driver for NCSA Telnet by Bruce Orchard and later
- *                         modified by Warren Van Houten and krus@diku.dk.
- *              3C505 technical information provided by
- *                      Terry Murphy, of 3Com Network Adapter Division
- *              Linux 1.3.0 changes by
- *                      Alan Cox <Alan.Cox@linux.org>
- *              More debugging, DMA support, currently maintained by
- *                      Philip Blundell <philb@gnu.org>
- *              Multicard/soft configurable dma channel/rev 2 hardware support
- *                      by Christopher Collins <ccollins@pcug.org.au>
- *             Ethtool support (jgarzik), 11/17/2001
- */
-
-#define DRV_NAME       "3c505"
-#define DRV_VERSION    "1.10a"
-
-
-/* Theory of operation:
- *
- * The 3c505 is quite an intelligent board.  All communication with it is done
- * by means of Primary Command Blocks (PCBs); these are transferred using PIO
- * through the command register.  The card has 256k of on-board RAM, which is
- * used to buffer received packets.  It might seem at first that more buffers
- * are better, but in fact this isn't true.  From my tests, it seems that
- * more than about 10 buffers are unnecessary, and there is a noticeable
- * performance hit in having more active on the card.  So the majority of the
- * card's memory isn't, in fact, used.  Sadly, the card only has one transmit
- * buffer and, short of loading our own firmware into it (which is what some
- * drivers resort to) there's nothing we can do about this.
- *
- * We keep up to 4 "receive packet" commands active on the board at a time.
- * When a packet comes in, so long as there is a receive command active, the
- * board will send us a "packet received" PCB and then add the data for that
- * packet to the DMA queue.  If a DMA transfer is not already in progress, we
- * set one up to start uploading the data.  We have to maintain a list of
- * backlogged receive packets, because the card may decide to tell us about
- * a newly-arrived packet at any time, and we may not be able to start a DMA
- * transfer immediately (ie one may already be going on).  We can't NAK the
- * PCB, because then it would throw the packet away.
- *
- * Trying to send a PCB to the card at the wrong moment seems to have bad
- * effects.  If we send it a transmit PCB while a receive DMA is happening,
- * it will just NAK the PCB and so we will have wasted our time.  Worse, it
- * sometimes seems to interrupt the transfer.  The majority of the low-level
- * code is protected by one huge semaphore -- "busy" -- which is set whenever
- * it probably isn't safe to do anything to the card.  The receive routine
- * must gain a lock on "busy" before it can start a DMA transfer, and the
- * transmit routine must gain a lock before it sends the first PCB to the card.
- * The send_pcb() routine also has an internal semaphore to protect it against
- * being re-entered (which would be disastrous) -- this is needed because
- * several things can happen asynchronously (re-priming the receiver and
- * asking the card for statistics, for example).  send_pcb() will also refuse
- * to talk to the card at all if a DMA upload is happening.  The higher-level
- * networking code will reschedule a later retry if some part of the driver
- * is blocked.  In practice, this doesn't seem to happen very often.
- */
-
-/* This driver may now work with revision 2.x hardware, since all the read
- * operations on the HCR have been removed (we now keep our own softcopy).
- * But I don't have an old card to test it on.
- *
- * This has had the bad effect that the autoprobe routine is now a bit
- * less friendly to other devices.  However, it was never very good.
- * before, so I doubt it will hurt anybody.
- */
-
-/* The driver is a mess.  I took Craig's and Juha's code, and hacked it firstly
- * to make it more reliable, and secondly to add DMA mode.  Many things could
- * probably be done better; the concurrency protection is particularly awful.
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/interrupt.h>
-#include <linux/errno.h>
-#include <linux/in.h>
-#include <linux/ioport.h>
-#include <linux/spinlock.h>
-#include <linux/ethtool.h>
-#include <linux/delay.h>
-#include <linux/bitops.h>
-#include <linux/gfp.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/init.h>
-
-#include "3c505.h"
-
-/*********************************************************
- *
- *  define debug messages here as common strings to reduce space
- *
- *********************************************************/
-
-#define timeout_msg "*** timeout at %s:%s (line %d) ***\n"
-#define TIMEOUT_MSG(lineno) \
-       pr_notice(timeout_msg, __FILE__, __func__, (lineno))
-
-#define invalid_pcb_msg "*** invalid pcb length %d at %s:%s (line %d) ***\n"
-#define INVALID_PCB_MSG(len) \
-       pr_notice(invalid_pcb_msg, (len), __FILE__, __func__, __LINE__)
-
-#define search_msg "%s: Looking for 3c505 adapter at address %#x..."
-
-#define stilllooking_msg "still looking..."
-
-#define found_msg "found.\n"
-
-#define notfound_msg "not found (reason = %d)\n"
-
-#define couldnot_msg "%s: 3c505 not found\n"
-
-/*********************************************************
- *
- *  various other debug stuff
- *
- *********************************************************/
-
-#ifdef ELP_DEBUG
-static int elp_debug = ELP_DEBUG;
-#else
-static int elp_debug;
-#endif
-#define debug elp_debug
-
-/*
- *  0 = no messages (well, some)
- *  1 = messages when high level commands performed
- *  2 = messages when low level commands performed
- *  3 = messages when interrupts received
- */
-
-/*****************************************************************
- *
- * List of I/O-addresses we try to auto-sense
- * Last element MUST BE 0!
- *****************************************************************/
-
-static int addr_list[] __initdata = {0x300, 0x280, 0x310, 0};
-
-/* Dma Memory related stuff */
-
-static unsigned long dma_mem_alloc(int size)
-{
-       int order = get_order(size);
-       return __get_dma_pages(GFP_KERNEL, order);
-}
-
-
-/*****************************************************************
- *
- * Functions for I/O (note the inline !)
- *
- *****************************************************************/
-
-static inline unsigned char inb_status(unsigned int base_addr)
-{
-       return inb(base_addr + PORT_STATUS);
-}
-
-static inline int inb_command(unsigned int base_addr)
-{
-       return inb(base_addr + PORT_COMMAND);
-}
-
-static inline void outb_control(unsigned char val, struct net_device *dev)
-{
-       outb(val, dev->base_addr + PORT_CONTROL);
-       ((elp_device *)(netdev_priv(dev)))->hcr_val = val;
-}
-
-#define HCR_VAL(x)   (((elp_device *)(netdev_priv(x)))->hcr_val)
-
-static inline void outb_command(unsigned char val, unsigned int base_addr)
-{
-       outb(val, base_addr + PORT_COMMAND);
-}
-
-static inline unsigned int backlog_next(unsigned int n)
-{
-       return (n + 1) % BACKLOG_SIZE;
-}
-
-/*****************************************************************
- *
- *  useful functions for accessing the adapter
- *
- *****************************************************************/
-
-/*
- * use this routine when accessing the ASF bits as they are
- * changed asynchronously by the adapter
- */
-
-/* get adapter PCB status */
-#define        GET_ASF(addr) \
-       (get_status(addr)&ASF_PCB_MASK)
-
-static inline int get_status(unsigned int base_addr)
-{
-       unsigned long timeout = jiffies + 10*HZ/100;
-       register int stat1;
-       do {
-               stat1 = inb_status(base_addr);
-       } while (stat1 != inb_status(base_addr) && time_before(jiffies, timeout));
-       if (time_after_eq(jiffies, timeout))
-               TIMEOUT_MSG(__LINE__);
-       return stat1;
-}
-
-static inline void set_hsf(struct net_device *dev, int hsf)
-{
-       elp_device *adapter = netdev_priv(dev);
-       unsigned long flags;
-
-       spin_lock_irqsave(&adapter->lock, flags);
-       outb_control((HCR_VAL(dev) & ~HSF_PCB_MASK) | hsf, dev);
-       spin_unlock_irqrestore(&adapter->lock, flags);
-}
-
-static bool start_receive(struct net_device *, pcb_struct *);
-
-static inline void adapter_reset(struct net_device *dev)
-{
-       unsigned long timeout;
-       elp_device *adapter = netdev_priv(dev);
-       unsigned char orig_hcr = adapter->hcr_val;
-
-       outb_control(0, dev);
-
-       if (inb_status(dev->base_addr) & ACRF) {
-               do {
-                       inb_command(dev->base_addr);
-                       timeout = jiffies + 2*HZ/100;
-                       while (time_before_eq(jiffies, timeout) && !(inb_status(dev->base_addr) & ACRF));
-               } while (inb_status(dev->base_addr) & ACRF);
-               set_hsf(dev, HSF_PCB_NAK);
-       }
-       outb_control(adapter->hcr_val | ATTN | DIR, dev);
-       mdelay(10);
-       outb_control(adapter->hcr_val & ~ATTN, dev);
-       mdelay(10);
-       outb_control(adapter->hcr_val | FLSH, dev);
-       mdelay(10);
-       outb_control(adapter->hcr_val & ~FLSH, dev);
-       mdelay(10);
-
-       outb_control(orig_hcr, dev);
-       if (!start_receive(dev, &adapter->tx_pcb))
-               pr_err("%s: start receive command failed\n", dev->name);
-}
-
-/* Check to make sure that a DMA transfer hasn't timed out.  This should
- * never happen in theory, but seems to occur occasionally if the card gets
- * prodded at the wrong time.
- */
-static inline void check_3c505_dma(struct net_device *dev)
-{
-       elp_device *adapter = netdev_priv(dev);
-       if (adapter->dmaing && time_after(jiffies, adapter->current_dma.start_time + 10)) {
-               unsigned long flags, f;
-               pr_err("%s: DMA %s timed out, %d bytes left\n", dev->name,
-                       adapter->current_dma.direction ? "download" : "upload",
-                       get_dma_residue(dev->dma));
-               spin_lock_irqsave(&adapter->lock, flags);
-               adapter->dmaing = 0;
-               adapter->busy = 0;
-
-               f=claim_dma_lock();
-               disable_dma(dev->dma);
-               release_dma_lock(f);
-
-               if (adapter->rx_active)
-                       adapter->rx_active--;
-               outb_control(adapter->hcr_val & ~(DMAE | TCEN | DIR), dev);
-               spin_unlock_irqrestore(&adapter->lock, flags);
-       }
-}
-
-/* Primitive functions used by send_pcb() */
-static inline bool send_pcb_slow(unsigned int base_addr, unsigned char byte)
-{
-       unsigned long timeout;
-       outb_command(byte, base_addr);
-       for (timeout = jiffies + 5*HZ/100; time_before(jiffies, timeout);) {
-               if (inb_status(base_addr) & HCRE)
-                       return false;
-       }
-       pr_warning("3c505: send_pcb_slow timed out\n");
-       return true;
-}
-
-static inline bool send_pcb_fast(unsigned int base_addr, unsigned char byte)
-{
-       unsigned int timeout;
-       outb_command(byte, base_addr);
-       for (timeout = 0; timeout < 40000; timeout++) {
-               if (inb_status(base_addr) & HCRE)
-                       return false;
-       }
-       pr_warning("3c505: send_pcb_fast timed out\n");
-       return true;
-}
-
-/* Check to see if the receiver needs restarting, and kick it if so */
-static inline void prime_rx(struct net_device *dev)
-{
-       elp_device *adapter = netdev_priv(dev);
-       while (adapter->rx_active < ELP_RX_PCBS && netif_running(dev)) {
-               if (!start_receive(dev, &adapter->itx_pcb))
-                       break;
-       }
-}
-
-/*****************************************************************
- *
- * send_pcb
- *   Send a PCB to the adapter.
- *
- *     output byte to command reg  --<--+
- *     wait until HCRE is non zero      |
- *     loop until all bytes sent   -->--+
- *     set HSF1 and HSF2 to 1
- *     output pcb length
- *     wait until ASF give ACK or NAK
- *     set HSF1 and HSF2 to 0
- *
- *****************************************************************/
-
-/* This can be quite slow -- the adapter is allowed to take up to 40ms
- * to respond to the initial interrupt.
- *
- * We run initially with interrupts turned on, but with a semaphore set
- * so that nobody tries to re-enter this code.  Once the first byte has
- * gone through, we turn interrupts off and then send the others (the
- * timeout is reduced to 500us).
- */
-
-static bool send_pcb(struct net_device *dev, pcb_struct * pcb)
-{
-       int i;
-       unsigned long timeout;
-       elp_device *adapter = netdev_priv(dev);
-       unsigned long flags;
-
-       check_3c505_dma(dev);
-
-       if (adapter->dmaing && adapter->current_dma.direction == 0)
-               return false;
-
-       /* Avoid contention */
-       if (test_and_set_bit(1, &adapter->send_pcb_semaphore)) {
-               if (elp_debug >= 3) {
-                       pr_debug("%s: send_pcb entered while threaded\n", dev->name);
-               }
-               return false;
-       }
-       /*
-        * load each byte into the command register and
-        * wait for the HCRE bit to indicate the adapter
-        * had read the byte
-        */
-       set_hsf(dev, 0);
-
-       if (send_pcb_slow(dev->base_addr, pcb->command))
-               goto abort;
-
-       spin_lock_irqsave(&adapter->lock, flags);
-
-       if (send_pcb_fast(dev->base_addr, pcb->length))
-               goto sti_abort;
-
-       for (i = 0; i < pcb->length; i++) {
-               if (send_pcb_fast(dev->base_addr, pcb->data.raw[i]))
-                       goto sti_abort;
-       }
-
-       outb_control(adapter->hcr_val | 3, dev);        /* signal end of PCB */
-       outb_command(2 + pcb->length, dev->base_addr);
-
-       /* now wait for the acknowledgement */
-       spin_unlock_irqrestore(&adapter->lock, flags);
-
-       for (timeout = jiffies + 5*HZ/100; time_before(jiffies, timeout);) {
-               switch (GET_ASF(dev->base_addr)) {
-               case ASF_PCB_ACK:
-                       adapter->send_pcb_semaphore = 0;
-                       return true;
-
-               case ASF_PCB_NAK:
-#ifdef ELP_DEBUG
-                       pr_debug("%s: send_pcb got NAK\n", dev->name);
-#endif
-                       goto abort;
-               }
-       }
-
-       if (elp_debug >= 1)
-               pr_debug("%s: timeout waiting for PCB acknowledge (status %02x)\n",
-                       dev->name, inb_status(dev->base_addr));
-       goto abort;
-
-      sti_abort:
-       spin_unlock_irqrestore(&adapter->lock, flags);
-      abort:
-       adapter->send_pcb_semaphore = 0;
-       return false;
-}
-
-
-/*****************************************************************
- *
- * receive_pcb
- *   Read a PCB from the adapter
- *
- *     wait for ACRF to be non-zero        ---<---+
- *     input a byte                               |
- *     if ASF1 and ASF2 were not both one         |
- *             before byte was read, loop      --->---+
- *     set HSF1 and HSF2 for ack
- *
- *****************************************************************/
-
-static bool receive_pcb(struct net_device *dev, pcb_struct * pcb)
-{
-       int i, j;
-       int total_length;
-       int stat;
-       unsigned long timeout;
-       unsigned long flags;
-
-       elp_device *adapter = netdev_priv(dev);
-
-       set_hsf(dev, 0);
-
-       /* get the command code */
-       timeout = jiffies + 2*HZ/100;
-       while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && time_before(jiffies, timeout));
-       if (time_after_eq(jiffies, timeout)) {
-               TIMEOUT_MSG(__LINE__);
-               return false;
-       }
-       pcb->command = inb_command(dev->base_addr);
-
-       /* read the data length */
-       timeout = jiffies + 3*HZ/100;
-       while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && time_before(jiffies, timeout));
-       if (time_after_eq(jiffies, timeout)) {
-               TIMEOUT_MSG(__LINE__);
-               pr_info("%s: status %02x\n", dev->name, stat);
-               return false;
-       }
-       pcb->length = inb_command(dev->base_addr);
-
-       if (pcb->length > MAX_PCB_DATA) {
-               INVALID_PCB_MSG(pcb->length);
-               adapter_reset(dev);
-               return false;
-       }
-       /* read the data */
-       spin_lock_irqsave(&adapter->lock, flags);
-       for (i = 0; i < MAX_PCB_DATA; i++) {
-               for (j = 0; j < 20000; j++) {
-                       stat = get_status(dev->base_addr);
-                       if (stat & ACRF)
-                               break;
-               }
-               pcb->data.raw[i] = inb_command(dev->base_addr);
-               if ((stat & ASF_PCB_MASK) == ASF_PCB_END || j >= 20000)
-                       break;
-       }
-       spin_unlock_irqrestore(&adapter->lock, flags);
-       if (i >= MAX_PCB_DATA) {
-               INVALID_PCB_MSG(i);
-               return false;
-       }
-       if (j >= 20000) {
-               TIMEOUT_MSG(__LINE__);
-               return false;
-       }
-       /* the last "data" byte was really the length! */
-       total_length = pcb->data.raw[i];
-
-       /* safety check total length vs data length */
-       if (total_length != (pcb->length + 2)) {
-               if (elp_debug >= 2)
-                       pr_warning("%s: mangled PCB received\n", dev->name);
-               set_hsf(dev, HSF_PCB_NAK);
-               return false;
-       }
-
-       if (pcb->command == CMD_RECEIVE_PACKET_COMPLETE) {
-               if (test_and_set_bit(0, (void *) &adapter->busy)) {
-                       if (backlog_next(adapter->rx_backlog.in) == adapter->rx_backlog.out) {
-                               set_hsf(dev, HSF_PCB_NAK);
-                               pr_warning("%s: PCB rejected, transfer in progress and backlog full\n", dev->name);
-                               pcb->command = 0;
-                               return true;
-                       } else {
-                               pcb->command = 0xff;
-                       }
-               }
-       }
-       set_hsf(dev, HSF_PCB_ACK);
-       return true;
-}
-
-/******************************************************
- *
- *  queue a receive command on the adapter so we will get an
- *  interrupt when a packet is received.
- *
- ******************************************************/
-
-static bool start_receive(struct net_device *dev, pcb_struct * tx_pcb)
-{
-       bool status;
-       elp_device *adapter = netdev_priv(dev);
-
-       if (elp_debug >= 3)
-               pr_debug("%s: restarting receiver\n", dev->name);
-       tx_pcb->command = CMD_RECEIVE_PACKET;
-       tx_pcb->length = sizeof(struct Rcv_pkt);
-       tx_pcb->data.rcv_pkt.buf_seg
-           = tx_pcb->data.rcv_pkt.buf_ofs = 0;         /* Unused */
-       tx_pcb->data.rcv_pkt.buf_len = 1600;
-       tx_pcb->data.rcv_pkt.timeout = 0;       /* set timeout to zero */
-       status = send_pcb(dev, tx_pcb);
-       if (status)
-               adapter->rx_active++;
-       return status;
-}
-
-/******************************************************
- *
- * extract a packet from the adapter
- * this routine is only called from within the interrupt
- * service routine, so no cli/sti calls are needed
- * note that the length is always assumed to be even
- *
- ******************************************************/
-
-static void receive_packet(struct net_device *dev, int len)
-{
-       int rlen;
-       elp_device *adapter = netdev_priv(dev);
-       void *target;
-       struct sk_buff *skb;
-       unsigned long flags;
-
-       rlen = (len + 1) & ~1;
-       skb = netdev_alloc_skb(dev, rlen + 2);
-
-       if (!skb) {
-               pr_warning("%s: memory squeeze, dropping packet\n", dev->name);
-               target = adapter->dma_buffer;
-               adapter->current_dma.target = NULL;
-               /* FIXME: stats */
-               return;
-       }
-
-       skb_reserve(skb, 2);
-       target = skb_put(skb, rlen);
-       if ((unsigned long)(target + rlen) >= MAX_DMA_ADDRESS) {
-               adapter->current_dma.target = target;
-               target = adapter->dma_buffer;
-       } else {
-               adapter->current_dma.target = NULL;
-       }
-
-       /* if this happens, we die */
-       if (test_and_set_bit(0, (void *) &adapter->dmaing))
-               pr_err("%s: rx blocked, DMA in progress, dir %d\n",
-                       dev->name, adapter->current_dma.direction);
-
-       adapter->current_dma.direction = 0;
-       adapter->current_dma.length = rlen;
-       adapter->current_dma.skb = skb;
-       adapter->current_dma.start_time = jiffies;
-
-       outb_control(adapter->hcr_val | DIR | TCEN | DMAE, dev);
-
-       flags=claim_dma_lock();
-       disable_dma(dev->dma);
-       clear_dma_ff(dev->dma);
-       set_dma_mode(dev->dma, 0x04);   /* dma read */
-       set_dma_addr(dev->dma, isa_virt_to_bus(target));
-       set_dma_count(dev->dma, rlen);
-       enable_dma(dev->dma);
-       release_dma_lock(flags);
-
-       if (elp_debug >= 3) {
-               pr_debug("%s: rx DMA transfer started\n", dev->name);
-       }
-
-       if (adapter->rx_active)
-               adapter->rx_active--;
-
-       if (!adapter->busy)
-               pr_warning("%s: receive_packet called, busy not set.\n", dev->name);
-}
-
-/******************************************************
- *
- * interrupt handler
- *
- ******************************************************/
-
-static irqreturn_t elp_interrupt(int irq, void *dev_id)
-{
-       int len;
-       int dlen;
-       int icount = 0;
-       struct net_device *dev = dev_id;
-       elp_device *adapter = netdev_priv(dev);
-       unsigned long timeout;
-
-       spin_lock(&adapter->lock);
-
-       do {
-               /*
-                * has a DMA transfer finished?
-                */
-               if (inb_status(dev->base_addr) & DONE) {
-                       if (!adapter->dmaing)
-                               pr_warning("%s: phantom DMA completed\n", dev->name);
-
-                       if (elp_debug >= 3)
-                               pr_debug("%s: %s DMA complete, status %02x\n", dev->name,
-                                       adapter->current_dma.direction ? "tx" : "rx",
-                                       inb_status(dev->base_addr));
-
-                       outb_control(adapter->hcr_val & ~(DMAE | TCEN | DIR), dev);
-                       if (adapter->current_dma.direction) {
-                               dev_kfree_skb_irq(adapter->current_dma.skb);
-                       } else {
-                               struct sk_buff *skb = adapter->current_dma.skb;
-                               if (skb) {
-                                       if (adapter->current_dma.target) {
-                                       /* have already done the skb_put() */
-                                       memcpy(adapter->current_dma.target, adapter->dma_buffer, adapter->current_dma.length);
-                                       }
-                                       skb->protocol = eth_type_trans(skb,dev);
-                                       dev->stats.rx_bytes += skb->len;
-                                       netif_rx(skb);
-                               }
-                       }
-                       adapter->dmaing = 0;
-                       if (adapter->rx_backlog.in != adapter->rx_backlog.out) {
-                               int t = adapter->rx_backlog.length[adapter->rx_backlog.out];
-                               adapter->rx_backlog.out = backlog_next(adapter->rx_backlog.out);
-                               if (elp_debug >= 2)
-                                       pr_debug("%s: receiving backlogged packet (%d)\n", dev->name, t);
-                               receive_packet(dev, t);
-                       } else {
-                               adapter->busy = 0;
-                       }
-               } else {
-                       /* has one timed out? */
-                       check_3c505_dma(dev);
-               }
-
-               /*
-                * receive a PCB from the adapter
-                */
-               timeout = jiffies + 3*HZ/100;
-               while ((inb_status(dev->base_addr) & ACRF) != 0 && time_before(jiffies, timeout)) {
-                       if (receive_pcb(dev, &adapter->irx_pcb)) {
-                               switch (adapter->irx_pcb.command)
-                               {
-                               case 0:
-                                       break;
-                                       /*
-                                        * received a packet - this must be handled fast
-                                        */
-                               case 0xff:
-                               case CMD_RECEIVE_PACKET_COMPLETE:
-                                       /* if the device isn't open, don't pass packets up the stack */
-                                       if (!netif_running(dev))
-                                               break;
-                                       len = adapter->irx_pcb.data.rcv_resp.pkt_len;
-                                       dlen = adapter->irx_pcb.data.rcv_resp.buf_len;
-                                       if (adapter->irx_pcb.data.rcv_resp.timeout != 0) {
-                                               pr_err("%s: interrupt - packet not received correctly\n", dev->name);
-                                       } else {
-                                               if (elp_debug >= 3) {
-                                                       pr_debug("%s: interrupt - packet received of length %i (%i)\n",
-                                                               dev->name, len, dlen);
-                                               }
-                                               if (adapter->irx_pcb.command == 0xff) {
-                                                       if (elp_debug >= 2)
-                                                               pr_debug("%s: adding packet to backlog (len = %d)\n",
-                                                                       dev->name, dlen);
-                                                       adapter->rx_backlog.length[adapter->rx_backlog.in] = dlen;
-                                                       adapter->rx_backlog.in = backlog_next(adapter->rx_backlog.in);
-                                               } else {
-                                                       receive_packet(dev, dlen);
-                                               }
-                                               if (elp_debug >= 3)
-                                                       pr_debug("%s: packet received\n", dev->name);
-                                       }
-                                       break;
-
-                                       /*
-                                        * 82586 configured correctly
-                                        */
-                               case CMD_CONFIGURE_82586_RESPONSE:
-                                       adapter->got[CMD_CONFIGURE_82586] = 1;
-                                       if (elp_debug >= 3)
-                                               pr_debug("%s: interrupt - configure response received\n", dev->name);
-                                       break;
-
-                                       /*
-                                        * Adapter memory configuration
-                                        */
-                               case CMD_CONFIGURE_ADAPTER_RESPONSE:
-                                       adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] = 1;
-                                       if (elp_debug >= 3)
-                                               pr_debug("%s: Adapter memory configuration %s.\n", dev->name,
-                                                      adapter->irx_pcb.data.failed ? "failed" : "succeeded");
-                                       break;
-
-                                       /*
-                                        * Multicast list loading
-                                        */
-                               case CMD_LOAD_MULTICAST_RESPONSE:
-                                       adapter->got[CMD_LOAD_MULTICAST_LIST] = 1;
-                                       if (elp_debug >= 3)
-                                               pr_debug("%s: Multicast address list loading %s.\n", dev->name,
-                                                      adapter->irx_pcb.data.failed ? "failed" : "succeeded");
-                                       break;
-
-                                       /*
-                                        * Station address setting
-                                        */
-                               case CMD_SET_ADDRESS_RESPONSE:
-                                       adapter->got[CMD_SET_STATION_ADDRESS] = 1;
-                                       if (elp_debug >= 3)
-                                               pr_debug("%s: Ethernet address setting %s.\n", dev->name,
-                                                      adapter->irx_pcb.data.failed ? "failed" : "succeeded");
-                                       break;
-
-
-                                       /*
-                                        * received board statistics
-                                        */
-                               case CMD_NETWORK_STATISTICS_RESPONSE:
-                                       dev->stats.rx_packets += adapter->irx_pcb.data.netstat.tot_recv;
-                                       dev->stats.tx_packets += adapter->irx_pcb.data.netstat.tot_xmit;
-                                       dev->stats.rx_crc_errors += adapter->irx_pcb.data.netstat.err_CRC;
-                                       dev->stats.rx_frame_errors += adapter->irx_pcb.data.netstat.err_align;
-                                       dev->stats.rx_fifo_errors += adapter->irx_pcb.data.netstat.err_ovrrun;
-                                       dev->stats.rx_over_errors += adapter->irx_pcb.data.netstat.err_res;
-                                       adapter->got[CMD_NETWORK_STATISTICS] = 1;
-                                       if (elp_debug >= 3)
-                                               pr_debug("%s: interrupt - statistics response received\n", dev->name);
-                                       break;
-
-                                       /*
-                                        * sent a packet
-                                        */
-                               case CMD_TRANSMIT_PACKET_COMPLETE:
-                                       if (elp_debug >= 3)
-                                               pr_debug("%s: interrupt - packet sent\n", dev->name);
-                                       if (!netif_running(dev))
-                                               break;
-                                       switch (adapter->irx_pcb.data.xmit_resp.c_stat) {
-                                       case 0xffff:
-                                               dev->stats.tx_aborted_errors++;
-                                               pr_info("%s: transmit timed out, network cable problem?\n", dev->name);
-                                               break;
-                                       case 0xfffe:
-                                               dev->stats.tx_fifo_errors++;
-                                               pr_info("%s: transmit timed out, FIFO underrun\n", dev->name);
-                                               break;
-                                       }
-                                       netif_wake_queue(dev);
-                                       break;
-
-                                       /*
-                                        * some unknown PCB
-                                        */
-                               default:
-                                       pr_debug("%s: unknown PCB received - %2.2x\n",
-                                               dev->name, adapter->irx_pcb.command);
-                                       break;
-                               }
-                       } else {
-                               pr_warning("%s: failed to read PCB on interrupt\n", dev->name);
-                               adapter_reset(dev);
-                       }
-               }
-
-       } while (icount++ < 5 && (inb_status(dev->base_addr) & (ACRF | DONE)));
-
-       prime_rx(dev);
-
-       /*
-        * indicate no longer in interrupt routine
-        */
-       spin_unlock(&adapter->lock);
-       return IRQ_HANDLED;
-}
-
-
-/******************************************************
- *
- * open the board
- *
- ******************************************************/
-
-static int elp_open(struct net_device *dev)
-{
-       elp_device *adapter = netdev_priv(dev);
-       int retval;
-
-       if (elp_debug >= 3)
-               pr_debug("%s: request to open device\n", dev->name);
-
-       /*
-        * make sure we actually found the device
-        */
-       if (adapter == NULL) {
-               pr_err("%s: Opening a non-existent physical device\n", dev->name);
-               return -EAGAIN;
-       }
-       /*
-        * disable interrupts on the board
-        */
-       outb_control(0, dev);
-
-       /*
-        * clear any pending interrupts
-        */
-       inb_command(dev->base_addr);
-       adapter_reset(dev);
-
-       /*
-        * no receive PCBs active
-        */
-       adapter->rx_active = 0;
-
-       adapter->busy = 0;
-       adapter->send_pcb_semaphore = 0;
-       adapter->rx_backlog.in = 0;
-       adapter->rx_backlog.out = 0;
-
-       spin_lock_init(&adapter->lock);
-
-       /*
-        * install our interrupt service routine
-        */
-       if ((retval = request_irq(dev->irq, elp_interrupt, 0, dev->name, dev))) {
-               pr_err("%s: could not allocate IRQ%d\n", dev->name, dev->irq);
-               return retval;
-       }
-       if ((retval = request_dma(dev->dma, dev->name))) {
-               free_irq(dev->irq, dev);
-               pr_err("%s: could not allocate DMA%d channel\n", dev->name, dev->dma);
-               return retval;
-       }
-       adapter->dma_buffer = (void *) dma_mem_alloc(DMA_BUFFER_SIZE);
-       if (!adapter->dma_buffer) {
-               pr_err("%s: could not allocate DMA buffer\n", dev->name);
-               free_dma(dev->dma);
-               free_irq(dev->irq, dev);
-               return -ENOMEM;
-       }
-       adapter->dmaing = 0;
-
-       /*
-        * enable interrupts on the board
-        */
-       outb_control(CMDE, dev);
-
-       /*
-        * configure adapter memory: we need 10 multicast addresses, default==0
-        */
-       if (elp_debug >= 3)
-               pr_debug("%s: sending 3c505 memory configuration command\n", dev->name);
-       adapter->tx_pcb.command = CMD_CONFIGURE_ADAPTER_MEMORY;
-       adapter->tx_pcb.data.memconf.cmd_q = 10;
-       adapter->tx_pcb.data.memconf.rcv_q = 20;
-       adapter->tx_pcb.data.memconf.mcast = 10;
-       adapter->tx_pcb.data.memconf.frame = 20;
-       adapter->tx_pcb.data.memconf.rcv_b = 20;
-       adapter->tx_pcb.data.memconf.progs = 0;
-       adapter->tx_pcb.length = sizeof(struct Memconf);
-       adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] = 0;
-       if (!send_pcb(dev, &adapter->tx_pcb))
-               pr_err("%s: couldn't send memory configuration command\n", dev->name);
-       else {
-               unsigned long timeout = jiffies + TIMEOUT;
-               while (adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] == 0 && time_before(jiffies, timeout));
-               if (time_after_eq(jiffies, timeout))
-                       TIMEOUT_MSG(__LINE__);
-       }
-
-
-       /*
-        * configure adapter to receive broadcast messages and wait for response
-        */
-       if (elp_debug >= 3)
-               pr_debug("%s: sending 82586 configure command\n", dev->name);
-       adapter->tx_pcb.command = CMD_CONFIGURE_82586;
-       adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD;
-       adapter->tx_pcb.length = 2;
-       adapter->got[CMD_CONFIGURE_82586] = 0;
-       if (!send_pcb(dev, &adapter->tx_pcb))
-               pr_err("%s: couldn't send 82586 configure command\n", dev->name);
-       else {
-               unsigned long timeout = jiffies + TIMEOUT;
-               while (adapter->got[CMD_CONFIGURE_82586] == 0 && time_before(jiffies, timeout));
-               if (time_after_eq(jiffies, timeout))
-                       TIMEOUT_MSG(__LINE__);
-       }
-
-       /* enable burst-mode DMA */
-       /* outb(0x1, dev->base_addr + PORT_AUXDMA); */
-
-       /*
-        * queue receive commands to provide buffering
-        */
-       prime_rx(dev);
-       if (elp_debug >= 3)
-               pr_debug("%s: %d receive PCBs active\n", dev->name, adapter->rx_active);
-
-       /*
-        * device is now officially open!
-        */
-
-       netif_start_queue(dev);
-       return 0;
-}
-
-
-/******************************************************
- *
- * send a packet to the adapter
- *
- ******************************************************/
-
-static netdev_tx_t send_packet(struct net_device *dev, struct sk_buff *skb)
-{
-       elp_device *adapter = netdev_priv(dev);
-       unsigned long target;
-       unsigned long flags;
-
-       /*
-        * make sure the length is even and no shorter than 60 bytes
-        */
-       unsigned int nlen = (((skb->len < 60) ? 60 : skb->len) + 1) & (~1);
-
-       if (test_and_set_bit(0, (void *) &adapter->busy)) {
-               if (elp_debug >= 2)
-                       pr_debug("%s: transmit blocked\n", dev->name);
-               return false;
-       }
-
-       dev->stats.tx_bytes += nlen;
-
-       /*
-        * send the adapter a transmit packet command. Ignore segment and offset
-        * and make sure the length is even
-        */
-       adapter->tx_pcb.command = CMD_TRANSMIT_PACKET;
-       adapter->tx_pcb.length = sizeof(struct Xmit_pkt);
-       adapter->tx_pcb.data.xmit_pkt.buf_ofs
-           = adapter->tx_pcb.data.xmit_pkt.buf_seg = 0;        /* Unused */
-       adapter->tx_pcb.data.xmit_pkt.pkt_len = nlen;
-
-       if (!send_pcb(dev, &adapter->tx_pcb)) {
-               adapter->busy = 0;
-               return false;
-       }
-       /* if this happens, we die */
-       if (test_and_set_bit(0, (void *) &adapter->dmaing))
-               pr_debug("%s: tx: DMA %d in progress\n", dev->name, adapter->current_dma.direction);
-
-       adapter->current_dma.direction = 1;
-       adapter->current_dma.start_time = jiffies;
-
-       if ((unsigned long)(skb->data + nlen) >= MAX_DMA_ADDRESS || nlen != skb->len) {
-               skb_copy_from_linear_data(skb, adapter->dma_buffer, nlen);
-               memset(adapter->dma_buffer+skb->len, 0, nlen-skb->len);
-               target = isa_virt_to_bus(adapter->dma_buffer);
-       }
-       else {
-               target = isa_virt_to_bus(skb->data);
-       }
-       adapter->current_dma.skb = skb;
-
-       flags=claim_dma_lock();
-       disable_dma(dev->dma);
-       clear_dma_ff(dev->dma);
-       set_dma_mode(dev->dma, 0x48);   /* dma memory -> io */
-       set_dma_addr(dev->dma, target);
-       set_dma_count(dev->dma, nlen);
-       outb_control(adapter->hcr_val | DMAE | TCEN, dev);
-       enable_dma(dev->dma);
-       release_dma_lock(flags);
-
-       if (elp_debug >= 3)
-               pr_debug("%s: DMA transfer started\n", dev->name);
-
-       return true;
-}
-
-/*
- *     The upper layer thinks we timed out
- */
-
-static void elp_timeout(struct net_device *dev)
-{
-       int stat;
-
-       stat = inb_status(dev->base_addr);
-       pr_warning("%s: transmit timed out, lost %s?\n", dev->name,
-                  (stat & ACRF) ? "interrupt" : "command");
-       if (elp_debug >= 1)
-               pr_debug("%s: status %#02x\n", dev->name, stat);
-       dev->trans_start = jiffies; /* prevent tx timeout */
-       dev->stats.tx_dropped++;
-       netif_wake_queue(dev);
-}
-
-/******************************************************
- *
- * start the transmitter
- *    return 0 if sent OK, else return 1
- *
- ******************************************************/
-
-static netdev_tx_t elp_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       unsigned long flags;
-       elp_device *adapter = netdev_priv(dev);
-
-       spin_lock_irqsave(&adapter->lock, flags);
-       check_3c505_dma(dev);
-
-       if (elp_debug >= 3)
-               pr_debug("%s: request to send packet of length %d\n", dev->name, (int) skb->len);
-
-       netif_stop_queue(dev);
-
-       /*
-        * send the packet at skb->data for skb->len
-        */
-       if (!send_packet(dev, skb)) {
-               if (elp_debug >= 2) {
-                       pr_debug("%s: failed to transmit packet\n", dev->name);
-               }
-               spin_unlock_irqrestore(&adapter->lock, flags);
-               return NETDEV_TX_BUSY;
-       }
-       if (elp_debug >= 3)
-               pr_debug("%s: packet of length %d sent\n", dev->name, (int) skb->len);
-
-       prime_rx(dev);
-       spin_unlock_irqrestore(&adapter->lock, flags);
-       netif_start_queue(dev);
-       return NETDEV_TX_OK;
-}
-
-/******************************************************
- *
- * return statistics on the board
- *
- ******************************************************/
-
-static struct net_device_stats *elp_get_stats(struct net_device *dev)
-{
-       elp_device *adapter = netdev_priv(dev);
-
-       if (elp_debug >= 3)
-               pr_debug("%s: request for stats\n", dev->name);
-
-       /* If the device is closed, just return the latest stats we have,
-          - we cannot ask from the adapter without interrupts */
-       if (!netif_running(dev))
-               return &dev->stats;
-
-       /* send a get statistics command to the board */
-       adapter->tx_pcb.command = CMD_NETWORK_STATISTICS;
-       adapter->tx_pcb.length = 0;
-       adapter->got[CMD_NETWORK_STATISTICS] = 0;
-       if (!send_pcb(dev, &adapter->tx_pcb))
-               pr_err("%s: couldn't send get statistics command\n", dev->name);
-       else {
-               unsigned long timeout = jiffies + TIMEOUT;
-               while (adapter->got[CMD_NETWORK_STATISTICS] == 0 && time_before(jiffies, timeout));
-               if (time_after_eq(jiffies, timeout)) {
-                       TIMEOUT_MSG(__LINE__);
-                       return &dev->stats;
-               }
-       }
-
-       /* statistics are now up to date */
-       return &dev->stats;
-}
-
-
-static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
-{
-       strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
-       strlcpy(info->version, DRV_VERSION, sizeof(info->version));
-       snprintf(info->bus_info, sizeof(info->bus_info), "ISA 0x%lx",
-                dev->base_addr);
-}
-
-static u32 netdev_get_msglevel(struct net_device *dev)
-{
-       return debug;
-}
-
-static void netdev_set_msglevel(struct net_device *dev, u32 level)
-{
-       debug = level;
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
-       .get_msglevel           = netdev_get_msglevel,
-       .set_msglevel           = netdev_set_msglevel,
-};
-
-/******************************************************
- *
- * close the board
- *
- ******************************************************/
-
-static int elp_close(struct net_device *dev)
-{
-       elp_device *adapter = netdev_priv(dev);
-
-       if (elp_debug >= 3)
-               pr_debug("%s: request to close device\n", dev->name);
-
-       netif_stop_queue(dev);
-
-       /* Someone may request the device statistic information even when
-        * the interface is closed. The following will update the statistics
-        * structure in the driver, so we'll be able to give current statistics.
-        */
-       (void) elp_get_stats(dev);
-
-       /*
-        * disable interrupts on the board
-        */
-       outb_control(0, dev);
-
-       /*
-        * release the IRQ
-        */
-       free_irq(dev->irq, dev);
-
-       free_dma(dev->dma);
-       free_pages((unsigned long) adapter->dma_buffer, get_order(DMA_BUFFER_SIZE));
-
-       return 0;
-}
-
-
-/************************************************************
- *
- * Set multicast list
- * num_addrs==0: clear mc_list
- * num_addrs==-1: set promiscuous mode
- * num_addrs>0: set mc_list
- *
- ************************************************************/
-
-static void elp_set_mc_list(struct net_device *dev)
-{
-       elp_device *adapter = netdev_priv(dev);
-       struct netdev_hw_addr *ha;
-       int i;
-       unsigned long flags;
-
-       if (elp_debug >= 3)
-               pr_debug("%s: request to set multicast list\n", dev->name);
-
-       spin_lock_irqsave(&adapter->lock, flags);
-
-       if (!(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) {
-               /* send a "load multicast list" command to the board, max 10 addrs/cmd */
-               /* if num_addrs==0 the list will be cleared */
-               adapter->tx_pcb.command = CMD_LOAD_MULTICAST_LIST;
-               adapter->tx_pcb.length = 6 * netdev_mc_count(dev);
-               i = 0;
-               netdev_for_each_mc_addr(ha, dev)
-                       memcpy(adapter->tx_pcb.data.multicast[i++],
-                              ha->addr, 6);
-               adapter->got[CMD_LOAD_MULTICAST_LIST] = 0;
-               if (!send_pcb(dev, &adapter->tx_pcb))
-                       pr_err("%s: couldn't send set_multicast command\n", dev->name);
-               else {
-                       unsigned long timeout = jiffies + TIMEOUT;
-                       while (adapter->got[CMD_LOAD_MULTICAST_LIST] == 0 && time_before(jiffies, timeout));
-                       if (time_after_eq(jiffies, timeout)) {
-                               TIMEOUT_MSG(__LINE__);
-                       }
-               }
-               if (!netdev_mc_empty(dev))
-                       adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD | RECV_MULTI;
-               else            /* num_addrs == 0 */
-                       adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD;
-       } else
-               adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_PROMISC;
-       /*
-        * configure adapter to receive messages (as specified above)
-        * and wait for response
-        */
-       if (elp_debug >= 3)
-               pr_debug("%s: sending 82586 configure command\n", dev->name);
-       adapter->tx_pcb.command = CMD_CONFIGURE_82586;
-       adapter->tx_pcb.length = 2;
-       adapter->got[CMD_CONFIGURE_82586] = 0;
-       if (!send_pcb(dev, &adapter->tx_pcb))
-       {
-               spin_unlock_irqrestore(&adapter->lock, flags);
-               pr_err("%s: couldn't send 82586 configure command\n", dev->name);
-       }
-       else {
-               unsigned long timeout = jiffies + TIMEOUT;
-               spin_unlock_irqrestore(&adapter->lock, flags);
-               while (adapter->got[CMD_CONFIGURE_82586] == 0 && time_before(jiffies, timeout));
-               if (time_after_eq(jiffies, timeout))
-                       TIMEOUT_MSG(__LINE__);
-       }
-}
-
-/************************************************************
- *
- * A couple of tests to see if there's 3C505 or not
- * Called only by elp_autodetect
- ************************************************************/
-
-static int __init elp_sense(struct net_device *dev)
-{
-       int addr = dev->base_addr;
-       const char *name = dev->name;
-       byte orig_HSR;
-
-       if (!request_region(addr, ELP_IO_EXTENT, "3c505"))
-               return -ENODEV;
-
-       orig_HSR = inb_status(addr);
-
-       if (elp_debug > 0)
-               pr_debug(search_msg, name, addr);
-
-       if (orig_HSR == 0xff) {
-               if (elp_debug > 0)
-                       pr_cont(notfound_msg, 1);
-               goto out;
-       }
-
-       /* Wait for a while; the adapter may still be booting up */
-       if (elp_debug > 0)
-               pr_cont(stilllooking_msg);
-
-       if (orig_HSR & DIR) {
-               /* If HCR.DIR is up, we pull it down. HSR.DIR should follow. */
-               outb(0, dev->base_addr + PORT_CONTROL);
-               msleep(300);
-               if (inb_status(addr) & DIR) {
-                       if (elp_debug > 0)
-                               pr_cont(notfound_msg, 2);
-                       goto out;
-               }
-       } else {
-               /* If HCR.DIR is down, we pull it up. HSR.DIR should follow. */
-               outb(DIR, dev->base_addr + PORT_CONTROL);
-               msleep(300);
-               if (!(inb_status(addr) & DIR)) {
-                       if (elp_debug > 0)
-                               pr_cont(notfound_msg, 3);
-                       goto out;
-               }
-       }
-       /*
-        * It certainly looks like a 3c505.
-        */
-       if (elp_debug > 0)
-               pr_cont(found_msg);
-
-       return 0;
-out:
-       release_region(addr, ELP_IO_EXTENT);
-       return -ENODEV;
-}
-
-/*************************************************************
- *
- * Search through addr_list[] and try to find a 3C505
- * Called only by eplus_probe
- *************************************************************/
-
-static int __init elp_autodetect(struct net_device *dev)
-{
-       int idx = 0;
-
-       /* if base address set, then only check that address
-          otherwise, run through the table */
-       if (dev->base_addr != 0) {      /* dev->base_addr == 0 ==> plain autodetect */
-               if (elp_sense(dev) == 0)
-                       return dev->base_addr;
-       } else
-               while ((dev->base_addr = addr_list[idx++])) {
-                       if (elp_sense(dev) == 0)
-                               return dev->base_addr;
-               }
-
-       /* could not find an adapter */
-       if (elp_debug > 0)
-               pr_debug(couldnot_msg, dev->name);
-
-       return 0;               /* Because of this, the layer above will return -ENODEV */
-}
-
-static const struct net_device_ops elp_netdev_ops = {
-       .ndo_open               = elp_open,
-       .ndo_stop               = elp_close,
-       .ndo_get_stats          = elp_get_stats,
-       .ndo_start_xmit         = elp_start_xmit,
-       .ndo_tx_timeout         = elp_timeout,
-       .ndo_set_rx_mode        = elp_set_mc_list,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-/******************************************************
- *
- * probe for an Etherlink Plus board at the specified address
- *
- ******************************************************/
-
-/* There are three situations we need to be able to detect here:
-
- *  a) the card is idle
- *  b) the card is still booting up
- *  c) the card is stuck in a strange state (some DOS drivers do this)
- *
- * In case (a), all is well.  In case (b), we wait 10 seconds to see if the
- * card finishes booting, and carry on if so.  In case (c), we do a hard reset,
- * loop round, and hope for the best.
- *
- * This is all very unpleasant, but hopefully avoids the problems with the old
- * probe code (which had a 15-second delay if the card was idle, and didn't
- * work at all if it was in a weird state).
- */
-
-static int __init elplus_setup(struct net_device *dev)
-{
-       elp_device *adapter = netdev_priv(dev);
-       int i, tries, tries1, okay;
-       unsigned long timeout;
-       unsigned long cookie = 0;
-       int err = -ENODEV;
-
-       /*
-        *  setup adapter structure
-        */
-
-       dev->base_addr = elp_autodetect(dev);
-       if (!dev->base_addr)
-               return -ENODEV;
-
-       adapter->send_pcb_semaphore = 0;
-
-       for (tries1 = 0; tries1 < 3; tries1++) {
-               outb_control((adapter->hcr_val | CMDE) & ~DIR, dev);
-               /* First try to write just one byte, to see if the card is
-                * responding at all normally.
-                */
-               timeout = jiffies + 5*HZ/100;
-               okay = 0;
-               while (time_before(jiffies, timeout) && !(inb_status(dev->base_addr) & HCRE));
-               if ((inb_status(dev->base_addr) & HCRE)) {
-                       outb_command(0, dev->base_addr);        /* send a spurious byte */
-                       timeout = jiffies + 5*HZ/100;
-                       while (time_before(jiffies, timeout) && !(inb_status(dev->base_addr) & HCRE));
-                       if (inb_status(dev->base_addr) & HCRE)
-                               okay = 1;
-               }
-               if (!okay) {
-                       /* Nope, it's ignoring the command register.  This means that
-                        * either it's still booting up, or it's died.
-                        */
-                       pr_err("%s: command register wouldn't drain, ", dev->name);
-                       if ((inb_status(dev->base_addr) & 7) == 3) {
-                               /* If the adapter status is 3, it *could* still be booting.
-                                * Give it the benefit of the doubt for 10 seconds.
-                                */
-                               pr_cont("assuming 3c505 still starting\n");
-                               timeout = jiffies + 10*HZ;
-                               while (time_before(jiffies, timeout) && (inb_status(dev->base_addr) & 7));
-                               if (inb_status(dev->base_addr) & 7) {
-                                       pr_err("%s: 3c505 failed to start\n", dev->name);
-                               } else {
-                                       okay = 1;  /* It started */
-                               }
-                       } else {
-                               /* Otherwise, it must just be in a strange
-                                * state.  We probably need to kick it.
-                                */
-                               pr_cont("3c505 is sulking\n");
-                       }
-               }
-               for (tries = 0; tries < 5 && okay; tries++) {
-
-                       /*
-                        * Try to set the Ethernet address, to make sure that the board
-                        * is working.
-                        */
-                       adapter->tx_pcb.command = CMD_STATION_ADDRESS;
-                       adapter->tx_pcb.length = 0;
-                       cookie = probe_irq_on();
-                       if (!send_pcb(dev, &adapter->tx_pcb)) {
-                               pr_err("%s: could not send first PCB\n", dev->name);
-                               probe_irq_off(cookie);
-                               continue;
-                       }
-                       if (!receive_pcb(dev, &adapter->rx_pcb)) {
-                               pr_err("%s: could not read first PCB\n", dev->name);
-                               probe_irq_off(cookie);
-                               continue;
-                       }
-                       if ((adapter->rx_pcb.command != CMD_ADDRESS_RESPONSE) ||
-                           (adapter->rx_pcb.length != 6)) {
-                               pr_err("%s: first PCB wrong (%d, %d)\n", dev->name,
-                                       adapter->rx_pcb.command, adapter->rx_pcb.length);
-                               probe_irq_off(cookie);
-                               continue;
-                       }
-                       goto okay;
-               }
-               /* It's broken.  Do a hard reset to re-initialise the board,
-                * and try again.
-                */
-               pr_info("%s: resetting adapter\n", dev->name);
-               outb_control(adapter->hcr_val | FLSH | ATTN, dev);
-               outb_control(adapter->hcr_val & ~(FLSH | ATTN), dev);
-       }
-       pr_err("%s: failed to initialise 3c505\n", dev->name);
-       goto out;
-
-      okay:
-       if (dev->irq) {         /* Is there a preset IRQ? */
-               int rpt = probe_irq_off(cookie);
-               if (dev->irq != rpt) {
-                       pr_warning("%s: warning, irq %d configured but %d detected\n", dev->name, dev->irq, rpt);
-               }
-               /* if dev->irq == probe_irq_off(cookie), all is well */
-       } else                 /* No preset IRQ; just use what we can detect */
-               dev->irq = probe_irq_off(cookie);
-       switch (dev->irq) {    /* Legal, sane? */
-       case 0:
-               pr_err("%s: IRQ probe failed: check 3c505 jumpers.\n",
-                      dev->name);
-               goto out;
-       case 1:
-       case 6:
-       case 8:
-       case 13:
-               pr_err("%s: Impossible IRQ %d reported by probe_irq_off().\n",
-                      dev->name, dev->irq);
-                      goto out;
-       }
-       /*
-        *  Now we have the IRQ number so we can disable the interrupts from
-        *  the board until the board is opened.
-        */
-       outb_control(adapter->hcr_val & ~CMDE, dev);
-
-       /*
-        * copy Ethernet address into structure
-        */
-       for (i = 0; i < 6; i++)
-               dev->dev_addr[i] = adapter->rx_pcb.data.eth_addr[i];
-
-       /* find a DMA channel */
-       if (!dev->dma) {
-               if (dev->mem_start) {
-                       dev->dma = dev->mem_start & 7;
-               }
-               else {
-                       pr_warning("%s: warning, DMA channel not specified, using default\n", dev->name);
-                       dev->dma = ELP_DMA;
-               }
-       }
-
-       /*
-        * print remainder of startup message
-        */
-       pr_info("%s: 3c505 at %#lx, irq %d, dma %d, addr %pM, ",
-               dev->name, dev->base_addr, dev->irq, dev->dma, dev->dev_addr);
-       /*
-        * read more information from the adapter
-        */
-
-       adapter->tx_pcb.command = CMD_ADAPTER_INFO;
-       adapter->tx_pcb.length = 0;
-       if (!send_pcb(dev, &adapter->tx_pcb) ||
-           !receive_pcb(dev, &adapter->rx_pcb) ||
-           (adapter->rx_pcb.command != CMD_ADAPTER_INFO_RESPONSE) ||
-           (adapter->rx_pcb.length != 10)) {
-               pr_cont("not responding to second PCB\n");
-       }
-       pr_cont("rev %d.%d, %dk\n", adapter->rx_pcb.data.info.major_vers,
-               adapter->rx_pcb.data.info.minor_vers, adapter->rx_pcb.data.info.RAM_sz);
-
-       /*
-        * reconfigure the adapter memory to better suit our purposes
-        */
-       adapter->tx_pcb.command = CMD_CONFIGURE_ADAPTER_MEMORY;
-       adapter->tx_pcb.length = 12;
-       adapter->tx_pcb.data.memconf.cmd_q = 8;
-       adapter->tx_pcb.data.memconf.rcv_q = 8;
-       adapter->tx_pcb.data.memconf.mcast = 10;
-       adapter->tx_pcb.data.memconf.frame = 10;
-       adapter->tx_pcb.data.memconf.rcv_b = 10;
-       adapter->tx_pcb.data.memconf.progs = 0;
-       if (!send_pcb(dev, &adapter->tx_pcb) ||
-           !receive_pcb(dev, &adapter->rx_pcb) ||
-           (adapter->rx_pcb.command != CMD_CONFIGURE_ADAPTER_RESPONSE) ||
-           (adapter->rx_pcb.length != 2)) {
-               pr_err("%s: could not configure adapter memory\n", dev->name);
-       }
-       if (adapter->rx_pcb.data.configure) {
-               pr_err("%s: adapter configuration failed\n", dev->name);
-       }
-
-       dev->netdev_ops = &elp_netdev_ops;
-       dev->watchdog_timeo = 10*HZ;
-       dev->ethtool_ops = &netdev_ethtool_ops;         /* local */
-
-       dev->mem_start = dev->mem_end = 0;
-
-       err = register_netdev(dev);
-       if (err)
-               goto out;
-
-       return 0;
-out:
-       release_region(dev->base_addr, ELP_IO_EXTENT);
-       return err;
-}
-
-#ifndef MODULE
-struct net_device * __init elplus_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(elp_device));
-       int err;
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = elplus_setup(dev);
-       if (err) {
-               free_netdev(dev);
-               return ERR_PTR(err);
-       }
-       return dev;
-}
-
-#else
-static struct net_device *dev_3c505[ELP_MAX_CARDS];
-static int io[ELP_MAX_CARDS];
-static int irq[ELP_MAX_CARDS];
-static int dma[ELP_MAX_CARDS];
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(dma, int, NULL, 0);
-MODULE_PARM_DESC(io, "EtherLink Plus I/O base address(es)");
-MODULE_PARM_DESC(irq, "EtherLink Plus IRQ number(s) (assigned)");
-MODULE_PARM_DESC(dma, "EtherLink Plus DMA channel(s)");
-
-int __init init_module(void)
-{
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < ELP_MAX_CARDS; this_dev++) {
-               struct net_device *dev = alloc_etherdev(sizeof(elp_device));
-               if (!dev)
-                       break;
-
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               if (dma[this_dev]) {
-                       dev->dma = dma[this_dev];
-               } else {
-                       dev->dma = ELP_DMA;
-                       pr_warning("3c505.c: warning, using default DMA channel,\n");
-               }
-               if (io[this_dev] == 0) {
-                       if (this_dev) {
-                               free_netdev(dev);
-                               break;
-                       }
-                       pr_notice("3c505.c: module autoprobe not recommended, give io=xx.\n");
-               }
-               if (elplus_setup(dev) != 0) {
-                       pr_warning("3c505.c: Failed to register card at 0x%x.\n", io[this_dev]);
-                       free_netdev(dev);
-                       break;
-               }
-               dev_3c505[this_dev] = dev;
-               found++;
-       }
-       if (!found)
-               return -ENODEV;
-       return 0;
-}
-
-void __exit cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < ELP_MAX_CARDS; this_dev++) {
-               struct net_device *dev = dev_3c505[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       release_region(dev->base_addr, ELP_IO_EXTENT);
-                       free_netdev(dev);
-               }
-       }
-}
-
-#endif                         /* MODULE */
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/i825xx/3c505.h b/drivers/net/ethernet/i825xx/3c505.h
deleted file mode 100644 (file)
index 04df2a9..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/*****************************************************************
- *
- *  defines for 3Com Etherlink Plus adapter
- *
- *****************************************************************/
-
-#define ELP_DMA       6
-#define ELP_RX_PCBS   4
-#define ELP_MAX_CARDS 4
-
-/*
- * I/O register offsets
- */
-#define        PORT_COMMAND    0x00    /* read/write, 8-bit */
-#define        PORT_STATUS     0x02    /* read only, 8-bit */
-#define        PORT_AUXDMA     0x02    /* write only, 8-bit */
-#define        PORT_DATA       0x04    /* read/write, 16-bit */
-#define        PORT_CONTROL    0x06    /* read/write, 8-bit */
-
-#define ELP_IO_EXTENT  0x10    /* size of used IO registers */
-
-/*
- * host control registers bits
- */
-#define        ATTN    0x80    /* attention */
-#define        FLSH    0x40    /* flush data register */
-#define DMAE   0x20    /* DMA enable */
-#define DIR    0x10    /* direction */
-#define        TCEN    0x08    /* terminal count interrupt enable */
-#define        CMDE    0x04    /* command register interrupt enable */
-#define        HSF2    0x02    /* host status flag 2 */
-#define        HSF1    0x01    /* host status flag 1 */
-
-/*
- * combinations of HSF flags used for PCB transmission
- */
-#define        HSF_PCB_ACK     HSF1
-#define        HSF_PCB_NAK     HSF2
-#define        HSF_PCB_END     (HSF2|HSF1)
-#define        HSF_PCB_MASK    (HSF2|HSF1)
-
-/*
- * host status register bits
- */
-#define        HRDY    0x80    /* data register ready */
-#define        HCRE    0x40    /* command register empty */
-#define        ACRF    0x20    /* adapter command register full */
-/* #define DIR         0x10    direction - same as in control register */
-#define        DONE    0x08    /* DMA done */
-#define        ASF3    0x04    /* adapter status flag 3 */
-#define        ASF2    0x02    /* adapter status flag 2 */
-#define        ASF1    0x01    /* adapter status flag 1 */
-
-/*
- * combinations of ASF flags used for PCB reception
- */
-#define        ASF_PCB_ACK     ASF1
-#define        ASF_PCB_NAK     ASF2
-#define        ASF_PCB_END     (ASF2|ASF1)
-#define        ASF_PCB_MASK    (ASF2|ASF1)
-
-/*
- * host aux DMA register bits
- */
-#define        DMA_BRST        0x01    /* DMA burst */
-
-/*
- * maximum amount of data allowed in a PCB
- */
-#define        MAX_PCB_DATA    62
-
-/*****************************************************************
- *
- *  timeout value
- *     this is a rough value used for loops to stop them from
- *     locking up the whole machine in the case of failure or
- *     error conditions
- *
- *****************************************************************/
-
-#define        TIMEOUT 300
-
-/*****************************************************************
- *
- * PCB commands
- *
- *****************************************************************/
-
-enum {
-  /*
-   * host PCB commands
-   */
-  CMD_CONFIGURE_ADAPTER_MEMORY = 0x01,
-  CMD_CONFIGURE_82586          = 0x02,
-  CMD_STATION_ADDRESS          = 0x03,
-  CMD_DMA_DOWNLOAD             = 0x04,
-  CMD_DMA_UPLOAD               = 0x05,
-  CMD_PIO_DOWNLOAD             = 0x06,
-  CMD_PIO_UPLOAD               = 0x07,
-  CMD_RECEIVE_PACKET           = 0x08,
-  CMD_TRANSMIT_PACKET          = 0x09,
-  CMD_NETWORK_STATISTICS       = 0x0a,
-  CMD_LOAD_MULTICAST_LIST      = 0x0b,
-  CMD_CLEAR_PROGRAM            = 0x0c,
-  CMD_DOWNLOAD_PROGRAM         = 0x0d,
-  CMD_EXECUTE_PROGRAM          = 0x0e,
-  CMD_SELF_TEST                        = 0x0f,
-  CMD_SET_STATION_ADDRESS      = 0x10,
-  CMD_ADAPTER_INFO             = 0x11,
-  NUM_TRANSMIT_CMDS,
-
-  /*
-   * adapter PCB commands
-   */
-  CMD_CONFIGURE_ADAPTER_RESPONSE       = 0x31,
-  CMD_CONFIGURE_82586_RESPONSE         = 0x32,
-  CMD_ADDRESS_RESPONSE                 = 0x33,
-  CMD_DOWNLOAD_DATA_REQUEST            = 0x34,
-  CMD_UPLOAD_DATA_REQUEST              = 0x35,
-  CMD_RECEIVE_PACKET_COMPLETE          = 0x38,
-  CMD_TRANSMIT_PACKET_COMPLETE         = 0x39,
-  CMD_NETWORK_STATISTICS_RESPONSE      = 0x3a,
-  CMD_LOAD_MULTICAST_RESPONSE          = 0x3b,
-  CMD_CLEAR_PROGRAM_RESPONSE           = 0x3c,
-  CMD_DOWNLOAD_PROGRAM_RESPONSE                = 0x3d,
-  CMD_EXECUTE_RESPONSE                 = 0x3e,
-  CMD_SELF_TEST_RESPONSE               = 0x3f,
-  CMD_SET_ADDRESS_RESPONSE             = 0x40,
-  CMD_ADAPTER_INFO_RESPONSE            = 0x41
-};
-
-/* Definitions for the PCB data structure */
-
-/* Data units */
-typedef unsigned char         byte;
-typedef unsigned short int    word;
-typedef unsigned long int     dword;
-
-/* Data structures */
-struct Memconf {
-       word    cmd_q,
-               rcv_q,
-               mcast,
-               frame,
-               rcv_b,
-               progs;
-};
-
-struct Rcv_pkt {
-       word    buf_ofs,
-               buf_seg,
-               buf_len,
-               timeout;
-};
-
-struct Xmit_pkt {
-       word    buf_ofs,
-               buf_seg,
-               pkt_len;
-};
-
-struct Rcv_resp {
-       word    buf_ofs,
-               buf_seg,
-               buf_len,
-               pkt_len,
-               timeout,
-               status;
-       dword   timetag;
-};
-
-struct Xmit_resp {
-       word    buf_ofs,
-               buf_seg,
-               c_stat,
-               status;
-};
-
-
-struct Netstat {
-       dword   tot_recv,
-               tot_xmit;
-       word    err_CRC,
-               err_align,
-               err_res,
-               err_ovrrun;
-};
-
-
-struct Selftest {
-       word    error;
-       union {
-               word ROM_cksum;
-               struct {
-                       word ofs, seg;
-               } RAM;
-               word i82586;
-       } failure;
-};
-
-struct Info {
-       byte    minor_vers,
-               major_vers;
-       word    ROM_cksum,
-               RAM_sz,
-               free_ofs,
-               free_seg;
-};
-
-struct Memdump {
-       word size,
-            off,
-            seg;
-};
-
-/*
-Primary Command Block. The most important data structure. All communication
-between the host and the adapter is done with these. (Except for the actual
-Ethernet data, which has different packaging.)
-*/
-typedef struct {
-       byte    command;
-       byte    length;
-       union   {
-               struct Memconf          memconf;
-               word                    configure;
-               struct Rcv_pkt          rcv_pkt;
-               struct Xmit_pkt         xmit_pkt;
-               byte                    multicast[10][6];
-               byte                    eth_addr[6];
-               byte                    failed;
-               struct Rcv_resp         rcv_resp;
-               struct Xmit_resp        xmit_resp;
-               struct Netstat          netstat;
-               struct Selftest         selftest;
-               struct Info             info;
-               struct Memdump          memdump;
-               byte                    raw[62];
-       } data;
-} pcb_struct;
-
-/* These defines for 'configure' */
-#define RECV_STATION   0x00
-#define RECV_BROAD     0x01
-#define RECV_MULTI     0x02
-#define RECV_PROMISC   0x04
-#define NO_LOOPBACK    0x00
-#define INT_LOOPBACK   0x08
-#define EXT_LOOPBACK   0x10
-
-/*****************************************************************
- *
- *  structure to hold context information for adapter
- *
- *****************************************************************/
-
-#define DMA_BUFFER_SIZE  1600
-#define BACKLOG_SIZE      4
-
-typedef struct {
-       volatile short got[NUM_TRANSMIT_CMDS];  /* flags for
-                                                  command completion */
-       pcb_struct tx_pcb;      /* PCB for foreground sending */
-       pcb_struct rx_pcb;      /* PCB for foreground receiving */
-       pcb_struct itx_pcb;     /* PCB for background sending */
-       pcb_struct irx_pcb;     /* PCB for background receiving */
-
-       void *dma_buffer;
-
-       struct {
-               unsigned int length[BACKLOG_SIZE];
-               unsigned int in;
-               unsigned int out;
-       } rx_backlog;
-
-       struct {
-               unsigned int direction;
-               unsigned int length;
-               struct sk_buff *skb;
-               void *target;
-               unsigned long start_time;
-       } current_dma;
-
-       /* flags */
-       unsigned long send_pcb_semaphore;
-       unsigned long dmaing;
-       unsigned long busy;
-
-       unsigned int rx_active;  /* number of receive PCBs */
-        volatile unsigned char hcr_val;  /* what we think the HCR contains */
-        spinlock_t lock;       /* Interrupt v tx lock */
-} elp_device;
diff --git a/drivers/net/ethernet/i825xx/3c507.c b/drivers/net/ethernet/i825xx/3c507.c
deleted file mode 100644 (file)
index 13983ee..0000000
+++ /dev/null
@@ -1,939 +0,0 @@
-/* 3c507.c: An EtherLink16 device driver for Linux. */
-/*
-       Written 1993,1994 by Donald Becker.
-
-       Copyright 1993 United States Government as represented by the
-       Director, National Security Agency.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-
-       Thanks go to jennings@Montrouge.SMR.slb.com ( Patrick Jennings)
-       and jrs@world.std.com (Rick Sladkey) for testing and bugfixes.
-       Mark Salazar <leslie@access.digex.net> made the changes for cards with
-       only 16K packet buffers.
-
-       Things remaining to do:
-       Verify that the tx and rx buffers don't have fencepost errors.
-       Move the theory of operation and memory map documentation.
-       The statistics need to be updated correctly.
-*/
-
-#define DRV_NAME               "3c507"
-#define DRV_VERSION            "1.10a"
-#define DRV_RELDATE            "11/17/2001"
-
-static const char version[] =
-       DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Donald Becker (becker@scyld.com)\n";
-
-/*
-  Sources:
-       This driver wouldn't have been written with the availability of the
-       Crynwr driver source code.      It provided a known-working implementation
-       that filled in the gaping holes of the Intel documentation.  Three cheers
-       for Russ Nelson.
-
-       Intel Microcommunications Databook, Vol. 1, 1990.  It provides just enough
-       info that the casual reader might think that it documents the i82586 :-<.
-*/
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/string.h>
-#include <linux/spinlock.h>
-#include <linux/ethtool.h>
-#include <linux/errno.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/if_ether.h>
-#include <linux/skbuff.h>
-#include <linux/init.h>
-#include <linux/bitops.h>
-
-#include <asm/dma.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-
-/* use 0 for production, 1 for verification, 2..7 for debug */
-#ifndef NET_DEBUG
-#define NET_DEBUG 1
-#endif
-static unsigned int net_debug = NET_DEBUG;
-#define debug net_debug
-
-
-/*
-                       Details of the i82586.
-
-   You'll really need the databook to understand the details of this part,
-   but the outline is that the i82586 has two separate processing units.
-   Both are started from a list of three configuration tables, of which only
-   the last, the System Control Block (SCB), is used after reset-time.  The SCB
-   has the following fields:
-               Status word
-               Command word
-               Tx/Command block addr.
-               Rx block addr.
-   The command word accepts the following controls for the Tx and Rx units:
-  */
-
-#define         CUC_START       0x0100
-#define         CUC_RESUME      0x0200
-#define         CUC_SUSPEND 0x0300
-#define         RX_START        0x0010
-#define         RX_RESUME       0x0020
-#define         RX_SUSPEND      0x0030
-
-/* The Rx unit uses a list of frame descriptors and a list of data buffer
-   descriptors.  We use full-sized (1518 byte) data buffers, so there is
-   a one-to-one pairing of frame descriptors to buffer descriptors.
-
-   The Tx ("command") unit executes a list of commands that look like:
-               Status word             Written by the 82586 when the command is done.
-               Command word    Command in lower 3 bits, post-command action in upper 3
-               Link word               The address of the next command.
-               Parameters              (as needed).
-
-       Some definitions related to the Command Word are:
- */
-#define CMD_EOL                0x8000                  /* The last command of the list, stop. */
-#define CMD_SUSP       0x4000                  /* Suspend after doing cmd. */
-#define CMD_INTR       0x2000                  /* Interrupt after doing cmd. */
-
-enum commands {
-       CmdNOp = 0, CmdSASetup = 1, CmdConfigure = 2, CmdMulticastList = 3,
-       CmdTx = 4, CmdTDR = 5, CmdDump = 6, CmdDiagnose = 7};
-
-/* Information that need to be kept for each board. */
-struct net_local {
-       int last_restart;
-       ushort rx_head;
-       ushort rx_tail;
-       ushort tx_head;
-       ushort tx_cmd_link;
-       ushort tx_reap;
-       ushort tx_pkts_in_ring;
-       spinlock_t lock;
-       void __iomem *base;
-};
-
-/*
-               Details of the EtherLink16 Implementation
-  The 3c507 is a generic shared-memory i82586 implementation.
-  The host can map 16K, 32K, 48K, or 64K of the 64K memory into
-  0x0[CD][08]0000, or all 64K into 0xF[02468]0000.
-  */
-
-/* Offsets from the base I/O address. */
-#define        SA_DATA         0       /* Station address data, or 3Com signature. */
-#define MISC_CTRL      6       /* Switch the SA_DATA banks, and bus config bits. */
-#define RESET_IRQ      10      /* Reset the latched IRQ line. */
-#define SIGNAL_CA      11      /* Frob the 82586 Channel Attention line. */
-#define ROM_CONFIG     13
-#define MEM_CONFIG     14
-#define IRQ_CONFIG     15
-#define EL16_IO_EXTENT 16
-
-/* The ID port is used at boot-time to locate the ethercard. */
-#define ID_PORT                0x100
-
-/* Offsets to registers in the mailbox (SCB). */
-#define iSCB_STATUS    0x8
-#define iSCB_CMD               0xA
-#define iSCB_CBL               0xC     /* Command BLock offset. */
-#define iSCB_RFA               0xE     /* Rx Frame Area offset. */
-
-/*  Since the 3c507 maps the shared memory window so that the last byte is
-       at 82586 address FFFF, the first byte is at 82586 address 0, 16K, 32K, or
-       48K corresponding to window sizes of 64K, 48K, 32K and 16K respectively.
-       We can account for this be setting the 'SBC Base' entry in the ISCP table
-       below for all the 16 bit offset addresses, and also adding the 'SCB Base'
-       value to all 24 bit physical addresses (in the SCP table and the TX and RX
-       Buffer Descriptors).
-                                       -Mark
-       */
-#define SCB_BASE               ((unsigned)64*1024 - (dev->mem_end - dev->mem_start))
-
-/*
-  What follows in 'init_words[]' is the "program" that is downloaded to the
-  82586 memory.         It's mostly tables and command blocks, and starts at the
-  reset address 0xfffff6.  This is designed to be similar to the EtherExpress,
-  thus the unusual location of the SCB at 0x0008.
-
-  Even with the additional "don't care" values, doing it this way takes less
-  program space than initializing the individual tables, and I feel it's much
-  cleaner.
-
-  The databook is particularly useless for the first two structures, I had
-  to use the Crynwr driver as an example.
-
-   The memory setup is as follows:
-   */
-
-#define CONFIG_CMD     0x0018
-#define SET_SA_CMD     0x0024
-#define SA_OFFSET      0x002A
-#define IDLELOOP       0x30
-#define TDR_CMD                0x38
-#define TDR_TIME       0x3C
-#define DUMP_CMD       0x40
-#define DIAG_CMD       0x48
-#define SET_MC_CMD     0x4E
-#define DUMP_DATA      0x56    /* A 170 byte buffer for dump and Set-MC into. */
-
-#define TX_BUF_START   0x0100
-#define NUM_TX_BUFS    5
-#define TX_BUF_SIZE    (1518+14+20+16) /* packet+header+TBD */
-
-#define RX_BUF_START   0x2000
-#define RX_BUF_SIZE    (1518+14+18)    /* packet+header+RBD */
-#define RX_BUF_END             (dev->mem_end - dev->mem_start)
-
-#define TX_TIMEOUT (HZ/20)
-
-/*
-  That's it: only 86 bytes to set up the beast, including every extra
-  command available.  The 170 byte buffer at DUMP_DATA is shared between the
-  Dump command (called only by the diagnostic program) and the SetMulticastList
-  command.
-
-  To complete the memory setup you only have to write the station address at
-  SA_OFFSET and create the Tx & Rx buffer lists.
-
-  The Tx command chain and buffer list is setup as follows:
-  A Tx command table, with the data buffer pointing to...
-  A Tx data buffer descriptor.  The packet is in a single buffer, rather than
-       chaining together several smaller buffers.
-  A NoOp command, which initially points to itself,
-  And the packet data.
-
-  A transmit is done by filling in the Tx command table and data buffer,
-  re-writing the NoOp command, and finally changing the offset of the last
-  command to point to the current Tx command.  When the Tx command is finished,
-  it jumps to the NoOp, when it loops until the next Tx command changes the
-  "link offset" in the NoOp.  This way the 82586 never has to go through the
-  slow restart sequence.
-
-  The Rx buffer list is set up in the obvious ring structure.  We have enough
-  memory (and low enough interrupt latency) that we can avoid the complicated
-  Rx buffer linked lists by alway associating a full-size Rx data buffer with
-  each Rx data frame.
-
-  I current use four transmit buffers starting at TX_BUF_START (0x0100), and
-  use the rest of memory, from RX_BUF_START to RX_BUF_END, for Rx buffers.
-
-  */
-
-static unsigned short init_words[] = {
-       /*      System Configuration Pointer (SCP). */
-       0x0000,                                 /* Set bus size to 16 bits. */
-       0,0,                                    /* pad words. */
-       0x0000,0x0000,                  /* ISCP phys addr, set in init_82586_mem(). */
-
-       /*      Intermediate System Configuration Pointer (ISCP). */
-       0x0001,                                 /* Status word that's cleared when init is done. */
-       0x0008,0,0,                             /* SCB offset, (skip, skip) */
-
-       /* System Control Block (SCB). */
-       0,0xf000|RX_START|CUC_START,    /* SCB status and cmd. */
-       CONFIG_CMD,                             /* Command list pointer, points to Configure. */
-       RX_BUF_START,                           /* Rx block list. */
-       0,0,0,0,                                /* Error count: CRC, align, buffer, overrun. */
-
-       /* 0x0018: Configure command.  Change to put MAC data with packet. */
-       0, CmdConfigure,                /* Status, command.             */
-       SET_SA_CMD,                             /* Next command is Set Station Addr. */
-       0x0804,                                 /* "4" bytes of config data, 8 byte FIFO. */
-       0x2e40,                                 /* Magic values, including MAC data location. */
-       0,                                              /* Unused pad word. */
-
-       /* 0x0024: Setup station address command. */
-       0, CmdSASetup,
-       SET_MC_CMD,                             /* Next command. */
-       0xaa00,0xb000,0x0bad,   /* Station address (to be filled in) */
-
-       /* 0x0030: NOP, looping back to itself.  Point to first Tx buffer to Tx. */
-       0, CmdNOp, IDLELOOP, 0 /* pad */,
-
-       /* 0x0038: A unused Time-Domain Reflectometer command. */
-       0, CmdTDR, IDLELOOP, 0,
-
-       /* 0x0040: An unused Dump State command. */
-       0, CmdDump, IDLELOOP, DUMP_DATA,
-
-       /* 0x0048: An unused Diagnose command. */
-       0, CmdDiagnose, IDLELOOP,
-
-       /* 0x004E: An empty set-multicast-list command. */
-       0, CmdMulticastList, IDLELOOP, 0,
-};
-
-/* Index to functions, as function prototypes. */
-
-static int     el16_probe1(struct net_device *dev, int ioaddr);
-static int     el16_open(struct net_device *dev);
-static netdev_tx_t el16_send_packet(struct sk_buff *skb,
-                                   struct net_device *dev);
-static irqreturn_t el16_interrupt(int irq, void *dev_id);
-static void el16_rx(struct net_device *dev);
-static int     el16_close(struct net_device *dev);
-static void el16_tx_timeout (struct net_device *dev);
-
-static void hardware_send_packet(struct net_device *dev, void *buf, short length, short pad);
-static void init_82586_mem(struct net_device *dev);
-static const struct ethtool_ops netdev_ethtool_ops;
-static void init_rx_bufs(struct net_device *);
-
-static int io = 0x300;
-static int irq;
-static int mem_start;
-
-
-/* Check for a network adaptor of this type, and return '0' iff one exists.
-       If dev->base_addr == 0, probe all likely locations.
-       If dev->base_addr == 1, always return failure.
-       If dev->base_addr == 2, (detachable devices only) allocate space for the
-       device and return success.
-       */
-
-struct net_device * __init el16_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-       static const unsigned ports[] = { 0x300, 0x320, 0x340, 0x280, 0};
-       const unsigned *port;
-       int err = -ENODEV;
-
-       if (!dev)
-               return ERR_PTR(-ENODEV);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-               io = dev->base_addr;
-               irq = dev->irq;
-               mem_start = dev->mem_start & 15;
-       }
-
-       if (io > 0x1ff)         /* Check a single specified location. */
-               err = el16_probe1(dev, io);
-       else if (io != 0)
-               err = -ENXIO;           /* Don't probe at all. */
-       else {
-               for (port = ports; *port; port++) {
-                       err = el16_probe1(dev, *port);
-                       if (!err)
-                               break;
-               }
-       }
-
-       if (err)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-       free_irq(dev->irq, dev);
-       iounmap(((struct net_local *)netdev_priv(dev))->base);
-       release_region(dev->base_addr, EL16_IO_EXTENT);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-static const struct net_device_ops netdev_ops = {
-       .ndo_open               = el16_open,
-       .ndo_stop               = el16_close,
-       .ndo_start_xmit         = el16_send_packet,
-       .ndo_tx_timeout         = el16_tx_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-static int __init el16_probe1(struct net_device *dev, int ioaddr)
-{
-       static unsigned char init_ID_done;
-       int i, irq, irqval, retval;
-       struct net_local *lp;
-
-       if (init_ID_done == 0) {
-               ushort lrs_state = 0xff;
-               /* Send the ID sequence to the ID_PORT to enable the board(s). */
-               outb(0x00, ID_PORT);
-               for(i = 0; i < 255; i++) {
-                       outb(lrs_state, ID_PORT);
-                       lrs_state <<= 1;
-                       if (lrs_state & 0x100)
-                               lrs_state ^= 0xe7;
-               }
-               outb(0x00, ID_PORT);
-               init_ID_done = 1;
-       }
-
-       if (!request_region(ioaddr, EL16_IO_EXTENT, DRV_NAME))
-               return -ENODEV;
-
-       if ((inb(ioaddr) != '*') || (inb(ioaddr + 1) != '3') ||
-           (inb(ioaddr + 2) != 'C') || (inb(ioaddr + 3) != 'O')) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       pr_info("%s: 3c507 at %#x,", dev->name, ioaddr);
-
-       /* We should make a few more checks here, like the first three octets of
-          the S.A. for the manufacturer's code. */
-
-       irq = inb(ioaddr + IRQ_CONFIG) & 0x0f;
-
-       irqval = request_irq(irq, el16_interrupt, 0, DRV_NAME, dev);
-       if (irqval) {
-               pr_cont("\n");
-               pr_err("3c507: unable to get IRQ %d (irqval=%d).\n", irq, irqval);
-               retval = -EAGAIN;
-               goto out;
-       }
-
-       /* We've committed to using the board, and can start filling in *dev. */
-       dev->base_addr = ioaddr;
-
-       outb(0x01, ioaddr + MISC_CTRL);
-       for (i = 0; i < 6; i++)
-               dev->dev_addr[i] = inb(ioaddr + i);
-       pr_cont(" %pM", dev->dev_addr);
-
-       if (mem_start)
-               net_debug = mem_start & 7;
-
-#ifdef MEM_BASE
-       dev->mem_start = MEM_BASE;
-       dev->mem_end = dev->mem_start + 0x10000;
-#else
-       {
-               int base;
-               int size;
-               char mem_config = inb(ioaddr + MEM_CONFIG);
-               if (mem_config & 0x20) {
-                       size = 64*1024;
-                       base = 0xf00000 + (mem_config & 0x08 ? 0x080000
-                                                          : ((mem_config & 3) << 17));
-               } else {
-                       size = ((mem_config & 3) + 1) << 14;
-                       base = 0x0c0000 + ( (mem_config & 0x18) << 12);
-               }
-               dev->mem_start = base;
-               dev->mem_end = base + size;
-       }
-#endif
-
-       dev->if_port = (inb(ioaddr + ROM_CONFIG) & 0x80) ? 1 : 0;
-       dev->irq = inb(ioaddr + IRQ_CONFIG) & 0x0f;
-
-       pr_cont(", IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->irq,
-                  dev->if_port ? "ex" : "in", dev->mem_start, dev->mem_end-1);
-
-       if (net_debug)
-               pr_debug("%s", version);
-
-       lp = netdev_priv(dev);
-       spin_lock_init(&lp->lock);
-       lp->base = ioremap(dev->mem_start, RX_BUF_END);
-       if (!lp->base) {
-               pr_err("3c507: unable to remap memory\n");
-               retval = -EAGAIN;
-               goto out1;
-       }
-
-       dev->netdev_ops = &netdev_ops;
-       dev->watchdog_timeo = TX_TIMEOUT;
-       dev->ethtool_ops = &netdev_ethtool_ops;
-       dev->flags &= ~IFF_MULTICAST;   /* Multicast doesn't work */
-       return 0;
-out1:
-       free_irq(dev->irq, dev);
-out:
-       release_region(ioaddr, EL16_IO_EXTENT);
-       return retval;
-}
-
-static int el16_open(struct net_device *dev)
-{
-       /* Initialize the 82586 memory and start it. */
-       init_82586_mem(dev);
-
-       netif_start_queue(dev);
-       return 0;
-}
-
-
-static void el16_tx_timeout (struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       void __iomem *shmem = lp->base;
-
-       if (net_debug > 1)
-               pr_debug("%s: transmit timed out, %s?  ", dev->name,
-                       readw(shmem + iSCB_STATUS) & 0x8000 ? "IRQ conflict" :
-                       "network cable problem");
-       /* Try to restart the adaptor. */
-       if (lp->last_restart == dev->stats.tx_packets) {
-               if (net_debug > 1)
-                       pr_cont("Resetting board.\n");
-               /* Completely reset the adaptor. */
-               init_82586_mem (dev);
-               lp->tx_pkts_in_ring = 0;
-       } else {
-               /* Issue the channel attention signal and hope it "gets better". */
-               if (net_debug > 1)
-                       pr_cont("Kicking board.\n");
-               writew(0xf000 | CUC_START | RX_START, shmem + iSCB_CMD);
-               outb (0, ioaddr + SIGNAL_CA);   /* Issue channel-attn. */
-               lp->last_restart = dev->stats.tx_packets;
-       }
-       dev->trans_start = jiffies; /* prevent tx timeout */
-       netif_wake_queue (dev);
-}
-
-
-static netdev_tx_t el16_send_packet (struct sk_buff *skb,
-                                    struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       unsigned long flags;
-       short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
-       unsigned char *buf = skb->data;
-
-       netif_stop_queue (dev);
-
-       spin_lock_irqsave (&lp->lock, flags);
-
-       dev->stats.tx_bytes += length;
-       /* Disable the 82586's input to the interrupt line. */
-       outb (0x80, ioaddr + MISC_CTRL);
-
-       hardware_send_packet (dev, buf, skb->len, length - skb->len);
-
-       /* Enable the 82586 interrupt input. */
-       outb (0x84, ioaddr + MISC_CTRL);
-
-       spin_unlock_irqrestore (&lp->lock, flags);
-
-       dev_kfree_skb (skb);
-
-       /* You might need to clean up and record Tx statistics here. */
-
-       return NETDEV_TX_OK;
-}
-
-/*     The typical workload of the driver:
-       Handle the network interface interrupts. */
-static irqreturn_t el16_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct net_local *lp;
-       int ioaddr, status, boguscount = 0;
-       ushort ack_cmd = 0;
-       void __iomem *shmem;
-
-       if (dev == NULL) {
-               pr_err("net_interrupt(): irq %d for unknown device.\n", irq);
-               return IRQ_NONE;
-       }
-
-       ioaddr = dev->base_addr;
-       lp = netdev_priv(dev);
-       shmem = lp->base;
-
-       spin_lock(&lp->lock);
-
-       status = readw(shmem+iSCB_STATUS);
-
-       if (net_debug > 4) {
-               pr_debug("%s: 3c507 interrupt, status %4.4x.\n", dev->name, status);
-       }
-
-       /* Disable the 82586's input to the interrupt line. */
-       outb(0x80, ioaddr + MISC_CTRL);
-
-       /* Reap the Tx packet buffers. */
-       while (lp->tx_pkts_in_ring) {
-         unsigned short tx_status = readw(shmem+lp->tx_reap);
-         if (!(tx_status & 0x8000)) {
-               if (net_debug > 5)
-                       pr_debug("Tx command incomplete (%#x).\n", lp->tx_reap);
-               break;
-         }
-         /* Tx unsuccessful or some interesting status bit set. */
-         if (!(tx_status & 0x2000) || (tx_status & 0x0f3f)) {
-               dev->stats.tx_errors++;
-               if (tx_status & 0x0600)  dev->stats.tx_carrier_errors++;
-               if (tx_status & 0x0100)  dev->stats.tx_fifo_errors++;
-               if (!(tx_status & 0x0040))  dev->stats.tx_heartbeat_errors++;
-               if (tx_status & 0x0020)  dev->stats.tx_aborted_errors++;
-               dev->stats.collisions += tx_status & 0xf;
-         }
-         dev->stats.tx_packets++;
-         if (net_debug > 5)
-                 pr_debug("Reaped %x, Tx status %04x.\n" , lp->tx_reap, tx_status);
-         lp->tx_reap += TX_BUF_SIZE;
-         if (lp->tx_reap > RX_BUF_START - TX_BUF_SIZE)
-               lp->tx_reap = TX_BUF_START;
-
-         lp->tx_pkts_in_ring--;
-         /* There is always more space in the Tx ring buffer now. */
-         netif_wake_queue(dev);
-
-         if (++boguscount > 10)
-               break;
-       }
-
-       if (status & 0x4000) { /* Packet received. */
-               if (net_debug > 5)
-                       pr_debug("Received packet, rx_head %04x.\n", lp->rx_head);
-               el16_rx(dev);
-       }
-
-       /* Acknowledge the interrupt sources. */
-       ack_cmd = status & 0xf000;
-
-       if ((status & 0x0700) != 0x0200 && netif_running(dev)) {
-               if (net_debug)
-                       pr_debug("%s: Command unit stopped, status %04x, restarting.\n",
-                                  dev->name, status);
-               /* If this ever occurs we should really re-write the idle loop, reset
-                  the Tx list, and do a complete restart of the command unit.
-                  For now we rely on the Tx timeout if the resume doesn't work. */
-               ack_cmd |= CUC_RESUME;
-       }
-
-       if ((status & 0x0070) != 0x0040 && netif_running(dev)) {
-               /* The Rx unit is not ready, it must be hung.  Restart the receiver by
-                  initializing the rx buffers, and issuing an Rx start command. */
-               if (net_debug)
-                       pr_debug("%s: Rx unit stopped, status %04x, restarting.\n",
-                                  dev->name, status);
-               init_rx_bufs(dev);
-               writew(RX_BUF_START,shmem+iSCB_RFA);
-               ack_cmd |= RX_START;
-       }
-
-       writew(ack_cmd,shmem+iSCB_CMD);
-       outb(0, ioaddr + SIGNAL_CA);                    /* Issue channel-attn. */
-
-       /* Clear the latched interrupt. */
-       outb(0, ioaddr + RESET_IRQ);
-
-       /* Enable the 82586's interrupt input. */
-       outb(0x84, ioaddr + MISC_CTRL);
-       spin_unlock(&lp->lock);
-       return IRQ_HANDLED;
-}
-
-static int el16_close(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       void __iomem *shmem = lp->base;
-
-       netif_stop_queue(dev);
-
-       /* Flush the Tx and disable Rx. */
-       writew(RX_SUSPEND | CUC_SUSPEND,shmem+iSCB_CMD);
-       outb(0, ioaddr + SIGNAL_CA);
-
-       /* Disable the 82586's input to the interrupt line. */
-       outb(0x80, ioaddr + MISC_CTRL);
-
-       /* We always physically use the IRQ line, so we don't do free_irq(). */
-
-       /* Update the statistics here. */
-
-       return 0;
-}
-
-/* Initialize the Rx-block list. */
-static void init_rx_bufs(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       void __iomem *write_ptr;
-       unsigned short SCB_base = SCB_BASE;
-
-       int cur_rxbuf = lp->rx_head = RX_BUF_START;
-
-       /* Initialize each Rx frame + data buffer. */
-       do {    /* While there is room for one more. */
-
-               write_ptr = lp->base + cur_rxbuf;
-
-               writew(0x0000,write_ptr);                       /* Status */
-               writew(0x0000,write_ptr+=2);                    /* Command */
-               writew(cur_rxbuf + RX_BUF_SIZE,write_ptr+=2);   /* Link */
-               writew(cur_rxbuf + 22,write_ptr+=2);            /* Buffer offset */
-               writew(0x0000,write_ptr+=2);                    /* Pad for dest addr. */
-               writew(0x0000,write_ptr+=2);
-               writew(0x0000,write_ptr+=2);
-               writew(0x0000,write_ptr+=2);                    /* Pad for source addr. */
-               writew(0x0000,write_ptr+=2);
-               writew(0x0000,write_ptr+=2);
-               writew(0x0000,write_ptr+=2);                    /* Pad for protocol. */
-
-               writew(0x0000,write_ptr+=2);                    /* Buffer: Actual count */
-               writew(-1,write_ptr+=2);                        /* Buffer: Next (none). */
-               writew(cur_rxbuf + 0x20 + SCB_base,write_ptr+=2);/* Buffer: Address low */
-               writew(0x0000,write_ptr+=2);
-               /* Finally, the number of bytes in the buffer. */
-               writew(0x8000 + RX_BUF_SIZE-0x20,write_ptr+=2);
-
-               lp->rx_tail = cur_rxbuf;
-               cur_rxbuf += RX_BUF_SIZE;
-       } while (cur_rxbuf <= RX_BUF_END - RX_BUF_SIZE);
-
-       /* Terminate the list by setting the EOL bit, and wrap the pointer to make
-          the list a ring. */
-       write_ptr = lp->base + lp->rx_tail + 2;
-       writew(0xC000,write_ptr);                               /* Command, mark as last. */
-       writew(lp->rx_head,write_ptr+2);                        /* Link */
-}
-
-static void init_82586_mem(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       short ioaddr = dev->base_addr;
-       void __iomem *shmem = lp->base;
-
-       /* Enable loopback to protect the wire while starting up,
-          and hold the 586 in reset during the memory initialization. */
-       outb(0x20, ioaddr + MISC_CTRL);
-
-       /* Fix the ISCP address and base. */
-       init_words[3] = SCB_BASE;
-       init_words[7] = SCB_BASE;
-
-       /* Write the words at 0xfff6 (address-aliased to 0xfffff6). */
-       memcpy_toio(lp->base + RX_BUF_END - 10, init_words, 10);
-
-       /* Write the words at 0x0000. */
-       memcpy_toio(lp->base, init_words + 5, sizeof(init_words) - 10);
-
-       /* Fill in the station address. */
-       memcpy_toio(lp->base+SA_OFFSET, dev->dev_addr, ETH_ALEN);
-
-       /* The Tx-block list is written as needed.  We just set up the values. */
-       lp->tx_cmd_link = IDLELOOP + 4;
-       lp->tx_head = lp->tx_reap = TX_BUF_START;
-
-       init_rx_bufs(dev);
-
-       /* Start the 586 by releasing the reset line, but leave loopback. */
-       outb(0xA0, ioaddr + MISC_CTRL);
-
-       /* This was time consuming to track down: you need to give two channel
-          attention signals to reliably start up the i82586. */
-       outb(0, ioaddr + SIGNAL_CA);
-
-       {
-               int boguscnt = 50;
-               while (readw(shmem+iSCB_STATUS) == 0)
-                       if (--boguscnt == 0) {
-                               pr_warning("%s: i82586 initialization timed out with status %04x, cmd %04x.\n",
-                                       dev->name, readw(shmem+iSCB_STATUS), readw(shmem+iSCB_CMD));
-                               break;
-                       }
-               /* Issue channel-attn -- the 82586 won't start. */
-               outb(0, ioaddr + SIGNAL_CA);
-       }
-
-       /* Disable loopback and enable interrupts. */
-       outb(0x84, ioaddr + MISC_CTRL);
-       if (net_debug > 4)
-               pr_debug("%s: Initialized 82586, status %04x.\n", dev->name,
-                          readw(shmem+iSCB_STATUS));
-}
-
-static void hardware_send_packet(struct net_device *dev, void *buf, short length, short pad)
-{
-       struct net_local *lp = netdev_priv(dev);
-       short ioaddr = dev->base_addr;
-       ushort tx_block = lp->tx_head;
-       void __iomem *write_ptr = lp->base + tx_block;
-       static char padding[ETH_ZLEN];
-
-       /* Set the write pointer to the Tx block, and put out the header. */
-       writew(0x0000,write_ptr);                       /* Tx status */
-       writew(CMD_INTR|CmdTx,write_ptr+=2);            /* Tx command */
-       writew(tx_block+16,write_ptr+=2);               /* Next command is a NoOp. */
-       writew(tx_block+8,write_ptr+=2);                        /* Data Buffer offset. */
-
-       /* Output the data buffer descriptor. */
-       writew((pad + length) | 0x8000,write_ptr+=2);           /* Byte count parameter. */
-       writew(-1,write_ptr+=2);                        /* No next data buffer. */
-       writew(tx_block+22+SCB_BASE,write_ptr+=2);      /* Buffer follows the NoOp command. */
-       writew(0x0000,write_ptr+=2);                    /* Buffer address high bits (always zero). */
-
-       /* Output the Loop-back NoOp command. */
-       writew(0x0000,write_ptr+=2);                    /* Tx status */
-       writew(CmdNOp,write_ptr+=2);                    /* Tx command */
-       writew(tx_block+16,write_ptr+=2);               /* Next is myself. */
-
-       /* Output the packet at the write pointer. */
-       memcpy_toio(write_ptr+2, buf, length);
-       if (pad)
-               memcpy_toio(write_ptr+length+2, padding, pad);
-
-       /* Set the old command link pointing to this send packet. */
-       writew(tx_block,lp->base + lp->tx_cmd_link);
-       lp->tx_cmd_link = tx_block + 20;
-
-       /* Set the next free tx region. */
-       lp->tx_head = tx_block + TX_BUF_SIZE;
-       if (lp->tx_head > RX_BUF_START - TX_BUF_SIZE)
-               lp->tx_head = TX_BUF_START;
-
-       if (net_debug > 4) {
-               pr_debug("%s: 3c507 @%x send length = %d, tx_block %3x, next %3x.\n",
-                          dev->name, ioaddr, length, tx_block, lp->tx_head);
-       }
-
-       /* Grimly block further packets if there has been insufficient reaping. */
-       if (++lp->tx_pkts_in_ring < NUM_TX_BUFS)
-               netif_wake_queue(dev);
-}
-
-static void el16_rx(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       void __iomem *shmem = lp->base;
-       ushort rx_head = lp->rx_head;
-       ushort rx_tail = lp->rx_tail;
-       ushort boguscount = 10;
-       short frame_status;
-
-       while ((frame_status = readw(shmem+rx_head)) < 0) {   /* Command complete */
-               void __iomem *read_frame = lp->base + rx_head;
-               ushort rfd_cmd = readw(read_frame+2);
-               ushort next_rx_frame = readw(read_frame+4);
-               ushort data_buffer_addr = readw(read_frame+6);
-               void __iomem *data_frame = lp->base + data_buffer_addr;
-               ushort pkt_len = readw(data_frame);
-
-               if (rfd_cmd != 0 || data_buffer_addr != rx_head + 22 ||
-                   (pkt_len & 0xC000) != 0xC000) {
-                       pr_err("%s: Rx frame at %#x corrupted, "
-                              "status %04x cmd %04x next %04x "
-                              "data-buf @%04x %04x.\n",
-                              dev->name, rx_head, frame_status, rfd_cmd,
-                              next_rx_frame, data_buffer_addr, pkt_len);
-               } else if ((frame_status & 0x2000) == 0) {
-                       /* Frame Rxed, but with error. */
-                       dev->stats.rx_errors++;
-                       if (frame_status & 0x0800) dev->stats.rx_crc_errors++;
-                       if (frame_status & 0x0400) dev->stats.rx_frame_errors++;
-                       if (frame_status & 0x0200) dev->stats.rx_fifo_errors++;
-                       if (frame_status & 0x0100) dev->stats.rx_over_errors++;
-                       if (frame_status & 0x0080) dev->stats.rx_length_errors++;
-               } else {
-                       /* Malloc up new buffer. */
-                       struct sk_buff *skb;
-
-                       pkt_len &= 0x3fff;
-                       skb = netdev_alloc_skb(dev, pkt_len + 2);
-                       if (skb == NULL) {
-                               pr_err("%s: Memory squeeze, dropping packet.\n",
-                                      dev->name);
-                               dev->stats.rx_dropped++;
-                               break;
-                       }
-
-                       skb_reserve(skb,2);
-
-                       /* 'skb->data' points to the start of sk_buff data area. */
-                       memcpy_fromio(skb_put(skb,pkt_len), data_frame + 10, pkt_len);
-
-                       skb->protocol=eth_type_trans(skb,dev);
-                       netif_rx(skb);
-                       dev->stats.rx_packets++;
-                       dev->stats.rx_bytes += pkt_len;
-               }
-
-               /* Clear the status word and set End-of-List on the rx frame. */
-               writew(0,read_frame);
-               writew(0xC000,read_frame+2);
-               /* Clear the end-of-list on the prev. RFD. */
-               writew(0x0000,lp->base + rx_tail + 2);
-
-               rx_tail = rx_head;
-               rx_head = next_rx_frame;
-               if (--boguscount == 0)
-                       break;
-       }
-
-       lp->rx_head = rx_head;
-       lp->rx_tail = rx_tail;
-}
-
-static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
-{
-       strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
-       strlcpy(info->version, DRV_VERSION, sizeof(info->version));
-       snprintf(info->bus_info, sizeof(info->bus_info), "ISA 0x%lx",
-                dev->base_addr);
-}
-
-static u32 netdev_get_msglevel(struct net_device *dev)
-{
-       return debug;
-}
-
-static void netdev_set_msglevel(struct net_device *dev, u32 level)
-{
-       debug = level;
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
-       .get_msglevel           = netdev_get_msglevel,
-       .set_msglevel           = netdev_set_msglevel,
-};
-
-#ifdef MODULE
-static struct net_device *dev_3c507;
-module_param(io, int, 0);
-module_param(irq, int, 0);
-MODULE_PARM_DESC(io, "EtherLink16 I/O base address");
-MODULE_PARM_DESC(irq, "(ignored)");
-
-int __init init_module(void)
-{
-       if (io == 0)
-               pr_notice("3c507: You should not use auto-probing with insmod!\n");
-       dev_3c507 = el16_probe(-1);
-       return IS_ERR(dev_3c507) ? PTR_ERR(dev_3c507) : 0;
-}
-
-void __exit
-cleanup_module(void)
-{
-       struct net_device *dev = dev_3c507;
-       unregister_netdev(dev);
-       free_irq(dev->irq, dev);
-       iounmap(((struct net_local *)netdev_priv(dev))->base);
-       release_region(dev->base_addr, EL16_IO_EXTENT);
-       free_netdev(dev);
-}
-#endif /* MODULE */
-MODULE_LICENSE("GPL");
index 6aa927af382c7bff2a0b1b0d96bca0e2026f30ae..1c54e229e3cc94ed8ff0eb630bd9acc70cb20a8d 100644 (file)
@@ -95,9 +95,6 @@ static char version[] __initdata =
 #if defined(CONFIG_BVME6000_NET) || defined(CONFIG_BVME6000_NET_MODULE)
 #define ENABLE_BVME6000_NET
 #endif
-#if defined(CONFIG_APRICOT) || defined(CONFIG_APRICOT_MODULE)
-#define ENABLE_APRICOT
-#endif
 
 #ifdef ENABLE_MVME16x_NET
 #include <asm/mvme16xhw.h>
@@ -120,8 +117,15 @@ static char version[] __initdata =
 #define WSWAPtbd(x)  ((struct i596_tbd *) (((u32)(x)<<16) | ((((u32)(x)))>>16)))
 #define WSWAPchar(x) ((char *)            (((u32)(x)<<16) | ((((u32)(x)))>>16)))
 #define ISCP_BUSY      0x00010000
-#define MACH_IS_APRICOT        0
 #else
+#error 82596.c: unknown architecture
+#endif
+
+/*
+ * These were the intel versions, left here for reference. There
+ * are currently no x86 users of this legacy i82596 chip.
+ */
+#if 0
 #define WSWAPrfd(x)     ((struct i596_rfd *)((long)x))
 #define WSWAPrbd(x)     ((struct i596_rbd *)((long)x))
 #define WSWAPiscp(x)    ((struct i596_iscp *)((long)x))
@@ -130,7 +134,6 @@ static char version[] __initdata =
 #define WSWAPtbd(x)     ((struct i596_tbd *)((long)x))
 #define WSWAPchar(x)    ((char *)((long)x))
 #define ISCP_BUSY      0x0001
-#define MACH_IS_APRICOT        1
 #endif
 
 /*
@@ -383,11 +386,6 @@ static inline void CA(struct net_device *dev)
                i = *(volatile u32 *) (dev->base_addr);
        }
 #endif
-#ifdef ENABLE_APRICOT
-       if (MACH_IS_APRICOT) {
-               outw(0, (short) (dev->base_addr) + 4);
-       }
-#endif
 }
 
 
@@ -617,9 +615,6 @@ static void rebuild_rx_bufs(struct net_device *dev)
 static int init_i596_mem(struct net_device *dev)
 {
        struct i596_private *lp = dev->ml_priv;
-#if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) || defined(ENABLE_APRICOT)
-       short ioaddr = dev->base_addr;
-#endif
        unsigned long flags;
 
        MPU_PORT(dev, PORT_RESET, NULL);
@@ -653,18 +648,6 @@ static int init_i596_mem(struct net_device *dev)
 
        MPU_PORT(dev, PORT_ALTSCP, (void *)virt_to_bus((void *)&lp->scp));
 
-#elif defined(ENABLE_APRICOT)
-
-       {
-               u32 scp = virt_to_bus(&lp->scp);
-
-               /* change the scp address */
-               outw(0, ioaddr);
-               outw(0, ioaddr);
-               outb(4, ioaddr + 0xf);
-               outw(scp | 2, ioaddr);
-               outw(scp >> 16, ioaddr);
-       }
 #endif
 
        lp->last_cmd = jiffies;
@@ -677,10 +660,6 @@ static int init_i596_mem(struct net_device *dev)
        if (MACH_IS_BVME6000)
                lp->scp.sysbus = 0x0000004c;
 #endif
-#ifdef ENABLE_APRICOT
-       if (MACH_IS_APRICOT)
-               lp->scp.sysbus = 0x00440000;
-#endif
 
        lp->scp.iscp = WSWAPiscp(virt_to_bus((void *)&lp->iscp));
        lp->iscp.scb = WSWAPscb(virt_to_bus((void *)&lp->scb));
@@ -698,10 +677,6 @@ static int init_i596_mem(struct net_device *dev)
 
        DEB(DEB_INIT,printk(KERN_DEBUG "%s: starting i82596.\n", dev->name));
 
-#if defined(ENABLE_APRICOT)
-       (void) inb(ioaddr + 0x10);
-       outb(4, ioaddr + 0xf);
-#endif
        CA(dev);
 
        if (wait_istat(dev,lp,1000,"initialization timed out"))
@@ -1202,43 +1177,6 @@ struct net_device * __init i82596_probe(int unit)
                dev->irq = (unsigned) BVME_IRQ_I596;
                goto found;
        }
-#endif
-#ifdef ENABLE_APRICOT
-       {
-               int checksum = 0;
-               int ioaddr = 0x300;
-
-               /* this is easy the ethernet interface can only be at 0x300 */
-               /* first check nothing is already registered here */
-
-               if (!request_region(ioaddr, I596_TOTAL_SIZE, DRV_NAME)) {
-                       printk(KERN_ERR "82596: IO address 0x%04x in use\n", ioaddr);
-                       err = -EBUSY;
-                       goto out;
-               }
-
-               dev->base_addr = ioaddr;
-
-               for (i = 0; i < 8; i++) {
-                       eth_addr[i] = inb(ioaddr + 8 + i);
-                       checksum += eth_addr[i];
-               }
-
-               /* checksum is a multiple of 0x100, got this wrong first time
-                  some machines have 0x100, some 0x200. The DOS driver doesn't
-                  even bother with the checksum.
-                  Some other boards trip the checksum.. but then appear as
-                  ether address 0. Trap these - AC */
-
-               if ((checksum % 0x100) ||
-                   (memcmp(eth_addr, "\x00\x00\x49", 3) != 0)) {
-                       err = -ENODEV;
-                       goto out1;
-               }
-
-               dev->irq = 10;
-               goto found;
-       }
 #endif
        err = -ENODEV;
        goto out;
@@ -1296,9 +1234,6 @@ out2:
 #endif
        free_page ((u32)(dev->mem_start));
 out1:
-#ifdef ENABLE_APRICOT
-       release_region(dev->base_addr, I596_TOTAL_SIZE);
-#endif
 out:
        free_netdev(dev);
        return ERR_PTR(err);
@@ -1454,10 +1389,6 @@ static irqreturn_t i596_interrupt(int irq, void *dev_id)
                *ethirq = 1;
                *ethirq = 3;
        }
-#endif
-#ifdef ENABLE_APRICOT
-       (void) inb(ioaddr + 0x10);
-       outb(4, ioaddr + 0xf);
 #endif
        CA(dev);
 
@@ -1589,11 +1520,6 @@ static void set_multicast_list(struct net_device *dev)
 #ifdef MODULE
 static struct net_device *dev_82596;
 
-#ifdef ENABLE_APRICOT
-module_param(irq, int, 0);
-MODULE_PARM_DESC(irq, "Apricot IRQ number");
-#endif
-
 static int debug = -1;
 module_param(debug, int, 0);
 MODULE_PARM_DESC(debug, "i82596 debug mask");
@@ -1620,10 +1546,6 @@ void __exit cleanup_module(void)
                        IOMAP_FULL_CACHING);
 #endif
        free_page ((u32)(dev_82596->mem_start));
-#ifdef ENABLE_APRICOT
-       /* If we don't do this, we can't re-insmod it later. */
-       release_region(dev_82596->base_addr, I596_TOTAL_SIZE);
-#endif
        free_netdev(dev_82596);
 }
 
index 70f8c2d221b63b91854f31f84421f76c7f5ffc42..955d929cd00fc8cb757ee987a4c7fb53382339f7 100644 (file)
@@ -20,29 +20,6 @@ config NET_VENDOR_I825XX
 
 if NET_VENDOR_I825XX
 
-config ELPLUS
-       tristate "3c505 \"EtherLink Plus\" support"
-       depends on ISA && ISA_DMA_API
-       ---help---
-         Information about this network (Ethernet) card can be found in
-         <file:Documentation/networking/3c505.txt>.  If you have a card of
-         this type, say Y and read the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called 3c505.
-
-config EL16
-       tristate "3c507 \"EtherLink 16\" support (EXPERIMENTAL)"
-       depends on ISA && EXPERIMENTAL
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called 3c507.
-
 config ARM_ETHER1
        tristate "Acorn Ether1 support"
        depends on ARM && ARCH_ACORN
@@ -50,17 +27,6 @@ config ARM_ETHER1
          If you have an Acorn system with one of these (AKA25) network cards,
          you should say Y to this option if you wish to use it with Linux.
 
-config APRICOT
-       tristate "Apricot Xen-II on board Ethernet"
-       depends on ISA
-       ---help---
-         If you have a network (Ethernet) controller of this type, say Y and
-         read the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called apricot.
-
 config BVME6000_NET
        tristate "BVME6000 Ethernet support"
        depends on BVME6000
@@ -70,33 +36,6 @@ config BVME6000_NET
          in your kernel.
          To compile this driver as a module, choose M here.
 
-config EEXPRESS
-       tristate "EtherExpress 16 support"
-       depends on ISA
-       ---help---
-         If you have an EtherExpress16 network (Ethernet) card, say Y and
-         read the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.  Note that the Intel
-         EtherExpress16 card used to be regarded as a very poor choice
-         because the driver was very unreliable. We now have a new driver
-         that should do better.
-
-         To compile this driver as a module, choose M here. The module
-         will be called eexpress.
-
-config EEXPRESS_PRO
-       tristate "EtherExpressPro support/EtherExpress 10 (i82595) support"
-       depends on ISA
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y. This
-         driver supports Intel i82595{FX,TX} based boards. Note however
-         that the EtherExpress PRO/100 Ethernet card has its own separate
-         driver.  Please read the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called eepro.
-
 config LASI_82596
        tristate "Lasi ethernet"
        depends on GSC
@@ -104,14 +43,6 @@ config LASI_82596
          Say Y here to support the builtin Intel 82596 ethernet controller
          found in Hewlett-Packard PA-RISC machines with 10Mbit ethernet.
 
-config LP486E
-       tristate "LP486E on board Ethernet"
-       depends on ISA
-       ---help---
-         Say Y here to support the 82596-based on-board Ethernet controller
-         for the Panther motherboard, which is one of the two shipped in the
-         Intel Professional Workstation.
-
 config MVME16x_NET
        tristate "MVME16x Ethernet support"
        depends on MVME16x
@@ -121,17 +52,6 @@ config MVME16x_NET
          driver for this chip in your kernel.
          To compile this driver as a module, choose M here.
 
-config NI52
-       tristate "NI5210 support"
-       depends on ISA
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called ni52.
-
 config SNI_82596
        tristate "SNI RM ethernet"
        depends on SNI_RM
@@ -148,14 +68,4 @@ config SUN3_82586
          that this driver does not support 82586-based adapters on additional
          VME boards.
 
-config ZNET
-       tristate "Zenith Z-Note support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && ISA_DMA_API && X86
-       ---help---
-         The Zenith Z-Note notebook computer has a built-in network
-         (Ethernet) card, and this is the Linux driver for it. Note that the
-         IBM Thinkpad 300 is compatible with the Z-Note and is also supported
-         by this driver. Read the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
 endif # NET_VENDOR_I825XX
index 6adff85e8ecc3bcefe25c3f408e1e3d39c9f8b08..8c8dcd29c40d45e86f6f2a73bebf2c417aadceb2 100644 (file)
@@ -3,15 +3,7 @@
 #
 
 obj-$(CONFIG_ARM_ETHER1) += ether1.o
-obj-$(CONFIG_EEXPRESS) += eexpress.o
-obj-$(CONFIG_EEXPRESS_PRO) += eepro.o
-obj-$(CONFIG_ELPLUS) += 3c505.o
-obj-$(CONFIG_EL16) += 3c507.o
-obj-$(CONFIG_LP486E) += lp486e.o
-obj-$(CONFIG_NI52) += ni52.o
 obj-$(CONFIG_SUN3_82586) += sun3_82586.o
-obj-$(CONFIG_ZNET) += znet.o
-obj-$(CONFIG_APRICOT) += 82596.o
 obj-$(CONFIG_LASI_82596) += lasi_82596.o
 obj-$(CONFIG_SNI_82596) += sni_82596.o
 obj-$(CONFIG_MVME16x_NET) += 82596.o
diff --git a/drivers/net/ethernet/i825xx/eepro.c b/drivers/net/ethernet/i825xx/eepro.c
deleted file mode 100644 (file)
index 7f49fd5..0000000
+++ /dev/null
@@ -1,1822 +0,0 @@
-/* eepro.c: Intel EtherExpress Pro/10 device driver for Linux. */
-/*
-       Written 1994, 1995,1996 by Bao C. Ha.
-
-       Copyright (C) 1994, 1995,1996 by Bao C. Ha.
-
-       This software may be used and distributed
-       according to the terms of the GNU General Public License,
-       incorporated herein by reference.
-
-       The author may be reached at bao.ha@srs.gov
-       or 418 Hastings Place, Martinez, GA 30907.
-
-       Things remaining to do:
-       Better record keeping of errors.
-       Eliminate transmit interrupt to reduce overhead.
-       Implement "concurrent processing". I won't be doing it!
-
-       Bugs:
-
-       If you have a problem of not detecting the 82595 during a
-       reboot (warm reset), disable the FLASH memory should fix it.
-       This is a compatibility hardware problem.
-
-       Versions:
-       0.13b   basic ethtool support (aris, 09/13/2004)
-       0.13a   in memory shortage, drop packets also in board
-               (Michael Westermann <mw@microdata-pos.de>, 07/30/2002)
-       0.13    irq sharing, rewrote probe function, fixed a nasty bug in
-               hardware_send_packet and a major cleanup (aris, 11/08/2001)
-       0.12d   fixing a problem with single card detected as eight eth devices
-               fixing a problem with sudden drop in card performance
-               (chris (asdn@go2.pl), 10/29/2001)
-       0.12c   fixing some problems with old cards (aris, 01/08/2001)
-       0.12b   misc fixes (aris, 06/26/2000)
-       0.12a   port of version 0.12a of 2.2.x kernels to 2.3.x
-               (aris (aris@conectiva.com.br), 05/19/2000)
-       0.11e   some tweaks about multiple cards support (PdP, jul/aug 1999)
-       0.11d   added __initdata, __init stuff; call spin_lock_init
-               in eepro_probe1. Replaced "eepro" by dev->name. Augmented
-               the code protected by spin_lock in interrupt routine
-               (PdP, 12/12/1998)
-       0.11c   minor cleanup (PdP, RMC, 09/12/1998)
-       0.11b   Pascal Dupuis (dupuis@lei.ucl.ac.be): works as a module
-               under 2.1.xx. Debug messages are flagged as KERN_DEBUG to
-               avoid console flooding. Added locking at critical parts. Now
-               the dawn thing is SMP safe.
-       0.11a   Attempt to get 2.1.xx support up (RMC)
-       0.11    Brian Candler added support for multiple cards. Tested as
-               a module, no idea if it works when compiled into kernel.
-
-       0.10e   Rick Bressler notified me that ifconfig up;ifconfig down fails
-               because the irq is lost somewhere. Fixed that by moving
-               request_irq and free_irq to eepro_open and eepro_close respectively.
-       0.10d   Ugh! Now Wakeup works. Was seriously broken in my first attempt.
-               I'll need to find a way to specify an ioport other than
-               the default one in the PnP case. PnP definitively sucks.
-               And, yes, this is not the only reason.
-       0.10c   PnP Wakeup Test for 595FX. uncomment #define PnPWakeup;
-               to use.
-       0.10b   Should work now with (some) Pro/10+. At least for
-               me (and my two cards) it does. _No_ guarantee for
-               function with non-Pro/10+ cards! (don't have any)
-               (RMC, 9/11/96)
-
-       0.10    Added support for the Etherexpress Pro/10+.  The
-               IRQ map was changed significantly from the old
-               pro/10.  The new interrupt map was provided by
-               Rainer M. Canavan (Canavan@Zeus.cs.bonn.edu).
-               (BCH, 9/3/96)
-
-       0.09    Fixed a race condition in the transmit algorithm,
-               which causes crashes under heavy load with fast
-               pentium computers.  The performance should also
-               improve a bit.  The size of RX buffer, and hence
-               TX buffer, can also be changed via lilo or insmod.
-               (BCH, 7/31/96)
-
-       0.08    Implement 32-bit I/O for the 82595TX and 82595FX
-               based lan cards.  Disable full-duplex mode if TPE
-               is not used.  (BCH, 4/8/96)
-
-       0.07a   Fix a stat report which counts every packet as a
-               heart-beat failure. (BCH, 6/3/95)
-
-       0.07    Modified to support all other 82595-based lan cards.
-               The IRQ vector of the EtherExpress Pro will be set
-               according to the value saved in the EEPROM.  For other
-               cards, I will do autoirq_request() to grab the next
-               available interrupt vector. (BCH, 3/17/95)
-
-       0.06a,b Interim released.  Minor changes in the comments and
-               print out format. (BCH, 3/9/95 and 3/14/95)
-
-       0.06    First stable release that I am comfortable with. (BCH,
-               3/2/95)
-
-       0.05    Complete testing of multicast. (BCH, 2/23/95)
-
-       0.04    Adding multicast support. (BCH, 2/14/95)
-
-       0.03    First widely alpha release for public testing.
-               (BCH, 2/14/95)
-
-*/
-
-static const char version[] =
-       "eepro.c: v0.13b 09/13/2004 aris@cathedrallabs.org\n";
-
-#include <linux/module.h>
-
-/*
-  Sources:
-
-       This driver wouldn't have been written without the availability
-       of the Crynwr's Lan595 driver source code.  It helps me to
-       familiarize with the 82595 chipset while waiting for the Intel
-       documentation.  I also learned how to detect the 82595 using
-       the packet driver's technique.
-
-       This driver is written by cutting and pasting the skeleton.c driver
-       provided by Donald Becker.  I also borrowed the EEPROM routine from
-       Donald Becker's 82586 driver.
-
-       Datasheet for the Intel 82595 (including the TX and FX version). It
-       provides just enough info that the casual reader might think that it
-       documents the i82595.
-
-       The User Manual for the 82595.  It provides a lot of the missing
-       information.
-
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/spinlock.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/bitops.h>
-#include <linux/ethtool.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#define DRV_NAME "eepro"
-#define DRV_VERSION "0.13c"
-
-#define compat_dev_kfree_skb( skb, mode ) dev_kfree_skb( (skb) )
-/* I had reports of looong delays with SLOW_DOWN defined as udelay(2) */
-#define SLOW_DOWN inb(0x80)
-/* udelay(2) */
-#define compat_init_data     __initdata
-enum iftype { AUI=0, BNC=1, TPE=2 };
-
-/* First, a few definitions that the brave might change. */
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int eepro_portlist[] compat_init_data =
-   { 0x300, 0x210, 0x240, 0x280, 0x2C0, 0x200, 0x320, 0x340, 0x360, 0};
-/* note: 0x300 is default, the 595FX supports ALL IO Ports
-  from 0x000 to 0x3F0, some of which are reserved in PCs */
-
-/* To try the (not-really PnP Wakeup: */
-/*
-#define PnPWakeup
-*/
-
-/* use 0 for production, 1 for verification, >2 for debug */
-#ifndef NET_DEBUG
-#define NET_DEBUG 0
-#endif
-static unsigned int net_debug = NET_DEBUG;
-
-/* The number of low I/O ports used by the ethercard. */
-#define EEPRO_IO_EXTENT        16
-
-/* Different 82595 chips */
-#define        LAN595          0
-#define        LAN595TX        1
-#define        LAN595FX        2
-#define        LAN595FX_10ISA  3
-
-/* Information that need to be kept for each board. */
-struct eepro_local {
-       unsigned rx_start;
-       unsigned tx_start; /* start of the transmit chain */
-       int tx_last;  /* pointer to last packet in the transmit chain */
-       unsigned tx_end;   /* end of the transmit chain (plus 1) */
-       int eepro;      /* 1 for the EtherExpress Pro/10,
-                          2 for the EtherExpress Pro/10+,
-                          3 for the EtherExpress 10 (blue cards),
-                          0 for other 82595-based lan cards. */
-       int version;    /* a flag to indicate if this is a TX or FX
-                                  version of the 82595 chip. */
-       int stepping;
-
-       spinlock_t lock; /* Serializing lock  */
-
-       unsigned rcv_ram;       /* pre-calculated space for rx */
-       unsigned xmt_ram;       /* pre-calculated space for tx */
-       unsigned char xmt_bar;
-       unsigned char xmt_lower_limit_reg;
-       unsigned char xmt_upper_limit_reg;
-       short xmt_lower_limit;
-       short xmt_upper_limit;
-       short rcv_lower_limit;
-       short rcv_upper_limit;
-       unsigned char eeprom_reg;
-       unsigned short word[8];
-};
-
-/* The station (ethernet) address prefix, used for IDing the board. */
-#define SA_ADDR0 0x00  /* Etherexpress Pro/10 */
-#define SA_ADDR1 0xaa
-#define SA_ADDR2 0x00
-
-#define GetBit(x,y) ((x & (1<<y))>>y)
-
-/* EEPROM Word 0: */
-#define ee_PnP       0  /* Plug 'n Play enable bit */
-#define ee_Word1     1  /* Word 1? */
-#define ee_BusWidth  2  /* 8/16 bit */
-#define ee_FlashAddr 3  /* Flash Address */
-#define ee_FlashMask 0x7   /* Mask */
-#define ee_AutoIO    6  /* */
-#define ee_reserved0 7  /* =0! */
-#define ee_Flash     8  /* Flash there? */
-#define ee_AutoNeg   9  /* Auto Negotiation enabled? */
-#define ee_IO0       10 /* IO Address LSB */
-#define ee_IO0Mask   0x /*...*/
-#define ee_IO1       15 /* IO MSB */
-
-/* EEPROM Word 1: */
-#define ee_IntSel    0   /* Interrupt */
-#define ee_IntMask   0x7
-#define ee_LI        3   /* Link Integrity 0= enabled */
-#define ee_PC        4   /* Polarity Correction 0= enabled */
-#define ee_TPE_AUI   5   /* PortSelection 1=TPE */
-#define ee_Jabber    6   /* Jabber prevention 0= enabled */
-#define ee_AutoPort  7   /* Auto Port Selection 1= Disabled */
-#define ee_SMOUT     8   /* SMout Pin Control 0= Input */
-#define ee_PROM      9   /* Flash EPROM / PROM 0=Flash */
-#define ee_reserved1 10  /* .. 12 =0! */
-#define ee_AltReady  13  /* Alternate Ready, 0=normal */
-#define ee_reserved2 14  /* =0! */
-#define ee_Duplex    15
-
-/* Word2,3,4: */
-#define ee_IA5       0 /*bit start for individual Addr Byte 5 */
-#define ee_IA4       8 /*bit start for individual Addr Byte 5 */
-#define ee_IA3       0 /*bit start for individual Addr Byte 5 */
-#define ee_IA2       8 /*bit start for individual Addr Byte 5 */
-#define ee_IA1       0 /*bit start for individual Addr Byte 5 */
-#define ee_IA0       8 /*bit start for individual Addr Byte 5 */
-
-/* Word 5: */
-#define ee_BNC_TPE   0 /* 0=TPE */
-#define ee_BootType  1 /* 00=None, 01=IPX, 10=ODI, 11=NDIS */
-#define ee_BootTypeMask 0x3
-#define ee_NumConn   3  /* Number of Connections 0= One or Two */
-#define ee_FlashSock 4  /* Presence of Flash Socket 0= Present */
-#define ee_PortTPE   5
-#define ee_PortBNC   6
-#define ee_PortAUI   7
-#define ee_PowerMgt  10 /* 0= disabled */
-#define ee_CP        13 /* Concurrent Processing */
-#define ee_CPMask    0x7
-
-/* Word 6: */
-#define ee_Stepping  0 /* Stepping info */
-#define ee_StepMask  0x0F
-#define ee_BoardID   4 /* Manucaturer Board ID, reserved */
-#define ee_BoardMask 0x0FFF
-
-/* Word 7: */
-#define ee_INT_TO_IRQ 0 /* int to IRQ Mapping  = 0x1EB8 for Pro/10+ */
-#define ee_FX_INT2IRQ 0x1EB8 /* the _only_ mapping allowed for FX chips */
-
-/*..*/
-#define ee_SIZE 0x40 /* total EEprom Size */
-#define ee_Checksum 0xBABA /* initial and final value for adding checksum */
-
-
-/* Card identification via EEprom:   */
-#define ee_addr_vendor 0x10  /* Word offset for EISA Vendor ID */
-#define ee_addr_id 0x11      /* Word offset for Card ID */
-#define ee_addr_SN 0x12      /* Serial Number */
-#define ee_addr_CRC_8 0x14   /* CRC over last thee Bytes */
-
-
-#define ee_vendor_intel0 0x25  /* Vendor ID Intel */
-#define ee_vendor_intel1 0xD4
-#define ee_id_eepro10p0 0x10   /* ID for eepro/10+ */
-#define ee_id_eepro10p1 0x31
-
-#define TX_TIMEOUT ((4*HZ)/10)
-
-/* Index to functions, as function prototypes. */
-
-static int     eepro_probe1(struct net_device *dev, int autoprobe);
-static int     eepro_open(struct net_device *dev);
-static netdev_tx_t eepro_send_packet(struct sk_buff *skb,
-                                    struct net_device *dev);
-static irqreturn_t eepro_interrupt(int irq, void *dev_id);
-static void    eepro_rx(struct net_device *dev);
-static void    eepro_transmit_interrupt(struct net_device *dev);
-static int     eepro_close(struct net_device *dev);
-static void     set_multicast_list(struct net_device *dev);
-static void     eepro_tx_timeout (struct net_device *dev);
-
-static int read_eeprom(int ioaddr, int location, struct net_device *dev);
-static int     hardware_send_packet(struct net_device *dev, void *buf, short length);
-static int     eepro_grab_irq(struct net_device *dev);
-
-/*
-                       Details of the i82595.
-
-You will need either the datasheet or the user manual to understand what
-is going on here.  The 82595 is very different from the 82586, 82593.
-
-The receive algorithm in eepro_rx() is just an implementation of the
-RCV ring structure that the Intel 82595 imposes at the hardware level.
-The receive buffer is set at 24K, and the transmit buffer is 8K.  I
-am assuming that the total buffer memory is 32K, which is true for the
-Intel EtherExpress Pro/10.  If it is less than that on a generic card,
-the driver will be broken.
-
-The transmit algorithm in the hardware_send_packet() is similar to the
-one in the eepro_rx().  The transmit buffer is a ring linked list.
-I just queue the next available packet to the end of the list.  In my
-system, the 82595 is so fast that the list seems to always contain a
-single packet.  In other systems with faster computers and more congested
-network traffics, the ring linked list should improve performance by
-allowing up to 8K worth of packets to be queued.
-
-The sizes of the receive and transmit buffers can now be changed via lilo
-or insmod.  Lilo uses the appended line "ether=io,irq,debug,rx-buffer,eth0"
-where rx-buffer is in KB unit.  Modules uses the parameter mem which is
-also in KB unit, for example "insmod io=io-address irq=0 mem=rx-buffer."
-The receive buffer has to be more than 3K or less than 29K.  Otherwise,
-it is reset to the default of 24K, and, hence, 8K for the trasnmit
-buffer (transmit-buffer = 32K - receive-buffer).
-
-*/
-#define RAM_SIZE        0x8000
-
-#define RCV_HEADER      8
-#define RCV_DEFAULT_RAM 0x6000
-
-#define XMT_HEADER      8
-#define XMT_DEFAULT_RAM        (RAM_SIZE - RCV_DEFAULT_RAM)
-
-#define XMT_START_PRO  RCV_DEFAULT_RAM
-#define XMT_START_10   0x0000
-#define RCV_START_PRO  0x0000
-#define RCV_START_10   XMT_DEFAULT_RAM
-
-#define        RCV_DONE        0x0008
-#define        RX_OK           0x2000
-#define        RX_ERROR        0x0d81
-
-#define        TX_DONE_BIT     0x0080
-#define        TX_OK           0x2000
-#define        CHAIN_BIT       0x8000
-#define        XMT_STATUS      0x02
-#define        XMT_CHAIN       0x04
-#define        XMT_COUNT       0x06
-
-#define        BANK0_SELECT    0x00
-#define        BANK1_SELECT    0x40
-#define        BANK2_SELECT    0x80
-
-/* Bank 0 registers */
-#define        COMMAND_REG     0x00    /* Register 0 */
-#define        MC_SETUP        0x03
-#define        XMT_CMD         0x04
-#define        DIAGNOSE_CMD    0x07
-#define        RCV_ENABLE_CMD  0x08
-#define        RCV_DISABLE_CMD 0x0a
-#define        STOP_RCV_CMD    0x0b
-#define        RESET_CMD       0x0e
-#define        POWER_DOWN_CMD  0x18
-#define        RESUME_XMT_CMD  0x1c
-#define        SEL_RESET_CMD   0x1e
-#define        STATUS_REG      0x01    /* Register 1 */
-#define        RX_INT          0x02
-#define        TX_INT          0x04
-#define        EXEC_STATUS     0x30
-#define        ID_REG          0x02    /* Register 2   */
-#define        R_ROBIN_BITS    0xc0    /* round robin counter */
-#define        ID_REG_MASK     0x2c
-#define        ID_REG_SIG      0x24
-#define        AUTO_ENABLE     0x10
-#define        INT_MASK_REG    0x03    /* Register 3   */
-#define        RX_STOP_MASK    0x01
-#define        RX_MASK         0x02
-#define        TX_MASK         0x04
-#define        EXEC_MASK       0x08
-#define        ALL_MASK        0x0f
-#define        IO_32_BIT       0x10
-#define        RCV_BAR         0x04    /* The following are word (16-bit) registers */
-#define        RCV_STOP        0x06
-
-#define        XMT_BAR_PRO     0x0a
-#define        XMT_BAR_10      0x0b
-
-#define        HOST_ADDRESS_REG        0x0c
-#define        IO_PORT         0x0e
-#define        IO_PORT_32_BIT  0x0c
-
-/* Bank 1 registers */
-#define        REG1    0x01
-#define        WORD_WIDTH      0x02
-#define        INT_ENABLE      0x80
-#define INT_NO_REG     0x02
-#define        RCV_LOWER_LIMIT_REG     0x08
-#define        RCV_UPPER_LIMIT_REG     0x09
-
-#define        XMT_LOWER_LIMIT_REG_PRO 0x0a
-#define        XMT_UPPER_LIMIT_REG_PRO 0x0b
-#define        XMT_LOWER_LIMIT_REG_10  0x0b
-#define        XMT_UPPER_LIMIT_REG_10  0x0a
-
-/* Bank 2 registers */
-#define        XMT_Chain_Int   0x20    /* Interrupt at the end of the transmit chain */
-#define        XMT_Chain_ErrStop       0x40 /* Interrupt at the end of the chain even if there are errors */
-#define        RCV_Discard_BadFrame    0x80 /* Throw bad frames away, and continue to receive others */
-#define        REG2            0x02
-#define        PRMSC_Mode      0x01
-#define        Multi_IA        0x20
-#define        REG3            0x03
-#define        TPE_BIT         0x04
-#define        BNC_BIT         0x20
-#define        REG13           0x0d
-#define        FDX             0x00
-#define        A_N_ENABLE      0x02
-
-#define        I_ADD_REG0      0x04
-#define        I_ADD_REG1      0x05
-#define        I_ADD_REG2      0x06
-#define        I_ADD_REG3      0x07
-#define        I_ADD_REG4      0x08
-#define        I_ADD_REG5      0x09
-
-#define        EEPROM_REG_PRO 0x0a
-#define        EEPROM_REG_10  0x0b
-
-#define EESK 0x01
-#define EECS 0x02
-#define EEDI 0x04
-#define EEDO 0x08
-
-/* do a full reset */
-#define eepro_reset(ioaddr) outb(RESET_CMD, ioaddr)
-
-/* do a nice reset */
-#define eepro_sel_reset(ioaddr)        { \
-                                       outb(SEL_RESET_CMD, ioaddr); \
-                                       SLOW_DOWN; \
-                                       SLOW_DOWN; \
-                                       }
-
-/* disable all interrupts */
-#define eepro_dis_int(ioaddr) outb(ALL_MASK, ioaddr + INT_MASK_REG)
-
-/* clear all interrupts */
-#define eepro_clear_int(ioaddr) outb(ALL_MASK, ioaddr + STATUS_REG)
-
-/* enable tx/rx */
-#define eepro_en_int(ioaddr) outb(ALL_MASK & ~(RX_MASK | TX_MASK), \
-                                                       ioaddr + INT_MASK_REG)
-
-/* enable exec event interrupt */
-#define eepro_en_intexec(ioaddr) outb(ALL_MASK & ~(EXEC_MASK), ioaddr + INT_MASK_REG)
-
-/* enable rx */
-#define eepro_en_rx(ioaddr) outb(RCV_ENABLE_CMD, ioaddr)
-
-/* disable rx */
-#define eepro_dis_rx(ioaddr) outb(RCV_DISABLE_CMD, ioaddr)
-
-/* switch bank */
-#define eepro_sw2bank0(ioaddr) outb(BANK0_SELECT, ioaddr)
-#define eepro_sw2bank1(ioaddr) outb(BANK1_SELECT, ioaddr)
-#define eepro_sw2bank2(ioaddr) outb(BANK2_SELECT, ioaddr)
-
-/* enable interrupt line */
-#define eepro_en_intline(ioaddr) outb(inb(ioaddr + REG1) | INT_ENABLE,\
-                               ioaddr + REG1)
-
-/* disable interrupt line */
-#define eepro_dis_intline(ioaddr) outb(inb(ioaddr + REG1) & 0x7f, \
-                               ioaddr + REG1);
-
-/* set diagnose flag */
-#define eepro_diag(ioaddr) outb(DIAGNOSE_CMD, ioaddr)
-
-/* ack for rx int */
-#define eepro_ack_rx(ioaddr) outb (RX_INT, ioaddr + STATUS_REG)
-
-/* ack for tx int */
-#define eepro_ack_tx(ioaddr) outb (TX_INT, ioaddr + STATUS_REG)
-
-/* a complete sel reset */
-#define eepro_complete_selreset(ioaddr) { \
-                                               dev->stats.tx_errors++;\
-                                               eepro_sel_reset(ioaddr);\
-                                               lp->tx_end = \
-                                                       lp->xmt_lower_limit;\
-                                               lp->tx_start = lp->tx_end;\
-                                               lp->tx_last = 0;\
-                                               dev->trans_start = jiffies;\
-                                               netif_wake_queue(dev);\
-                                               eepro_en_rx(ioaddr);\
-                                       }
-
-/* Check for a network adaptor of this type, and return '0' if one exists.
-   If dev->base_addr == 0, probe all likely locations.
-   If dev->base_addr == 1, always return failure.
-   If dev->base_addr == 2, allocate space for the device and return success
-   (detachable devices only).
-   */
-static int __init do_eepro_probe(struct net_device *dev)
-{
-       int i;
-       int base_addr = dev->base_addr;
-       int irq = dev->irq;
-
-#ifdef PnPWakeup
-       /* XXXX for multiple cards should this only be run once? */
-
-       /* Wakeup: */
-       #define WakeupPort 0x279
-       #define WakeupSeq    {0x6A, 0xB5, 0xDA, 0xED, 0xF6, 0xFB, 0x7D, 0xBE,\
-                             0xDF, 0x6F, 0x37, 0x1B, 0x0D, 0x86, 0xC3, 0x61,\
-                             0xB0, 0x58, 0x2C, 0x16, 0x8B, 0x45, 0xA2, 0xD1,\
-                             0xE8, 0x74, 0x3A, 0x9D, 0xCE, 0xE7, 0x73, 0x43}
-
-       {
-               unsigned short int WS[32]=WakeupSeq;
-
-               if (request_region(WakeupPort, 2, "eepro wakeup")) {
-                       if (net_debug>5)
-                               printk(KERN_DEBUG "Waking UP\n");
-
-                       outb_p(0,WakeupPort);
-                       outb_p(0,WakeupPort);
-                       for (i=0; i<32; i++) {
-                               outb_p(WS[i],WakeupPort);
-                               if (net_debug>5) printk(KERN_DEBUG ": %#x ",WS[i]);
-                       }
-
-                       release_region(WakeupPort, 2);
-               } else
-                       printk(KERN_WARNING "PnP wakeup region busy!\n");
-       }
-#endif
-
-       if (base_addr > 0x1ff)          /* Check a single specified location. */
-               return eepro_probe1(dev, 0);
-
-       else if (base_addr != 0)        /* Don't probe at all. */
-               return -ENXIO;
-
-       for (i = 0; eepro_portlist[i]; i++) {
-               dev->base_addr = eepro_portlist[i];
-               dev->irq = irq;
-               if (eepro_probe1(dev, 1) == 0)
-                       return 0;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init eepro_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct eepro_local));
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENODEV);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_eepro_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static void __init printEEPROMInfo(struct net_device *dev)
-{
-       struct eepro_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       unsigned short Word;
-       int i,j;
-
-       j = ee_Checksum;
-       for (i = 0; i < 8; i++)
-               j += lp->word[i];
-       for ( ; i < ee_SIZE; i++)
-               j += read_eeprom(ioaddr, i, dev);
-
-       printk(KERN_DEBUG "Checksum: %#x\n",j&0xffff);
-
-       Word = lp->word[0];
-       printk(KERN_DEBUG "Word0:\n");
-       printk(KERN_DEBUG " Plug 'n Pray: %d\n",GetBit(Word,ee_PnP));
-       printk(KERN_DEBUG " Buswidth: %d\n",(GetBit(Word,ee_BusWidth)+1)*8 );
-       printk(KERN_DEBUG " AutoNegotiation: %d\n",GetBit(Word,ee_AutoNeg));
-       printk(KERN_DEBUG " IO Address: %#x\n", (Word>>ee_IO0)<<4);
-
-       if (net_debug>4)  {
-               Word = lp->word[1];
-               printk(KERN_DEBUG "Word1:\n");
-               printk(KERN_DEBUG " INT: %d\n", Word & ee_IntMask);
-               printk(KERN_DEBUG " LI: %d\n", GetBit(Word,ee_LI));
-               printk(KERN_DEBUG " PC: %d\n", GetBit(Word,ee_PC));
-               printk(KERN_DEBUG " TPE/AUI: %d\n", GetBit(Word,ee_TPE_AUI));
-               printk(KERN_DEBUG " Jabber: %d\n", GetBit(Word,ee_Jabber));
-               printk(KERN_DEBUG " AutoPort: %d\n", !GetBit(Word,ee_AutoPort));
-               printk(KERN_DEBUG " Duplex: %d\n", GetBit(Word,ee_Duplex));
-       }
-
-       Word = lp->word[5];
-       printk(KERN_DEBUG "Word5:\n");
-       printk(KERN_DEBUG " BNC: %d\n",GetBit(Word,ee_BNC_TPE));
-       printk(KERN_DEBUG " NumConnectors: %d\n",GetBit(Word,ee_NumConn));
-       printk(KERN_DEBUG " Has ");
-       if (GetBit(Word,ee_PortTPE)) printk(KERN_DEBUG "TPE ");
-       if (GetBit(Word,ee_PortBNC)) printk(KERN_DEBUG "BNC ");
-       if (GetBit(Word,ee_PortAUI)) printk(KERN_DEBUG "AUI ");
-       printk(KERN_DEBUG "port(s)\n");
-
-       Word = lp->word[6];
-       printk(KERN_DEBUG "Word6:\n");
-       printk(KERN_DEBUG " Stepping: %d\n",Word & ee_StepMask);
-       printk(KERN_DEBUG " BoardID: %d\n",Word>>ee_BoardID);
-
-       Word = lp->word[7];
-       printk(KERN_DEBUG "Word7:\n");
-       printk(KERN_DEBUG " INT to IRQ:\n");
-
-       for (i=0, j=0; i<15; i++)
-               if (GetBit(Word,i)) printk(KERN_DEBUG " INT%d -> IRQ %d;",j++,i);
-
-       printk(KERN_DEBUG "\n");
-}
-
-/* function to recalculate the limits of buffer based on rcv_ram */
-static void eepro_recalc (struct net_device *dev)
-{
-       struct eepro_local *    lp;
-
-       lp = netdev_priv(dev);
-       lp->xmt_ram = RAM_SIZE - lp->rcv_ram;
-
-       if (lp->eepro == LAN595FX_10ISA) {
-               lp->xmt_lower_limit = XMT_START_10;
-               lp->xmt_upper_limit = (lp->xmt_ram - 2);
-               lp->rcv_lower_limit = lp->xmt_ram;
-               lp->rcv_upper_limit = (RAM_SIZE - 2);
-       }
-       else {
-               lp->rcv_lower_limit = RCV_START_PRO;
-               lp->rcv_upper_limit = (lp->rcv_ram - 2);
-               lp->xmt_lower_limit = lp->rcv_ram;
-               lp->xmt_upper_limit = (RAM_SIZE - 2);
-       }
-}
-
-/* prints boot-time info */
-static void __init eepro_print_info (struct net_device *dev)
-{
-       struct eepro_local *    lp = netdev_priv(dev);
-       int                     i;
-       const char *            ifmap[] = {"AUI", "10Base2", "10BaseT"};
-
-       i = inb(dev->base_addr + ID_REG);
-       printk(KERN_DEBUG " id: %#x ",i);
-       printk(" io: %#x ", (unsigned)dev->base_addr);
-
-       switch (lp->eepro) {
-               case LAN595FX_10ISA:
-                       printk("%s: Intel EtherExpress 10 ISA\n at %#x,",
-                                       dev->name, (unsigned)dev->base_addr);
-                       break;
-               case LAN595FX:
-                       printk("%s: Intel EtherExpress Pro/10+ ISA\n at %#x,",
-                                       dev->name, (unsigned)dev->base_addr);
-                       break;
-               case LAN595TX:
-                       printk("%s: Intel EtherExpress Pro/10 ISA at %#x,",
-                                       dev->name, (unsigned)dev->base_addr);
-                       break;
-               case LAN595:
-                       printk("%s: Intel 82595-based lan card at %#x,",
-                                       dev->name, (unsigned)dev->base_addr);
-                       break;
-       }
-
-       printk(" %pM", dev->dev_addr);
-
-       if (net_debug > 3)
-               printk(KERN_DEBUG ", %dK RCV buffer",
-                               (int)(lp->rcv_ram)/1024);
-
-       if (dev->irq > 2)
-               printk(", IRQ %d, %s.\n", dev->irq, ifmap[dev->if_port]);
-       else
-               printk(", %s.\n", ifmap[dev->if_port]);
-
-       if (net_debug > 3) {
-               i = lp->word[5];
-               if (i & 0x2000) /* bit 13 of EEPROM word 5 */
-                       printk(KERN_DEBUG "%s: Concurrent Processing is "
-                               "enabled but not used!\n", dev->name);
-       }
-
-       /* Check the station address for the manufacturer's code */
-       if (net_debug>3)
-               printEEPROMInfo(dev);
-}
-
-static const struct ethtool_ops eepro_ethtool_ops;
-
-static const struct net_device_ops eepro_netdev_ops = {
-       .ndo_open               = eepro_open,
-       .ndo_stop               = eepro_close,
-       .ndo_start_xmit         = eepro_send_packet,
-       .ndo_set_rx_mode        = set_multicast_list,
-       .ndo_tx_timeout         = eepro_tx_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-/* This is the real probe routine.  Linux has a history of friendly device
-   probes on the ISA bus.  A good device probe avoids doing writes, and
-   verifies that the correct device exists and functions.  */
-
-static int __init eepro_probe1(struct net_device *dev, int autoprobe)
-{
-       unsigned short station_addr[3], id, counter;
-       int i;
-       struct eepro_local *lp;
-       int ioaddr = dev->base_addr;
-       int err;
-
-       /* Grab the region so we can find another board if autoIRQ fails. */
-       if (!request_region(ioaddr, EEPRO_IO_EXTENT, DRV_NAME)) {
-               if (!autoprobe)
-                       printk(KERN_WARNING "EEPRO: io-port 0x%04x in use\n",
-                               ioaddr);
-               return -EBUSY;
-       }
-
-       /* Now, we are going to check for the signature of the
-          ID_REG (register 2 of bank 0) */
-
-       id = inb(ioaddr + ID_REG);
-
-       if ((id & ID_REG_MASK) != ID_REG_SIG)
-               goto exit;
-
-       /* We seem to have the 82595 signature, let's
-          play with its counter (last 2 bits of
-          register 2 of bank 0) to be sure. */
-
-       counter = id & R_ROBIN_BITS;
-
-       if ((inb(ioaddr + ID_REG) & R_ROBIN_BITS) != (counter + 0x40))
-               goto exit;
-
-       lp = netdev_priv(dev);
-       memset(lp, 0, sizeof(struct eepro_local));
-       lp->xmt_bar = XMT_BAR_PRO;
-       lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_PRO;
-       lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_PRO;
-       lp->eeprom_reg = EEPROM_REG_PRO;
-       spin_lock_init(&lp->lock);
-
-       /* Now, get the ethernet hardware address from
-          the EEPROM */
-       station_addr[0] = read_eeprom(ioaddr, 2, dev);
-
-       /* FIXME - find another way to know that we've found
-        * an Etherexpress 10
-        */
-       if (station_addr[0] == 0x0000 || station_addr[0] == 0xffff) {
-               lp->eepro = LAN595FX_10ISA;
-               lp->eeprom_reg = EEPROM_REG_10;
-               lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_10;
-               lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_10;
-               lp->xmt_bar = XMT_BAR_10;
-               station_addr[0] = read_eeprom(ioaddr, 2, dev);
-       }
-
-       /* get all words at once. will be used here and for ethtool */
-       for (i = 0; i < 8; i++) {
-               lp->word[i] = read_eeprom(ioaddr, i, dev);
-       }
-       station_addr[1] = lp->word[3];
-       station_addr[2] = lp->word[4];
-
-       if (!lp->eepro) {
-               if (lp->word[7] == ee_FX_INT2IRQ)
-                       lp->eepro = 2;
-               else if (station_addr[2] == SA_ADDR1)
-                       lp->eepro = 1;
-       }
-
-       /* Fill in the 'dev' fields. */
-       for (i=0; i < 6; i++)
-               dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i];
-
-       /* RX buffer must be more than 3K and less than 29K */
-       if (dev->mem_end < 3072 || dev->mem_end > 29696)
-               lp->rcv_ram = RCV_DEFAULT_RAM;
-
-       /* calculate {xmt,rcv}_{lower,upper}_limit */
-       eepro_recalc(dev);
-
-       if (GetBit(lp->word[5], ee_BNC_TPE))
-               dev->if_port = BNC;
-       else
-               dev->if_port = TPE;
-
-       if (dev->irq < 2 && lp->eepro != 0) {
-               /* Mask off INT number */
-               int count = lp->word[1] & 7;
-               unsigned irqMask = lp->word[7];
-
-               while (count--)
-                       irqMask &= irqMask - 1;
-
-               count = ffs(irqMask);
-
-               if (count)
-                       dev->irq = count - 1;
-
-               if (dev->irq < 2) {
-                       printk(KERN_ERR " Duh! illegal interrupt vector stored in EEPROM.\n");
-                       goto exit;
-               } else if (dev->irq == 2) {
-                       dev->irq = 9;
-               }
-       }
-
-       dev->netdev_ops         = &eepro_netdev_ops;
-       dev->watchdog_timeo     = TX_TIMEOUT;
-       dev->ethtool_ops        = &eepro_ethtool_ops;
-
-       /* print boot time info */
-       eepro_print_info(dev);
-
-       /* reset 82595 */
-       eepro_reset(ioaddr);
-
-       err = register_netdev(dev);
-       if (err)
-               goto err;
-       return 0;
-exit:
-       err = -ENODEV;
-err:
-       release_region(dev->base_addr, EEPRO_IO_EXTENT);
-       return err;
-}
-
-/* Open/initialize the board.  This is called (in the current kernel)
-   sometime after booting when the 'ifconfig' program is run.
-
-   This routine should set everything up anew at each open, even
-   registers that "should" only need to be set once at boot, so that
-   there is non-reboot way to recover if something goes wrong.
-   */
-
-static const char irqrmap[] = {-1,-1,0,1,-1,2,-1,-1,-1,0,3,4,-1,-1,-1,-1};
-static const char irqrmap2[] = {-1,-1,4,0,1,2,-1,3,-1,4,5,6,7,-1,-1,-1};
-static int     eepro_grab_irq(struct net_device *dev)
-{
-       static const int irqlist[] = { 3, 4, 5, 7, 9, 10, 11, 12, 0 };
-       const int *irqp = irqlist;
-       int temp_reg, ioaddr = dev->base_addr;
-
-       eepro_sw2bank1(ioaddr); /* be CAREFUL, BANK 1 now */
-
-       /* Enable the interrupt line. */
-       eepro_en_intline(ioaddr);
-
-       /* be CAREFUL, BANK 0 now */
-       eepro_sw2bank0(ioaddr);
-
-       /* clear all interrupts */
-       eepro_clear_int(ioaddr);
-
-       /* Let EXEC event to interrupt */
-       eepro_en_intexec(ioaddr);
-
-       do {
-               eepro_sw2bank1(ioaddr); /* be CAREFUL, BANK 1 now */
-
-               temp_reg = inb(ioaddr + INT_NO_REG);
-               outb((temp_reg & 0xf8) | irqrmap[*irqp], ioaddr + INT_NO_REG);
-
-               eepro_sw2bank0(ioaddr); /* Switch back to Bank 0 */
-
-               if (request_irq (*irqp, NULL, IRQF_SHARED, "bogus", dev) != EBUSY) {
-                       unsigned long irq_mask;
-                       /* Twinkle the interrupt, and check if it's seen */
-                       irq_mask = probe_irq_on();
-
-                       eepro_diag(ioaddr); /* RESET the 82595 */
-                       mdelay(20);
-
-                       if (*irqp == probe_irq_off(irq_mask))  /* It's a good IRQ line */
-                               break;
-
-                       /* clear all interrupts */
-                       eepro_clear_int(ioaddr);
-               }
-       } while (*++irqp);
-
-       eepro_sw2bank1(ioaddr); /* Switch back to Bank 1 */
-
-       /* Disable the physical interrupt line. */
-       eepro_dis_intline(ioaddr);
-
-       eepro_sw2bank0(ioaddr); /* Switch back to Bank 0 */
-
-       /* Mask all the interrupts. */
-       eepro_dis_int(ioaddr);
-
-       /* clear all interrupts */
-       eepro_clear_int(ioaddr);
-
-       return dev->irq;
-}
-
-static int eepro_open(struct net_device *dev)
-{
-       unsigned short temp_reg, old8, old9;
-       int irqMask;
-       int i, ioaddr = dev->base_addr;
-       struct eepro_local *lp = netdev_priv(dev);
-
-       if (net_debug > 3)
-               printk(KERN_DEBUG "%s: entering eepro_open routine.\n", dev->name);
-
-       irqMask = lp->word[7];
-
-       if (lp->eepro == LAN595FX_10ISA) {
-               if (net_debug > 3) printk(KERN_DEBUG "p->eepro = 3;\n");
-       }
-       else if (irqMask == ee_FX_INT2IRQ) /* INT to IRQ Mask */
-               {
-                       lp->eepro = 2; /* Yes, an Intel EtherExpress Pro/10+ */
-                       if (net_debug > 3) printk(KERN_DEBUG "p->eepro = 2;\n");
-               }
-
-       else if ((dev->dev_addr[0] == SA_ADDR0 &&
-                       dev->dev_addr[1] == SA_ADDR1 &&
-                       dev->dev_addr[2] == SA_ADDR2))
-               {
-                       lp->eepro = 1;
-                       if (net_debug > 3) printk(KERN_DEBUG "p->eepro = 1;\n");
-               }  /* Yes, an Intel EtherExpress Pro/10 */
-
-       else lp->eepro = 0; /* No, it is a generic 82585 lan card */
-
-       /* Get the interrupt vector for the 82595 */
-       if (dev->irq < 2 && eepro_grab_irq(dev) == 0) {
-               printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq);
-               return -EAGAIN;
-       }
-
-       if (request_irq(dev->irq , eepro_interrupt, 0, dev->name, dev)) {
-               printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq);
-               return -EAGAIN;
-       }
-
-       /* Initialize the 82595. */
-
-       eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */
-       temp_reg = inb(ioaddr + lp->eeprom_reg);
-
-       lp->stepping = temp_reg >> 5;   /* Get the stepping number of the 595 */
-
-       if (net_debug > 3)
-               printk(KERN_DEBUG "The stepping of the 82595 is %d\n", lp->stepping);
-
-       if (temp_reg & 0x10) /* Check the TurnOff Enable bit */
-               outb(temp_reg & 0xef, ioaddr + lp->eeprom_reg);
-       for (i=0; i < 6; i++)
-               outb(dev->dev_addr[i] , ioaddr + I_ADD_REG0 + i);
-
-       temp_reg = inb(ioaddr + REG1);    /* Setup Transmit Chaining */
-       outb(temp_reg | XMT_Chain_Int | XMT_Chain_ErrStop /* and discard bad RCV frames */
-               | RCV_Discard_BadFrame, ioaddr + REG1);
-
-       temp_reg = inb(ioaddr + REG2); /* Match broadcast */
-       outb(temp_reg | 0x14, ioaddr + REG2);
-
-       temp_reg = inb(ioaddr + REG3);
-       outb(temp_reg & 0x3f, ioaddr + REG3); /* clear test mode */
-
-       /* Set the receiving mode */
-       eepro_sw2bank1(ioaddr); /* be CAREFUL, BANK 1 now */
-
-       /* Set the interrupt vector */
-       temp_reg = inb(ioaddr + INT_NO_REG);
-       if (lp->eepro == LAN595FX || lp->eepro == LAN595FX_10ISA)
-               outb((temp_reg & 0xf8) | irqrmap2[dev->irq], ioaddr + INT_NO_REG);
-       else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG);
-
-
-       temp_reg = inb(ioaddr + INT_NO_REG);
-       if (lp->eepro == LAN595FX || lp->eepro == LAN595FX_10ISA)
-               outb((temp_reg & 0xf0) | irqrmap2[dev->irq] | 0x08,ioaddr+INT_NO_REG);
-       else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG);
-
-       if (net_debug > 3)
-               printk(KERN_DEBUG "eepro_open: content of INT Reg is %x\n", temp_reg);
-
-
-       /* Initialize the RCV and XMT upper and lower limits */
-       outb(lp->rcv_lower_limit >> 8, ioaddr + RCV_LOWER_LIMIT_REG);
-       outb(lp->rcv_upper_limit >> 8, ioaddr + RCV_UPPER_LIMIT_REG);
-       outb(lp->xmt_lower_limit >> 8, ioaddr + lp->xmt_lower_limit_reg);
-       outb(lp->xmt_upper_limit >> 8, ioaddr + lp->xmt_upper_limit_reg);
-
-       /* Enable the interrupt line. */
-       eepro_en_intline(ioaddr);
-
-       /* Switch back to Bank 0 */
-       eepro_sw2bank0(ioaddr);
-
-       /* Let RX and TX events to interrupt */
-       eepro_en_int(ioaddr);
-
-       /* clear all interrupts */
-       eepro_clear_int(ioaddr);
-
-       /* Initialize RCV */
-       outw(lp->rcv_lower_limit, ioaddr + RCV_BAR);
-       lp->rx_start = lp->rcv_lower_limit;
-       outw(lp->rcv_upper_limit | 0xfe, ioaddr + RCV_STOP);
-
-       /* Initialize XMT */
-       outw(lp->xmt_lower_limit, ioaddr + lp->xmt_bar);
-       lp->tx_start = lp->tx_end = lp->xmt_lower_limit;
-       lp->tx_last = 0;
-
-       /* Check for the i82595TX and i82595FX */
-       old8 = inb(ioaddr + 8);
-       outb(~old8, ioaddr + 8);
-
-       if ((temp_reg = inb(ioaddr + 8)) == old8) {
-               if (net_debug > 3)
-                       printk(KERN_DEBUG "i82595 detected!\n");
-               lp->version = LAN595;
-       }
-       else {
-               lp->version = LAN595TX;
-               outb(old8, ioaddr + 8);
-               old9 = inb(ioaddr + 9);
-
-               if (irqMask==ee_FX_INT2IRQ) {
-                       if (net_debug > 3) {
-                               printk(KERN_DEBUG "IrqMask: %#x\n",irqMask);
-                               printk(KERN_DEBUG "i82595FX detected!\n");
-                       }
-                       lp->version = LAN595FX;
-                       outb(old9, ioaddr + 9);
-                       if (dev->if_port != TPE) {      /* Hopefully, this will fix the
-                                                       problem of using Pentiums and
-                                                       pro/10 w/ BNC. */
-                               eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */
-                               temp_reg = inb(ioaddr + REG13);
-                               /* disable the full duplex mode since it is not
-                               applicable with the 10Base2 cable. */
-                               outb(temp_reg & ~(FDX | A_N_ENABLE), REG13);
-                               eepro_sw2bank0(ioaddr); /* be CAREFUL, BANK 0 now */
-                       }
-               }
-               else if (net_debug > 3) {
-                       printk(KERN_DEBUG "temp_reg: %#x  ~old9: %#x\n",temp_reg,((~old9)&0xff));
-                       printk(KERN_DEBUG "i82595TX detected!\n");
-               }
-       }
-
-       eepro_sel_reset(ioaddr);
-
-       netif_start_queue(dev);
-
-       if (net_debug > 3)
-               printk(KERN_DEBUG "%s: exiting eepro_open routine.\n", dev->name);
-
-       /* enabling rx */
-       eepro_en_rx(ioaddr);
-
-       return 0;
-}
-
-static void eepro_tx_timeout (struct net_device *dev)
-{
-       struct eepro_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       /* if (net_debug > 1) */
-       printk (KERN_ERR "%s: transmit timed out, %s?\n", dev->name,
-               "network cable problem");
-       /* This is not a duplicate. One message for the console,
-          one for the log file  */
-       printk (KERN_DEBUG "%s: transmit timed out, %s?\n", dev->name,
-               "network cable problem");
-       eepro_complete_selreset(ioaddr);
-}
-
-
-static netdev_tx_t eepro_send_packet(struct sk_buff *skb,
-                                    struct net_device *dev)
-{
-       struct eepro_local *lp = netdev_priv(dev);
-       unsigned long flags;
-       int ioaddr = dev->base_addr;
-       short length = skb->len;
-
-       if (net_debug > 5)
-               printk(KERN_DEBUG  "%s: entering eepro_send_packet routine.\n", dev->name);
-
-       if (length < ETH_ZLEN) {
-               if (skb_padto(skb, ETH_ZLEN))
-                       return NETDEV_TX_OK;
-               length = ETH_ZLEN;
-       }
-       netif_stop_queue (dev);
-
-       eepro_dis_int(ioaddr);
-       spin_lock_irqsave(&lp->lock, flags);
-
-       {
-               unsigned char *buf = skb->data;
-
-               if (hardware_send_packet(dev, buf, length))
-                       /* we won't wake queue here because we're out of space */
-                       dev->stats.tx_dropped++;
-               else {
-                       dev->stats.tx_bytes+=skb->len;
-                       netif_wake_queue(dev);
-               }
-
-       }
-
-       dev_kfree_skb (skb);
-
-       /* You might need to clean up and record Tx statistics here. */
-       /* dev->stats.tx_aborted_errors++; */
-
-       if (net_debug > 5)
-               printk(KERN_DEBUG "%s: exiting eepro_send_packet routine.\n", dev->name);
-
-       eepro_en_int(ioaddr);
-       spin_unlock_irqrestore(&lp->lock, flags);
-
-       return NETDEV_TX_OK;
-}
-
-
-/*     The typical workload of the driver:
-       Handle the network interface interrupts. */
-
-static irqreturn_t
-eepro_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct eepro_local *lp;
-       int ioaddr, status, boguscount = 20;
-       int handled = 0;
-
-       lp = netdev_priv(dev);
-
-        spin_lock(&lp->lock);
-
-       if (net_debug > 5)
-               printk(KERN_DEBUG "%s: entering eepro_interrupt routine.\n", dev->name);
-
-       ioaddr = dev->base_addr;
-
-       while (((status = inb(ioaddr + STATUS_REG)) & (RX_INT|TX_INT)) && (boguscount--))
-       {
-               handled = 1;
-               if (status & RX_INT) {
-                       if (net_debug > 4)
-                               printk(KERN_DEBUG "%s: packet received interrupt.\n", dev->name);
-
-                       eepro_dis_int(ioaddr);
-
-                       /* Get the received packets */
-                       eepro_ack_rx(ioaddr);
-                       eepro_rx(dev);
-
-                       eepro_en_int(ioaddr);
-               }
-               if (status & TX_INT) {
-                       if (net_debug > 4)
-                               printk(KERN_DEBUG "%s: packet transmit interrupt.\n", dev->name);
-
-
-                       eepro_dis_int(ioaddr);
-
-                       /* Process the status of transmitted packets */
-                       eepro_ack_tx(ioaddr);
-                       eepro_transmit_interrupt(dev);
-
-                       eepro_en_int(ioaddr);
-               }
-       }
-
-       if (net_debug > 5)
-               printk(KERN_DEBUG "%s: exiting eepro_interrupt routine.\n", dev->name);
-
-       spin_unlock(&lp->lock);
-       return IRQ_RETVAL(handled);
-}
-
-static int eepro_close(struct net_device *dev)
-{
-       struct eepro_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       short temp_reg;
-
-       netif_stop_queue(dev);
-
-       eepro_sw2bank1(ioaddr); /* Switch back to Bank 1 */
-
-       /* Disable the physical interrupt line. */
-       temp_reg = inb(ioaddr + REG1);
-       outb(temp_reg & 0x7f, ioaddr + REG1);
-
-       eepro_sw2bank0(ioaddr); /* Switch back to Bank 0 */
-
-       /* Flush the Tx and disable Rx. */
-       outb(STOP_RCV_CMD, ioaddr);
-       lp->tx_start = lp->tx_end = lp->xmt_lower_limit;
-       lp->tx_last = 0;
-
-       /* Mask all the interrupts. */
-       eepro_dis_int(ioaddr);
-
-       /* clear all interrupts */
-       eepro_clear_int(ioaddr);
-
-       /* Reset the 82595 */
-       eepro_reset(ioaddr);
-
-       /* release the interrupt */
-       free_irq(dev->irq, dev);
-
-       /* Update the statistics here. What statistics? */
-
-       return 0;
-}
-
-/* Set or clear the multicast filter for this adaptor.
- */
-static void
-set_multicast_list(struct net_device *dev)
-{
-       struct eepro_local *lp = netdev_priv(dev);
-       short ioaddr = dev->base_addr;
-       unsigned short mode;
-       struct netdev_hw_addr *ha;
-       int mc_count = netdev_mc_count(dev);
-
-       if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || mc_count > 63)
-       {
-               eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */
-               mode = inb(ioaddr + REG2);
-               outb(mode | PRMSC_Mode, ioaddr + REG2);
-               mode = inb(ioaddr + REG3);
-               outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
-               eepro_sw2bank0(ioaddr); /* Return to BANK 0 now */
-       }
-
-       else if (mc_count == 0)
-       {
-               eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */
-               mode = inb(ioaddr + REG2);
-               outb(mode & 0xd6, ioaddr + REG2); /* Turn off Multi-IA and PRMSC_Mode bits */
-               mode = inb(ioaddr + REG3);
-               outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
-               eepro_sw2bank0(ioaddr); /* Return to BANK 0 now */
-       }
-
-       else
-       {
-               unsigned short status, *eaddrs;
-               int i, boguscount = 0;
-
-               /* Disable RX and TX interrupts.  Necessary to avoid
-                  corruption of the HOST_ADDRESS_REG by interrupt
-                  service routines. */
-               eepro_dis_int(ioaddr);
-
-               eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */
-               mode = inb(ioaddr + REG2);
-               outb(mode | Multi_IA, ioaddr + REG2);
-               mode = inb(ioaddr + REG3);
-               outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
-               eepro_sw2bank0(ioaddr); /* Return to BANK 0 now */
-               outw(lp->tx_end, ioaddr + HOST_ADDRESS_REG);
-               outw(MC_SETUP, ioaddr + IO_PORT);
-               outw(0, ioaddr + IO_PORT);
-               outw(0, ioaddr + IO_PORT);
-               outw(6 * (mc_count + 1), ioaddr + IO_PORT);
-
-               netdev_for_each_mc_addr(ha, dev) {
-                       eaddrs = (unsigned short *) ha->addr;
-                       outw(*eaddrs++, ioaddr + IO_PORT);
-                       outw(*eaddrs++, ioaddr + IO_PORT);
-                       outw(*eaddrs++, ioaddr + IO_PORT);
-               }
-
-               eaddrs = (unsigned short *) dev->dev_addr;
-               outw(eaddrs[0], ioaddr + IO_PORT);
-               outw(eaddrs[1], ioaddr + IO_PORT);
-               outw(eaddrs[2], ioaddr + IO_PORT);
-               outw(lp->tx_end, ioaddr + lp->xmt_bar);
-               outb(MC_SETUP, ioaddr);
-
-               /* Update the transmit queue */
-               i = lp->tx_end + XMT_HEADER + 6 * (mc_count + 1);
-
-               if (lp->tx_start != lp->tx_end)
-               {
-                       /* update the next address and the chain bit in the
-                          last packet */
-                       outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG);
-                       outw(i, ioaddr + IO_PORT);
-                       outw(lp->tx_last + XMT_COUNT, ioaddr + HOST_ADDRESS_REG);
-                       status = inw(ioaddr + IO_PORT);
-                       outw(status | CHAIN_BIT, ioaddr + IO_PORT);
-                       lp->tx_end = i ;
-               }
-               else {
-                       lp->tx_start = lp->tx_end = i ;
-               }
-
-               /* Acknowledge that the MC setup is done */
-               do { /* We should be doing this in the eepro_interrupt()! */
-                       SLOW_DOWN;
-                       SLOW_DOWN;
-                       if (inb(ioaddr + STATUS_REG) & 0x08)
-                       {
-                               i = inb(ioaddr);
-                               outb(0x08, ioaddr + STATUS_REG);
-
-                               if (i & 0x20) { /* command ABORTed */
-                                       printk(KERN_NOTICE "%s: multicast setup failed.\n",
-                                               dev->name);
-                                       break;
-                               } else if ((i & 0x0f) == 0x03)  { /* MC-Done */
-                                       printk(KERN_DEBUG "%s: set Rx mode to %d address%s.\n",
-                                               dev->name, mc_count,
-                                               mc_count > 1 ? "es":"");
-                                       break;
-                               }
-                       }
-               } while (++boguscount < 100);
-
-               /* Re-enable RX and TX interrupts */
-               eepro_en_int(ioaddr);
-       }
-       if (lp->eepro == LAN595FX_10ISA) {
-               eepro_complete_selreset(ioaddr);
-       }
-       else
-               eepro_en_rx(ioaddr);
-}
-
-/* The horrible routine to read a word from the serial EEPROM. */
-/* IMPORTANT - the 82595 will be set to Bank 0 after the eeprom is read */
-
-/* The delay between EEPROM clock transitions. */
-#define eeprom_delay() { udelay(40); }
-#define EE_READ_CMD (6 << 6)
-
-static int
-read_eeprom(int ioaddr, int location, struct net_device *dev)
-{
-       int i;
-       unsigned short retval = 0;
-       struct eepro_local *lp = netdev_priv(dev);
-       short ee_addr = ioaddr + lp->eeprom_reg;
-       int read_cmd = location | EE_READ_CMD;
-       short ctrl_val = EECS ;
-
-       /* XXXX - black magic */
-               eepro_sw2bank1(ioaddr);
-               outb(0x00, ioaddr + STATUS_REG);
-       /* XXXX - black magic */
-
-       eepro_sw2bank2(ioaddr);
-       outb(ctrl_val, ee_addr);
-
-       /* Shift the read command bits out. */
-       for (i = 8; i >= 0; i--) {
-               short outval = (read_cmd & (1 << i)) ? ctrl_val | EEDI
-                       : ctrl_val;
-               outb(outval, ee_addr);
-               outb(outval | EESK, ee_addr);   /* EEPROM clock tick. */
-               eeprom_delay();
-               outb(outval, ee_addr);  /* Finish EEPROM a clock tick. */
-               eeprom_delay();
-       }
-       outb(ctrl_val, ee_addr);
-
-       for (i = 16; i > 0; i--) {
-               outb(ctrl_val | EESK, ee_addr);  eeprom_delay();
-               retval = (retval << 1) | ((inb(ee_addr) & EEDO) ? 1 : 0);
-               outb(ctrl_val, ee_addr);  eeprom_delay();
-       }
-
-       /* Terminate the EEPROM access. */
-       ctrl_val &= ~EECS;
-       outb(ctrl_val | EESK, ee_addr);
-       eeprom_delay();
-       outb(ctrl_val, ee_addr);
-       eeprom_delay();
-       eepro_sw2bank0(ioaddr);
-       return retval;
-}
-
-static int
-hardware_send_packet(struct net_device *dev, void *buf, short length)
-{
-       struct eepro_local *lp = netdev_priv(dev);
-       short ioaddr = dev->base_addr;
-       unsigned status, tx_available, last, end;
-
-       if (net_debug > 5)
-               printk(KERN_DEBUG "%s: entering hardware_send_packet routine.\n", dev->name);
-
-       /* determine how much of the transmit buffer space is available */
-       if (lp->tx_end > lp->tx_start)
-               tx_available = lp->xmt_ram - (lp->tx_end - lp->tx_start);
-       else if (lp->tx_end < lp->tx_start)
-               tx_available = lp->tx_start - lp->tx_end;
-       else tx_available = lp->xmt_ram;
-
-       if (((((length + 3) >> 1) << 1) + 2*XMT_HEADER) >= tx_available) {
-               /* No space available ??? */
-               return 1;
-               }
-
-               last = lp->tx_end;
-               end = last + (((length + 3) >> 1) << 1) + XMT_HEADER;
-
-       if (end >= lp->xmt_upper_limit + 2) { /* the transmit buffer is wrapped around */
-               if ((lp->xmt_upper_limit + 2 - last) <= XMT_HEADER) {
-                               /* Arrrr!!!, must keep the xmt header together,
-                               several days were lost to chase this one down. */
-                       last = lp->xmt_lower_limit;
-                               end = last + (((length + 3) >> 1) << 1) + XMT_HEADER;
-                       }
-               else end = lp->xmt_lower_limit + (end -
-                                               lp->xmt_upper_limit + 2);
-               }
-
-               outw(last, ioaddr + HOST_ADDRESS_REG);
-               outw(XMT_CMD, ioaddr + IO_PORT);
-               outw(0, ioaddr + IO_PORT);
-               outw(end, ioaddr + IO_PORT);
-               outw(length, ioaddr + IO_PORT);
-
-               if (lp->version == LAN595)
-                       outsw(ioaddr + IO_PORT, buf, (length + 3) >> 1);
-               else {  /* LAN595TX or LAN595FX, capable of 32-bit I/O processing */
-                       unsigned short temp = inb(ioaddr + INT_MASK_REG);
-                       outb(temp | IO_32_BIT, ioaddr + INT_MASK_REG);
-                       outsl(ioaddr + IO_PORT_32_BIT, buf, (length + 3) >> 2);
-                       outb(temp & ~(IO_32_BIT), ioaddr + INT_MASK_REG);
-               }
-
-               /* A dummy read to flush the DRAM write pipeline */
-               status = inw(ioaddr + IO_PORT);
-
-               if (lp->tx_start == lp->tx_end) {
-               outw(last, ioaddr + lp->xmt_bar);
-                       outb(XMT_CMD, ioaddr);
-                       lp->tx_start = last;   /* I don't like to change tx_start here */
-               }
-               else {
-                       /* update the next address and the chain bit in the
-                       last packet */
-
-                       if (lp->tx_end != last) {
-                               outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG);
-                               outw(last, ioaddr + IO_PORT);
-                       }
-
-                       outw(lp->tx_last + XMT_COUNT, ioaddr + HOST_ADDRESS_REG);
-                       status = inw(ioaddr + IO_PORT);
-                       outw(status | CHAIN_BIT, ioaddr + IO_PORT);
-
-                       /* Continue the transmit command */
-                       outb(RESUME_XMT_CMD, ioaddr);
-               }
-
-               lp->tx_last = last;
-               lp->tx_end = end;
-
-               if (net_debug > 5)
-                       printk(KERN_DEBUG "%s: exiting hardware_send_packet routine.\n", dev->name);
-
-       return 0;
-}
-
-static void
-eepro_rx(struct net_device *dev)
-{
-       struct eepro_local *lp = netdev_priv(dev);
-       short ioaddr = dev->base_addr;
-       short boguscount = 20;
-       short rcv_car = lp->rx_start;
-       unsigned rcv_event, rcv_status, rcv_next_frame, rcv_size;
-
-       if (net_debug > 5)
-               printk(KERN_DEBUG "%s: entering eepro_rx routine.\n", dev->name);
-
-       /* Set the read pointer to the start of the RCV */
-       outw(rcv_car, ioaddr + HOST_ADDRESS_REG);
-
-       rcv_event = inw(ioaddr + IO_PORT);
-
-       while (rcv_event == RCV_DONE) {
-
-               rcv_status = inw(ioaddr + IO_PORT);
-               rcv_next_frame = inw(ioaddr + IO_PORT);
-               rcv_size = inw(ioaddr + IO_PORT);
-
-               if ((rcv_status & (RX_OK | RX_ERROR)) == RX_OK) {
-
-                       /* Malloc up new buffer. */
-                       struct sk_buff *skb;
-
-                       dev->stats.rx_bytes+=rcv_size;
-                       rcv_size &= 0x3fff;
-                       skb = netdev_alloc_skb(dev, rcv_size + 5);
-                       if (skb == NULL) {
-                               printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
-                               dev->stats.rx_dropped++;
-                               rcv_car = lp->rx_start + RCV_HEADER + rcv_size;
-                               lp->rx_start = rcv_next_frame;
-                               outw(rcv_next_frame, ioaddr + HOST_ADDRESS_REG);
-
-                               break;
-                       }
-                       skb_reserve(skb,2);
-
-                       if (lp->version == LAN595)
-                               insw(ioaddr+IO_PORT, skb_put(skb,rcv_size), (rcv_size + 3) >> 1);
-                       else { /* LAN595TX or LAN595FX, capable of 32-bit I/O processing */
-                               unsigned short temp = inb(ioaddr + INT_MASK_REG);
-                               outb(temp | IO_32_BIT, ioaddr + INT_MASK_REG);
-                               insl(ioaddr+IO_PORT_32_BIT, skb_put(skb,rcv_size),
-                                       (rcv_size + 3) >> 2);
-                               outb(temp & ~(IO_32_BIT), ioaddr + INT_MASK_REG);
-                       }
-
-                       skb->protocol = eth_type_trans(skb,dev);
-                       netif_rx(skb);
-                       dev->stats.rx_packets++;
-               }
-
-               else { /* Not sure will ever reach here,
-                       I set the 595 to discard bad received frames */
-                       dev->stats.rx_errors++;
-
-                       if (rcv_status & 0x0100)
-                               dev->stats.rx_over_errors++;
-
-                       else if (rcv_status & 0x0400)
-                               dev->stats.rx_frame_errors++;
-
-                       else if (rcv_status & 0x0800)
-                               dev->stats.rx_crc_errors++;
-
-                       printk(KERN_DEBUG "%s: event = %#x, status = %#x, next = %#x, size = %#x\n",
-                               dev->name, rcv_event, rcv_status, rcv_next_frame, rcv_size);
-               }
-
-               if (rcv_status & 0x1000)
-                       dev->stats.rx_length_errors++;
-
-               rcv_car = lp->rx_start + RCV_HEADER + rcv_size;
-               lp->rx_start = rcv_next_frame;
-
-               if (--boguscount == 0)
-                       break;
-
-               outw(rcv_next_frame, ioaddr + HOST_ADDRESS_REG);
-               rcv_event = inw(ioaddr + IO_PORT);
-
-       }
-       if (rcv_car == 0)
-               rcv_car = lp->rcv_upper_limit | 0xff;
-
-       outw(rcv_car - 1, ioaddr + RCV_STOP);
-
-       if (net_debug > 5)
-               printk(KERN_DEBUG "%s: exiting eepro_rx routine.\n", dev->name);
-}
-
-static void
-eepro_transmit_interrupt(struct net_device *dev)
-{
-       struct eepro_local *lp = netdev_priv(dev);
-       short ioaddr = dev->base_addr;
-       short boguscount = 25;
-       short xmt_status;
-
-       while ((lp->tx_start != lp->tx_end) && boguscount--) {
-
-               outw(lp->tx_start, ioaddr + HOST_ADDRESS_REG);
-               xmt_status = inw(ioaddr+IO_PORT);
-
-               if (!(xmt_status & TX_DONE_BIT))
-                               break;
-
-               xmt_status = inw(ioaddr+IO_PORT);
-               lp->tx_start = inw(ioaddr+IO_PORT);
-
-               netif_wake_queue (dev);
-
-               if (xmt_status & TX_OK)
-                       dev->stats.tx_packets++;
-               else {
-                       dev->stats.tx_errors++;
-                       if (xmt_status & 0x0400) {
-                               dev->stats.tx_carrier_errors++;
-                               printk(KERN_DEBUG "%s: carrier error\n",
-                                       dev->name);
-                               printk(KERN_DEBUG "%s: XMT status = %#x\n",
-                                       dev->name, xmt_status);
-                       }
-                       else {
-                               printk(KERN_DEBUG "%s: XMT status = %#x\n",
-                                       dev->name, xmt_status);
-                               printk(KERN_DEBUG "%s: XMT status = %#x\n",
-                                       dev->name, xmt_status);
-                       }
-               }
-               if (xmt_status & 0x000f) {
-                       dev->stats.collisions += (xmt_status & 0x000f);
-               }
-
-               if ((xmt_status & 0x0040) == 0x0) {
-                       dev->stats.tx_heartbeat_errors++;
-               }
-       }
-}
-
-static int eepro_ethtool_get_settings(struct net_device *dev,
-                                       struct ethtool_cmd *cmd)
-{
-       struct eepro_local      *lp = netdev_priv(dev);
-
-       cmd->supported =        SUPPORTED_10baseT_Half |
-                               SUPPORTED_10baseT_Full |
-                               SUPPORTED_Autoneg;
-       cmd->advertising =      ADVERTISED_10baseT_Half |
-                               ADVERTISED_10baseT_Full |
-                               ADVERTISED_Autoneg;
-
-       if (GetBit(lp->word[5], ee_PortTPE)) {
-               cmd->supported |= SUPPORTED_TP;
-               cmd->advertising |= ADVERTISED_TP;
-       }
-       if (GetBit(lp->word[5], ee_PortBNC)) {
-               cmd->supported |= SUPPORTED_BNC;
-               cmd->advertising |= ADVERTISED_BNC;
-       }
-       if (GetBit(lp->word[5], ee_PortAUI)) {
-               cmd->supported |= SUPPORTED_AUI;
-               cmd->advertising |= ADVERTISED_AUI;
-       }
-
-       ethtool_cmd_speed_set(cmd, SPEED_10);
-
-       if (dev->if_port == TPE && lp->word[1] & ee_Duplex) {
-               cmd->duplex = DUPLEX_FULL;
-       }
-       else {
-               cmd->duplex = DUPLEX_HALF;
-       }
-
-       cmd->port = dev->if_port;
-       cmd->phy_address = dev->base_addr;
-       cmd->transceiver = XCVR_INTERNAL;
-
-       if (lp->word[0] & ee_AutoNeg) {
-               cmd->autoneg = 1;
-       }
-
-       return 0;
-}
-
-static void eepro_ethtool_get_drvinfo(struct net_device *dev,
-                                       struct ethtool_drvinfo *drvinfo)
-{
-       strlcpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver));
-       strlcpy(drvinfo->version, DRV_VERSION, sizeof(drvinfo->version));
-       snprintf(drvinfo->bus_info, sizeof(drvinfo->bus_info),
-               "ISA 0x%lx", dev->base_addr);
-}
-
-static const struct ethtool_ops eepro_ethtool_ops = {
-       .get_settings   = eepro_ethtool_get_settings,
-       .get_drvinfo    = eepro_ethtool_get_drvinfo,
-};
-
-#ifdef MODULE
-
-#define MAX_EEPRO 8
-static struct net_device *dev_eepro[MAX_EEPRO];
-
-static int io[MAX_EEPRO] = {
-  [0 ... MAX_EEPRO-1] = -1
-};
-static int irq[MAX_EEPRO];
-static int mem[MAX_EEPRO] = {  /* Size of the rx buffer in KB */
-  [0 ... MAX_EEPRO-1] = RCV_DEFAULT_RAM/1024
-};
-static int autodetect;
-
-static int n_eepro;
-/* For linux 2.1.xx */
-
-MODULE_AUTHOR("Pascal Dupuis and others");
-MODULE_DESCRIPTION("Intel i82595 ISA EtherExpressPro10/10+ driver");
-MODULE_LICENSE("GPL");
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(mem, int, NULL, 0);
-module_param(autodetect, int, 0);
-MODULE_PARM_DESC(io, "EtherExpress Pro/10 I/O base address(es)");
-MODULE_PARM_DESC(irq, "EtherExpress Pro/10 IRQ number(s)");
-MODULE_PARM_DESC(mem, "EtherExpress Pro/10 Rx buffer size(es) in kB (3-29)");
-MODULE_PARM_DESC(autodetect, "EtherExpress Pro/10 force board(s) detection (0-1)");
-
-int __init init_module(void)
-{
-       struct net_device *dev;
-       int i;
-       if (io[0] == -1 && autodetect == 0) {
-               printk(KERN_WARNING "eepro_init_module: Probe is very dangerous in ISA boards!\n");
-               printk(KERN_WARNING "eepro_init_module: Please add \"autodetect=1\" to force probe\n");
-               return -ENODEV;
-       }
-       else if (autodetect) {
-               /* if autodetect is set then we must force detection */
-               for (i = 0; i < MAX_EEPRO; i++) {
-                       io[i] = 0;
-               }
-
-               printk(KERN_INFO "eepro_init_module: Auto-detecting boards (May God protect us...)\n");
-       }
-
-       for (i = 0; i < MAX_EEPRO && io[i] != -1; i++) {
-               dev = alloc_etherdev(sizeof(struct eepro_local));
-               if (!dev)
-                       break;
-
-               dev->mem_end = mem[i];
-               dev->base_addr = io[i];
-               dev->irq = irq[i];
-
-               if (do_eepro_probe(dev) == 0) {
-                       dev_eepro[n_eepro++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               break;
-       }
-
-       if (n_eepro)
-               printk(KERN_INFO "%s", version);
-
-       return n_eepro ? 0 : -ENODEV;
-}
-
-void __exit
-cleanup_module(void)
-{
-       int i;
-
-       for (i=0; i<n_eepro; i++) {
-               struct net_device *dev = dev_eepro[i];
-               unregister_netdev(dev);
-               release_region(dev->base_addr, EEPRO_IO_EXTENT);
-               free_netdev(dev);
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/i825xx/eexpress.c b/drivers/net/ethernet/i825xx/eexpress.c
deleted file mode 100644 (file)
index 7a6a2f0..0000000
+++ /dev/null
@@ -1,1661 +0,0 @@
-/* Intel EtherExpress 16 device driver for Linux
- *
- * Written by John Sullivan, 1995
- *  based on original code by Donald Becker, with changes by
- *  Alan Cox and Pauline Middelink.
- *
- * Support for 8-bit mode by Zoltan Szilagyi <zoltans@cs.arizona.edu>
- *
- * Many modifications, and currently maintained, by
- *  Philip Blundell <philb@gnu.org>
- * Added the Compaq LTE  Alan Cox <alan@lxorguk.ukuu.org.uk>
- * Added MCA support Adam Fritzler (now deleted)
- *
- * Note - this driver is experimental still - it has problems on faster
- * machines. Someone needs to sit down and go through it line by line with
- * a databook...
- */
-
-/* The EtherExpress 16 is a fairly simple card, based on a shared-memory
- * design using the i82586 Ethernet coprocessor.  It bears no relationship,
- * as far as I know, to the similarly-named "EtherExpress Pro" range.
- *
- * Historically, Linux support for these cards has been very bad.  However,
- * things seem to be getting better slowly.
- */
-
-/* If your card is confused about what sort of interface it has (eg it
- * persistently reports "10baseT" when none is fitted), running 'SOFTSET /BART'
- * or 'SOFTSET /LISA' from DOS seems to help.
- */
-
-/* Here's the scoop on memory mapping.
- *
- * There are three ways to access EtherExpress card memory: either using the
- * shared-memory mapping, or using PIO through the dataport, or using PIO
- * through the "shadow memory" ports.
- *
- * The shadow memory system works by having the card map some of its memory
- * as follows:
- *
- * (the low five bits of the SMPTR are ignored)
- *
- *  base+0x4000..400f      memory at SMPTR+0..15
- *  base+0x8000..800f      memory at SMPTR+16..31
- *  base+0xc000..c007      dubious stuff (memory at SMPTR+16..23 apparently)
- *  base+0xc008..c00f      memory at 0x0008..0x000f
- *
- * This last set (the one at c008) is particularly handy because the SCB
- * lives at 0x0008.  So that set of ports gives us easy random access to data
- * in the SCB without having to mess around setting up pointers and the like.
- * We always use this method to access the SCB (via the scb_xx() functions).
- *
- * Dataport access works by aiming the appropriate (read or write) pointer
- * at the first address you're interested in, and then reading or writing from
- * the dataport.  The pointers auto-increment after each transfer.  We use
- * this for data transfer.
- *
- * We don't use the shared-memory system because it allegedly doesn't work on
- * all cards, and because it's a bit more prone to go wrong (it's one more
- * thing to configure...).
- */
-
-/* Known bugs:
- *
- * - The card seems to want to give us two interrupts every time something
- *   happens, where just one would be better.
- */
-
-/*
- *
- * Note by Zoltan Szilagyi 10-12-96:
- *
- * I've succeeded in eliminating the "CU wedged" messages, and hence the
- * lockups, which were only occurring with cards running in 8-bit mode ("force
- * 8-bit operation" in Intel's SoftSet utility). This version of the driver
- * sets the 82586 and the ASIC to 8-bit mode at startup; it also stops the
- * CU before submitting a packet for transmission, and then restarts it as soon
- * as the process of handing the packet is complete. This is definitely an
- * unnecessary slowdown if the card is running in 16-bit mode; therefore one
- * should detect 16-bit vs 8-bit mode from the EEPROM settings and act
- * accordingly. In 8-bit mode with this bugfix I'm getting about 150 K/s for
- * ftp's, which is significantly better than I get in DOS, so the overhead of
- * stopping and restarting the CU with each transmit is not prohibitive in
- * practice.
- *
- * Update by David Woodhouse 11/5/99:
- *
- * I've seen "CU wedged" messages in 16-bit mode, on the Alpha architecture.
- * I assume that this is because 16-bit accesses are actually handled as two
- * 8-bit accesses.
- */
-
-#ifdef __alpha__
-#define LOCKUP16 1
-#endif
-#ifndef LOCKUP16
-#define LOCKUP16 0
-#endif
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/string.h>
-#include <linux/in.h>
-#include <linux/delay.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/spinlock.h>
-#include <linux/bitops.h>
-#include <linux/jiffies.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-
-#ifndef NET_DEBUG
-#define NET_DEBUG 4
-#endif
-
-#include "eexpress.h"
-
-#define EEXP_IO_EXTENT  16
-
-/*
- * Private data declarations
- */
-
-struct net_local
-{
-       unsigned long last_tx;       /* jiffies when last transmit started */
-       unsigned long init_time;     /* jiffies when eexp_hw_init586 called */
-       unsigned short rx_first;     /* first rx buf, same as RX_BUF_START */
-       unsigned short rx_last;      /* last rx buf */
-       unsigned short rx_ptr;       /* first rx buf to look at */
-       unsigned short tx_head;      /* next free tx buf */
-       unsigned short tx_reap;      /* first in-use tx buf */
-       unsigned short tx_tail;      /* previous tx buf to tx_head */
-       unsigned short tx_link;      /* last known-executing tx buf */
-       unsigned short last_tx_restart;   /* set to tx_link when we
-                                            restart the CU */
-       unsigned char started;
-       unsigned short rx_buf_start;
-       unsigned short rx_buf_end;
-       unsigned short num_tx_bufs;
-       unsigned short num_rx_bufs;
-       unsigned char width;         /* 0 for 16bit, 1 for 8bit */
-       unsigned char was_promisc;
-       unsigned char old_mc_count;
-       spinlock_t lock;
-};
-
-/* This is the code and data that is downloaded to the EtherExpress card's
- * memory at boot time.
- */
-
-static unsigned short start_code[] = {
-/* 0x0000 */
-       0x0001,                 /* ISCP: busy - cleared after reset */
-       0x0008,0x0000,0x0000,   /* offset,address (lo,hi) of SCB */
-
-       0x0000,0x0000,          /* SCB: status, commands */
-       0x0000,0x0000,          /* links to first command block,
-                                  first receive descriptor */
-       0x0000,0x0000,          /* CRC error, alignment error counts */
-       0x0000,0x0000,          /* out of resources, overrun error counts */
-
-       0x0000,0x0000,          /* pad */
-       0x0000,0x0000,
-
-/* 0x20 -- start of 82586 CU program */
-#define CONF_LINK 0x20
-       0x0000,Cmd_Config,
-       0x0032,                 /* link to next command */
-       0x080c,                 /* 12 bytes follow : fifo threshold=8 */
-       0x2e40,                 /* don't rx bad frames
-                                * SRDY/ARDY => ext. sync. : preamble len=8
-                                * take addresses from data buffers
-                                * 6 bytes/address
-                                */
-       0x6000,                 /* default backoff method & priority
-                                * interframe spacing = 0x60 */
-       0xf200,                 /* slot time=0x200
-                                * max collision retry = 0xf */
-#define CONF_PROMISC  0x2e
-       0x0000,                 /* no HDLC : normal CRC : enable broadcast
-                                * disable promiscuous/multicast modes */
-       0x003c,                 /* minimum frame length = 60 octets) */
-
-       0x0000,Cmd_SetAddr,
-       0x003e,                 /* link to next command */
-#define CONF_HWADDR  0x38
-       0x0000,0x0000,0x0000,   /* hardware address placed here */
-
-       0x0000,Cmd_MCast,
-       0x0076,                 /* link to next command */
-#define CONF_NR_MULTICAST 0x44
-       0x0000,                 /* number of bytes in multicast address(es) */
-#define CONF_MULTICAST 0x46
-       0x0000, 0x0000, 0x0000, /* some addresses */
-       0x0000, 0x0000, 0x0000,
-       0x0000, 0x0000, 0x0000,
-       0x0000, 0x0000, 0x0000,
-       0x0000, 0x0000, 0x0000,
-       0x0000, 0x0000, 0x0000,
-       0x0000, 0x0000, 0x0000,
-       0x0000, 0x0000, 0x0000,
-
-#define CONF_DIAG_RESULT  0x76
-       0x0000, Cmd_Diag,
-       0x007c,                 /* link to next command */
-
-       0x0000,Cmd_TDR|Cmd_INT,
-       0x0084,
-#define CONF_TDR_RESULT  0x82
-       0x0000,
-
-       0x0000,Cmd_END|Cmd_Nop, /* end of configure sequence */
-       0x0084                  /* dummy link */
-};
-
-/* maps irq number to EtherExpress magic value */
-static char irqrmap[] = { 0,0,1,2,3,4,0,0,0,1,5,6,0,0,0,0 };
-
-/*
- * Prototypes for Linux interface
- */
-
-static int eexp_open(struct net_device *dev);
-static int eexp_close(struct net_device *dev);
-static void eexp_timeout(struct net_device *dev);
-static netdev_tx_t eexp_xmit(struct sk_buff *buf,
-                            struct net_device *dev);
-
-static irqreturn_t eexp_irq(int irq, void *dev_addr);
-static void eexp_set_multicast(struct net_device *dev);
-
-/*
- * Prototypes for hardware access functions
- */
-
-static void eexp_hw_rx_pio(struct net_device *dev);
-static void eexp_hw_tx_pio(struct net_device *dev, unsigned short *buf,
-                      unsigned short len);
-static int eexp_hw_probe(struct net_device *dev,unsigned short ioaddr);
-static unsigned short eexp_hw_readeeprom(unsigned short ioaddr,
-                                        unsigned char location);
-
-static unsigned short eexp_hw_lasttxstat(struct net_device *dev);
-static void eexp_hw_txrestart(struct net_device *dev);
-
-static void eexp_hw_txinit    (struct net_device *dev);
-static void eexp_hw_rxinit    (struct net_device *dev);
-
-static void eexp_hw_init586   (struct net_device *dev);
-static void eexp_setup_filter (struct net_device *dev);
-
-static char *eexp_ifmap[]={"AUI", "BNC", "RJ45"};
-enum eexp_iftype {AUI=0, BNC=1, TPE=2};
-
-#define STARTED_RU      2
-#define STARTED_CU      1
-
-/*
- * Primitive hardware access functions.
- */
-
-static inline unsigned short scb_status(struct net_device *dev)
-{
-       return inw(dev->base_addr + 0xc008);
-}
-
-static inline unsigned short scb_rdcmd(struct net_device *dev)
-{
-       return inw(dev->base_addr + 0xc00a);
-}
-
-static inline void scb_command(struct net_device *dev, unsigned short cmd)
-{
-       outw(cmd, dev->base_addr + 0xc00a);
-}
-
-static inline void scb_wrcbl(struct net_device *dev, unsigned short val)
-{
-       outw(val, dev->base_addr + 0xc00c);
-}
-
-static inline void scb_wrrfa(struct net_device *dev, unsigned short val)
-{
-       outw(val, dev->base_addr + 0xc00e);
-}
-
-static inline void set_loopback(struct net_device *dev)
-{
-       outb(inb(dev->base_addr + Config) | 2, dev->base_addr + Config);
-}
-
-static inline void clear_loopback(struct net_device *dev)
-{
-       outb(inb(dev->base_addr + Config) & ~2, dev->base_addr + Config);
-}
-
-static inline unsigned short int SHADOW(short int addr)
-{
-       addr &= 0x1f;
-       if (addr > 0xf) addr += 0x3ff0;
-       return addr + 0x4000;
-}
-
-/*
- * Linux interface
- */
-
-/*
- * checks for presence of EtherExpress card
- */
-
-static int __init do_express_probe(struct net_device *dev)
-{
-       unsigned short *port;
-       static unsigned short ports[] = { 0x240,0x300,0x310,0x270,0x320,0x340,0 };
-       unsigned short ioaddr = dev->base_addr;
-       int dev_irq = dev->irq;
-       int err;
-
-       dev->if_port = 0xff; /* not set */
-
-       if (ioaddr&0xfe00) {
-               if (!request_region(ioaddr, EEXP_IO_EXTENT, "EtherExpress"))
-                       return -EBUSY;
-               err = eexp_hw_probe(dev,ioaddr);
-               release_region(ioaddr, EEXP_IO_EXTENT);
-               return err;
-       } else if (ioaddr)
-               return -ENXIO;
-
-       for (port=&ports[0] ; *port ; port++ )
-       {
-               unsigned short sum = 0;
-               int i;
-               if (!request_region(*port, EEXP_IO_EXTENT, "EtherExpress"))
-                       continue;
-               for ( i=0 ; i<4 ; i++ )
-               {
-                       unsigned short t;
-                       t = inb(*port + ID_PORT);
-                       sum |= (t>>4) << ((t & 0x03)<<2);
-               }
-               if (sum==0xbaba && !eexp_hw_probe(dev,*port)) {
-                       release_region(*port, EEXP_IO_EXTENT);
-                       return 0;
-               }
-               release_region(*port, EEXP_IO_EXTENT);
-               dev->irq = dev_irq;
-       }
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init express_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_express_probe(dev);
-       if (!err)
-               return dev;
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-/*
- * open and initialize the adapter, ready for use
- */
-
-static int eexp_open(struct net_device *dev)
-{
-       int ret;
-       unsigned short ioaddr = dev->base_addr;
-       struct net_local *lp = netdev_priv(dev);
-
-#if NET_DEBUG > 6
-       printk(KERN_DEBUG "%s: eexp_open()\n", dev->name);
-#endif
-
-       if (!dev->irq || !irqrmap[dev->irq])
-               return -ENXIO;
-
-       ret = request_irq(dev->irq, eexp_irq, 0, dev->name, dev);
-       if (ret)
-               return ret;
-
-       if (!request_region(ioaddr, EEXP_IO_EXTENT, "EtherExpress")) {
-               printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
-                       , ioaddr);
-               goto err_out1;
-       }
-       if (!request_region(ioaddr+0x4000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
-               printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
-                       , ioaddr+0x4000);
-               goto err_out2;
-       }
-       if (!request_region(ioaddr+0x8000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
-               printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
-                       , ioaddr+0x8000);
-               goto err_out3;
-       }
-       if (!request_region(ioaddr+0xc000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
-               printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
-                       , ioaddr+0xc000);
-               goto err_out4;
-       }
-
-       if (lp->width) {
-               printk("%s: forcing ASIC to 8-bit mode\n", dev->name);
-               outb(inb(dev->base_addr+Config)&~4, dev->base_addr+Config);
-       }
-
-       eexp_hw_init586(dev);
-       netif_start_queue(dev);
-#if NET_DEBUG > 6
-       printk(KERN_DEBUG "%s: leaving eexp_open()\n", dev->name);
-#endif
-       return 0;
-
-       err_out4:
-               release_region(ioaddr+0x8000, EEXP_IO_EXTENT);
-       err_out3:
-               release_region(ioaddr+0x4000, EEXP_IO_EXTENT);
-       err_out2:
-               release_region(ioaddr, EEXP_IO_EXTENT);
-       err_out1:
-               free_irq(dev->irq, dev);
-               return -EBUSY;
-}
-
-/*
- * close and disable the interface, leaving the 586 in reset.
- */
-
-static int eexp_close(struct net_device *dev)
-{
-       unsigned short ioaddr = dev->base_addr;
-       struct net_local *lp = netdev_priv(dev);
-
-       int irq = dev->irq;
-
-       netif_stop_queue(dev);
-
-       outb(SIRQ_dis|irqrmap[irq],ioaddr+SET_IRQ);
-       lp->started = 0;
-       scb_command(dev, SCB_CUsuspend|SCB_RUsuspend);
-       outb(0,ioaddr+SIGNAL_CA);
-       free_irq(irq,dev);
-       outb(i586_RST,ioaddr+EEPROM_Ctrl);
-       release_region(ioaddr, EEXP_IO_EXTENT);
-       release_region(ioaddr+0x4000, 16);
-       release_region(ioaddr+0x8000, 16);
-       release_region(ioaddr+0xc000, 16);
-
-       return 0;
-}
-
-/*
- * This gets called when a higher level thinks we are broken.  Check that
- * nothing has become jammed in the CU.
- */
-
-static void unstick_cu(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short ioaddr = dev->base_addr;
-
-       if (lp->started)
-       {
-               if (time_after(jiffies, dev_trans_start(dev) + HZ/2))
-               {
-                       if (lp->tx_link==lp->last_tx_restart)
-                       {
-                               unsigned short boguscount=200,rsst;
-                               printk(KERN_WARNING "%s: Retransmit timed out, status %04x, resetting...\n",
-                                      dev->name, scb_status(dev));
-                               eexp_hw_txinit(dev);
-                               lp->last_tx_restart = 0;
-                               scb_wrcbl(dev, lp->tx_link);
-                               scb_command(dev, SCB_CUstart);
-                               outb(0,ioaddr+SIGNAL_CA);
-                               while (!SCB_complete(rsst=scb_status(dev)))
-                               {
-                                       if (!--boguscount)
-                                       {
-                                               boguscount=200;
-                                               printk(KERN_WARNING "%s: Reset timed out status %04x, retrying...\n",
-                                                      dev->name,rsst);
-                                               scb_wrcbl(dev, lp->tx_link);
-                                               scb_command(dev, SCB_CUstart);
-                                               outb(0,ioaddr+SIGNAL_CA);
-                                       }
-                               }
-                               netif_wake_queue(dev);
-                       }
-                       else
-                       {
-                               unsigned short status = scb_status(dev);
-                               if (SCB_CUdead(status))
-                               {
-                                       unsigned short txstatus = eexp_hw_lasttxstat(dev);
-                                       printk(KERN_WARNING "%s: Transmit timed out, CU not active status %04x %04x, restarting...\n",
-                                              dev->name, status, txstatus);
-                                       eexp_hw_txrestart(dev);
-                               }
-                               else
-                               {
-                                       unsigned short txstatus = eexp_hw_lasttxstat(dev);
-                                       if (netif_queue_stopped(dev) && !txstatus)
-                                       {
-                                               printk(KERN_WARNING "%s: CU wedged, status %04x %04x, resetting...\n",
-                                                      dev->name,status,txstatus);
-                                               eexp_hw_init586(dev);
-                                               netif_wake_queue(dev);
-                                       }
-                                       else
-                                       {
-                                               printk(KERN_WARNING "%s: transmit timed out\n", dev->name);
-                                       }
-                               }
-                       }
-               }
-       }
-       else
-       {
-               if (time_after(jiffies, lp->init_time + 10))
-               {
-                       unsigned short status = scb_status(dev);
-                       printk(KERN_WARNING "%s: i82586 startup timed out, status %04x, resetting...\n",
-                              dev->name, status);
-                       eexp_hw_init586(dev);
-                       netif_wake_queue(dev);
-               }
-       }
-}
-
-static void eexp_timeout(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-#ifdef CONFIG_SMP
-       unsigned long flags;
-#endif
-       int status;
-
-       disable_irq(dev->irq);
-
-       /*
-        *      Best would be to use synchronize_irq(); spin_lock() here
-        *      lets make it work first..
-        */
-
-#ifdef CONFIG_SMP
-       spin_lock_irqsave(&lp->lock, flags);
-#endif
-
-       status = scb_status(dev);
-       unstick_cu(dev);
-       printk(KERN_INFO "%s: transmit timed out, %s?\n", dev->name,
-              (SCB_complete(status)?"lost interrupt":
-               "board on fire"));
-       dev->stats.tx_errors++;
-       lp->last_tx = jiffies;
-       if (!SCB_complete(status)) {
-               scb_command(dev, SCB_CUabort);
-               outb(0,dev->base_addr+SIGNAL_CA);
-       }
-       netif_wake_queue(dev);
-#ifdef CONFIG_SMP
-       spin_unlock_irqrestore(&lp->lock, flags);
-#endif
-}
-
-/*
- * Called to transmit a packet, or to allow us to right ourselves
- * if the kernel thinks we've died.
- */
-static netdev_tx_t eexp_xmit(struct sk_buff *buf, struct net_device *dev)
-{
-       short length = buf->len;
-#ifdef CONFIG_SMP
-       struct net_local *lp = netdev_priv(dev);
-       unsigned long flags;
-#endif
-
-#if NET_DEBUG > 6
-       printk(KERN_DEBUG "%s: eexp_xmit()\n", dev->name);
-#endif
-
-       if (buf->len < ETH_ZLEN) {
-               if (skb_padto(buf, ETH_ZLEN))
-                       return NETDEV_TX_OK;
-               length = ETH_ZLEN;
-       }
-
-       disable_irq(dev->irq);
-
-       /*
-        *      Best would be to use synchronize_irq(); spin_lock() here
-        *      lets make it work first..
-        */
-
-#ifdef CONFIG_SMP
-       spin_lock_irqsave(&lp->lock, flags);
-#endif
-
-       {
-               unsigned short *data = (unsigned short *)buf->data;
-
-               dev->stats.tx_bytes += length;
-
-               eexp_hw_tx_pio(dev,data,length);
-       }
-       dev_kfree_skb(buf);
-#ifdef CONFIG_SMP
-       spin_unlock_irqrestore(&lp->lock, flags);
-#endif
-       enable_irq(dev->irq);
-       return NETDEV_TX_OK;
-}
-
-/*
- * Handle an EtherExpress interrupt
- * If we've finished initializing, start the RU and CU up.
- * If we've already started, reap tx buffers, handle any received packets,
- * check to make sure we've not become wedged.
- */
-
-static unsigned short eexp_start_irq(struct net_device *dev,
-                                    unsigned short status)
-{
-       unsigned short ack_cmd = SCB_ack(status);
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short ioaddr = dev->base_addr;
-       if ((dev->flags & IFF_UP) && !(lp->started & STARTED_CU)) {
-               short diag_status, tdr_status;
-               while (SCB_CUstat(status)==2)
-                       status = scb_status(dev);
-#if NET_DEBUG > 4
-               printk("%s: CU went non-active (status %04x)\n",
-                      dev->name, status);
-#endif
-
-               outw(CONF_DIAG_RESULT & ~31, ioaddr + SM_PTR);
-               diag_status = inw(ioaddr + SHADOW(CONF_DIAG_RESULT));
-               if (diag_status & 1<<11) {
-                       printk(KERN_WARNING "%s: 82586 failed self-test\n",
-                              dev->name);
-               } else if (!(diag_status & 1<<13)) {
-                       printk(KERN_WARNING "%s: 82586 self-test failed to complete\n", dev->name);
-               }
-
-               outw(CONF_TDR_RESULT & ~31, ioaddr + SM_PTR);
-               tdr_status = inw(ioaddr + SHADOW(CONF_TDR_RESULT));
-               if (tdr_status & (TDR_SHORT|TDR_OPEN)) {
-                       printk(KERN_WARNING "%s: TDR reports cable %s at %d tick%s\n", dev->name, (tdr_status & TDR_SHORT)?"short":"broken", tdr_status & TDR_TIME, ((tdr_status & TDR_TIME) != 1) ? "s" : "");
-               }
-               else if (tdr_status & TDR_XCVRPROBLEM) {
-                       printk(KERN_WARNING "%s: TDR reports transceiver problem\n", dev->name);
-               }
-               else if (tdr_status & TDR_LINKOK) {
-#if NET_DEBUG > 4
-                       printk(KERN_DEBUG "%s: TDR reports link OK\n", dev->name);
-#endif
-               } else {
-                       printk("%s: TDR is ga-ga (status %04x)\n", dev->name,
-                              tdr_status);
-               }
-
-               lp->started |= STARTED_CU;
-               scb_wrcbl(dev, lp->tx_link);
-               /* if the RU isn't running, start it now */
-               if (!(lp->started & STARTED_RU)) {
-                       ack_cmd |= SCB_RUstart;
-                       scb_wrrfa(dev, lp->rx_buf_start);
-                       lp->rx_ptr = lp->rx_buf_start;
-                       lp->started |= STARTED_RU;
-               }
-               ack_cmd |= SCB_CUstart | 0x2000;
-       }
-
-       if ((dev->flags & IFF_UP) && !(lp->started & STARTED_RU) && SCB_RUstat(status)==4)
-               lp->started|=STARTED_RU;
-
-       return ack_cmd;
-}
-
-static void eexp_cmd_clear(struct net_device *dev)
-{
-       unsigned long int oldtime = jiffies;
-       while (scb_rdcmd(dev) && (time_before(jiffies, oldtime + 10)));
-       if (scb_rdcmd(dev)) {
-               printk("%s: command didn't clear\n", dev->name);
-       }
-}
-
-static irqreturn_t eexp_irq(int dummy, void *dev_info)
-{
-       struct net_device *dev = dev_info;
-       struct net_local *lp;
-       unsigned short ioaddr,status,ack_cmd;
-       unsigned short old_read_ptr, old_write_ptr;
-
-       lp = netdev_priv(dev);
-       ioaddr = dev->base_addr;
-
-       spin_lock(&lp->lock);
-
-       old_read_ptr = inw(ioaddr+READ_PTR);
-       old_write_ptr = inw(ioaddr+WRITE_PTR);
-
-       outb(SIRQ_dis|irqrmap[dev->irq], ioaddr+SET_IRQ);
-
-       status = scb_status(dev);
-
-#if NET_DEBUG > 4
-       printk(KERN_DEBUG "%s: interrupt (status %x)\n", dev->name, status);
-#endif
-
-       if (lp->started == (STARTED_CU | STARTED_RU)) {
-
-               do {
-                       eexp_cmd_clear(dev);
-
-                       ack_cmd = SCB_ack(status);
-                       scb_command(dev, ack_cmd);
-                       outb(0,ioaddr+SIGNAL_CA);
-
-                       eexp_cmd_clear(dev);
-
-                       if (SCB_complete(status)) {
-                               if (!eexp_hw_lasttxstat(dev)) {
-                                       printk("%s: tx interrupt but no status\n", dev->name);
-                               }
-                       }
-
-                       if (SCB_rxdframe(status))
-                               eexp_hw_rx_pio(dev);
-
-                       status = scb_status(dev);
-               } while (status & 0xc000);
-
-               if (SCB_RUdead(status))
-               {
-                       printk(KERN_WARNING "%s: RU stopped: status %04x\n",
-                              dev->name,status);
-#if 0
-                       printk(KERN_WARNING "%s: cur_rfd=%04x, cur_rbd=%04x\n", dev->name, lp->cur_rfd, lp->cur_rbd);
-                       outw(lp->cur_rfd, ioaddr+READ_PTR);
-                       printk(KERN_WARNING "%s: [%04x]\n", dev->name, inw(ioaddr+DATAPORT));
-                       outw(lp->cur_rfd+6, ioaddr+READ_PTR);
-                       printk(KERN_WARNING "%s: rbd is %04x\n", dev->name, rbd= inw(ioaddr+DATAPORT));
-                       outw(rbd, ioaddr+READ_PTR);
-                       printk(KERN_WARNING "%s: [%04x %04x] ", dev->name, inw(ioaddr+DATAPORT), inw(ioaddr+DATAPORT));
-                       outw(rbd+8, ioaddr+READ_PTR);
-                       printk("[%04x]\n", inw(ioaddr+DATAPORT));
-#endif
-                       dev->stats.rx_errors++;
-#if 1
-                       eexp_hw_rxinit(dev);
-#else
-                       lp->cur_rfd = lp->first_rfd;
-#endif
-                       scb_wrrfa(dev, lp->rx_buf_start);
-                       scb_command(dev, SCB_RUstart);
-                       outb(0,ioaddr+SIGNAL_CA);
-               }
-       } else {
-               if (status & 0x8000)
-                       ack_cmd = eexp_start_irq(dev, status);
-               else
-                       ack_cmd = SCB_ack(status);
-               scb_command(dev, ack_cmd);
-               outb(0,ioaddr+SIGNAL_CA);
-       }
-
-       eexp_cmd_clear(dev);
-
-       outb(SIRQ_en|irqrmap[dev->irq], ioaddr+SET_IRQ);
-
-#if NET_DEBUG > 6
-       printk("%s: leaving eexp_irq()\n", dev->name);
-#endif
-       outw(old_read_ptr, ioaddr+READ_PTR);
-       outw(old_write_ptr, ioaddr+WRITE_PTR);
-
-       spin_unlock(&lp->lock);
-       return IRQ_HANDLED;
-}
-
-/*
- * Hardware access functions
- */
-
-/*
- * Set the cable type to use.
- */
-
-static void eexp_hw_set_interface(struct net_device *dev)
-{
-       unsigned char oldval = inb(dev->base_addr + 0x300e);
-       oldval &= ~0x82;
-       switch (dev->if_port) {
-       case TPE:
-               oldval |= 0x2;
-       case BNC:
-               oldval |= 0x80;
-               break;
-       }
-       outb(oldval, dev->base_addr+0x300e);
-       mdelay(20);
-}
-
-/*
- * Check all the receive buffers, and hand any received packets
- * to the upper levels. Basic sanity check on each frame
- * descriptor, though we don't bother trying to fix broken ones.
- */
-
-static void eexp_hw_rx_pio(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short rx_block = lp->rx_ptr;
-       unsigned short boguscount = lp->num_rx_bufs;
-       unsigned short ioaddr = dev->base_addr;
-       unsigned short status;
-
-#if NET_DEBUG > 6
-       printk(KERN_DEBUG "%s: eexp_hw_rx()\n", dev->name);
-#endif
-
-       do {
-               unsigned short rfd_cmd, rx_next, pbuf, pkt_len;
-
-               outw(rx_block, ioaddr + READ_PTR);
-               status = inw(ioaddr + DATAPORT);
-
-               if (FD_Done(status))
-               {
-                       rfd_cmd = inw(ioaddr + DATAPORT);
-                       rx_next = inw(ioaddr + DATAPORT);
-                       pbuf = inw(ioaddr + DATAPORT);
-
-                       outw(pbuf, ioaddr + READ_PTR);
-                       pkt_len = inw(ioaddr + DATAPORT);
-
-                       if (rfd_cmd!=0x0000)
-                       {
-                               printk(KERN_WARNING "%s: rfd_cmd not zero:0x%04x\n",
-                                      dev->name, rfd_cmd);
-                               continue;
-                       }
-                       else if (pbuf!=rx_block+0x16)
-                       {
-                               printk(KERN_WARNING "%s: rfd and rbd out of sync 0x%04x 0x%04x\n",
-                                      dev->name, rx_block+0x16, pbuf);
-                               continue;
-                       }
-                       else if ((pkt_len & 0xc000)!=0xc000)
-                       {
-                               printk(KERN_WARNING "%s: EOF or F not set on received buffer (%04x)\n",
-                                      dev->name, pkt_len & 0xc000);
-                               continue;
-                       }
-                       else if (!FD_OK(status))
-                       {
-                               dev->stats.rx_errors++;
-                               if (FD_CRC(status))
-                                       dev->stats.rx_crc_errors++;
-                               if (FD_Align(status))
-                                       dev->stats.rx_frame_errors++;
-                               if (FD_Resrc(status))
-                                       dev->stats.rx_fifo_errors++;
-                               if (FD_DMA(status))
-                                       dev->stats.rx_over_errors++;
-                               if (FD_Short(status))
-                                       dev->stats.rx_length_errors++;
-                       }
-                       else
-                       {
-                               struct sk_buff *skb;
-                               pkt_len &= 0x3fff;
-                               skb = netdev_alloc_skb(dev, pkt_len + 16);
-                               if (skb == NULL)
-                               {
-                                       printk(KERN_WARNING "%s: Memory squeeze, dropping packet\n",dev->name);
-                                       dev->stats.rx_dropped++;
-                                       break;
-                               }
-                               skb_reserve(skb, 2);
-                               outw(pbuf+10, ioaddr+READ_PTR);
-                               insw(ioaddr+DATAPORT, skb_put(skb,pkt_len),(pkt_len+1)>>1);
-                               skb->protocol = eth_type_trans(skb,dev);
-                               netif_rx(skb);
-                               dev->stats.rx_packets++;
-                               dev->stats.rx_bytes += pkt_len;
-                       }
-                       outw(rx_block, ioaddr+WRITE_PTR);
-                       outw(0, ioaddr+DATAPORT);
-                       outw(0, ioaddr+DATAPORT);
-                       rx_block = rx_next;
-               }
-       } while (FD_Done(status) && boguscount--);
-       lp->rx_ptr = rx_block;
-}
-
-/*
- * Hand a packet to the card for transmission
- * If we get here, we MUST have already checked
- * to make sure there is room in the transmit
- * buffer region.
- */
-
-static void eexp_hw_tx_pio(struct net_device *dev, unsigned short *buf,
-                      unsigned short len)
-{
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short ioaddr = dev->base_addr;
-
-       if (LOCKUP16 || lp->width) {
-               /* Stop the CU so that there is no chance that it
-                  jumps off to a bogus address while we are writing the
-                  pointer to the next transmit packet in 8-bit mode --
-                  this eliminates the "CU wedged" errors in 8-bit mode.
-                  (Zoltan Szilagyi 10-12-96) */
-               scb_command(dev, SCB_CUsuspend);
-               outw(0xFFFF, ioaddr+SIGNAL_CA);
-       }
-
-       outw(lp->tx_head, ioaddr + WRITE_PTR);
-
-       outw(0x0000, ioaddr + DATAPORT);
-        outw(Cmd_INT|Cmd_Xmit, ioaddr + DATAPORT);
-       outw(lp->tx_head+0x08, ioaddr + DATAPORT);
-       outw(lp->tx_head+0x0e, ioaddr + DATAPORT);
-
-       outw(0x0000, ioaddr + DATAPORT);
-       outw(0x0000, ioaddr + DATAPORT);
-       outw(lp->tx_head+0x08, ioaddr + DATAPORT);
-
-       outw(0x8000|len, ioaddr + DATAPORT);
-       outw(-1, ioaddr + DATAPORT);
-       outw(lp->tx_head+0x16, ioaddr + DATAPORT);
-       outw(0, ioaddr + DATAPORT);
-
-       outsw(ioaddr + DATAPORT, buf, (len+1)>>1);
-
-       outw(lp->tx_tail+0xc, ioaddr + WRITE_PTR);
-       outw(lp->tx_head, ioaddr + DATAPORT);
-
-       dev->trans_start = jiffies;
-       lp->tx_tail = lp->tx_head;
-       if (lp->tx_head==TX_BUF_START+((lp->num_tx_bufs-1)*TX_BUF_SIZE))
-               lp->tx_head = TX_BUF_START;
-       else
-               lp->tx_head += TX_BUF_SIZE;
-       if (lp->tx_head != lp->tx_reap)
-               netif_wake_queue(dev);
-
-       if (LOCKUP16 || lp->width) {
-               /* Restart the CU so that the packet can actually
-                  be transmitted. (Zoltan Szilagyi 10-12-96) */
-               scb_command(dev, SCB_CUresume);
-               outw(0xFFFF, ioaddr+SIGNAL_CA);
-       }
-
-       dev->stats.tx_packets++;
-       lp->last_tx = jiffies;
-}
-
-static const struct net_device_ops eexp_netdev_ops = {
-       .ndo_open               = eexp_open,
-       .ndo_stop               = eexp_close,
-       .ndo_start_xmit         = eexp_xmit,
-       .ndo_set_rx_mode        = eexp_set_multicast,
-       .ndo_tx_timeout         = eexp_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-/*
- * Sanity check the suspected EtherExpress card
- * Read hardware address, reset card, size memory and initialize buffer
- * memory pointers. These are held in netdev_priv(), in case someone has more
- * than one card in a machine.
- */
-
-static int __init eexp_hw_probe(struct net_device *dev, unsigned short ioaddr)
-{
-       unsigned short hw_addr[3];
-       unsigned char buswidth;
-       unsigned int memory_size;
-       int i;
-       unsigned short xsum = 0;
-       struct net_local *lp = netdev_priv(dev);
-
-       printk("%s: EtherExpress 16 at %#x ",dev->name,ioaddr);
-
-       outb(ASIC_RST, ioaddr+EEPROM_Ctrl);
-       outb(0, ioaddr+EEPROM_Ctrl);
-       udelay(500);
-       outb(i586_RST, ioaddr+EEPROM_Ctrl);
-
-       hw_addr[0] = eexp_hw_readeeprom(ioaddr,2);
-       hw_addr[1] = eexp_hw_readeeprom(ioaddr,3);
-       hw_addr[2] = eexp_hw_readeeprom(ioaddr,4);
-
-       /* Standard Address or Compaq LTE Address */
-       if (!((hw_addr[2]==0x00aa && ((hw_addr[1] & 0xff00)==0x0000)) ||
-             (hw_addr[2]==0x0080 && ((hw_addr[1] & 0xff00)==0x5F00))))
-       {
-               printk(" rejected: invalid address %04x%04x%04x\n",
-                       hw_addr[2],hw_addr[1],hw_addr[0]);
-               return -ENODEV;
-       }
-
-       /* Calculate the EEPROM checksum.  Carry on anyway if it's bad,
-        * though.
-        */
-       for (i = 0; i < 64; i++)
-               xsum += eexp_hw_readeeprom(ioaddr, i);
-       if (xsum != 0xbaba)
-               printk(" (bad EEPROM xsum 0x%02x)", xsum);
-
-       dev->base_addr = ioaddr;
-       for ( i=0 ; i<6 ; i++ )
-               dev->dev_addr[i] = ((unsigned char *)hw_addr)[5-i];
-
-       {
-               static const char irqmap[] = { 0, 9, 3, 4, 5, 10, 11, 0 };
-               unsigned short setupval = eexp_hw_readeeprom(ioaddr,0);
-
-               /* Use the IRQ from EEPROM if none was given */
-               if (!dev->irq)
-                       dev->irq = irqmap[setupval>>13];
-
-               if (dev->if_port == 0xff) {
-                       dev->if_port = !(setupval & 0x1000) ? AUI :
-                               eexp_hw_readeeprom(ioaddr,5) & 0x1 ? TPE : BNC;
-               }
-
-               buswidth = !((setupval & 0x400) >> 10);
-       }
-
-       memset(lp, 0, sizeof(struct net_local));
-       spin_lock_init(&lp->lock);
-
-       printk("(IRQ %d, %s connector, %d-bit bus", dev->irq,
-              eexp_ifmap[dev->if_port], buswidth?8:16);
-
-       if (!request_region(dev->base_addr + 0x300e, 1, "EtherExpress"))
-               return -EBUSY;
-
-       eexp_hw_set_interface(dev);
-
-       release_region(dev->base_addr + 0x300e, 1);
-
-       /* Find out how much RAM we have on the card */
-       outw(0, dev->base_addr + WRITE_PTR);
-       for (i = 0; i < 32768; i++)
-               outw(0, dev->base_addr + DATAPORT);
-
-        for (memory_size = 0; memory_size < 64; memory_size++)
-       {
-               outw(memory_size<<10, dev->base_addr + READ_PTR);
-               if (inw(dev->base_addr+DATAPORT))
-                       break;
-               outw(memory_size<<10, dev->base_addr + WRITE_PTR);
-               outw(memory_size | 0x5000, dev->base_addr+DATAPORT);
-               outw(memory_size<<10, dev->base_addr + READ_PTR);
-               if (inw(dev->base_addr+DATAPORT) != (memory_size | 0x5000))
-                       break;
-       }
-
-       /* Sort out the number of buffers.  We may have 16, 32, 48 or 64k
-        * of RAM to play with.
-        */
-       lp->num_tx_bufs = 4;
-       lp->rx_buf_end = 0x3ff6;
-       switch (memory_size)
-       {
-       case 64:
-               lp->rx_buf_end += 0x4000;
-       case 48:
-               lp->num_tx_bufs += 4;
-               lp->rx_buf_end += 0x4000;
-       case 32:
-               lp->rx_buf_end += 0x4000;
-       case 16:
-               printk(", %dk RAM)\n", memory_size);
-               break;
-       default:
-               printk(") bad memory size (%dk).\n", memory_size);
-               return -ENODEV;
-               break;
-       }
-
-       lp->rx_buf_start = TX_BUF_START + (lp->num_tx_bufs*TX_BUF_SIZE);
-       lp->width = buswidth;
-
-       dev->netdev_ops = &eexp_netdev_ops;
-       dev->watchdog_timeo = 2*HZ;
-
-       return register_netdev(dev);
-}
-
-/*
- * Read a word from the EtherExpress on-board serial EEPROM.
- * The EEPROM contains 64 words of 16 bits.
- */
-static unsigned short __init eexp_hw_readeeprom(unsigned short ioaddr,
-                                                   unsigned char location)
-{
-       unsigned short cmd = 0x180|(location&0x7f);
-       unsigned short rval = 0,wval = EC_CS|i586_RST;
-       int i;
-
-       outb(EC_CS|i586_RST,ioaddr+EEPROM_Ctrl);
-       for (i=0x100 ; i ; i>>=1 )
-       {
-               if (cmd&i)
-                       wval |= EC_Wr;
-               else
-                       wval &= ~EC_Wr;
-
-               outb(wval,ioaddr+EEPROM_Ctrl);
-               outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
-               eeprom_delay();
-               outb(wval,ioaddr+EEPROM_Ctrl);
-               eeprom_delay();
-       }
-       wval &= ~EC_Wr;
-       outb(wval,ioaddr+EEPROM_Ctrl);
-       for (i=0x8000 ; i ; i>>=1 )
-       {
-               outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
-               eeprom_delay();
-               if (inb(ioaddr+EEPROM_Ctrl)&EC_Rd)
-                       rval |= i;
-               outb(wval,ioaddr+EEPROM_Ctrl);
-               eeprom_delay();
-       }
-       wval &= ~EC_CS;
-       outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
-       eeprom_delay();
-       outb(wval,ioaddr+EEPROM_Ctrl);
-       eeprom_delay();
-       return rval;
-}
-
-/*
- * Reap tx buffers and return last transmit status.
- * if ==0 then either:
- *    a) we're not transmitting anything, so why are we here?
- *    b) we've died.
- * otherwise, Stat_Busy(return) means we've still got some packets
- * to transmit, Stat_Done(return) means our buffers should be empty
- * again
- */
-
-static unsigned short eexp_hw_lasttxstat(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short tx_block = lp->tx_reap;
-       unsigned short status;
-
-       if (!netif_queue_stopped(dev) && lp->tx_head==lp->tx_reap)
-               return 0x0000;
-
-       do
-       {
-               outw(tx_block & ~31, dev->base_addr + SM_PTR);
-               status = inw(dev->base_addr + SHADOW(tx_block));
-               if (!Stat_Done(status))
-               {
-                       lp->tx_link = tx_block;
-                       return status;
-               }
-               else
-               {
-                       lp->last_tx_restart = 0;
-                       dev->stats.collisions += Stat_NoColl(status);
-                       if (!Stat_OK(status))
-                       {
-                               char *whatsup = NULL;
-                               dev->stats.tx_errors++;
-                               if (Stat_Abort(status))
-                                       dev->stats.tx_aborted_errors++;
-                               if (Stat_TNoCar(status)) {
-                                       whatsup = "aborted, no carrier";
-                                       dev->stats.tx_carrier_errors++;
-                               }
-                               if (Stat_TNoCTS(status)) {
-                                       whatsup = "aborted, lost CTS";
-                                       dev->stats.tx_carrier_errors++;
-                               }
-                               if (Stat_TNoDMA(status)) {
-                                       whatsup = "FIFO underran";
-                                       dev->stats.tx_fifo_errors++;
-                               }
-                               if (Stat_TXColl(status)) {
-                                       whatsup = "aborted, too many collisions";
-                                       dev->stats.tx_aborted_errors++;
-                               }
-                               if (whatsup)
-                                       printk(KERN_INFO "%s: transmit %s\n",
-                                              dev->name, whatsup);
-                       }
-                       else
-                               dev->stats.tx_packets++;
-               }
-               if (tx_block == TX_BUF_START+((lp->num_tx_bufs-1)*TX_BUF_SIZE))
-                       lp->tx_reap = tx_block = TX_BUF_START;
-               else
-                       lp->tx_reap = tx_block += TX_BUF_SIZE;
-               netif_wake_queue(dev);
-       }
-       while (lp->tx_reap != lp->tx_head);
-
-       lp->tx_link = lp->tx_tail + 0x08;
-
-       return status;
-}
-
-/*
- * This should never happen. It is called when some higher routine detects
- * that the CU has stopped, to try to restart it from the last packet we knew
- * we were working on, or the idle loop if we had finished for the time.
- */
-
-static void eexp_hw_txrestart(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short ioaddr = dev->base_addr;
-
-       lp->last_tx_restart = lp->tx_link;
-       scb_wrcbl(dev, lp->tx_link);
-       scb_command(dev, SCB_CUstart);
-       outb(0,ioaddr+SIGNAL_CA);
-
-       {
-               unsigned short boguscount=50,failcount=5;
-               while (!scb_status(dev))
-               {
-                       if (!--boguscount)
-                       {
-                               if (--failcount)
-                               {
-                                       printk(KERN_WARNING "%s: CU start timed out, status %04x, cmd %04x\n", dev->name, scb_status(dev), scb_rdcmd(dev));
-                                       scb_wrcbl(dev, lp->tx_link);
-                                       scb_command(dev, SCB_CUstart);
-                                       outb(0,ioaddr+SIGNAL_CA);
-                                       boguscount = 100;
-                               }
-                               else
-                               {
-                                       printk(KERN_WARNING "%s: Failed to restart CU, resetting board...\n",dev->name);
-                                       eexp_hw_init586(dev);
-                                       netif_wake_queue(dev);
-                                       return;
-                               }
-                       }
-               }
-       }
-}
-
-/*
- * Writes down the list of transmit buffers into card memory.  Each
- * entry consists of an 82586 transmit command, followed by a jump
- * pointing to itself.  When we want to transmit a packet, we write
- * the data into the appropriate transmit buffer and then modify the
- * preceding jump to point at the new transmit command.  This means that
- * the 586 command unit is continuously active.
- */
-
-static void eexp_hw_txinit(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short tx_block = TX_BUF_START;
-       unsigned short curtbuf;
-       unsigned short ioaddr = dev->base_addr;
-
-       for ( curtbuf=0 ; curtbuf<lp->num_tx_bufs ; curtbuf++ )
-       {
-               outw(tx_block, ioaddr + WRITE_PTR);
-
-               outw(0x0000, ioaddr + DATAPORT);
-               outw(Cmd_INT|Cmd_Xmit, ioaddr + DATAPORT);
-               outw(tx_block+0x08, ioaddr + DATAPORT);
-               outw(tx_block+0x0e, ioaddr + DATAPORT);
-
-               outw(0x0000, ioaddr + DATAPORT);
-               outw(0x0000, ioaddr + DATAPORT);
-               outw(tx_block+0x08, ioaddr + DATAPORT);
-
-               outw(0x8000, ioaddr + DATAPORT);
-               outw(-1, ioaddr + DATAPORT);
-               outw(tx_block+0x16, ioaddr + DATAPORT);
-               outw(0x0000, ioaddr + DATAPORT);
-
-               tx_block += TX_BUF_SIZE;
-       }
-       lp->tx_head = TX_BUF_START;
-       lp->tx_reap = TX_BUF_START;
-       lp->tx_tail = tx_block - TX_BUF_SIZE;
-       lp->tx_link = lp->tx_tail + 0x08;
-       lp->rx_buf_start = tx_block;
-
-}
-
-/*
- * Write the circular list of receive buffer descriptors to card memory.
- * The end of the list isn't marked, which means that the 82586 receive
- * unit will loop until buffers become available (this avoids it giving us
- * "out of resources" messages).
- */
-
-static void eexp_hw_rxinit(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short rx_block = lp->rx_buf_start;
-       unsigned short ioaddr = dev->base_addr;
-
-       lp->num_rx_bufs = 0;
-       lp->rx_first = lp->rx_ptr = rx_block;
-       do
-       {
-               lp->num_rx_bufs++;
-
-               outw(rx_block, ioaddr + WRITE_PTR);
-
-               outw(0, ioaddr + DATAPORT);  outw(0, ioaddr+DATAPORT);
-               outw(rx_block + RX_BUF_SIZE, ioaddr+DATAPORT);
-               outw(0xffff, ioaddr+DATAPORT);
-
-               outw(0x0000, ioaddr+DATAPORT);
-               outw(0xdead, ioaddr+DATAPORT);
-               outw(0xdead, ioaddr+DATAPORT);
-               outw(0xdead, ioaddr+DATAPORT);
-               outw(0xdead, ioaddr+DATAPORT);
-               outw(0xdead, ioaddr+DATAPORT);
-               outw(0xdead, ioaddr+DATAPORT);
-
-               outw(0x0000, ioaddr+DATAPORT);
-               outw(rx_block + RX_BUF_SIZE + 0x16, ioaddr+DATAPORT);
-               outw(rx_block + 0x20, ioaddr+DATAPORT);
-               outw(0, ioaddr+DATAPORT);
-               outw(RX_BUF_SIZE-0x20, ioaddr+DATAPORT);
-
-               lp->rx_last = rx_block;
-               rx_block += RX_BUF_SIZE;
-       } while (rx_block <= lp->rx_buf_end-RX_BUF_SIZE);
-
-
-       /* Make first Rx frame descriptor point to first Rx buffer
-           descriptor */
-       outw(lp->rx_first + 6, ioaddr+WRITE_PTR);
-       outw(lp->rx_first + 0x16, ioaddr+DATAPORT);
-
-       /* Close Rx frame descriptor ring */
-       outw(lp->rx_last + 4, ioaddr+WRITE_PTR);
-       outw(lp->rx_first, ioaddr+DATAPORT);
-
-       /* Close Rx buffer descriptor ring */
-       outw(lp->rx_last + 0x16 + 2, ioaddr+WRITE_PTR);
-       outw(lp->rx_first + 0x16, ioaddr+DATAPORT);
-
-}
-
-/*
- * Un-reset the 586, and start the configuration sequence. We don't wait for
- * this to finish, but allow the interrupt handler to start the CU and RU for
- * us.  We can't start the receive/transmission system up before we know that
- * the hardware is configured correctly.
- */
-
-static void eexp_hw_init586(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       unsigned short ioaddr = dev->base_addr;
-       int i;
-
-#if NET_DEBUG > 6
-       printk("%s: eexp_hw_init586()\n", dev->name);
-#endif
-
-       lp->started = 0;
-
-       set_loopback(dev);
-
-       outb(SIRQ_dis|irqrmap[dev->irq],ioaddr+SET_IRQ);
-
-       /* Download the startup code */
-       outw(lp->rx_buf_end & ~31, ioaddr + SM_PTR);
-       outw(lp->width?0x0001:0x0000, ioaddr + 0x8006);
-       outw(0x0000, ioaddr + 0x8008);
-       outw(0x0000, ioaddr + 0x800a);
-       outw(0x0000, ioaddr + 0x800c);
-       outw(0x0000, ioaddr + 0x800e);
-
-       for (i = 0; i < ARRAY_SIZE(start_code) * 2; i+=32) {
-               int j;
-               outw(i, ioaddr + SM_PTR);
-               for (j = 0; j < 16 && (i+j)/2 < ARRAY_SIZE(start_code); j+=2)
-                       outw(start_code[(i+j)/2],
-                            ioaddr+0x4000+j);
-               for (j = 0; j < 16 && (i+j+16)/2 < ARRAY_SIZE(start_code); j+=2)
-                       outw(start_code[(i+j+16)/2],
-                            ioaddr+0x8000+j);
-       }
-
-       /* Do we want promiscuous mode or multicast? */
-       outw(CONF_PROMISC & ~31, ioaddr+SM_PTR);
-       i = inw(ioaddr+SHADOW(CONF_PROMISC));
-       outw((dev->flags & IFF_PROMISC)?(i|1):(i & ~1),
-            ioaddr+SHADOW(CONF_PROMISC));
-       lp->was_promisc = dev->flags & IFF_PROMISC;
-#if 0
-       eexp_setup_filter(dev);
-#endif
-
-       /* Write our hardware address */
-       outw(CONF_HWADDR & ~31, ioaddr+SM_PTR);
-       outw(((unsigned short *)dev->dev_addr)[0], ioaddr+SHADOW(CONF_HWADDR));
-       outw(((unsigned short *)dev->dev_addr)[1],
-            ioaddr+SHADOW(CONF_HWADDR+2));
-       outw(((unsigned short *)dev->dev_addr)[2],
-            ioaddr+SHADOW(CONF_HWADDR+4));
-
-       eexp_hw_txinit(dev);
-       eexp_hw_rxinit(dev);
-
-       outb(0,ioaddr+EEPROM_Ctrl);
-       mdelay(5);
-
-       scb_command(dev, 0xf000);
-       outb(0,ioaddr+SIGNAL_CA);
-
-       outw(0, ioaddr+SM_PTR);
-
-       {
-               unsigned short rboguscount=50,rfailcount=5;
-               while (inw(ioaddr+0x4000))
-               {
-                       if (!--rboguscount)
-                       {
-                               printk(KERN_WARNING "%s: i82586 reset timed out, kicking...\n",
-                                       dev->name);
-                               scb_command(dev, 0);
-                               outb(0,ioaddr+SIGNAL_CA);
-                               rboguscount = 100;
-                               if (!--rfailcount)
-                               {
-                                       printk(KERN_WARNING "%s: i82586 not responding, giving up.\n",
-                                               dev->name);
-                                       return;
-                               }
-                       }
-               }
-       }
-
-        scb_wrcbl(dev, CONF_LINK);
-       scb_command(dev, 0xf000|SCB_CUstart);
-       outb(0,ioaddr+SIGNAL_CA);
-
-       {
-               unsigned short iboguscount=50,ifailcount=5;
-               while (!scb_status(dev))
-               {
-                       if (!--iboguscount)
-                       {
-                               if (--ifailcount)
-                               {
-                                       printk(KERN_WARNING "%s: i82586 initialization timed out, status %04x, cmd %04x\n",
-                                               dev->name, scb_status(dev), scb_rdcmd(dev));
-                                       scb_wrcbl(dev, CONF_LINK);
-                                       scb_command(dev, 0xf000|SCB_CUstart);
-                                       outb(0,ioaddr+SIGNAL_CA);
-                                       iboguscount = 100;
-                               }
-                               else
-                               {
-                                       printk(KERN_WARNING "%s: Failed to initialize i82586, giving up.\n",dev->name);
-                                       return;
-                               }
-                       }
-               }
-       }
-
-       clear_loopback(dev);
-       outb(SIRQ_en|irqrmap[dev->irq],ioaddr+SET_IRQ);
-
-       lp->init_time = jiffies;
-#if NET_DEBUG > 6
-        printk("%s: leaving eexp_hw_init586()\n", dev->name);
-#endif
-}
-
-static void eexp_setup_filter(struct net_device *dev)
-{
-       struct netdev_hw_addr *ha;
-       unsigned short ioaddr = dev->base_addr;
-       int count = netdev_mc_count(dev);
-       int i;
-       if (count > 8) {
-               printk(KERN_INFO "%s: too many multicast addresses (%d)\n",
-                      dev->name, count);
-               count = 8;
-       }
-
-       outw(CONF_NR_MULTICAST & ~31, ioaddr+SM_PTR);
-       outw(6*count, ioaddr+SHADOW(CONF_NR_MULTICAST));
-       i = 0;
-       netdev_for_each_mc_addr(ha, dev) {
-               unsigned short *data = (unsigned short *) ha->addr;
-
-               if (i == count)
-                       break;
-               outw((CONF_MULTICAST+(6*i)) & ~31, ioaddr+SM_PTR);
-               outw(data[0], ioaddr+SHADOW(CONF_MULTICAST+(6*i)));
-               outw((CONF_MULTICAST+(6*i)+2) & ~31, ioaddr+SM_PTR);
-               outw(data[1], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+2));
-               outw((CONF_MULTICAST+(6*i)+4) & ~31, ioaddr+SM_PTR);
-               outw(data[2], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+4));
-               i++;
-       }
-}
-
-/*
- * Set or clear the multicast filter for this adaptor.
- */
-static void
-eexp_set_multicast(struct net_device *dev)
-{
-        unsigned short ioaddr = dev->base_addr;
-        struct net_local *lp = netdev_priv(dev);
-        int kick = 0, i;
-        if ((dev->flags & IFF_PROMISC) != lp->was_promisc) {
-                outw(CONF_PROMISC & ~31, ioaddr+SM_PTR);
-                i = inw(ioaddr+SHADOW(CONF_PROMISC));
-                outw((dev->flags & IFF_PROMISC)?(i|1):(i & ~1),
-                     ioaddr+SHADOW(CONF_PROMISC));
-                lp->was_promisc = dev->flags & IFF_PROMISC;
-                kick = 1;
-        }
-        if (!(dev->flags & IFF_PROMISC)) {
-                eexp_setup_filter(dev);
-                if (lp->old_mc_count != netdev_mc_count(dev)) {
-                        kick = 1;
-                        lp->old_mc_count = netdev_mc_count(dev);
-                }
-        }
-        if (kick) {
-                unsigned long oj;
-                scb_command(dev, SCB_CUsuspend);
-                outb(0, ioaddr+SIGNAL_CA);
-                outb(0, ioaddr+SIGNAL_CA);
-#if 0
-                printk("%s: waiting for CU to go suspended\n", dev->name);
-#endif
-                oj = jiffies;
-                while ((SCB_CUstat(scb_status(dev)) == 2) &&
-                       (time_before(jiffies, oj + 2000)));
-               if (SCB_CUstat(scb_status(dev)) == 2)
-                       printk("%s: warning, CU didn't stop\n", dev->name);
-                lp->started &= ~(STARTED_CU);
-                scb_wrcbl(dev, CONF_LINK);
-                scb_command(dev, SCB_CUstart);
-                outb(0, ioaddr+SIGNAL_CA);
-        }
-}
-
-
-/*
- * MODULE stuff
- */
-
-#ifdef MODULE
-
-#define EEXP_MAX_CARDS     4    /* max number of cards to support */
-
-static struct net_device *dev_eexp[EEXP_MAX_CARDS];
-static int irq[EEXP_MAX_CARDS];
-static int io[EEXP_MAX_CARDS];
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-MODULE_PARM_DESC(io, "EtherExpress 16 I/O base address(es)");
-MODULE_PARM_DESC(irq, "EtherExpress 16 IRQ number(s)");
-MODULE_LICENSE("GPL");
-
-
-/* Ideally the user would give us io=, irq= for every card.  If any parameters
- * are specified, we verify and then use them.  If no parameters are given, we
- * autoprobe for one card only.
- */
-int __init init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) {
-               dev = alloc_etherdev(sizeof(struct net_local));
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               if (io[this_dev] == 0) {
-                       if (this_dev)
-                               break;
-                       printk(KERN_NOTICE "eexpress.c: Module autoprobe not recommended, give io=xx.\n");
-               }
-               if (do_express_probe(dev) == 0) {
-                       dev_eexp[this_dev] = dev;
-                       found++;
-                       continue;
-               }
-               printk(KERN_WARNING "eexpress.c: Failed to register card at 0x%x.\n", io[this_dev]);
-               free_netdev(dev);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-void __exit cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) {
-               struct net_device *dev = dev_eexp[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif
-
-/*
- * Local Variables:
- *  c-file-style: "linux"
- *  tab-width: 8
- * End:
- */
diff --git a/drivers/net/ethernet/i825xx/eexpress.h b/drivers/net/ethernet/i825xx/eexpress.h
deleted file mode 100644 (file)
index dc9c6ea..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * eexpress.h: Intel EtherExpress16 defines
- */
-
-/*
- * EtherExpress card register addresses
- * as offsets from the base IO region (dev->base_addr)
- */
-
-#define DATAPORT      0x0000
-#define WRITE_PTR     0x0002
-#define READ_PTR      0x0004
-#define SIGNAL_CA     0x0006
-#define SET_IRQ       0x0007
-#define SM_PTR        0x0008
-#define        MEM_Dec       0x000a
-#define MEM_Ctrl      0x000b
-#define MEM_Page_Ctrl 0x000c
-#define Config        0x000d
-#define EEPROM_Ctrl   0x000e
-#define ID_PORT       0x000f
-#define        MEM_ECtrl     0x000f
-
-/*
- * card register defines
- */
-
-/* SET_IRQ */
-#define SIRQ_en       0x08
-#define SIRQ_dis      0x00
-
-/* EEPROM_Ctrl */
-#define EC_Clk        0x01
-#define EC_CS         0x02
-#define EC_Wr         0x04
-#define EC_Rd         0x08
-#define ASIC_RST      0x40
-#define i586_RST      0x80
-
-#define eeprom_delay() { udelay(40); }
-
-/*
- * i82586 Memory Configuration
- */
-
-/* (System Configuration Pointer) System start up block, read after 586_RST */
-#define SCP_START 0xfff6
-
-/* Intermediate System Configuration Pointer */
-#define ISCP_START 0x0000
-
-/* System Command Block */
-#define SCB_START 0x0008
-
-/* Start of buffer region.  Everything before this is used for control
- * structures and the CU configuration program.  The memory layout is
- * determined in eexp_hw_probe(), once we know how much memory is
- * available on the card.
- */
-
-#define TX_BUF_START 0x0100
-
-#define TX_BUF_SIZE ((24+ETH_FRAME_LEN+31)&~0x1f)
-#define RX_BUF_SIZE ((32+ETH_FRAME_LEN+31)&~0x1f)
-
-/*
- * SCB defines
- */
-
-/* these functions take the SCB status word and test the relevant status bit */
-#define SCB_complete(s) (((s) & 0x8000) != 0)
-#define SCB_rxdframe(s) (((s) & 0x4000) != 0)
-#define SCB_CUdead(s)   (((s) & 0x2000) != 0)
-#define SCB_RUdead(s)   (((s) & 0x1000) != 0)
-#define SCB_ack(s)      ((s) & 0xf000)
-
-/* Command unit status: 0=idle, 1=suspended, 2=active */
-#define SCB_CUstat(s)   (((s)&0x0300)>>8)
-
-/* Receive unit status: 0=idle, 1=suspended, 2=out of resources, 4=ready */
-#define SCB_RUstat(s)   (((s)&0x0070)>>4)
-
-/* SCB commands */
-#define SCB_CUnop       0x0000
-#define SCB_CUstart     0x0100
-#define SCB_CUresume    0x0200
-#define SCB_CUsuspend   0x0300
-#define SCB_CUabort     0x0400
-#define SCB_resetchip   0x0080
-
-#define SCB_RUnop       0x0000
-#define SCB_RUstart     0x0010
-#define SCB_RUresume    0x0020
-#define SCB_RUsuspend   0x0030
-#define SCB_RUabort     0x0040
-
-/*
- * Command block defines
- */
-
-#define Stat_Done(s)    (((s) & 0x8000) != 0)
-#define Stat_Busy(s)    (((s) & 0x4000) != 0)
-#define Stat_OK(s)      (((s) & 0x2000) != 0)
-#define Stat_Abort(s)   (((s) & 0x1000) != 0)
-#define Stat_STFail     (((s) & 0x0800) != 0)
-#define Stat_TNoCar(s)  (((s) & 0x0400) != 0)
-#define Stat_TNoCTS(s)  (((s) & 0x0200) != 0)
-#define Stat_TNoDMA(s)  (((s) & 0x0100) != 0)
-#define Stat_TDefer(s)  (((s) & 0x0080) != 0)
-#define Stat_TColl(s)   (((s) & 0x0040) != 0)
-#define Stat_TXColl(s)  (((s) & 0x0020) != 0)
-#define Stat_NoColl(s)  ((s) & 0x000f)
-
-/* Cmd_END will end AFTER the command if this is the first
- * command block after an SCB_CUstart, but BEFORE the command
- * for all subsequent commands. Best strategy is to place
- * Cmd_INT on the last command in the sequence, followed by a
- * dummy Cmd_Nop with Cmd_END after this.
- */
-
-#define Cmd_END     0x8000
-#define Cmd_SUS     0x4000
-#define Cmd_INT     0x2000
-
-#define Cmd_Nop     0x0000
-#define Cmd_SetAddr 0x0001
-#define Cmd_Config  0x0002
-#define Cmd_MCast   0x0003
-#define Cmd_Xmit    0x0004
-#define Cmd_TDR     0x0005
-#define Cmd_Dump    0x0006
-#define Cmd_Diag    0x0007
-
-
-/*
- * Frame Descriptor (Receive block) defines
- */
-
-#define FD_Done(s)  (((s) & 0x8000) != 0)
-#define FD_Busy(s)  (((s) & 0x4000) != 0)
-#define FD_OK(s)    (((s) & 0x2000) != 0)
-
-#define FD_CRC(s)   (((s) & 0x0800) != 0)
-#define FD_Align(s) (((s) & 0x0400) != 0)
-#define FD_Resrc(s) (((s) & 0x0200) != 0)
-#define FD_DMA(s)   (((s) & 0x0100) != 0)
-#define FD_Short(s) (((s) & 0x0080) != 0)
-#define FD_NoEOF(s) (((s) & 0x0040) != 0)
-
-struct rfd_header {
-       volatile unsigned long flags;
-       volatile unsigned short link;
-       volatile unsigned short rbd_offset;
-       volatile unsigned short dstaddr1;
-       volatile unsigned short dstaddr2;
-       volatile unsigned short dstaddr3;
-       volatile unsigned short srcaddr1;
-       volatile unsigned short srcaddr2;
-       volatile unsigned short srcaddr3;
-       volatile unsigned short length;
-
-       /* This is actually a Receive Buffer Descriptor.  The way we
-        * arrange memory means that an RBD always follows the RFD that
-        * points to it, so they might as well be in the same structure.
-        */
-       volatile unsigned short actual_count;
-       volatile unsigned short next_rbd;
-       volatile unsigned short buf_addr1;
-       volatile unsigned short buf_addr2;
-       volatile unsigned short size;
-};
-
-/* Returned data from the Time Domain Reflectometer */
-
-#define TDR_LINKOK       (1<<15)
-#define TDR_XCVRPROBLEM  (1<<14)
-#define TDR_OPEN         (1<<13)
-#define TDR_SHORT        (1<<12)
-#define TDR_TIME         0x7ff
diff --git a/drivers/net/ethernet/i825xx/lp486e.c b/drivers/net/ethernet/i825xx/lp486e.c
deleted file mode 100644 (file)
index 3735bfa..0000000
+++ /dev/null
@@ -1,1337 +0,0 @@
-/* Intel Professional Workstation/panther ethernet driver */
-/* lp486e.c: A panther 82596 ethernet driver for linux. */
-/*
-    History and copyrights:
-
-    Driver skeleton
-        Written 1993 by Donald Becker.
-        Copyright 1993 United States Government as represented by the Director,
-        National Security Agency.  This software may only be used and
-       distributed according to the terms of the GNU General Public License
-       as modified by SRC, incorporated herein by reference.
-
-        The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-    Apricot
-        Written 1994 by Mark Evans.
-        This driver is for the Apricot 82596 bus-master interface
-
-        Modularised 12/94 Mark Evans
-
-    Professional Workstation
-       Derived from apricot.c by Ard van Breemen
-       <ard@murphy.nl>|<ard@cstmel.hobby.nl>|<ard@cstmel.nl.eu.org>
-
-       Credits:
-       Thanks to Murphy Software BV for letting me write this in their time.
-       Well, actually, I get paid doing this...
-       (Also: see http://www.murphy.nl for murphy, and my homepage ~ard for
-       more information on the Professional Workstation)
-
-    Present version
-       aeb@cwi.nl
-*/
-/*
-    There are currently two motherboards that I know of in the
-    professional workstation. The only one that I know is the
-    intel panther motherboard. -- ard
-*/
-/*
-The pws is equipped with an intel 82596. This is a very intelligent controller
-which runs its own micro-code. Communication with the hostprocessor is done
-through linked lists of commands and buffers in the hostprocessors memory.
-A complete description of the 82596 is available from intel. Search for
-a file called "29021806.pdf". It is a complete description of the chip itself.
-To use it for the pws some additions are needed regarding generation of
-the PORT and CA signal, and the interrupt glue needed for a pc.
-I/O map:
-PORT  SIZE ACTION MEANING
-0xCB0    2 WRITE  Lower 16 bits for PORT command
-0xCB2    2 WRITE  Upper 16 bits for PORT command, and issue of PORT command
-0xCB4    1 WRITE  Generation of CA signal
-0xCB8    1 WRITE  Clear interrupt glue
-All other communication is through memory!
-*/
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#define DRV_NAME "lp486e"
-
-/* debug print flags */
-#define LOG_SRCDST    0x80000000
-#define LOG_STATINT   0x40000000
-#define LOG_STARTINT  0x20000000
-
-#define i596_debug debug
-
-static int i596_debug = 0;
-
-static const char * const medianame[] = {
-       "10baseT", "AUI",
-       "10baseT-FD", "AUI-FD",
-};
-
-#define LP486E_TOTAL_SIZE 16
-
-#define I596_NULL (0xffffffff)
-
-#define CMD_EOL                0x8000  /* The last command of the list, stop. */
-#define CMD_SUSP       0x4000  /* Suspend after doing cmd. */
-#define CMD_INTR       0x2000  /* Interrupt after doing cmd. */
-
-#define CMD_FLEX       0x0008  /* Enable flexible memory model */
-
-enum commands {
-       CmdNOP = 0,
-       CmdIASetup = 1,
-       CmdConfigure = 2,
-       CmdMulticastList = 3,
-       CmdTx = 4,
-       CmdTDR = 5,
-       CmdDump = 6,
-       CmdDiagnose = 7
-};
-
-#if 0
-static const char *CUcmdnames[8] = { "NOP", "IASetup", "Configure", "MulticastList",
-                                    "Tx", "TDR", "Dump", "Diagnose" };
-#endif
-
-/* Status word bits */
-#define        STAT_CX         0x8000  /* The CU finished executing a command
-                                  with the Interrupt bit set */
-#define        STAT_FR         0x4000  /* The RU finished receiving a frame */
-#define        STAT_CNA        0x2000  /* The CU left the active state */
-#define        STAT_RNR        0x1000  /* The RU left the active state */
-#define STAT_ACK       (STAT_CX | STAT_FR | STAT_CNA | STAT_RNR)
-#define        STAT_CUS        0x0700  /* Status of CU: 0: idle, 1: suspended,
-                                  2: active, 3-7: unused */
-#define STAT_RUS       0x00f0  /* Status of RU: 0: idle, 1: suspended,
-                                  2: no resources, 4: ready,
-                                  10: no resources due to no more RBDs,
-                                  12: no more RBDs, other: unused */
-#define        STAT_T          0x0008  /* Bus throttle timers loaded */
-#define        STAT_ZERO       0x0807  /* Always zero */
-
-#if 0
-static char *CUstates[8] = {
-       "idle", "suspended", "active", 0, 0, 0, 0, 0
-};
-static char *RUstates[16] = {
-       "idle", "suspended", "no resources", 0, "ready", 0, 0, 0,
-       0, 0, "no RBDs", 0, "out of RBDs", 0, 0, 0
-};
-
-static void
-i596_out_status(int status) {
-       int bad = 0;
-       char *s;
-
-       printk("status %4.4x:", status);
-       if (status == 0xffff)
-               printk(" strange..\n");
-       else {
-               if (status & STAT_CX)
-                       printk("  CU done");
-               if (status & STAT_CNA)
-                       printk("  CU stopped");
-               if (status & STAT_FR)
-                       printk("  got a frame");
-               if (status & STAT_RNR)
-                       printk("  RU stopped");
-               if (status & STAT_T)
-                       printk("  throttled");
-               if (status & STAT_ZERO)
-                       bad = 1;
-               s = CUstates[(status & STAT_CUS) >> 8];
-               if (!s)
-                       bad = 1;
-               else
-                       printk("  CU(%s)", s);
-               s = RUstates[(status & STAT_RUS) >> 4];
-               if (!s)
-                       bad = 1;
-               else
-                       printk("  RU(%s)", s);
-               if (bad)
-                       printk("  bad status");
-               printk("\n");
-       }
-}
-#endif
-
-/* Command word bits */
-#define ACK_CX         0x8000
-#define ACK_FR         0x4000
-#define ACK_CNA                0x2000
-#define ACK_RNR                0x1000
-
-#define CUC_START      0x0100
-#define CUC_RESUME     0x0200
-#define CUC_SUSPEND    0x0300
-#define CUC_ABORT      0x0400
-
-#define RX_START       0x0010
-#define RX_RESUME      0x0020
-#define RX_SUSPEND     0x0030
-#define RX_ABORT       0x0040
-
-typedef u32 phys_addr;
-
-static inline phys_addr
-va_to_pa(void *x) {
-       return x ? virt_to_bus(x) : I596_NULL;
-}
-
-static inline void *
-pa_to_va(phys_addr x) {
-       return (x == I596_NULL) ? NULL : bus_to_virt(x);
-}
-
-/* status bits for cmd */
-#define CMD_STAT_C     0x8000  /* CU command complete */
-#define CMD_STAT_B     0x4000  /* CU command in progress */
-#define CMD_STAT_OK    0x2000  /* CU command completed without errors */
-#define CMD_STAT_A     0x1000  /* CU command abnormally terminated */
-
-struct i596_cmd {              /* 8 bytes */
-       unsigned short status;
-       unsigned short command;
-       phys_addr pa_next;      /* va_to_pa(struct i596_cmd *next) */
-};
-
-#define EOF            0x8000
-#define SIZE_MASK      0x3fff
-
-struct i596_tbd {
-       unsigned short size;
-       unsigned short pad;
-       phys_addr pa_next;      /* va_to_pa(struct i596_tbd *next) */
-       phys_addr pa_data;      /* va_to_pa(char *data) */
-       struct sk_buff *skb;
-};
-
-struct tx_cmd {
-       struct i596_cmd cmd;
-       phys_addr pa_tbd;       /* va_to_pa(struct i596_tbd *tbd) */
-       unsigned short size;
-       unsigned short pad;
-};
-
-/* status bits for rfd */
-#define RFD_STAT_C     0x8000  /* Frame reception complete */
-#define RFD_STAT_B     0x4000  /* Frame reception in progress */
-#define RFD_STAT_OK    0x2000  /* Frame received without errors */
-#define RFD_STATUS     0x1fff
-#define RFD_LENGTH_ERR 0x1000
-#define RFD_CRC_ERR    0x0800
-#define RFD_ALIGN_ERR  0x0400
-#define RFD_NOBUFS_ERR 0x0200
-#define RFD_DMA_ERR    0x0100  /* DMA overrun failure to acquire system bus */
-#define RFD_SHORT_FRAME_ERR    0x0080
-#define RFD_NOEOP_ERR  0x0040
-#define RFD_TRUNC_ERR  0x0020
-#define RFD_MULTICAST  0x0002  /* 0: destination had our address
-                                  1: destination was broadcast/multicast */
-#define RFD_COLLISION  0x0001
-
-/* receive frame descriptor */
-struct i596_rfd {
-       unsigned short stat;
-       unsigned short cmd;
-       phys_addr pa_next;      /* va_to_pa(struct i596_rfd *next) */
-       phys_addr pa_rbd;       /* va_to_pa(struct i596_rbd *rbd) */
-       unsigned short count;
-       unsigned short size;
-       char data[1532];
-};
-
-#define RBD_EL         0x8000
-#define RBD_P          0x4000
-#define RBD_SIZEMASK   0x3fff
-#define RBD_EOF                0x8000
-#define RBD_F          0x4000
-
-/* receive buffer descriptor */
-struct i596_rbd {
-       unsigned short size;
-       unsigned short pad;
-       phys_addr pa_next;      /* va_to_pa(struct i596_tbd *next) */
-       phys_addr pa_data;      /* va_to_pa(char *data) */
-       phys_addr pa_prev;      /* va_to_pa(struct i596_tbd *prev) */
-
-       /* Driver private part */
-       struct sk_buff *skb;
-};
-
-#define RX_RING_SIZE 64
-#define RX_SKBSIZE (ETH_FRAME_LEN+10)
-#define RX_RBD_SIZE 32
-
-/* System Control Block - 40 bytes */
-struct i596_scb {
-       u16 status;             /* 0 */
-       u16 command;            /* 2 */
-       phys_addr pa_cmd;       /* 4 - va_to_pa(struct i596_cmd *cmd) */
-       phys_addr pa_rfd;       /* 8 - va_to_pa(struct i596_rfd *rfd) */
-       u32 crc_err;            /* 12 */
-       u32 align_err;          /* 16 */
-       u32 resource_err;       /* 20 */
-       u32 over_err;           /* 24 */
-       u32 rcvdt_err;          /* 28 */
-       u32 short_err;          /* 32 */
-       u16 t_on;               /* 36 */
-       u16 t_off;              /* 38 */
-};
-
-/* Intermediate System Configuration Pointer - 8 bytes */
-struct i596_iscp {
-       u32 busy;               /* 0 */
-       phys_addr pa_scb;       /* 4 - va_to_pa(struct i596_scb *scb) */
-};
-
-/* System Configuration Pointer - 12 bytes */
-struct i596_scp {
-       u32 sysbus;             /* 0 */
-       u32 pad;                /* 4 */
-       phys_addr pa_iscp;      /* 8 - va_to_pa(struct i596_iscp *iscp) */
-};
-
-/* Selftest and dump results - needs 16-byte alignment */
-/*
- * The size of the dump area is 304 bytes. When the dump is executed
- * by the Port command an extra word will be appended to the dump area.
- * The extra word is a copy of the Dump status word (containing the
- * C, B, OK bits). [I find 0xa006, with a0 for C+OK and 6 for dump]
- */
-struct i596_dump {
-       u16 dump[153];          /* (304 = 130h) + 2 bytes */
-};
-
-struct i596_private {          /* aligned to a 16-byte boundary */
-       struct i596_scp scp;    /* 0 - needs 16-byte alignment */
-       struct i596_iscp iscp;  /* 12 */
-       struct i596_scb scb;    /* 20 */
-       u32 dummy;              /* 60 */
-       struct i596_dump dump;  /* 64 - needs 16-byte alignment */
-
-       struct i596_cmd set_add;
-       char eth_addr[8];       /* directly follows set_add */
-
-       struct i596_cmd set_conf;
-       char i596_config[16];   /* directly follows set_conf */
-
-       struct i596_cmd tdr;
-       unsigned long tdr_stat; /* directly follows tdr */
-
-       int last_restart;
-       struct i596_rbd *rbd_list;
-       struct i596_rbd *rbd_tail;
-       struct i596_rfd *rx_tail;
-       struct i596_cmd *cmd_tail;
-       struct i596_cmd *cmd_head;
-       int cmd_backlog;
-       unsigned long last_cmd;
-       spinlock_t cmd_lock;
-};
-
-static char init_setup[14] = {
-       0x8E,   /* length 14 bytes, prefetch on */
-       0xC8,   /* default: fifo to 8, monitor off */
-       0x40,   /* default: don't save bad frames (apricot.c had 0x80) */
-       0x2E,   /* (default is 0x26)
-                  No source address insertion, 8 byte preamble */
-       0x00,   /* default priority and backoff */
-       0x60,   /* default interframe spacing */
-       0x00,   /* default slot time LSB */
-       0xf2,   /* default slot time and nr of retries */
-       0x00,   /* default various bits
-                  (0: promiscuous mode, 1: broadcast disable,
-                   2: encoding mode, 3: transmit on no CRS,
-                   4: no CRC insertion, 5: CRC type,
-                   6: bit stuffing, 7: padding) */
-       0x00,   /* default carrier sense and collision detect */
-       0x40,   /* default minimum frame length */
-       0xff,   /* (default is 0xff, and that is what apricot.c has;
-                  elp486.c has 0xfb: Enable crc append in memory.) */
-       0x00,   /* default: not full duplex */
-       0x7f    /* (default is 0x3f) multi IA */
-};
-
-static int i596_open(struct net_device *dev);
-static netdev_tx_t i596_start_xmit(struct sk_buff *skb, struct net_device *dev);
-static irqreturn_t i596_interrupt(int irq, void *dev_id);
-static int i596_close(struct net_device *dev);
-static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd);
-static void print_eth(char *);
-static void set_multicast_list(struct net_device *dev);
-static void i596_tx_timeout(struct net_device *dev);
-
-static int
-i596_timeout(struct net_device *dev, char *msg, int ct) {
-       struct i596_private *lp;
-       int boguscnt = ct;
-
-       lp = netdev_priv(dev);
-       while (lp->scb.command) {
-               if (--boguscnt == 0) {
-                       printk("%s: %s timed out - stat %4.4x, cmd %4.4x\n",
-                              dev->name, msg,
-                              lp->scb.status, lp->scb.command);
-                       return 1;
-               }
-               udelay(5);
-               barrier();
-       }
-       return 0;
-}
-
-static inline int
-init_rx_bufs(struct net_device *dev, int num) {
-       struct i596_private *lp;
-       struct i596_rfd *rfd;
-       int i;
-       // struct i596_rbd *rbd;
-
-       lp = netdev_priv(dev);
-       lp->scb.pa_rfd = I596_NULL;
-
-       for (i = 0; i < num; i++) {
-               rfd = kmalloc(sizeof(struct i596_rfd), GFP_KERNEL);
-               if (rfd == NULL)
-                       break;
-
-               rfd->stat = 0;
-               rfd->pa_rbd = I596_NULL;
-               rfd->count = 0;
-               rfd->size = 1532;
-               if (i == 0) {
-                       rfd->cmd = CMD_EOL;
-                       lp->rx_tail = rfd;
-               } else {
-                       rfd->cmd = 0;
-               }
-               rfd->pa_next = lp->scb.pa_rfd;
-               lp->scb.pa_rfd = va_to_pa(rfd);
-               lp->rx_tail->pa_next = lp->scb.pa_rfd;
-       }
-
-#if 0
-       for (i = 0; i<RX_RBD_SIZE; i++) {
-               rbd = kmalloc(sizeof(struct i596_rbd), GFP_KERNEL);
-               if (rbd) {
-                       rbd->pad = 0;
-                       rbd->count = 0;
-                       rbd->skb = dev_alloc_skb(RX_SKBSIZE);
-                       if (!rbd->skb) {
-                               printk("dev_alloc_skb failed");
-                       }
-                       rbd->next = rfd->rbd;
-                       if (i) {
-                               rfd->rbd->prev = rbd;
-                               rbd->size = RX_SKBSIZE;
-                       } else {
-                               rbd->size = (RX_SKBSIZE | RBD_EL);
-                               lp->rbd_tail = rbd;
-                       }
-
-                       rfd->rbd = rbd;
-               }
-       }
-       lp->rbd_tail->next = rfd->rbd;
-#endif
-       return i;
-}
-
-static inline void
-remove_rx_bufs(struct net_device *dev) {
-       struct i596_private *lp;
-       struct i596_rfd *rfd;
-
-       lp = netdev_priv(dev);
-       lp->rx_tail->pa_next = I596_NULL;
-
-       do {
-               rfd = pa_to_va(lp->scb.pa_rfd);
-               lp->scb.pa_rfd = rfd->pa_next;
-               kfree(rfd);
-       } while (rfd != lp->rx_tail);
-
-       lp->rx_tail = NULL;
-
-#if 0
-       for (lp->rbd_list) {
-       }
-#endif
-}
-
-#define PORT_RESET              0x00    /* reset 82596 */
-#define PORT_SELFTEST           0x01    /* selftest */
-#define PORT_ALTSCP             0x02    /* alternate SCB address */
-#define PORT_DUMP               0x03    /* dump */
-
-#define IOADDR 0xcb0           /* real constant */
-#define IRQ    10              /* default IRQ - can be changed by ECU */
-
-/* The 82596 requires two 16-bit write cycles for a port command */
-static inline void
-PORT(phys_addr a, unsigned int cmd) {
-       if (a & 0xf)
-               printk("lp486e.c: PORT: address not aligned\n");
-       outw(((a & 0xffff) | cmd), IOADDR);
-       outw(((a>>16) & 0xffff), IOADDR+2);
-}
-
-static inline void
-CA(void) {
-       outb(0, IOADDR+4);
-       udelay(8);
-}
-
-static inline void
-CLEAR_INT(void) {
-       outb(0, IOADDR+8);
-}
-
-#if 0
-/* selftest or dump */
-static void
-i596_port_do(struct net_device *dev, int portcmd, char *cmdname) {
-       struct i596_private *lp = netdev_priv(dev);
-       u16 *outp;
-       int i, m;
-
-       memset((void *)&(lp->dump), 0, sizeof(struct i596_dump));
-       outp = &(lp->dump.dump[0]);
-
-       PORT(va_to_pa(outp), portcmd);
-       mdelay(30);             /* random, unmotivated */
-
-       printk("lp486e i82596 %s result:\n", cmdname);
-       for (m = ARRAY_SIZE(lp->dump.dump); m && lp->dump.dump[m-1] == 0; m--)
-               ;
-       for (i = 0; i < m; i++) {
-               printk(" %04x", lp->dump.dump[i]);
-               if (i%8 == 7)
-                       printk("\n");
-       }
-       printk("\n");
-}
-#endif
-
-static int
-i596_scp_setup(struct net_device *dev) {
-       struct i596_private *lp = netdev_priv(dev);
-       int boguscnt;
-
-       /* Setup SCP, ISCP, SCB */
-       /*
-        * sysbus bits:
-        *  only a single byte is significant - here 0x44
-        *  0x80: big endian mode (details depend on stepping)
-        *  0x40: 1
-        *  0x20: interrupt pin is active low
-        *  0x10: lock function disabled
-        *  0x08: external triggering of bus throttle timers
-        *  0x06: 00: 82586 compat mode, 01: segmented mode, 10: linear mode
-        *  0x01: unused
-        */
-       lp->scp.sysbus = 0x00440000;            /* linear mode */
-       lp->scp.pad = 0;                        /* must be zero */
-       lp->scp.pa_iscp = va_to_pa(&(lp->iscp));
-
-       /*
-        * The CPU sets the ISCP to 1 before it gives the first CA()
-        */
-       lp->iscp.busy = 0x0001;
-       lp->iscp.pa_scb = va_to_pa(&(lp->scb));
-
-       lp->scb.command = 0;
-       lp->scb.status = 0;
-       lp->scb.pa_cmd = I596_NULL;
-       /* lp->scb.pa_rfd has been initialised already */
-
-       lp->last_cmd = jiffies;
-       lp->cmd_backlog = 0;
-       lp->cmd_head = NULL;
-
-       /*
-        * Reset the 82596.
-        * We need to wait 10 systemclock cycles, and
-        * 5 serial clock cycles.
-        */
-       PORT(0, PORT_RESET);    /* address part ignored */
-       udelay(100);
-
-       /*
-        * Before the CA signal is asserted, the default SCP address
-        * (0x00fffff4) can be changed to a 16-byte aligned value
-        */
-       PORT(va_to_pa(&lp->scp), PORT_ALTSCP);  /* change the scp address */
-
-       /*
-        * The initialization procedure begins when a
-        * Channel Attention signal is asserted after a reset.
-        */
-
-       CA();
-
-       /*
-        * The ISCP busy is cleared by the 82596 after the SCB address is read.
-        */
-       boguscnt = 100;
-       while (lp->iscp.busy) {
-               if (--boguscnt == 0) {
-                       /* No i82596 present? */
-                       printk("%s: i82596 initialization timed out\n",
-                              dev->name);
-                       return 1;
-               }
-               udelay(5);
-               barrier();
-       }
-       /* I find here boguscnt==100, so no delay was required. */
-
-       return 0;
-}
-
-static int
-init_i596(struct net_device *dev) {
-       struct i596_private *lp;
-
-       if (i596_scp_setup(dev))
-               return 1;
-
-       lp = netdev_priv(dev);
-       lp->scb.command = 0;
-
-       memcpy ((void *)lp->i596_config, init_setup, 14);
-       lp->set_conf.command = CmdConfigure;
-       i596_add_cmd(dev, (void *)&lp->set_conf);
-
-       memcpy ((void *)lp->eth_addr, dev->dev_addr, 6);
-       lp->set_add.command = CmdIASetup;
-       i596_add_cmd(dev, &lp->set_add);
-
-       lp->tdr.command = CmdTDR;
-       i596_add_cmd(dev, &lp->tdr);
-
-       if (lp->scb.command && i596_timeout(dev, "i82596 init", 200))
-               return 1;
-
-       lp->scb.command = RX_START;
-       CA();
-
-       barrier();
-
-       if (lp->scb.command && i596_timeout(dev, "Receive Unit start", 100))
-               return 1;
-
-       return 0;
-}
-
-/* Receive a single frame */
-static inline int
-i596_rx_one(struct net_device *dev, struct i596_private *lp,
-           struct i596_rfd *rfd, int *frames) {
-
-       if (rfd->stat & RFD_STAT_OK) {
-               /* a good frame */
-               int pkt_len = (rfd->count & 0x3fff);
-               struct sk_buff *skb = netdev_alloc_skb(dev, pkt_len);
-
-               (*frames)++;
-
-               if (rfd->cmd & CMD_EOL)
-                       printk("Received on EOL\n");
-
-               if (skb == NULL) {
-                       printk ("%s: i596_rx Memory squeeze, "
-                               "dropping packet.\n", dev->name);
-                       dev->stats.rx_dropped++;
-                       return 1;
-               }
-
-               memcpy(skb_put(skb,pkt_len), rfd->data, pkt_len);
-
-               skb->protocol = eth_type_trans(skb,dev);
-               netif_rx(skb);
-               dev->stats.rx_packets++;
-       } else {
-#if 0
-               printk("Frame reception error status %04x\n",
-                      rfd->stat);
-#endif
-               dev->stats.rx_errors++;
-               if (rfd->stat & RFD_COLLISION)
-                       dev->stats.collisions++;
-               if (rfd->stat & RFD_SHORT_FRAME_ERR)
-                       dev->stats.rx_length_errors++;
-               if (rfd->stat & RFD_DMA_ERR)
-                       dev->stats.rx_over_errors++;
-               if (rfd->stat & RFD_NOBUFS_ERR)
-                       dev->stats.rx_fifo_errors++;
-               if (rfd->stat & RFD_ALIGN_ERR)
-                       dev->stats.rx_frame_errors++;
-               if (rfd->stat & RFD_CRC_ERR)
-                       dev->stats.rx_crc_errors++;
-               if (rfd->stat & RFD_LENGTH_ERR)
-                       dev->stats.rx_length_errors++;
-       }
-       rfd->stat = rfd->count = 0;
-       return 0;
-}
-
-static int
-i596_rx(struct net_device *dev) {
-       struct i596_private *lp = netdev_priv(dev);
-       struct i596_rfd *rfd;
-       int frames = 0;
-
-       while (1) {
-               rfd = pa_to_va(lp->scb.pa_rfd);
-               if (!rfd) {
-                       printk(KERN_ERR "i596_rx: NULL rfd?\n");
-                       return 0;
-               }
-#if 1
-               if (rfd->stat && !(rfd->stat & (RFD_STAT_C | RFD_STAT_B)))
-                       printk("SF:%p-%04x\n", rfd, rfd->stat);
-#endif
-               if (!(rfd->stat & RFD_STAT_C))
-                       break;          /* next one not ready */
-               if (i596_rx_one(dev, lp, rfd, &frames))
-                       break;          /* out of memory */
-               rfd->cmd = CMD_EOL;
-               lp->rx_tail->cmd = 0;
-               lp->rx_tail = rfd;
-               lp->scb.pa_rfd = rfd->pa_next;
-               barrier();
-       }
-
-       return frames;
-}
-
-static void
-i596_cleanup_cmd(struct net_device *dev) {
-       struct i596_private *lp;
-       struct i596_cmd *cmd;
-
-       lp = netdev_priv(dev);
-       while (lp->cmd_head) {
-               cmd = lp->cmd_head;
-
-               lp->cmd_head = pa_to_va(lp->cmd_head->pa_next);
-               lp->cmd_backlog--;
-
-               switch ((cmd->command) & 0x7) {
-                       case CmdTx: {
-                               struct tx_cmd *tx_cmd = (struct tx_cmd *) cmd;
-                               struct i596_tbd * tx_cmd_tbd;
-                               tx_cmd_tbd = pa_to_va(tx_cmd->pa_tbd);
-
-                               dev_kfree_skb_any(tx_cmd_tbd->skb);
-
-                               dev->stats.tx_errors++;
-                               dev->stats.tx_aborted_errors++;
-
-                               cmd->pa_next = I596_NULL;
-                               kfree((unsigned char *)tx_cmd);
-                               netif_wake_queue(dev);
-                               break;
-                       }
-                       case CmdMulticastList: {
-                               // unsigned short count = *((unsigned short *) (ptr + 1));
-
-                               cmd->pa_next = I596_NULL;
-                               kfree((unsigned char *)cmd);
-                               break;
-                       }
-                       default: {
-                               cmd->pa_next = I596_NULL;
-                               break;
-                       }
-               }
-               barrier();
-       }
-
-       if (lp->scb.command && i596_timeout(dev, "i596_cleanup_cmd", 100))
-               ;
-
-       lp->scb.pa_cmd = va_to_pa(lp->cmd_head);
-}
-
-static void i596_reset(struct net_device *dev, struct i596_private *lp, int ioaddr) {
-
-       if (lp->scb.command && i596_timeout(dev, "i596_reset", 100))
-               ;
-
-       netif_stop_queue(dev);
-
-       lp->scb.command = CUC_ABORT | RX_ABORT;
-       CA();
-       barrier();
-
-       /* wait for shutdown */
-       if (lp->scb.command && i596_timeout(dev, "i596_reset(2)", 400))
-               ;
-
-       i596_cleanup_cmd(dev);
-       i596_rx(dev);
-
-       netif_start_queue(dev);
-       /*dev_kfree_skb(skb, FREE_WRITE);*/
-       init_i596(dev);
-}
-
-static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd) {
-       struct i596_private *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       unsigned long flags;
-
-       cmd->status = 0;
-       cmd->command |= (CMD_EOL | CMD_INTR);
-       cmd->pa_next = I596_NULL;
-
-       spin_lock_irqsave(&lp->cmd_lock, flags);
-
-       if (lp->cmd_head) {
-               lp->cmd_tail->pa_next = va_to_pa(cmd);
-       } else {
-               lp->cmd_head = cmd;
-               if (lp->scb.command && i596_timeout(dev, "i596_add_cmd", 100))
-                       ;
-               lp->scb.pa_cmd = va_to_pa(cmd);
-               lp->scb.command = CUC_START;
-               CA();
-       }
-       lp->cmd_tail = cmd;
-       lp->cmd_backlog++;
-
-       lp->cmd_head = pa_to_va(lp->scb.pa_cmd);
-       spin_unlock_irqrestore(&lp->cmd_lock, flags);
-
-       if (lp->cmd_backlog > 16) {
-               int tickssofar = jiffies - lp->last_cmd;
-               if (tickssofar < HZ/4)
-                       return;
-
-               printk(KERN_WARNING "%s: command unit timed out, status resetting.\n", dev->name);
-               i596_reset(dev, lp, ioaddr);
-       }
-}
-
-static int i596_open(struct net_device *dev)
-{
-       int i;
-
-       i = request_irq(dev->irq, i596_interrupt, IRQF_SHARED, dev->name, dev);
-       if (i) {
-               printk(KERN_ERR "%s: IRQ %d not free\n", dev->name, dev->irq);
-               return i;
-       }
-
-       if ((i = init_rx_bufs(dev, RX_RING_SIZE)) < RX_RING_SIZE)
-               printk(KERN_ERR "%s: only able to allocate %d receive buffers\n", dev->name, i);
-
-       if (i < 4) {
-               free_irq(dev->irq, dev);
-               return -EAGAIN;
-       }
-       netif_start_queue(dev);
-       init_i596(dev);
-       return 0;                       /* Always succeed */
-}
-
-static netdev_tx_t i596_start_xmit (struct sk_buff *skb, struct net_device *dev) {
-       struct tx_cmd *tx_cmd;
-       short length;
-
-       length = skb->len;
-
-       if (length < ETH_ZLEN) {
-               if (skb_padto(skb, ETH_ZLEN))
-                       return NETDEV_TX_OK;
-               length = ETH_ZLEN;
-       }
-
-       tx_cmd = kmalloc((sizeof (struct tx_cmd) + sizeof (struct i596_tbd)), GFP_ATOMIC);
-       if (tx_cmd == NULL) {
-               printk(KERN_WARNING "%s: i596_xmit Memory squeeze, dropping packet.\n", dev->name);
-               dev->stats.tx_dropped++;
-               dev_kfree_skb (skb);
-       } else {
-               struct i596_tbd *tx_cmd_tbd;
-               tx_cmd_tbd = (struct i596_tbd *) (tx_cmd + 1);
-               tx_cmd->pa_tbd = va_to_pa (tx_cmd_tbd);
-               tx_cmd_tbd->pa_next = I596_NULL;
-
-               tx_cmd->cmd.command = (CMD_FLEX | CmdTx);
-
-               tx_cmd->pad = 0;
-               tx_cmd->size = 0;
-               tx_cmd_tbd->pad = 0;
-               tx_cmd_tbd->size = (EOF | length);
-
-               tx_cmd_tbd->pa_data = va_to_pa (skb->data);
-               tx_cmd_tbd->skb = skb;
-
-               if (i596_debug & LOG_SRCDST)
-                       print_eth (skb->data);
-
-               i596_add_cmd (dev, (struct i596_cmd *) tx_cmd);
-
-               dev->stats.tx_packets++;
-       }
-
-       return NETDEV_TX_OK;
-}
-
-static void
-i596_tx_timeout (struct net_device *dev) {
-       struct i596_private *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       /* Transmitter timeout, serious problems. */
-       printk(KERN_WARNING "%s: transmit timed out, status resetting.\n", dev->name);
-       dev->stats.tx_errors++;
-
-       /* Try to restart the adaptor */
-       if (lp->last_restart == dev->stats.tx_packets) {
-               printk ("Resetting board.\n");
-
-               /* Shutdown and restart */
-               i596_reset (dev, lp, ioaddr);
-       } else {
-               /* Issue a channel attention signal */
-               printk ("Kicking board.\n");
-               lp->scb.command = (CUC_START | RX_START);
-               CA();
-               lp->last_restart = dev->stats.tx_packets;
-       }
-       netif_wake_queue(dev);
-}
-
-static void print_eth(char *add)
-{
-       int i;
-
-       printk ("Dest  ");
-       for (i = 0; i < 6; i++)
-               printk(" %2.2X", (unsigned char) add[i]);
-       printk ("\n");
-
-       printk ("Source");
-       for (i = 0; i < 6; i++)
-               printk(" %2.2X", (unsigned char) add[i+6]);
-       printk ("\n");
-
-       printk ("type %2.2X%2.2X\n",
-               (unsigned char) add[12], (unsigned char) add[13]);
-}
-
-static const struct net_device_ops i596_netdev_ops = {
-       .ndo_open               = i596_open,
-       .ndo_stop               = i596_close,
-       .ndo_start_xmit         = i596_start_xmit,
-       .ndo_set_rx_mode        = set_multicast_list,
-       .ndo_tx_timeout         = i596_tx_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-static int __init lp486e_probe(struct net_device *dev) {
-       struct i596_private *lp;
-       unsigned char eth_addr[6] = { 0, 0xaa, 0, 0, 0, 0 };
-       unsigned char *bios;
-       int i, j;
-       int ret = -ENOMEM;
-       static int probed;
-
-       if (probed)
-               return -ENODEV;
-       probed++;
-
-       if (!request_region(IOADDR, LP486E_TOTAL_SIZE, DRV_NAME)) {
-               printk(KERN_ERR "lp486e: IO address 0x%x in use\n", IOADDR);
-               return -EBUSY;
-       }
-
-       lp = netdev_priv(dev);
-       spin_lock_init(&lp->cmd_lock);
-
-       /*
-        * Do we really have this thing?
-        */
-       if (i596_scp_setup(dev)) {
-               ret = -ENODEV;
-               goto err_out_kfree;
-       }
-
-       dev->base_addr = IOADDR;
-       dev->irq = IRQ;
-
-
-       /*
-        * How do we find the ethernet address? I don't know.
-        * One possibility is to look at the EISA configuration area
-        * [0xe8000-0xe9fff]. This contains the ethernet address
-        * but not at a fixed address - things depend on setup options.
-        *
-        * If we find no address, or the wrong address, use
-        *   ifconfig eth0 hw ether a1:a2:a3:a4:a5:a6
-        * with the value found in the BIOS setup.
-        */
-       bios = bus_to_virt(0xe8000);
-       for (j = 0; j < 0x2000; j++) {
-               if (bios[j] == 0 && bios[j+1] == 0xaa && bios[j+2] == 0) {
-                       printk("%s: maybe address at BIOS 0x%x:",
-                              dev->name, 0xe8000+j);
-                       for (i = 0; i < 6; i++) {
-                               eth_addr[i] = bios[i+j];
-                               printk(" %2.2X", eth_addr[i]);
-                       }
-                       printk("\n");
-               }
-       }
-
-       printk("%s: lp486e 82596 at %#3lx, IRQ %d,",
-              dev->name, dev->base_addr, dev->irq);
-       for (i = 0; i < 6; i++)
-               printk(" %2.2X", dev->dev_addr[i] = eth_addr[i]);
-       printk("\n");
-
-       /* The LP486E-specific entries in the device structure. */
-       dev->netdev_ops = &i596_netdev_ops;
-       dev->watchdog_timeo = 5*HZ;
-
-#if 0
-       /* selftest reports 0x320925ae - don't know what that means */
-       i596_port_do(dev, PORT_SELFTEST, "selftest");
-       i596_port_do(dev, PORT_DUMP, "dump");
-#endif
-       return 0;
-
-err_out_kfree:
-       release_region(IOADDR, LP486E_TOTAL_SIZE);
-       return ret;
-}
-
-static inline void
-i596_handle_CU_completion(struct net_device *dev,
-                         struct i596_private *lp,
-                         unsigned short status,
-                         unsigned short *ack_cmdp) {
-       struct i596_cmd *cmd;
-       int frames_out = 0;
-       int commands_done = 0;
-       int cmd_val;
-       unsigned long flags;
-
-       spin_lock_irqsave(&lp->cmd_lock, flags);
-       cmd = lp->cmd_head;
-
-       while (lp->cmd_head && (lp->cmd_head->status & CMD_STAT_C)) {
-               cmd = lp->cmd_head;
-
-               lp->cmd_head = pa_to_va(lp->cmd_head->pa_next);
-               lp->cmd_backlog--;
-
-               commands_done++;
-               cmd_val = cmd->command & 0x7;
-#if 0
-               printk("finished CU %s command (%d)\n",
-                      CUcmdnames[cmd_val], cmd_val);
-#endif
-               switch (cmd_val) {
-               case CmdTx:
-               {
-                       struct tx_cmd *tx_cmd;
-                       struct i596_tbd *tx_cmd_tbd;
-
-                       tx_cmd = (struct tx_cmd *) cmd;
-                       tx_cmd_tbd = pa_to_va(tx_cmd->pa_tbd);
-
-                       frames_out++;
-                       if (cmd->status & CMD_STAT_OK) {
-                               if (i596_debug)
-                                       print_eth(pa_to_va(tx_cmd_tbd->pa_data));
-                       } else {
-                               dev->stats.tx_errors++;
-                               if (i596_debug)
-                                       printk("transmission failure:%04x\n",
-                                              cmd->status);
-                               if (cmd->status & 0x0020)
-                                       dev->stats.collisions++;
-                               if (!(cmd->status & 0x0040))
-                                       dev->stats.tx_heartbeat_errors++;
-                               if (cmd->status & 0x0400)
-                                       dev->stats.tx_carrier_errors++;
-                               if (cmd->status & 0x0800)
-                                       dev->stats.collisions++;
-                               if (cmd->status & 0x1000)
-                                       dev->stats.tx_aborted_errors++;
-                       }
-                       dev_kfree_skb_irq(tx_cmd_tbd->skb);
-
-                       cmd->pa_next = I596_NULL;
-                       kfree((unsigned char *)tx_cmd);
-                       netif_wake_queue(dev);
-                       break;
-               }
-
-               case CmdMulticastList:
-                       cmd->pa_next = I596_NULL;
-                       kfree((unsigned char *)cmd);
-                       break;
-
-               case CmdTDR:
-               {
-                       unsigned long status = *((unsigned long *) (cmd + 1));
-                       if (status & 0x8000) {
-                               if (i596_debug)
-                                       printk("%s: link ok.\n", dev->name);
-                       } else {
-                               if (status & 0x4000)
-                                       printk("%s: Transceiver problem.\n",
-                                              dev->name);
-                               if (status & 0x2000)
-                                       printk("%s: Termination problem.\n",
-                                              dev->name);
-                               if (status & 0x1000)
-                                       printk("%s: Short circuit.\n",
-                                              dev->name);
-                               printk("%s: Time %ld.\n",
-                                      dev->name, status & 0x07ff);
-                       }
-               }
-               default:
-                       cmd->pa_next = I596_NULL;
-                       lp->last_cmd = jiffies;
-
-               }
-               barrier();
-       }
-
-       cmd = lp->cmd_head;
-       while (cmd && (cmd != lp->cmd_tail)) {
-               cmd->command &= 0x1fff;
-               cmd = pa_to_va(cmd->pa_next);
-               barrier();
-       }
-
-       if (lp->cmd_head)
-               *ack_cmdp |= CUC_START;
-       lp->scb.pa_cmd = va_to_pa(lp->cmd_head);
-       spin_unlock_irqrestore(&lp->cmd_lock, flags);
-}
-
-static irqreturn_t
-i596_interrupt(int irq, void *dev_instance)
-{
-       struct net_device *dev = dev_instance;
-       struct i596_private *lp = netdev_priv(dev);
-       unsigned short status, ack_cmd = 0;
-       int frames_in = 0;
-
-       /*
-        * The 82596 examines the command, performs the required action,
-        * and then clears the SCB command word.
-        */
-       if (lp->scb.command && i596_timeout(dev, "interrupt", 40))
-               ;
-
-       /*
-        * The status word indicates the status of the 82596.
-        * It is modified only by the 82596.
-        *
-        * [So, we must not clear it. I find often status 0xffff,
-        *  which is not one of the values allowed by the docs.]
-        */
-       status = lp->scb.status;
-#if 0
-       if (i596_debug) {
-               printk("%s: i596 interrupt, ", dev->name);
-               i596_out_status(status);
-       }
-#endif
-       /* Impossible, but it happens - perhaps when we get
-          a receive interrupt but scb.pa_rfd is I596_NULL. */
-       if (status == 0xffff) {
-               printk("%s: i596_interrupt: got status 0xffff\n", dev->name);
-               goto out;
-       }
-
-       ack_cmd = (status & STAT_ACK);
-
-       if (status & (STAT_CX | STAT_CNA))
-               i596_handle_CU_completion(dev, lp, status, &ack_cmd);
-
-       if (status & (STAT_FR | STAT_RNR)) {
-               /* Restart the receive unit when it got inactive somehow */
-               if ((status & STAT_RNR) && netif_running(dev))
-                       ack_cmd |= RX_START;
-
-               if (status & STAT_FR) {
-                       frames_in = i596_rx(dev);
-                       if (!frames_in)
-                               printk("receive frame reported, but no frames\n");
-               }
-       }
-
-       /* acknowledge the interrupt */
-       /*
-       if ((lp->scb.pa_cmd != I596_NULL) && netif_running(dev))
-               ack_cmd |= CUC_START;
-       */
-
-       if (lp->scb.command && i596_timeout(dev, "i596 interrupt", 100))
-               ;
-
-       lp->scb.command = ack_cmd;
-
-       CLEAR_INT();
-       CA();
-
- out:
-       return IRQ_HANDLED;
-}
-
-static int i596_close(struct net_device *dev) {
-       struct i596_private *lp = netdev_priv(dev);
-
-       netif_stop_queue(dev);
-
-       if (i596_debug)
-               printk("%s: Shutting down ethercard, status was %4.4x.\n",
-                      dev->name, lp->scb.status);
-
-       lp->scb.command = (CUC_ABORT | RX_ABORT);
-       CA();
-
-       i596_cleanup_cmd(dev);
-
-       if (lp->scb.command && i596_timeout(dev, "i596_close", 200))
-               ;
-
-       free_irq(dev->irq, dev);
-       remove_rx_bufs(dev);
-
-       return 0;
-}
-
-/*
-*      Set or clear the multicast filter for this adaptor.
-*/
-
-static void set_multicast_list(struct net_device *dev) {
-       struct i596_private *lp = netdev_priv(dev);
-       struct i596_cmd *cmd;
-
-       if (i596_debug > 1)
-               printk ("%s: set multicast list %d\n",
-                       dev->name, netdev_mc_count(dev));
-
-       if (!netdev_mc_empty(dev)) {
-               struct netdev_hw_addr *ha;
-               char *cp;
-               cmd = kmalloc(sizeof(struct i596_cmd) + 2 +
-                             netdev_mc_count(dev) * 6, GFP_ATOMIC);
-               if (cmd == NULL) {
-                       printk (KERN_ERR "%s: set_multicast Memory squeeze.\n", dev->name);
-                       return;
-               }
-               cmd->command = CmdMulticastList;
-               *((unsigned short *) (cmd + 1)) = netdev_mc_count(dev) * 6;
-               cp = ((char *)(cmd + 1))+2;
-               netdev_for_each_mc_addr(ha, dev) {
-                       memcpy(cp, ha->addr, 6);
-                       cp += 6;
-               }
-               if (i596_debug & LOG_SRCDST)
-                       print_eth (((char *)(cmd + 1)) + 2);
-               i596_add_cmd(dev, cmd);
-       } else {
-               if (lp->set_conf.pa_next != I596_NULL) {
-                       return;
-               }
-               if (netdev_mc_empty(dev) &&
-                   !(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) {
-                       lp->i596_config[8] &= ~0x01;
-               } else {
-                       lp->i596_config[8] |= 0x01;
-               }
-
-               i596_add_cmd(dev, &lp->set_conf);
-       }
-}
-
-MODULE_AUTHOR("Ard van Breemen <ard@cstmel.nl.eu.org>");
-MODULE_DESCRIPTION("Intel Panther onboard i82596 driver");
-MODULE_LICENSE("GPL");
-
-static struct net_device *dev_lp486e;
-static int full_duplex;
-static int options;
-static int io = IOADDR;
-static int irq = IRQ;
-
-module_param(debug, int, 0);
-//module_param(max_interrupt_work, int, 0);
-//module_param(reverse_probe, int, 0);
-//module_param(rx_copybreak, int, 0);
-module_param(options, int, 0);
-module_param(full_duplex, int, 0);
-
-static int __init lp486e_init_module(void) {
-       int err;
-       struct net_device *dev = alloc_etherdev(sizeof(struct i596_private));
-       if (!dev)
-               return -ENOMEM;
-
-       dev->irq = irq;
-       dev->base_addr = io;
-       err = lp486e_probe(dev);
-       if (err) {
-               free_netdev(dev);
-               return err;
-       }
-       err = register_netdev(dev);
-       if (err) {
-               release_region(dev->base_addr, LP486E_TOTAL_SIZE);
-               free_netdev(dev);
-               return err;
-       }
-       dev_lp486e = dev;
-       full_duplex = 0;
-       options = 0;
-       return 0;
-}
-
-static void __exit lp486e_cleanup_module(void) {
-       unregister_netdev(dev_lp486e);
-       release_region(dev_lp486e->base_addr, LP486E_TOTAL_SIZE);
-       free_netdev(dev_lp486e);
-}
-
-module_init(lp486e_init_module);
-module_exit(lp486e_cleanup_module);
diff --git a/drivers/net/ethernet/i825xx/ni52.c b/drivers/net/ethernet/i825xx/ni52.c
deleted file mode 100644 (file)
index 272976e..0000000
+++ /dev/null
@@ -1,1346 +0,0 @@
-/*
- * net-3-driver for the NI5210 card (i82586 Ethernet chip)
- *
- * This is an extension to the Linux operating system, and is covered by the
- * same GNU General Public License that covers that work.
- *
- * Alphacode 0.82 (96/09/29) for Linux 2.0.0 (or later)
- * Copyrights (c) 1994,1995,1996 by M.Hipp (hippm@informatik.uni-tuebingen.de)
- *    [feel free to mail ....]
- *
- * when using as module: (no autoprobing!)
- *   run with e.g:
- *       insmod ni52.o io=0x360 irq=9 memstart=0xd0000 memend=0xd4000
- *
- * CAN YOU PLEASE REPORT ME YOUR PERFORMANCE EXPERIENCES !!.
- *
- * If you find a bug, please report me:
- *   The kernel panic output and any kmsg from the ni52 driver
- *   the ni5210-driver-version and the linux-kernel version
- *   how many shared memory (memsize) on the netcard,
- *   bootprom: yes/no, base_addr, mem_start
- *   maybe the ni5210-card revision and the i82586 version
- *
- * autoprobe for: base_addr: 0x300,0x280,0x360,0x320,0x340
- *                mem_start: 0xd0000,0xd2000,0xc8000,0xca000,0xd4000,0xd6000,
- *                           0xd8000,0xcc000,0xce000,0xda000,0xdc000
- *
- * sources:
- *   skeleton.c from Donald Becker
- *
- * I have also done a look in the following sources: (mail me if you need them)
- *   crynwr-packet-driver by Russ Nelson
- *   Garret A. Wollman's (fourth) i82586-driver for BSD
- *   (before getting an i82596 (yes 596 not 586) manual, the existing drivers
- *    helped me a lot to understand this tricky chip.)
- *
- * Known Problems:
- *   The internal sysbus seems to be slow. So we often lose packets because of
- *   overruns while receiving from a fast remote host.
- *   This can slow down TCP connections. Maybe the newer ni5210 cards are
- *   better. My experience is, that if a machine sends with more than about
- *   500-600K/s the fifo/sysbus overflows.
- *
- * IMPORTANT NOTE:
- *   On fast networks, it's a (very) good idea to have 16K shared memory. With
- *   8K, we can store only 4 receive frames, so it can (easily) happen that a
- *   remote machine 'overruns' our system.
- *
- * Known i82586/card problems (I'm sure, there are many more!):
- *   Running the NOP-mode, the i82586 sometimes seems to forget to report
- *   every xmit-interrupt until we restart the CU.
- *   Another MAJOR bug is, that the RU sometimes seems to ignore the EL-Bit
- *   in the RBD-Struct which indicates an end of the RBD queue.
- *   Instead, the RU fetches another (randomly selected and
- *   usually used) RBD and begins to fill it. (Maybe, this happens only if
- *   the last buffer from the previous RFD fits exact into the queue and
- *   the next RFD can't fetch an initial RBD. Anyone knows more? )
- *
- * results from ftp performance tests with Linux 1.2.5
- *   send and receive about 350-400 KByte/s (peak up to 460 kbytes/s)
- *   sending in NOP-mode: peak performance up to 530K/s (but better don't
- *   run this mode)
- */
-
-/*
- * 29.Sept.96: virt_to_bus changes for new memory scheme
- * 19.Feb.96: more Mcast changes, module support (MH)
- *
- * 18.Nov.95: Mcast changes (AC).
- *
- * 23.April.95: fixed(?) receiving problems by configuring a RFD more
- *              than the number of RBD's. Can maybe cause other problems.
- * 18.April.95: Added MODULE support (MH)
- * 17.April.95: MC related changes in init586() and set_multicast_list().
- *              removed use of 'jiffies' in init586() (MH)
- *
- * 19.Sep.94: Added Multicast support (not tested yet) (MH)
- *
- * 18.Sep.94: Workaround for 'EL-Bug'. Removed flexible RBD-handling.
- *            Now, every RFD has exact one RBD. (MH)
- *
- * 14.Sep.94: added promiscuous mode, a few cleanups (MH)
- *
- * 19.Aug.94: changed request_irq() parameter (MH)
- *
- * 20.July.94: removed cleanup bugs, removed a 16K-mem-probe-bug (MH)
- *
- * 19.July.94: lotsa cleanups .. (MH)
- *
- * 17.July.94: some patches ... verified to run with 1.1.29 (MH)
- *
- * 4.July.94: patches for Linux 1.1.24  (MH)
- *
- * 26.March.94: patches for Linux 1.0 and iomem-auto-probe (MH)
- *
- * 30.Sep.93: Added nop-chain .. driver now runs with only one Xmit-Buff,
- *                             too (MH)
- *
- * < 30.Sep.93: first versions
- */
-
-static int debuglevel; /* debug-printk 0: off 1: a few 2: more */
-static int automatic_resume; /* experimental .. better should be zero */
-static int rfdadd;     /* rfdadd=1 may be better for 8K MEM cards */
-static int fifo = 0x8; /* don't change */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/bitops.h>
-#include <asm/io.h>
-
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-
-#include "ni52.h"
-
-#define DRV_NAME "ni52"
-
-#define DEBUG       /* debug on */
-#define SYSBUSVAL 1 /* 8 Bit */
-
-#define ni_attn586()  { outb(0, dev->base_addr + NI52_ATTENTION); }
-#define ni_reset586() { outb(0, dev->base_addr + NI52_RESET); }
-#define ni_disint()   { outb(0, dev->base_addr + NI52_INTDIS); }
-#define ni_enaint()   { outb(0, dev->base_addr + NI52_INTENA); }
-
-#define make32(ptr16) ((void __iomem *)(p->memtop + (short) (ptr16)))
-#define make24(ptr32) ((char __iomem *)(ptr32)) - p->base
-#define make16(ptr32) ((unsigned short) ((char __iomem *)(ptr32)\
-                                       - p->memtop))
-
-/******************* how to calculate the buffers *****************************
-
-  * IMPORTANT NOTE: if you configure only one NUM_XMIT_BUFFS, the driver works
-  * --------------- in a different (more stable?) mode. Only in this mode it's
-  *                 possible to configure the driver with 'NO_NOPCOMMANDS'
-
-sizeof(scp)=12; sizeof(scb)=16; sizeof(iscp)=8;
-sizeof(scp)+sizeof(iscp)+sizeof(scb) = 36 = INIT
-sizeof(rfd) = 24; sizeof(rbd) = 12;
-sizeof(tbd) = 8; sizeof(transmit_cmd) = 16;
-sizeof(nop_cmd) = 8;
-
-  * if you don't know the driver, better do not change these values: */
-
-#define RECV_BUFF_SIZE 1524 /* slightly oversized */
-#define XMIT_BUFF_SIZE 1524 /* slightly oversized */
-#define NUM_XMIT_BUFFS 1    /* config for both, 8K and 16K shmem */
-#define NUM_RECV_BUFFS_8  4 /* config for 8K shared mem */
-#define NUM_RECV_BUFFS_16 9 /* config for 16K shared mem */
-#define NO_NOPCOMMANDS      /* only possible with NUM_XMIT_BUFFS=1 */
-
-/**************************************************************************/
-
-
-#define NI52_TOTAL_SIZE 16
-#define NI52_ADDR0 0x02
-#define NI52_ADDR1 0x07
-#define NI52_ADDR2 0x01
-
-static int     ni52_probe1(struct net_device *dev, int ioaddr);
-static irqreturn_t ni52_interrupt(int irq, void *dev_id);
-static int     ni52_open(struct net_device *dev);
-static int     ni52_close(struct net_device *dev);
-static netdev_tx_t ni52_send_packet(struct sk_buff *, struct net_device *);
-static struct  net_device_stats *ni52_get_stats(struct net_device *dev);
-static void    set_multicast_list(struct net_device *dev);
-static void    ni52_timeout(struct net_device *dev);
-
-/* helper-functions */
-static int     init586(struct net_device *dev);
-static int     check586(struct net_device *dev, unsigned size);
-static void    alloc586(struct net_device *dev);
-static void    startrecv586(struct net_device *dev);
-static void   __iomem *alloc_rfa(struct net_device *dev, void __iomem *ptr);
-static void    ni52_rcv_int(struct net_device *dev);
-static void    ni52_xmt_int(struct net_device *dev);
-static void    ni52_rnr_int(struct net_device *dev);
-
-struct priv {
-       char __iomem *base;
-       char __iomem *mapped;
-       char __iomem *memtop;
-       spinlock_t spinlock;
-       int reset;
-       struct rfd_struct __iomem *rfd_last, *rfd_top, *rfd_first;
-       struct scp_struct __iomem *scp;
-       struct iscp_struct __iomem *iscp;
-       struct scb_struct __iomem *scb;
-       struct tbd_struct __iomem *xmit_buffs[NUM_XMIT_BUFFS];
-#if (NUM_XMIT_BUFFS == 1)
-       struct transmit_cmd_struct __iomem *xmit_cmds[2];
-       struct nop_cmd_struct __iomem *nop_cmds[2];
-#else
-       struct transmit_cmd_struct __iomem *xmit_cmds[NUM_XMIT_BUFFS];
-       struct nop_cmd_struct __iomem *nop_cmds[NUM_XMIT_BUFFS];
-#endif
-       int nop_point, num_recv_buffs;
-       char __iomem *xmit_cbuffs[NUM_XMIT_BUFFS];
-       int xmit_count, xmit_last;
-};
-
-/* wait for command with timeout: */
-static void wait_for_scb_cmd(struct net_device *dev)
-{
-       struct priv *p = netdev_priv(dev);
-       int i;
-       for (i = 0; i < 16384; i++) {
-               if (readb(&p->scb->cmd_cuc) == 0)
-                     break;
-               udelay(4);
-               if (i == 16383) {
-                       printk(KERN_ERR "%s: scb_cmd timed out: %04x,%04x .. disabling i82586!!\n",
-                               dev->name, readb(&p->scb->cmd_cuc), readb(&p->scb->cus));
-                       if (!p->reset) {
-                               p->reset = 1;
-                               ni_reset586();
-                       }
-               }
-       }
-}
-
-static void wait_for_scb_cmd_ruc(struct net_device *dev)
-{
-       struct priv *p = netdev_priv(dev);
-       int i;
-       for (i = 0; i < 16384; i++) {
-               if (readb(&p->scb->cmd_ruc) == 0)
-                       break;
-               udelay(4);
-               if (i == 16383) {
-                       printk(KERN_ERR "%s: scb_cmd (ruc) timed out: %04x,%04x .. disabling i82586!!\n",
-                               dev->name, readb(&p->scb->cmd_ruc),
-                               readb(&p->scb->rus));
-                       if (!p->reset) {
-                               p->reset = 1;
-                               ni_reset586();
-                       }
-               }
-       }
-}
-
-static void wait_for_stat_compl(void __iomem *p)
-{
-       struct nop_cmd_struct __iomem *addr = p;
-       int i;
-       for (i = 0; i < 32767; i++) {
-               if (readw(&((addr)->cmd_status)) & STAT_COMPL)
-                       break;
-               udelay(32);
-       }
-}
-
-/**********************************************
- * close device
- */
-static int ni52_close(struct net_device *dev)
-{
-       free_irq(dev->irq, dev);
-       ni_reset586(); /* the hard way to stop the receiver */
-       netif_stop_queue(dev);
-       return 0;
-}
-
-/**********************************************
- * open device
- */
-static int ni52_open(struct net_device *dev)
-{
-       int ret;
-
-       ni_disint();
-       alloc586(dev);
-       init586(dev);
-       startrecv586(dev);
-       ni_enaint();
-
-       ret = request_irq(dev->irq, ni52_interrupt, 0, dev->name, dev);
-       if (ret) {
-               ni_reset586();
-               return ret;
-       }
-       netif_start_queue(dev);
-       return 0; /* most done by init */
-}
-
-static int check_iscp(struct net_device *dev, void __iomem *addr)
-{
-       struct iscp_struct __iomem *iscp = addr;
-       struct priv *p = netdev_priv(dev);
-       memset_io(iscp, 0, sizeof(struct iscp_struct));
-
-       writel(make24(iscp), &p->scp->iscp);
-       writeb(1, &iscp->busy);
-
-       ni_reset586();
-       ni_attn586();
-       mdelay(32);     /* wait a while... */
-       /* i82586 clears 'busy' after successful init */
-       if (readb(&iscp->busy))
-               return 0;
-       return 1;
-}
-
-/**********************************************
- * Check to see if there's an 82586 out there.
- */
-static int check586(struct net_device *dev, unsigned size)
-{
-       struct priv *p = netdev_priv(dev);
-       int i;
-
-       p->mapped = ioremap(dev->mem_start, size);
-       if (!p->mapped)
-               return 0;
-
-       p->base = p->mapped + size - 0x01000000;
-       p->memtop = p->mapped + size;
-       p->scp = (struct scp_struct __iomem *)(p->base + SCP_DEFAULT_ADDRESS);
-       p->scb  = (struct scb_struct __iomem *) p->mapped;
-       p->iscp = (struct iscp_struct __iomem *)p->scp - 1;
-       memset_io(p->scp, 0, sizeof(struct scp_struct));
-       for (i = 0; i < sizeof(struct scp_struct); i++)
-               /* memory was writeable? */
-               if (readb((char __iomem *)p->scp + i))
-                       goto Enodev;
-       writeb(SYSBUSVAL, &p->scp->sysbus);     /* 1 = 8Bit-Bus, 0 = 16 Bit */
-       if (readb(&p->scp->sysbus) != SYSBUSVAL)
-               goto Enodev;
-
-       if (!check_iscp(dev, p->mapped))
-               goto Enodev;
-       if (!check_iscp(dev, p->iscp))
-               goto Enodev;
-       return 1;
-Enodev:
-       iounmap(p->mapped);
-       return 0;
-}
-
-/******************************************************************
- * set iscp at the right place, called by ni52_probe1 and open586.
- */
-static void alloc586(struct net_device *dev)
-{
-       struct priv *p = netdev_priv(dev);
-
-       ni_reset586();
-       mdelay(32);
-
-       memset_io(p->iscp, 0, sizeof(struct iscp_struct));
-       memset_io(p->scp , 0, sizeof(struct scp_struct));
-
-       writel(make24(p->iscp), &p->scp->iscp);
-       writeb(SYSBUSVAL, &p->scp->sysbus);
-       writew(make16(p->scb), &p->iscp->scb_offset);
-
-       writeb(1, &p->iscp->busy);
-       ni_reset586();
-       ni_attn586();
-
-       mdelay(32);
-
-       if (readb(&p->iscp->busy))
-               printk(KERN_ERR "%s: Init-Problems (alloc).\n", dev->name);
-
-       p->reset = 0;
-
-       memset_io(p->scb, 0, sizeof(struct scb_struct));
-}
-
-/* set: io,irq,memstart,memend or set it when calling insmod */
-static int irq = 9;
-static int io = 0x300;
-static long memstart;  /* e.g 0xd0000 */
-static long memend;    /* e.g 0xd4000 */
-
-/**********************************************
- * probe the ni5210-card
- */
-struct net_device * __init ni52_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct priv));
-       static const int ports[] = {0x300, 0x280, 0x360, 0x320, 0x340, 0};
-       const int *port;
-       struct priv *p;
-       int err = 0;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       p = netdev_priv(dev);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-               io = dev->base_addr;
-               irq = dev->irq;
-               memstart = dev->mem_start;
-               memend = dev->mem_end;
-       }
-
-       if (io > 0x1ff) {       /* Check a single specified location. */
-               err = ni52_probe1(dev, io);
-       } else if (io > 0) {            /* Don't probe at all. */
-               err = -ENXIO;
-       } else {
-               for (port = ports; *port && ni52_probe1(dev, *port) ; port++)
-                       ;
-               if (*port)
-                       goto got_it;
-#ifdef FULL_IO_PROBE
-               for (io = 0x200; io < 0x400 && ni52_probe1(dev, io); io += 8)
-                       ;
-               if (io < 0x400)
-                       goto got_it;
-#endif
-               err = -ENODEV;
-       }
-       if (err)
-               goto out;
-got_it:
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-       iounmap(p->mapped);
-       release_region(dev->base_addr, NI52_TOTAL_SIZE);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-static const struct net_device_ops ni52_netdev_ops = {
-       .ndo_open               = ni52_open,
-       .ndo_stop               = ni52_close,
-       .ndo_get_stats          = ni52_get_stats,
-       .ndo_tx_timeout         = ni52_timeout,
-       .ndo_start_xmit         = ni52_send_packet,
-       .ndo_set_rx_mode        = set_multicast_list,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-static int __init ni52_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, size, retval;
-       struct priv *priv = netdev_priv(dev);
-
-       dev->base_addr = ioaddr;
-       dev->irq = irq;
-       dev->mem_start = memstart;
-       dev->mem_end = memend;
-
-       spin_lock_init(&priv->spinlock);
-
-       if (!request_region(ioaddr, NI52_TOTAL_SIZE, DRV_NAME))
-               return -EBUSY;
-
-       if (!(inb(ioaddr+NI52_MAGIC1) == NI52_MAGICVAL1) ||
-           !(inb(ioaddr+NI52_MAGIC2) == NI52_MAGICVAL2)) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       for (i = 0; i < ETH_ALEN; i++)
-               dev->dev_addr[i] = inb(dev->base_addr+i);
-
-       if (dev->dev_addr[0] != NI52_ADDR0 || dev->dev_addr[1] != NI52_ADDR1 ||
-           dev->dev_addr[2] != NI52_ADDR2) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       printk(KERN_INFO "%s: NI5210 found at %#3lx, ",
-                               dev->name, dev->base_addr);
-
-       /*
-        * check (or search) IO-Memory, 8K and 16K
-        */
-#ifdef MODULE
-       size = dev->mem_end - dev->mem_start;
-       if (size != 0x2000 && size != 0x4000) {
-               printk("\n");
-               printk(KERN_ERR "%s: Invalid memory size %d. Allowed is 0x2000 or 0x4000 bytes.\n", dev->name, size);
-               retval = -ENODEV;
-               goto out;
-       }
-       if (!check586(dev, size)) {
-               printk(KERN_ERR "?memcheck, Can't find memory at 0x%lx with size %d!\n", dev->mem_start, size);
-               retval = -ENODEV;
-               goto out;
-       }
-#else
-       if (dev->mem_start != 0) {
-               /* no auto-mem-probe */
-               size = 0x4000; /* check for 16K mem */
-               if (!check586(dev, size)) {
-                       size = 0x2000; /* check for 8K mem */
-                       if (!check586(dev, size)) {
-                               printk(KERN_ERR "?memprobe, Can't find memory at 0x%lx!\n", dev->mem_start);
-                               retval = -ENODEV;
-                               goto out;
-                       }
-               }
-       } else {
-               static const unsigned long memaddrs[] = {
-                       0xc8000, 0xca000, 0xcc000, 0xce000, 0xd0000, 0xd2000,
-                       0xd4000, 0xd6000, 0xd8000, 0xda000, 0xdc000, 0
-               };
-               for (i = 0;; i++) {
-                       if (!memaddrs[i]) {
-                               printk(KERN_ERR "?memprobe, Can't find io-memory!\n");
-                               retval = -ENODEV;
-                               goto out;
-                       }
-                       dev->mem_start = memaddrs[i];
-                       size = 0x2000; /* check for 8K mem */
-                       if (check586(dev, size))
-                               /* 8K-check */
-                               break;
-                       size = 0x4000; /* check for 16K mem */
-                       if (check586(dev, size))
-                               /* 16K-check */
-                               break;
-               }
-       }
-       /* set mem_end showed by 'ifconfig' */
-       dev->mem_end = dev->mem_start + size;
-#endif
-
-       alloc586(dev);
-
-       /* set number of receive-buffs according to memsize */
-       if (size == 0x2000)
-               priv->num_recv_buffs = NUM_RECV_BUFFS_8;
-       else
-               priv->num_recv_buffs = NUM_RECV_BUFFS_16;
-
-       printk(KERN_DEBUG "Memaddr: 0x%lx, Memsize: %d, ",
-                               dev->mem_start, size);
-
-       if (dev->irq < 2) {
-               unsigned long irq_mask;
-
-               irq_mask = probe_irq_on();
-               ni_reset586();
-               ni_attn586();
-
-               mdelay(20);
-               dev->irq = probe_irq_off(irq_mask);
-               if (!dev->irq) {
-                       printk("?autoirq, Failed to detect IRQ line!\n");
-                       retval = -EAGAIN;
-                       iounmap(priv->mapped);
-                       goto out;
-               }
-               printk("IRQ %d (autodetected).\n", dev->irq);
-       } else {
-               if (dev->irq == 2)
-                       dev->irq = 9;
-               printk("IRQ %d (assigned and not checked!).\n", dev->irq);
-       }
-
-       dev->netdev_ops         = &ni52_netdev_ops;
-       dev->watchdog_timeo     = HZ/20;
-
-       return 0;
-out:
-       release_region(ioaddr, NI52_TOTAL_SIZE);
-       return retval;
-}
-
-/**********************************************
- * init the chip (ni52-interrupt should be disabled?!)
- * needs a correct 'allocated' memory
- */
-
-static int init586(struct net_device *dev)
-{
-       void __iomem *ptr;
-       int i, result = 0;
-       struct priv *p = netdev_priv(dev);
-       struct configure_cmd_struct __iomem *cfg_cmd;
-       struct iasetup_cmd_struct __iomem *ias_cmd;
-       struct tdr_cmd_struct __iomem *tdr_cmd;
-       struct mcsetup_cmd_struct __iomem *mc_cmd;
-       struct netdev_hw_addr *ha;
-       int num_addrs = netdev_mc_count(dev);
-
-       ptr = p->scb + 1;
-
-       cfg_cmd = ptr; /* configure-command */
-       writew(0, &cfg_cmd->cmd_status);
-       writew(CMD_CONFIGURE | CMD_LAST, &cfg_cmd->cmd_cmd);
-       writew(0xFFFF, &cfg_cmd->cmd_link);
-
-       /* number of cfg bytes */
-       writeb(0x0a, &cfg_cmd->byte_cnt);
-       /* fifo-limit (8=tx:32/rx:64) */
-       writeb(fifo, &cfg_cmd->fifo);
-       /* hold or discard bad recv frames (bit 7) */
-       writeb(0x40, &cfg_cmd->sav_bf);
-       /* addr_len |!src_insert |pre-len |loopback */
-       writeb(0x2e, &cfg_cmd->adr_len);
-       writeb(0x00, &cfg_cmd->priority);
-       writeb(0x60, &cfg_cmd->ifs);
-       writeb(0x00, &cfg_cmd->time_low);
-       writeb(0xf2, &cfg_cmd->time_high);
-       writeb(0x00, &cfg_cmd->promisc);
-       if (dev->flags & IFF_ALLMULTI) {
-               int len = ((char __iomem *)p->iscp - (char __iomem *)ptr - 8) / 6;
-               if (num_addrs > len) {
-                       printk(KERN_ERR "%s: switching to promisc. mode\n",
-                               dev->name);
-                       writeb(0x01, &cfg_cmd->promisc);
-               }
-       }
-       if (dev->flags & IFF_PROMISC)
-               writeb(0x01, &cfg_cmd->promisc);
-       writeb(0x00, &cfg_cmd->carr_coll);
-       writew(make16(cfg_cmd), &p->scb->cbl_offset);
-       writeb(0, &p->scb->cmd_ruc);
-
-       writeb(CUC_START, &p->scb->cmd_cuc); /* cmd.-unit start */
-       ni_attn586();
-
-       wait_for_stat_compl(cfg_cmd);
-
-       if ((readw(&cfg_cmd->cmd_status) & (STAT_OK|STAT_COMPL)) !=
-                                                       (STAT_COMPL|STAT_OK)) {
-               printk(KERN_ERR "%s: configure command failed: %x\n",
-                               dev->name, readw(&cfg_cmd->cmd_status));
-               return 1;
-       }
-
-       /*
-        * individual address setup
-        */
-
-       ias_cmd = ptr;
-
-       writew(0, &ias_cmd->cmd_status);
-       writew(CMD_IASETUP | CMD_LAST, &ias_cmd->cmd_cmd);
-       writew(0xffff, &ias_cmd->cmd_link);
-
-       memcpy_toio(&ias_cmd->iaddr, (char *)dev->dev_addr, ETH_ALEN);
-
-       writew(make16(ias_cmd), &p->scb->cbl_offset);
-
-       writeb(CUC_START, &p->scb->cmd_cuc); /* cmd.-unit start */
-       ni_attn586();
-
-       wait_for_stat_compl(ias_cmd);
-
-       if ((readw(&ias_cmd->cmd_status) & (STAT_OK|STAT_COMPL)) !=
-                                                       (STAT_OK|STAT_COMPL)) {
-               printk(KERN_ERR "%s (ni52): individual address setup command failed: %04x\n", dev->name, readw(&ias_cmd->cmd_status));
-               return 1;
-       }
-
-       /*
-        * TDR, wire check .. e.g. no resistor e.t.c
-        */
-
-       tdr_cmd = ptr;
-
-       writew(0, &tdr_cmd->cmd_status);
-       writew(CMD_TDR | CMD_LAST, &tdr_cmd->cmd_cmd);
-       writew(0xffff, &tdr_cmd->cmd_link);
-       writew(0, &tdr_cmd->status);
-
-       writew(make16(tdr_cmd), &p->scb->cbl_offset);
-       writeb(CUC_START, &p->scb->cmd_cuc); /* cmd.-unit start */
-       ni_attn586();
-
-       wait_for_stat_compl(tdr_cmd);
-
-       if (!(readw(&tdr_cmd->cmd_status) & STAT_COMPL))
-               printk(KERN_ERR "%s: Problems while running the TDR.\n",
-                               dev->name);
-       else {
-               udelay(16);
-               result = readw(&tdr_cmd->status);
-               writeb(readb(&p->scb->cus) & STAT_MASK, &p->scb->cmd_cuc);
-               ni_attn586(); /* ack the interrupts */
-
-               if (result & TDR_LNK_OK)
-                       ;
-               else if (result & TDR_XCVR_PRB)
-                       printk(KERN_ERR "%s: TDR: Transceiver problem. Check the cable(s)!\n",
-                               dev->name);
-               else if (result & TDR_ET_OPN)
-                       printk(KERN_ERR "%s: TDR: No correct termination %d clocks away.\n",
-                               dev->name, result & TDR_TIMEMASK);
-               else if (result & TDR_ET_SRT) {
-                       /* time == 0 -> strange :-) */
-                       if (result & TDR_TIMEMASK)
-                               printk(KERN_ERR "%s: TDR: Detected a short circuit %d clocks away.\n",
-                                       dev->name, result & TDR_TIMEMASK);
-               } else
-                       printk(KERN_ERR "%s: TDR: Unknown status %04x\n",
-                                               dev->name, result);
-       }
-
-       /*
-        * Multicast setup
-        */
-       if (num_addrs && !(dev->flags & IFF_PROMISC)) {
-               mc_cmd = ptr;
-               writew(0, &mc_cmd->cmd_status);
-               writew(CMD_MCSETUP | CMD_LAST, &mc_cmd->cmd_cmd);
-               writew(0xffff, &mc_cmd->cmd_link);
-               writew(num_addrs * 6, &mc_cmd->mc_cnt);
-
-               i = 0;
-               netdev_for_each_mc_addr(ha, dev)
-                       memcpy_toio(mc_cmd->mc_list[i++], ha->addr, 6);
-
-               writew(make16(mc_cmd), &p->scb->cbl_offset);
-               writeb(CUC_START, &p->scb->cmd_cuc);
-               ni_attn586();
-
-               wait_for_stat_compl(mc_cmd);
-
-               if ((readw(&mc_cmd->cmd_status) & (STAT_COMPL|STAT_OK))
-                                                != (STAT_COMPL|STAT_OK))
-                       printk(KERN_ERR "%s: Can't apply multicast-address-list.\n", dev->name);
-       }
-
-       /*
-        * alloc nop/xmit-cmds
-        */
-#if (NUM_XMIT_BUFFS == 1)
-       for (i = 0; i < 2; i++) {
-               p->nop_cmds[i] = ptr;
-               writew(CMD_NOP, &p->nop_cmds[i]->cmd_cmd);
-               writew(0, &p->nop_cmds[i]->cmd_status);
-               writew(make16(p->nop_cmds[i]), &p->nop_cmds[i]->cmd_link);
-               ptr = ptr + sizeof(struct nop_cmd_struct);
-       }
-#else
-       for (i = 0; i < NUM_XMIT_BUFFS; i++) {
-               p->nop_cmds[i] = ptr;
-               writew(CMD_NOP, &p->nop_cmds[i]->cmd_cmd);
-               writew(0, &p->nop_cmds[i]->cmd_status);
-               writew(make16(p->nop_cmds[i]), &p->nop_cmds[i]->cmd_link);
-               ptr = ptr + sizeof(struct nop_cmd_struct);
-       }
-#endif
-
-       ptr = alloc_rfa(dev, ptr); /* init receive-frame-area */
-
-       /*
-        * alloc xmit-buffs / init xmit_cmds
-        */
-       for (i = 0; i < NUM_XMIT_BUFFS; i++) {
-               /* Transmit cmd/buff 0 */
-               p->xmit_cmds[i] = ptr;
-               ptr = ptr + sizeof(struct transmit_cmd_struct);
-               p->xmit_cbuffs[i] = ptr; /* char-buffs */
-               ptr = ptr + XMIT_BUFF_SIZE;
-               p->xmit_buffs[i] = ptr; /* TBD */
-               ptr = ptr + sizeof(struct tbd_struct);
-               if ((void __iomem *)ptr > (void __iomem *)p->iscp) {
-                       printk(KERN_ERR "%s: not enough shared-mem for your configuration!\n",
-                               dev->name);
-                       return 1;
-               }
-               memset_io(p->xmit_cmds[i], 0,
-                                       sizeof(struct transmit_cmd_struct));
-               memset_io(p->xmit_buffs[i], 0,
-                                       sizeof(struct tbd_struct));
-               writew(make16(p->nop_cmds[(i+1)%NUM_XMIT_BUFFS]),
-                                       &p->xmit_cmds[i]->cmd_link);
-               writew(STAT_COMPL, &p->xmit_cmds[i]->cmd_status);
-               writew(CMD_XMIT|CMD_INT, &p->xmit_cmds[i]->cmd_cmd);
-               writew(make16(p->xmit_buffs[i]), &p->xmit_cmds[i]->tbd_offset);
-               writew(0xffff, &p->xmit_buffs[i]->next);
-               writel(make24(p->xmit_cbuffs[i]), &p->xmit_buffs[i]->buffer);
-       }
-
-       p->xmit_count = 0;
-       p->xmit_last    = 0;
-#ifndef NO_NOPCOMMANDS
-       p->nop_point    = 0;
-#endif
-
-        /*
-               * 'start transmitter'
-               */
-#ifndef NO_NOPCOMMANDS
-       writew(make16(p->nop_cmds[0]), &p->scb->cbl_offset);
-       writeb(CUC_START, &p->scb->cmd_cuc);
-       ni_attn586();
-       wait_for_scb_cmd(dev);
-#else
-       writew(make16(p->xmit_cmds[0]), &p->xmit_cmds[0]->cmd_link);
-       writew(CMD_XMIT | CMD_SUSPEND | CMD_INT, &p->xmit_cmds[0]->cmd_cmd);
-#endif
-
-       /*
-        * ack. interrupts
-        */
-       writeb(readb(&p->scb->cus) & STAT_MASK, &p->scb->cmd_cuc);
-       ni_attn586();
-       udelay(16);
-
-       ni_enaint();
-
-       return 0;
-}
-
-/******************************************************
- * This is a helper routine for ni52_rnr_int() and init586().
- * It sets up the Receive Frame Area (RFA).
- */
-
-static void __iomem *alloc_rfa(struct net_device *dev, void __iomem *ptr)
-{
-       struct rfd_struct __iomem *rfd = ptr;
-       struct rbd_struct __iomem *rbd;
-       int i;
-       struct priv *p = netdev_priv(dev);
-
-       memset_io(rfd, 0,
-               sizeof(struct rfd_struct) * (p->num_recv_buffs + rfdadd));
-       p->rfd_first = rfd;
-
-       for (i = 0; i < (p->num_recv_buffs + rfdadd); i++) {
-               writew(make16(rfd + (i+1) % (p->num_recv_buffs+rfdadd)),
-                       &rfd[i].next);
-               writew(0xffff, &rfd[i].rbd_offset);
-       }
-       /* RU suspend */
-       writeb(RFD_SUSP, &rfd[p->num_recv_buffs-1+rfdadd].last);
-
-       ptr = rfd + (p->num_recv_buffs + rfdadd);
-
-       rbd = ptr;
-       ptr = rbd + p->num_recv_buffs;
-
-        /* clr descriptors */
-       memset_io(rbd, 0, sizeof(struct rbd_struct) * (p->num_recv_buffs));
-
-       for (i = 0; i < p->num_recv_buffs; i++) {
-               writew(make16(rbd + (i+1) % p->num_recv_buffs), &rbd[i].next);
-               writew(RECV_BUFF_SIZE, &rbd[i].size);
-               writel(make24(ptr), &rbd[i].buffer);
-               ptr = ptr + RECV_BUFF_SIZE;
-       }
-       p->rfd_top      = p->rfd_first;
-       p->rfd_last = p->rfd_first + (p->num_recv_buffs - 1 + rfdadd);
-
-       writew(make16(p->rfd_first), &p->scb->rfa_offset);
-       writew(make16(rbd), &p->rfd_first->rbd_offset);
-
-       return ptr;
-}
-
-
-/**************************************************
- * Interrupt Handler ...
- */
-
-static irqreturn_t ni52_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       unsigned int stat;
-       int cnt = 0;
-       struct priv *p;
-
-       p = netdev_priv(dev);
-
-       if (debuglevel > 1)
-               printk("I");
-
-       spin_lock(&p->spinlock);
-
-       wait_for_scb_cmd(dev); /* wait for last command */
-
-       while ((stat = readb(&p->scb->cus) & STAT_MASK)) {
-               writeb(stat, &p->scb->cmd_cuc);
-               ni_attn586();
-
-               if (stat & STAT_FR)      /* received a frame */
-                       ni52_rcv_int(dev);
-
-               if (stat & STAT_RNR) { /* RU went 'not ready' */
-                       printk("(R)");
-                       if (readb(&p->scb->rus) & RU_SUSPEND) {
-                               /* special case: RU_SUSPEND */
-                               wait_for_scb_cmd(dev);
-                               writeb(RUC_RESUME, &p->scb->cmd_ruc);
-                               ni_attn586();
-                               wait_for_scb_cmd_ruc(dev);
-                       } else {
-                               printk(KERN_ERR "%s: Receiver-Unit went 'NOT READY': %04x/%02x.\n",
-                                       dev->name, stat, readb(&p->scb->rus));
-                               ni52_rnr_int(dev);
-                       }
-               }
-
-               /* Command with I-bit set complete */
-               if (stat & STAT_CX)
-                        ni52_xmt_int(dev);
-
-#ifndef NO_NOPCOMMANDS
-               if (stat & STAT_CNA) {  /* CU went 'not ready' */
-                       if (netif_running(dev))
-                               printk(KERN_ERR "%s: oops! CU has left active state. stat: %04x/%02x.\n",
-                                       dev->name, stat, readb(&p->scb->cus));
-               }
-#endif
-
-               if (debuglevel > 1)
-                       printk("%d", cnt++);
-
-               /* Wait for ack. (ni52_xmt_int can be faster than ack!!) */
-               wait_for_scb_cmd(dev);
-               if (readb(&p->scb->cmd_cuc)) {   /* timed out? */
-                       printk(KERN_ERR "%s: Acknowledge timed out.\n",
-                               dev->name);
-                       ni_disint();
-                       break;
-               }
-       }
-       spin_unlock(&p->spinlock);
-
-       if (debuglevel > 1)
-               printk("i");
-       return IRQ_HANDLED;
-}
-
-/*******************************************************
- * receive-interrupt
- */
-
-static void ni52_rcv_int(struct net_device *dev)
-{
-       int status, cnt = 0;
-       unsigned short totlen;
-       struct sk_buff *skb;
-       struct rbd_struct __iomem *rbd;
-       struct priv *p = netdev_priv(dev);
-
-       if (debuglevel > 0)
-               printk("R");
-
-       for (; (status = readb(&p->rfd_top->stat_high)) & RFD_COMPL;) {
-               rbd = make32(readw(&p->rfd_top->rbd_offset));
-               if (status & RFD_OK) { /* frame received without error? */
-                       totlen = readw(&rbd->status);
-                       if (totlen & RBD_LAST) {
-                               /* the first and the last buffer? */
-                               totlen &= RBD_MASK; /* length of this frame */
-                               writew(0x00, &rbd->status);
-                               skb = netdev_alloc_skb(dev, totlen + 2);
-                               if (skb != NULL) {
-                                       skb_reserve(skb, 2);
-                                       skb_put(skb, totlen);
-                                       memcpy_fromio(skb->data, p->base + readl(&rbd->buffer), totlen);
-                                       skb->protocol = eth_type_trans(skb, dev);
-                                       netif_rx(skb);
-                                       dev->stats.rx_packets++;
-                                       dev->stats.rx_bytes += totlen;
-                               } else
-                                       dev->stats.rx_dropped++;
-                       } else {
-                               int rstat;
-                                /* free all RBD's until RBD_LAST is set */
-                               totlen = 0;
-                               while (!((rstat = readw(&rbd->status)) & RBD_LAST)) {
-                                       totlen += rstat & RBD_MASK;
-                                       if (!rstat) {
-                                               printk(KERN_ERR "%s: Whoops .. no end mark in RBD list\n", dev->name);
-                                               break;
-                                       }
-                                       writew(0, &rbd->status);
-                                       rbd = make32(readw(&rbd->next));
-                               }
-                               totlen += rstat & RBD_MASK;
-                               writew(0, &rbd->status);
-                               printk(KERN_ERR "%s: received oversized frame! length: %d\n",
-                                       dev->name, totlen);
-                               dev->stats.rx_dropped++;
-                        }
-               } else {/* frame !(ok), only with 'save-bad-frames' */
-                       printk(KERN_ERR "%s: oops! rfd-error-status: %04x\n",
-                               dev->name, status);
-                       dev->stats.rx_errors++;
-               }
-               writeb(0, &p->rfd_top->stat_high);
-               writeb(RFD_SUSP, &p->rfd_top->last); /* maybe exchange by RFD_LAST */
-               writew(0xffff, &p->rfd_top->rbd_offset);
-               writeb(0, &p->rfd_last->last);  /* delete RFD_SUSP      */
-               p->rfd_last = p->rfd_top;
-               p->rfd_top = make32(readw(&p->rfd_top->next)); /* step to next RFD */
-               writew(make16(p->rfd_top), &p->scb->rfa_offset);
-
-               if (debuglevel > 0)
-                       printk("%d", cnt++);
-       }
-
-       if (automatic_resume) {
-               wait_for_scb_cmd(dev);
-               writeb(RUC_RESUME, &p->scb->cmd_ruc);
-               ni_attn586();
-               wait_for_scb_cmd_ruc(dev);
-       }
-
-#ifdef WAIT_4_BUSY
-       {
-               int i;
-               for (i = 0; i < 1024; i++) {
-                       if (p->rfd_top->status)
-                               break;
-                       udelay(16);
-                       if (i == 1023)
-                               printk(KERN_ERR "%s: RU hasn't fetched next RFD (not busy/complete)\n", dev->name);
-               }
-       }
-#endif
-       if (debuglevel > 0)
-               printk("r");
-}
-
-/**********************************************************
- * handle 'Receiver went not ready'.
- */
-
-static void ni52_rnr_int(struct net_device *dev)
-{
-       struct priv *p = netdev_priv(dev);
-
-       dev->stats.rx_errors++;
-
-       wait_for_scb_cmd(dev);          /* wait for the last cmd, WAIT_4_FULLSTAT?? */
-       writeb(RUC_ABORT, &p->scb->cmd_ruc); /* usually the RU is in the 'no resource'-state .. abort it now. */
-       ni_attn586();
-       wait_for_scb_cmd_ruc(dev);              /* wait for accept cmd. */
-
-       alloc_rfa(dev, p->rfd_first);
-       /* maybe add a check here, before restarting the RU */
-       startrecv586(dev); /* restart RU */
-
-       printk(KERN_ERR "%s: Receive-Unit restarted. Status: %04x\n",
-               dev->name, readb(&p->scb->rus));
-
-}
-
-/**********************************************************
- * handle xmit - interrupt
- */
-
-static void ni52_xmt_int(struct net_device *dev)
-{
-       int status;
-       struct priv *p = netdev_priv(dev);
-
-       if (debuglevel > 0)
-               printk("X");
-
-       status = readw(&p->xmit_cmds[p->xmit_last]->cmd_status);
-       if (!(status & STAT_COMPL))
-               printk(KERN_ERR "%s: strange .. xmit-int without a 'COMPLETE'\n", dev->name);
-
-       if (status & STAT_OK) {
-               dev->stats.tx_packets++;
-               dev->stats.collisions += (status & TCMD_MAXCOLLMASK);
-       } else {
-               dev->stats.tx_errors++;
-               if (status & TCMD_LATECOLL) {
-                       printk(KERN_ERR "%s: late collision detected.\n",
-                               dev->name);
-                       dev->stats.collisions++;
-               } else if (status & TCMD_NOCARRIER) {
-                       dev->stats.tx_carrier_errors++;
-                       printk(KERN_ERR "%s: no carrier detected.\n",
-                               dev->name);
-               } else if (status & TCMD_LOSTCTS)
-                       printk(KERN_ERR "%s: loss of CTS detected.\n",
-                               dev->name);
-               else if (status & TCMD_UNDERRUN) {
-                       dev->stats.tx_fifo_errors++;
-                       printk(KERN_ERR "%s: DMA underrun detected.\n",
-                               dev->name);
-               } else if (status & TCMD_MAXCOLL) {
-                       printk(KERN_ERR "%s: Max. collisions exceeded.\n",
-                               dev->name);
-                       dev->stats.collisions += 16;
-               }
-       }
-#if (NUM_XMIT_BUFFS > 1)
-       if ((++p->xmit_last) == NUM_XMIT_BUFFS)
-               p->xmit_last = 0;
-#endif
-       netif_wake_queue(dev);
-}
-
-/***********************************************************
- * (re)start the receiver
- */
-
-static void startrecv586(struct net_device *dev)
-{
-       struct priv *p = netdev_priv(dev);
-
-       wait_for_scb_cmd(dev);
-       wait_for_scb_cmd_ruc(dev);
-       writew(make16(p->rfd_first), &p->scb->rfa_offset);
-       writeb(RUC_START, &p->scb->cmd_ruc);
-       ni_attn586();           /* start cmd. */
-       wait_for_scb_cmd_ruc(dev);
-       /* wait for accept cmd. (no timeout!!) */
-}
-
-static void ni52_timeout(struct net_device *dev)
-{
-       struct priv *p = netdev_priv(dev);
-#ifndef NO_NOPCOMMANDS
-       if (readb(&p->scb->cus) & CU_ACTIVE) { /* COMMAND-UNIT active? */
-               netif_wake_queue(dev);
-#ifdef DEBUG
-               printk(KERN_ERR "%s: strange ... timeout with CU active?!?\n",
-                       dev->name);
-               printk(KERN_ERR "%s: X0: %04x N0: %04x N1: %04x %d\n",
-                       dev->name, (int)p->xmit_cmds[0]->cmd_status,
-                       readw(&p->nop_cmds[0]->cmd_status),
-                       readw(&p->nop_cmds[1]->cmd_status),
-                       p->nop_point);
-#endif
-               writeb(CUC_ABORT, &p->scb->cmd_cuc);
-               ni_attn586();
-               wait_for_scb_cmd(dev);
-               writew(make16(p->nop_cmds[p->nop_point]), &p->scb->cbl_offset);
-               writeb(CUC_START, &p->scb->cmd_cuc);
-               ni_attn586();
-               wait_for_scb_cmd(dev);
-               dev->trans_start = jiffies; /* prevent tx timeout */
-               return 0;
-       }
-#endif
-       {
-#ifdef DEBUG
-               printk(KERN_ERR "%s: xmitter timed out, try to restart! stat: %02x\n",
-                               dev->name, readb(&p->scb->cus));
-               printk(KERN_ERR "%s: command-stats: %04x %04x\n",
-                               dev->name,
-                               readw(&p->xmit_cmds[0]->cmd_status),
-                               readw(&p->xmit_cmds[1]->cmd_status));
-               printk(KERN_ERR "%s: check, whether you set the right interrupt number!\n",
-                               dev->name);
-#endif
-               ni52_close(dev);
-               ni52_open(dev);
-       }
-       dev->trans_start = jiffies; /* prevent tx timeout */
-}
-
-/******************************************************
- * send frame
- */
-
-static netdev_tx_t ni52_send_packet(struct sk_buff *skb,
-                                   struct net_device *dev)
-{
-       int len, i;
-#ifndef NO_NOPCOMMANDS
-       int next_nop;
-#endif
-       struct priv *p = netdev_priv(dev);
-
-       if (skb->len > XMIT_BUFF_SIZE) {
-               printk(KERN_ERR "%s: Sorry, max. framelength is %d bytes. The length of your frame is %d bytes.\n", dev->name, XMIT_BUFF_SIZE, skb->len);
-               return NETDEV_TX_OK;
-       }
-
-       netif_stop_queue(dev);
-
-       memcpy_toio(p->xmit_cbuffs[p->xmit_count], skb->data, skb->len);
-       len = skb->len;
-       if (len < ETH_ZLEN) {
-               len = ETH_ZLEN;
-               memset_io(p->xmit_cbuffs[p->xmit_count]+skb->len, 0,
-                                                       len - skb->len);
-       }
-
-#if (NUM_XMIT_BUFFS == 1)
-#      ifdef NO_NOPCOMMANDS
-
-#ifdef DEBUG
-       if (readb(&p->scb->cus) & CU_ACTIVE) {
-               printk(KERN_ERR "%s: Hmmm .. CU is still running and we wanna send a new packet.\n", dev->name);
-               printk(KERN_ERR "%s: stat: %04x %04x\n",
-                               dev->name, readb(&p->scb->cus),
-                               readw(&p->xmit_cmds[0]->cmd_status));
-       }
-#endif
-       writew(TBD_LAST | len, &p->xmit_buffs[0]->size);
-       for (i = 0; i < 16; i++) {
-               writew(0, &p->xmit_cmds[0]->cmd_status);
-               wait_for_scb_cmd(dev);
-               if ((readb(&p->scb->cus) & CU_STATUS) == CU_SUSPEND)
-                       writeb(CUC_RESUME, &p->scb->cmd_cuc);
-               else {
-                       writew(make16(p->xmit_cmds[0]), &p->scb->cbl_offset);
-                       writeb(CUC_START, &p->scb->cmd_cuc);
-               }
-               ni_attn586();
-               if (!i)
-                       dev_kfree_skb(skb);
-               wait_for_scb_cmd(dev);
-               /* test it, because CU sometimes doesn't start immediately */
-               if (readb(&p->scb->cus) & CU_ACTIVE)
-                       break;
-               if (readw(&p->xmit_cmds[0]->cmd_status))
-                       break;
-               if (i == 15)
-                       printk(KERN_WARNING "%s: Can't start transmit-command.\n", dev->name);
-       }
-#      else
-       next_nop = (p->nop_point + 1) & 0x1;
-       writew(TBD_LAST | len, &p->xmit_buffs[0]->size);
-       writew(make16(p->nop_cmds[next_nop]), &p->xmit_cmds[0]->cmd_link);
-       writew(make16(p->nop_cmds[next_nop]),
-                               &p->nop_cmds[next_nop]->cmd_link);
-       writew(0, &p->xmit_cmds[0]->cmd_status);
-       writew(0, &p->nop_cmds[next_nop]->cmd_status);
-
-       writew(make16(p->xmit_cmds[0]), &p->nop_cmds[p->nop_point]->cmd_link);
-       p->nop_point = next_nop;
-       dev_kfree_skb(skb);
-#      endif
-#else
-       writew(TBD_LAST | len, &p->xmit_buffs[p->xmit_count]->size);
-       next_nop = p->xmit_count + 1
-       if (next_nop == NUM_XMIT_BUFFS)
-               next_nop = 0;
-       writew(0, &p->xmit_cmds[p->xmit_count]->cmd_status);
-       /* linkpointer of xmit-command already points to next nop cmd */
-       writew(make16(p->nop_cmds[next_nop]),
-                               &p->nop_cmds[next_nop]->cmd_link);
-       writew(0, &p->nop_cmds[next_nop]->cmd_status);
-       writew(make16(p->xmit_cmds[p->xmit_count]),
-                               &p->nop_cmds[p->xmit_count]->cmd_link);
-       p->xmit_count = next_nop;
-       {
-               unsigned long flags;
-               spin_lock_irqsave(&p->spinlock);
-               if (p->xmit_count != p->xmit_last)
-                       netif_wake_queue(dev);
-               spin_unlock_irqrestore(&p->spinlock);
-       }
-       dev_kfree_skb(skb);
-#endif
-       return NETDEV_TX_OK;
-}
-
-/*******************************************
- * Someone wanna have the statistics
- */
-
-static struct net_device_stats *ni52_get_stats(struct net_device *dev)
-{
-       struct priv *p = netdev_priv(dev);
-       unsigned short crc, aln, rsc, ovrn;
-
-       /* Get error-statistics from the ni82586 */
-       crc = readw(&p->scb->crc_errs);
-       writew(0, &p->scb->crc_errs);
-       aln = readw(&p->scb->aln_errs);
-       writew(0, &p->scb->aln_errs);
-       rsc = readw(&p->scb->rsc_errs);
-       writew(0, &p->scb->rsc_errs);
-       ovrn = readw(&p->scb->ovrn_errs);
-       writew(0, &p->scb->ovrn_errs);
-
-       dev->stats.rx_crc_errors += crc;
-       dev->stats.rx_fifo_errors += ovrn;
-       dev->stats.rx_frame_errors += aln;
-       dev->stats.rx_dropped += rsc;
-
-       return &dev->stats;
-}
-
-/********************************************************
- * Set MC list ..
- */
-
-static void set_multicast_list(struct net_device *dev)
-{
-       netif_stop_queue(dev);
-       ni_disint();
-       alloc586(dev);
-       init586(dev);
-       startrecv586(dev);
-       ni_enaint();
-       netif_wake_queue(dev);
-}
-
-#ifdef MODULE
-static struct net_device *dev_ni52;
-
-module_param(io, int, 0);
-module_param(irq, int, 0);
-module_param(memstart, long, 0);
-module_param(memend, long, 0);
-MODULE_PARM_DESC(io, "NI5210 I/O base address,required");
-MODULE_PARM_DESC(irq, "NI5210 IRQ number,required");
-MODULE_PARM_DESC(memstart, "NI5210 memory base address,required");
-MODULE_PARM_DESC(memend, "NI5210 memory end address,required");
-
-int __init init_module(void)
-{
-       if (io <= 0x0 || !memend || !memstart || irq < 2) {
-               printk(KERN_ERR "ni52: Autoprobing not allowed for modules.\n");
-               printk(KERN_ERR "ni52: Set symbols 'io' 'irq' 'memstart' and 'memend'\n");
-               return -ENODEV;
-       }
-       dev_ni52 = ni52_probe(-1);
-       if (IS_ERR(dev_ni52))
-               return PTR_ERR(dev_ni52);
-       return 0;
-}
-
-void __exit cleanup_module(void)
-{
-       struct priv *p = netdev_priv(dev_ni52);
-       unregister_netdev(dev_ni52);
-       iounmap(p->mapped);
-       release_region(dev_ni52->base_addr, NI52_TOTAL_SIZE);
-       free_netdev(dev_ni52);
-}
-#endif /* MODULE */
-
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/i825xx/ni52.h b/drivers/net/ethernet/i825xx/ni52.h
deleted file mode 100644 (file)
index 0a03b28..0000000
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Intel i82586 Ethernet definitions
- *
- * This is an extension to the Linux operating system, and is covered by the
- * same GNU General Public License that covers that work.
- *
- * copyrights (c) 1994 by Michael Hipp (hippm@informatik.uni-tuebingen.de)
- *
- * I have done a look in the following sources:
- *   crynwr-packet-driver by Russ Nelson
- *   Garret A. Wollman's i82586-driver for BSD
- */
-
-
-#define NI52_RESET     0  /* writing to this address, resets the i82586 */
-#define NI52_ATTENTION 1  /* channel attention, kick the 586 */
-#define NI52_TENA      3  /* 2-5 possibly wrong, Xmit enable */
-#define NI52_TDIS      2  /* Xmit disable */
-#define NI52_INTENA    5  /* Interrupt enable */
-#define NI52_INTDIS    4  /* Interrupt disable */
-#define NI52_MAGIC1    6  /* dunno exact function */
-#define NI52_MAGIC2    7  /* dunno exact function */
-
-#define NI52_MAGICVAL1 0x00  /* magic-values for ni5210 card */
-#define NI52_MAGICVAL2 0x55
-
-/*
- * where to find the System Configuration Pointer (SCP)
- */
-#define SCP_DEFAULT_ADDRESS 0xfffff4
-
-
-/*
- * System Configuration Pointer Struct
- */
-
-struct scp_struct
-{
-       u16 zero_dum0;  /* has to be zero */
-       u8 sysbus;      /* 0=16Bit,1=8Bit */
-       u8 zero_dum1;   /* has to be zero for 586 */
-       u16 zero_dum2;
-       u16 zero_dum3;
-       u32 iscp;               /* pointer to the iscp-block */
-};
-
-
-/*
- * Intermediate System Configuration Pointer (ISCP)
- */
-struct iscp_struct
-{
-       u8 busy;          /* 586 clears after successful init */
-       u8 zero_dummy;    /* has to be zero */
-       u16 scb_offset;    /* pointeroffset to the scb_base */
-       u32 scb_base;      /* base-address of all 16-bit offsets */
-};
-
-/*
- * System Control Block (SCB)
- */
-struct scb_struct
-{
-       u8 rus;
-       u8 cus;
-       u8 cmd_ruc;        /* command word: RU part */
-       u8 cmd_cuc;        /* command word: CU part & ACK */
-       u16 cbl_offset;    /* pointeroffset, command block list */
-       u16 rfa_offset;    /* pointeroffset, receive frame area */
-       u16 crc_errs;      /* CRC-Error counter */
-       u16 aln_errs;      /* alignmenterror counter */
-       u16 rsc_errs;      /* Resourceerror counter */
-       u16 ovrn_errs;     /* OVerrunerror counter */
-};
-
-/*
- * possible command values for the command word
- */
-#define RUC_MASK       0x0070  /* mask for RU commands */
-#define RUC_NOP                0x0000  /* NOP-command */
-#define RUC_START      0x0010  /* start RU */
-#define RUC_RESUME     0x0020  /* resume RU after suspend */
-#define RUC_SUSPEND    0x0030  /* suspend RU */
-#define RUC_ABORT      0x0040  /* abort receiver operation immediately */
-
-#define CUC_MASK        0x07  /* mask for CU command */
-#define CUC_NOP         0x00  /* NOP-command */
-#define CUC_START       0x01  /* start execution of 1. cmd on the CBL */
-#define CUC_RESUME      0x02  /* resume after suspend */
-#define CUC_SUSPEND     0x03  /* Suspend CU */
-#define CUC_ABORT       0x04  /* abort command operation immediately */
-
-#define ACK_MASK        0xf0  /* mask for ACK command */
-#define ACK_CX          0x80  /* acknowledges STAT_CX */
-#define ACK_FR          0x40  /* ack. STAT_FR */
-#define ACK_CNA         0x20  /* ack. STAT_CNA */
-#define ACK_RNR         0x10  /* ack. STAT_RNR */
-
-/*
- * possible status values for the status word
- */
-#define STAT_MASK       0xf0  /* mask for cause of interrupt */
-#define STAT_CX         0x80  /* CU finished cmd with its I bit set */
-#define STAT_FR         0x40  /* RU finished receiving a frame */
-#define STAT_CNA        0x20  /* CU left active state */
-#define STAT_RNR        0x10  /* RU left ready state */
-
-#define CU_STATUS       0x7   /* CU status, 0=idle */
-#define CU_SUSPEND      0x1   /* CU is suspended */
-#define CU_ACTIVE       0x2   /* CU is active */
-
-#define RU_STATUS      0x70    /* RU status, 0=idle */
-#define RU_SUSPEND     0x10    /* RU suspended */
-#define RU_NOSPACE     0x20    /* RU no resources */
-#define RU_READY       0x40    /* RU is ready */
-
-/*
- * Receive Frame Descriptor (RFD)
- */
-struct rfd_struct
-{
-       u8  stat_low;   /* status word */
-       u8  stat_high;  /* status word */
-       u8  rfd_sf;     /* 82596 mode only */
-       u8  last;               /* Bit15,Last Frame on List / Bit14,suspend */
-       u16 next;               /* linkoffset to next RFD */
-       u16 rbd_offset; /* pointeroffset to RBD-buffer */
-       u8  dest[6];    /* ethernet-address, destination */
-       u8  source[6];  /* ethernet-address, source */
-       u16 length;     /* 802.3 frame-length */
-       u16 zero_dummy; /* dummy */
-};
-
-#define RFD_LAST     0x80      /* last: last rfd in the list */
-#define RFD_SUSP     0x40      /* last: suspend RU after  */
-#define RFD_COMPL    0x80
-#define RFD_OK       0x20
-#define RFD_BUSY     0x40
-#define RFD_ERR_LEN  0x10     /* Length error (if enabled length-checking */
-#define RFD_ERR_CRC  0x08     /* CRC error */
-#define RFD_ERR_ALGN 0x04     /* Alignment error */
-#define RFD_ERR_RNR  0x02     /* status: receiver out of resources */
-#define RFD_ERR_OVR  0x01     /* DMA Overrun! */
-
-#define RFD_ERR_FTS  0x0080    /* Frame to short */
-#define RFD_ERR_NEOP 0x0040    /* No EOP flag (for bitstuffing only) */
-#define RFD_ERR_TRUN 0x0020    /* (82596 only/SF mode) indicates truncated frame */
-#define RFD_MATCHADD 0x0002     /* status: Destinationaddress !matches IA (only 82596) */
-#define RFD_COLLDET  0x0001    /* Detected collision during reception */
-
-/*
- * Receive Buffer Descriptor (RBD)
- */
-struct rbd_struct
-{
-       u16 status;     /* status word,number of used bytes in buff */
-       u16 next;               /* pointeroffset to next RBD */
-       u32 buffer;     /* receive buffer address pointer */
-       u16 size;               /* size of this buffer */
-       u16 zero_dummy;    /* dummy */
-};
-
-#define RBD_LAST       0x8000  /* last buffer */
-#define RBD_USED       0x4000  /* this buffer has data */
-#define RBD_MASK       0x3fff  /* size-mask for length */
-
-/*
- * Statusvalues for Commands/RFD
- */
-#define STAT_COMPL   0x8000    /* status: frame/command is complete */
-#define STAT_BUSY    0x4000    /* status: frame/command is busy */
-#define STAT_OK      0x2000    /* status: frame/command is ok */
-
-/*
- * Action-Commands
- */
-#define CMD_NOP                0x0000  /* NOP */
-#define CMD_IASETUP    0x0001  /* initial address setup command */
-#define CMD_CONFIGURE  0x0002  /* configure command */
-#define CMD_MCSETUP    0x0003  /* MC setup command */
-#define CMD_XMIT       0x0004  /* transmit command */
-#define CMD_TDR                0x0005  /* time domain reflectometer (TDR) command */
-#define CMD_DUMP       0x0006  /* dump command */
-#define CMD_DIAGNOSE   0x0007  /* diagnose command */
-
-/*
- * Action command bits
- */
-#define CMD_LAST       0x8000  /* indicates last command in the CBL */
-#define CMD_SUSPEND    0x4000  /* suspend CU after this CB */
-#define CMD_INT                0x2000  /* generate interrupt after execution */
-
-/*
- * NOP - command
- */
-struct nop_cmd_struct
-{
-       u16 cmd_status; /* status of this command */
-       u16 cmd_cmd;       /* the command itself (+bits) */
-       u16 cmd_link;      /* offsetpointer to next command */
-};
-
-/*
- * IA Setup command
- */
-struct iasetup_cmd_struct
-{
-       u16 cmd_status;
-       u16 cmd_cmd;
-       u16 cmd_link;
-       u8  iaddr[6];
-};
-
-/*
- * Configure command
- */
-struct configure_cmd_struct
-{
-       u16 cmd_status;
-       u16 cmd_cmd;
-       u16 cmd_link;
-       u8  byte_cnt;   /* size of the config-cmd */
-       u8  fifo;       /* fifo/recv monitor */
-       u8  sav_bf;     /* save bad frames (bit7=1)*/
-       u8  adr_len;    /* adr_len(0-2),al_loc(3),pream(4-5),loopbak(6-7)*/
-       u8  priority;   /* lin_prio(0-2),exp_prio(4-6),bof_metd(7) */
-       u8  ifs;        /* inter frame spacing */
-       u8  time_low;   /* slot time low */
-       u8  time_high;  /* slot time high(0-2) and max. retries(4-7) */
-       u8  promisc;    /* promisc-mode(0) , et al (1-7) */
-       u8  carr_coll;  /* carrier(0-3)/collision(4-7) stuff */
-       u8  fram_len;   /* minimal frame len */
-       u8  dummy;           /* dummy */
-};
-
-/*
- * Multicast Setup command
- */
-struct mcsetup_cmd_struct
-{
-       u16 cmd_status;
-       u16 cmd_cmd;
-       u16 cmd_link;
-       u16 mc_cnt;             /* number of bytes in the MC-List */
-       u8  mc_list[0][6];      /* pointer to 6 bytes entries */
-};
-
-/*
- * DUMP command
- */
-struct dump_cmd_struct
-{
-       u16 cmd_status;
-       u16 cmd_cmd;
-       u16 cmd_link;
-       u16 dump_offset;    /* pointeroffset to DUMP space */
-};
-
-/*
- * transmit command
- */
-struct transmit_cmd_struct
-{
-       u16 cmd_status;
-       u16 cmd_cmd;
-       u16 cmd_link;
-       u16 tbd_offset; /* pointeroffset to TBD */
-       u8  dest[6];       /* destination address of the frame */
-       u16 length;     /* user defined: 802.3 length / Ether type */
-};
-
-#define TCMD_ERRMASK     0x0fa0
-#define TCMD_MAXCOLLMASK 0x000f
-#define TCMD_MAXCOLL     0x0020
-#define TCMD_HEARTBEAT   0x0040
-#define TCMD_DEFERRED    0x0080
-#define TCMD_UNDERRUN    0x0100
-#define TCMD_LOSTCTS     0x0200
-#define TCMD_NOCARRIER   0x0400
-#define TCMD_LATECOLL    0x0800
-
-struct tdr_cmd_struct
-{
-       u16 cmd_status;
-       u16 cmd_cmd;
-       u16 cmd_link;
-       u16 status;
-};
-
-#define TDR_LNK_OK     0x8000  /* No link problem identified */
-#define TDR_XCVR_PRB   0x4000  /* indicates a transceiver problem */
-#define TDR_ET_OPN     0x2000  /* open, no correct termination */
-#define TDR_ET_SRT     0x1000  /* TDR detected a short circuit */
-#define TDR_TIMEMASK   0x07ff  /* mask for the time field */
-
-/*
- * Transmit Buffer Descriptor (TBD)
- */
-struct tbd_struct
-{
-       u16 size;               /* size + EOF-Flag(15) */
-       u16 next;          /* pointeroffset to next TBD */
-       u32 buffer;        /* pointer to buffer */
-};
-
-#define TBD_LAST 0x8000         /* EOF-Flag, indicates last buffer in list */
-
-
-
-
diff --git a/drivers/net/ethernet/i825xx/znet.c b/drivers/net/ethernet/i825xx/znet.c
deleted file mode 100644 (file)
index c9479e0..0000000
+++ /dev/null
@@ -1,928 +0,0 @@
-/* znet.c: An Zenith Z-Note ethernet driver for linux. */
-
-/*
-       Written by Donald Becker.
-
-       The author may be reached as becker@scyld.com.
-       This driver is based on the Linux skeleton driver.  The copyright of the
-       skeleton driver is held by the United States Government, as represented
-       by DIRNSA, and it is released under the GPL.
-
-       Thanks to Mike Hollick for alpha testing and suggestions.
-
-  References:
-          The Crynwr packet driver.
-
-         "82593 CSMA/CD Core LAN Controller" Intel datasheet, 1992
-         Intel Microcommunications Databook, Vol. 1, 1990.
-    As usual with Intel, the documentation is incomplete and inaccurate.
-       I had to read the Crynwr packet driver to figure out how to actually
-       use the i82593, and guess at what register bits matched the loosely
-       related i82586.
-
-                                       Theory of Operation
-
-       The i82593 used in the Zenith Z-Note series operates using two(!) slave
-       DMA     channels, one interrupt, and one 8-bit I/O port.
-
-       While there     several ways to configure '593 DMA system, I chose the one
-       that seemed commensurate with the highest system performance in the face
-       of moderate interrupt latency: Both DMA channels are configured as
-       recirculating ring buffers, with one channel (#0) dedicated to Rx and
-       the other channel (#1) to Tx and configuration.  (Note that this is
-       different than the Crynwr driver, where the Tx DMA channel is initialized
-       before each operation.  That approach simplifies operation and Tx error
-       recovery, but requires additional I/O in normal operation and precludes
-       transmit buffer chaining.)
-
-       Both rings are set to 8192 bytes using {TX,RX}_RING_SIZE.  This provides
-       a reasonable ring size for Rx, while simplifying DMA buffer allocation --
-       DMA buffers must not cross a 128K boundary.  (In truth the size selection
-       was influenced by my lack of '593 documentation.  I thus was constrained
-       to use the Crynwr '593 initialization table, which sets the Rx ring size
-       to 8K.)
-
-       Despite my usual low opinion about Intel-designed parts, I must admit
-       that the bulk data handling of the i82593 is a good design for
-       an integrated system, like a laptop, where using two slave DMA channels
-       doesn't pose a problem.  I still take issue with using only a single I/O
-       port.  In the same controlled environment there are essentially no
-       limitations on I/O space, and using multiple locations would eliminate
-       the     need for multiple operations when looking at status registers,
-       setting the Rx ring boundary, or switching to promiscuous mode.
-
-       I also question Zenith's selection of the '593: one of the advertised
-       advantages of earlier Intel parts was that if you figured out the magic
-       initialization incantation you could use the same part on many different
-       network types.  Zenith's use of the "FriendlyNet" (sic) connector rather
-       than an on-board transceiver leads me to believe that they were planning
-       to take advantage of this.  But, uhmmm, the '593 omits all but ethernet
-       functionality from the serial subsystem.
- */
-
-/* 10/2002
-
-   o Resurected for Linux 2.5+ by Marc Zyngier <maz@wild-wind.fr.eu.org> :
-
-   - Removed strange DMA snooping in znet_sent_packet, which lead to
-     TX buffer corruption on my laptop.
-   - Use init_etherdev stuff.
-   - Use kmalloc-ed DMA buffers.
-   - Use as few global variables as possible.
-   - Use proper resources management.
-   - Use wireless/i82593.h as much as possible (structure, constants)
-   - Compiles as module or build-in.
-   - Now survives unplugging/replugging cable.
-
-   Some code was taken from wavelan_cs.
-
-   Tested on a vintage Zenith Z-Note 433Lnp+. Probably broken on
-   anything else. Testers (and detailed bug reports) are welcome :-).
-
-   o TODO :
-
-   - Properly handle multicast
-   - Understand why some traffic patterns add a 1s latency...
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/slab.h>
-#include <linux/errno.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/if_arp.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#include <linux/i82593.h>
-
-static char version[] __initdata = "znet.c:v1.02 9/23/94 becker@scyld.com\n";
-
-#ifndef ZNET_DEBUG
-#define ZNET_DEBUG 1
-#endif
-static unsigned int znet_debug = ZNET_DEBUG;
-module_param (znet_debug, int, 0);
-MODULE_PARM_DESC (znet_debug, "ZNet debug level");
-MODULE_LICENSE("GPL");
-
-/* The DMA modes we need aren't in <dma.h>. */
-#define DMA_RX_MODE            0x14    /* Auto init, I/O to mem, ++, demand. */
-#define DMA_TX_MODE            0x18    /* Auto init, Mem to I/O, ++, demand. */
-#define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17)
-#define RX_BUF_SIZE 8192
-#define TX_BUF_SIZE 8192
-#define DMA_BUF_SIZE (RX_BUF_SIZE + 16)        /* 8k + 16 bytes for trailers */
-
-#define TX_TIMEOUT     (HZ/10)
-
-struct znet_private {
-       int rx_dma, tx_dma;
-       spinlock_t lock;
-       short sia_base, sia_size, io_size;
-       struct i82593_conf_block i593_init;
-       /* The starting, current, and end pointers for the packet buffers. */
-       ushort *rx_start, *rx_cur, *rx_end;
-       ushort *tx_start, *tx_cur, *tx_end;
-       ushort tx_buf_len;                      /* Tx buffer length, in words. */
-};
-
-/* Only one can be built-in;-> */
-static struct net_device *znet_dev;
-
-#define NETIDBLK_MAGIC         "NETIDBLK"
-#define NETIDBLK_MAGIC_SIZE    8
-
-struct netidblk {
-       char magic[NETIDBLK_MAGIC_SIZE];        /* The magic number (string) "NETIDBLK" */
-       unsigned char netid[8]; /* The physical station address */
-       char nettype, globalopt;
-       char vendor[8];         /* The machine vendor and product name. */
-       char product[8];
-       char irq1, irq2;                /* Interrupts, only one is currently used.      */
-       char dma1, dma2;
-       short dma_mem_misc[8];          /* DMA buffer locations (unused in Linux). */
-       short iobase1, iosize1;
-       short iobase2, iosize2;         /* Second iobase unused. */
-       char driver_options;                    /* Misc. bits */
-       char pad;
-};
-
-static int     znet_open(struct net_device *dev);
-static netdev_tx_t znet_send_packet(struct sk_buff *skb,
-                                   struct net_device *dev);
-static irqreturn_t znet_interrupt(int irq, void *dev_id);
-static void    znet_rx(struct net_device *dev);
-static int     znet_close(struct net_device *dev);
-static void hardware_init(struct net_device *dev);
-static void update_stop_hit(short ioaddr, unsigned short rx_stop_offset);
-static void znet_tx_timeout (struct net_device *dev);
-
-/* Request needed resources */
-static int znet_request_resources (struct net_device *dev)
-{
-       struct znet_private *znet = netdev_priv(dev);
-
-       if (request_irq (dev->irq, znet_interrupt, 0, "ZNet", dev))
-               goto failed;
-       if (request_dma (znet->rx_dma, "ZNet rx"))
-               goto free_irq;
-       if (request_dma (znet->tx_dma, "ZNet tx"))
-               goto free_rx_dma;
-       if (!request_region (znet->sia_base, znet->sia_size, "ZNet SIA"))
-               goto free_tx_dma;
-       if (!request_region (dev->base_addr, znet->io_size, "ZNet I/O"))
-               goto free_sia;
-
-       return 0;                               /* Happy ! */
-
- free_sia:
-       release_region (znet->sia_base, znet->sia_size);
- free_tx_dma:
-       free_dma (znet->tx_dma);
- free_rx_dma:
-       free_dma (znet->rx_dma);
- free_irq:
-       free_irq (dev->irq, dev);
- failed:
-       return -1;
-}
-
-static void znet_release_resources (struct net_device *dev)
-{
-       struct znet_private *znet = netdev_priv(dev);
-
-       release_region (znet->sia_base, znet->sia_size);
-       release_region (dev->base_addr, znet->io_size);
-       free_dma (znet->tx_dma);
-       free_dma (znet->rx_dma);
-       free_irq (dev->irq, dev);
-}
-
-/* Keep the magical SIA stuff in a single function... */
-static void znet_transceiver_power (struct net_device *dev, int on)
-{
-       struct znet_private *znet = netdev_priv(dev);
-       unsigned char v;
-
-       /* Turn on/off the 82501 SIA, using zenith-specific magic. */
-       /* Select LAN control register */
-       outb(0x10, znet->sia_base);
-
-       if (on)
-               v = inb(znet->sia_base + 1) | 0x84;
-       else
-               v = inb(znet->sia_base + 1) & ~0x84;
-
-       outb(v, znet->sia_base+1); /* Turn on/off LAN power (bit 2). */
-}
-
-/* Init the i82593, with current promisc/mcast configuration.
-   Also used from hardware_init. */
-static void znet_set_multicast_list (struct net_device *dev)
-{
-       struct znet_private *znet = netdev_priv(dev);
-       short ioaddr = dev->base_addr;
-       struct i82593_conf_block *cfblk = &znet->i593_init;
-
-       memset(cfblk, 0x00, sizeof(struct i82593_conf_block));
-
-        /* The configuration block.  What an undocumented nightmare.
-          The first set of values are those suggested (without explanation)
-          for ethernet in the Intel 82586 databook.  The rest appear to be
-          completely undocumented, except for cryptic notes in the Crynwr
-          packet driver.  This driver uses the Crynwr values verbatim. */
-
-       /* maz : Rewritten to take advantage of the wanvelan includes.
-          At least we have names, not just blind values */
-
-       /* Byte 0 */
-       cfblk->fifo_limit = 10; /* = 16 B rx and 80 B tx fifo thresholds */
-       cfblk->forgnesi = 0;    /* 0=82C501, 1=AMD7992B compatibility */
-       cfblk->fifo_32 = 1;
-       cfblk->d6mod = 0;       /* Run in i82593 advanced mode */
-       cfblk->throttle_enb = 1;
-
-       /* Byte 1 */
-       cfblk->throttle = 8;    /* Continuous w/interrupts, 128-clock DMA. */
-       cfblk->cntrxint = 0;    /* enable continuous mode receive interrupts */
-       cfblk->contin = 1;      /* enable continuous mode */
-
-       /* Byte 2 */
-       cfblk->addr_len = ETH_ALEN;
-       cfblk->acloc = 1;       /* Disable source addr insertion by i82593 */
-       cfblk->preamb_len = 2;  /* 8 bytes preamble */
-       cfblk->loopback = 0;    /* Loopback off */
-
-       /* Byte 3 */
-       cfblk->lin_prio = 0;    /* Default priorities & backoff methods. */
-       cfblk->tbofstop = 0;
-       cfblk->exp_prio = 0;
-       cfblk->bof_met = 0;
-
-       /* Byte 4 */
-       cfblk->ifrm_spc = 6;    /* 96 bit times interframe spacing */
-
-       /* Byte 5 */
-       cfblk->slottim_low = 0; /* 512 bit times slot time (low) */
-
-       /* Byte 6 */
-       cfblk->slottim_hi = 2;  /* 512 bit times slot time (high) */
-       cfblk->max_retr = 15;   /* 15 collisions retries */
-
-       /* Byte 7 */
-       cfblk->prmisc = ((dev->flags & IFF_PROMISC) ? 1 : 0); /* Promiscuous mode */
-       cfblk->bc_dis = 0;      /* Enable broadcast reception */
-       cfblk->crs_1 = 0;       /* Don't transmit without carrier sense */
-       cfblk->nocrc_ins = 0;   /* i82593 generates CRC */
-       cfblk->crc_1632 = 0;    /* 32-bit Autodin-II CRC */
-       cfblk->crs_cdt = 0;     /* CD not to be interpreted as CS */
-
-       /* Byte 8 */
-       cfblk->cs_filter = 0;   /* CS is recognized immediately */
-       cfblk->crs_src = 0;     /* External carrier sense */
-       cfblk->cd_filter = 0;   /* CD is recognized immediately */
-
-       /* Byte 9 */
-       cfblk->min_fr_len = ETH_ZLEN >> 2; /* Minimum frame length */
-
-       /* Byte A */
-       cfblk->lng_typ = 1;     /* Type/length checks OFF */
-       cfblk->lng_fld = 1;     /* Disable 802.3 length field check */
-       cfblk->rxcrc_xf = 1;    /* Don't transfer CRC to memory */
-       cfblk->artx = 1;        /* Disable automatic retransmission */
-       cfblk->sarec = 1;       /* Disable source addr trig of CD */
-       cfblk->tx_jabber = 0;   /* Disable jabber jam sequence */
-       cfblk->hash_1 = 1;      /* Use bits 0-5 in mc address hash */
-       cfblk->lbpkpol = 0;     /* Loopback pin active high */
-
-       /* Byte B */
-       cfblk->fdx = 0;         /* Disable full duplex operation */
-
-       /* Byte C */
-       cfblk->dummy_6 = 0x3f;  /* all ones, Default multicast addresses & backoff. */
-       cfblk->mult_ia = 0;     /* No multiple individual addresses */
-       cfblk->dis_bof = 0;     /* Disable the backoff algorithm ?! */
-
-       /* Byte D */
-       cfblk->dummy_1 = 1;     /* set to 1 */
-       cfblk->tx_ifs_retrig = 3; /* Hmm... Disabled */
-       cfblk->mc_all = (!netdev_mc_empty(dev) ||
-                       (dev->flags & IFF_ALLMULTI)); /* multicast all mode */
-       cfblk->rcv_mon = 0;     /* Monitor mode disabled */
-       cfblk->frag_acpt = 0;   /* Do not accept fragments */
-       cfblk->tstrttrs = 0;    /* No start transmission threshold */
-
-       /* Byte E */
-       cfblk->fretx = 1;       /* FIFO automatic retransmission */
-       cfblk->runt_eop = 0;    /* drop "runt" packets */
-       cfblk->hw_sw_pin = 0;   /* ?? */
-       cfblk->big_endn = 0;    /* Big Endian ? no... */
-       cfblk->syncrqs = 1;     /* Synchronous DRQ deassertion... */
-       cfblk->sttlen = 1;      /* 6 byte status registers */
-       cfblk->rx_eop = 0;      /* Signal EOP on packet reception */
-       cfblk->tx_eop = 0;      /* Signal EOP on packet transmission */
-
-       /* Byte F */
-       cfblk->rbuf_size = RX_BUF_SIZE >> 12; /* Set receive buffer size */
-       cfblk->rcvstop = 1;     /* Enable Receive Stop Register */
-
-       if (znet_debug > 2) {
-               int i;
-               unsigned char *c;
-
-               for (i = 0, c = (char *) cfblk; i < sizeof (*cfblk); i++)
-                       printk ("%02X ", c[i]);
-               printk ("\n");
-       }
-
-       *znet->tx_cur++ = sizeof(struct i82593_conf_block);
-       memcpy(znet->tx_cur, cfblk, sizeof(struct i82593_conf_block));
-       znet->tx_cur += sizeof(struct i82593_conf_block)/2;
-       outb(OP0_CONFIGURE | CR0_CHNL, ioaddr);
-
-       /* XXX FIXME maz : Add multicast addresses here, so having a
-        * multicast address configured isn't equal to IFF_ALLMULTI */
-}
-
-static const struct net_device_ops znet_netdev_ops = {
-       .ndo_open               = znet_open,
-       .ndo_stop               = znet_close,
-       .ndo_start_xmit         = znet_send_packet,
-       .ndo_set_rx_mode        = znet_set_multicast_list,
-       .ndo_tx_timeout         = znet_tx_timeout,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-/* The Z-Note probe is pretty easy.  The NETIDBLK exists in the safe-to-probe
-   BIOS area.  We just scan for the signature, and pull the vital parameters
-   out of the structure. */
-
-static int __init znet_probe (void)
-{
-       int i;
-       struct netidblk *netinfo;
-       struct znet_private *znet;
-       struct net_device *dev;
-       char *p;
-       char *plast = phys_to_virt(0x100000 - NETIDBLK_MAGIC_SIZE);
-       int err = -ENOMEM;
-
-       /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */
-       for(p = (char *)phys_to_virt(0xf0000); p <= plast; p++)
-               if (*p == 'N' &&
-                   strncmp(p, NETIDBLK_MAGIC, NETIDBLK_MAGIC_SIZE) == 0)
-                       break;
-
-       if (p > plast) {
-               if (znet_debug > 1)
-                       printk(KERN_INFO "No Z-Note ethernet adaptor found.\n");
-               return -ENODEV;
-       }
-
-       dev = alloc_etherdev(sizeof(struct znet_private));
-       if (!dev)
-               return -ENOMEM;
-
-       znet = netdev_priv(dev);
-
-       netinfo = (struct netidblk *)p;
-       dev->base_addr = netinfo->iobase1;
-       dev->irq = netinfo->irq1;
-
-       /* The station address is in the "netidblk" at 0x0f0000. */
-       for (i = 0; i < 6; i++)
-               dev->dev_addr[i] = netinfo->netid[i];
-
-       printk(KERN_INFO "%s: ZNET at %#3lx, %pM"
-              ", using IRQ %d DMA %d and %d.\n",
-              dev->name, dev->base_addr, dev->dev_addr,
-              dev->irq, netinfo->dma1, netinfo->dma2);
-
-       if (znet_debug > 1) {
-               printk(KERN_INFO "%s: vendor '%16.16s' IRQ1 %d IRQ2 %d DMA1 %d DMA2 %d.\n",
-                      dev->name, netinfo->vendor,
-                      netinfo->irq1, netinfo->irq2,
-                      netinfo->dma1, netinfo->dma2);
-               printk(KERN_INFO "%s: iobase1 %#x size %d iobase2 %#x size %d net type %2.2x.\n",
-                      dev->name, netinfo->iobase1, netinfo->iosize1,
-                      netinfo->iobase2, netinfo->iosize2, netinfo->nettype);
-       }
-
-       if (znet_debug > 0)
-               printk(KERN_INFO "%s", version);
-
-       znet->rx_dma = netinfo->dma1;
-       znet->tx_dma = netinfo->dma2;
-       spin_lock_init(&znet->lock);
-       znet->sia_base = 0xe6;  /* Magic address for the 82501 SIA */
-       znet->sia_size = 2;
-       /* maz: Despite the '593 being advertised above as using a
-        * single 8bits I/O port, this driver does many 16bits
-        * access. So set io_size accordingly */
-       znet->io_size  = 2;
-
-       if (!(znet->rx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA)))
-               goto free_dev;
-       if (!(znet->tx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA)))
-               goto free_rx;
-
-       if (!dma_page_eq (znet->rx_start, znet->rx_start + (RX_BUF_SIZE/2-1)) ||
-           !dma_page_eq (znet->tx_start, znet->tx_start + (TX_BUF_SIZE/2-1))) {
-               printk (KERN_WARNING "tx/rx crossing DMA frontiers, giving up\n");
-               goto free_tx;
-       }
-
-       znet->rx_end = znet->rx_start + RX_BUF_SIZE/2;
-       znet->tx_buf_len = TX_BUF_SIZE/2;
-       znet->tx_end = znet->tx_start + znet->tx_buf_len;
-
-       /* The ZNET-specific entries in the device structure. */
-       dev->netdev_ops = &znet_netdev_ops;
-       dev->watchdog_timeo = TX_TIMEOUT;
-       err = register_netdev(dev);
-       if (err)
-               goto free_tx;
-       znet_dev = dev;
-       return 0;
-
- free_tx:
-       kfree(znet->tx_start);
- free_rx:
-       kfree(znet->rx_start);
- free_dev:
-       free_netdev(dev);
-       return err;
-}
-
-
-static int znet_open(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       if (znet_debug > 2)
-               printk(KERN_DEBUG "%s: znet_open() called.\n", dev->name);
-
-       /* These should never fail.  You can't add devices to a sealed box! */
-       if (znet_request_resources (dev)) {
-               printk(KERN_WARNING "%s: Not opened -- resource busy?!?\n", dev->name);
-               return -EBUSY;
-       }
-
-       znet_transceiver_power (dev, 1);
-
-       /* According to the Crynwr driver we should wait 50 msec. for the
-          LAN clock to stabilize.  My experiments indicates that the '593 can
-          be initialized immediately.  The delay is probably needed for the
-          DC-to-DC converter to come up to full voltage, and for the oscillator
-          to be spot-on at 20Mhz before transmitting.
-          Until this proves to be a problem we rely on the higher layers for the
-          delay and save allocating a timer entry. */
-
-       /* maz : Well, I'm getting every time the following message
-        * without the delay on a 486@33. This machine is much too
-        * fast... :-) So maybe the Crynwr driver wasn't wrong after
-        * all, even if the message is completly harmless on my
-        * setup. */
-       mdelay (50);
-
-       /* This follows the packet driver's lead, and checks for success. */
-       if (inb(ioaddr) != 0x10 && inb(ioaddr) != 0x00)
-               printk(KERN_WARNING "%s: Problem turning on the transceiver power.\n",
-                      dev->name);
-
-       hardware_init(dev);
-       netif_start_queue (dev);
-
-       return 0;
-}
-
-
-static void znet_tx_timeout (struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       ushort event, tx_status, rx_offset, state;
-
-       outb (CR0_STATUS_0, ioaddr);
-       event = inb (ioaddr);
-       outb (CR0_STATUS_1, ioaddr);
-       tx_status = inw (ioaddr);
-       outb (CR0_STATUS_2, ioaddr);
-       rx_offset = inw (ioaddr);
-       outb (CR0_STATUS_3, ioaddr);
-       state = inb (ioaddr);
-       printk (KERN_WARNING "%s: transmit timed out, status %02x %04x %04x %02x,"
-        " resetting.\n", dev->name, event, tx_status, rx_offset, state);
-       if (tx_status == TX_LOST_CRS)
-               printk (KERN_WARNING "%s: Tx carrier error, check transceiver cable.\n",
-                       dev->name);
-       outb (OP0_RESET, ioaddr);
-       hardware_init (dev);
-       netif_wake_queue (dev);
-}
-
-static netdev_tx_t znet_send_packet(struct sk_buff *skb, struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       struct znet_private *znet = netdev_priv(dev);
-       unsigned long flags;
-       short length = skb->len;
-
-       if (znet_debug > 4)
-               printk(KERN_DEBUG "%s: ZNet_send_packet.\n", dev->name);
-
-       if (length < ETH_ZLEN) {
-               if (skb_padto(skb, ETH_ZLEN))
-                       return NETDEV_TX_OK;
-               length = ETH_ZLEN;
-       }
-
-       netif_stop_queue (dev);
-
-       /* Check that the part hasn't reset itself, probably from suspend. */
-       outb(CR0_STATUS_0, ioaddr);
-       if (inw(ioaddr) == 0x0010 &&
-           inw(ioaddr) == 0x0000 &&
-           inw(ioaddr) == 0x0010) {
-               if (znet_debug > 1)
-                       printk (KERN_WARNING "%s : waking up\n", dev->name);
-               hardware_init(dev);
-               znet_transceiver_power (dev, 1);
-       }
-
-       if (1) {
-               unsigned char *buf = (void *)skb->data;
-               ushort *tx_link = znet->tx_cur - 1;
-               ushort rnd_len = (length + 1)>>1;
-
-               dev->stats.tx_bytes+=length;
-
-               if (znet->tx_cur >= znet->tx_end)
-                 znet->tx_cur = znet->tx_start;
-               *znet->tx_cur++ = length;
-               if (znet->tx_cur + rnd_len + 1 > znet->tx_end) {
-                       int semi_cnt = (znet->tx_end - znet->tx_cur)<<1; /* Cvrt to byte cnt. */
-                       memcpy(znet->tx_cur, buf, semi_cnt);
-                       rnd_len -= semi_cnt>>1;
-                       memcpy(znet->tx_start, buf + semi_cnt, length - semi_cnt);
-                       znet->tx_cur = znet->tx_start + rnd_len;
-               } else {
-                       memcpy(znet->tx_cur, buf, skb->len);
-                       znet->tx_cur += rnd_len;
-               }
-               *znet->tx_cur++ = 0;
-
-               spin_lock_irqsave(&znet->lock, flags);
-               {
-                       *tx_link = OP0_TRANSMIT | CR0_CHNL;
-                       /* Is this always safe to do? */
-                       outb(OP0_TRANSMIT | CR0_CHNL, ioaddr);
-               }
-               spin_unlock_irqrestore (&znet->lock, flags);
-
-               netif_start_queue (dev);
-
-               if (znet_debug > 4)
-                 printk(KERN_DEBUG "%s: Transmitter queued, length %d.\n", dev->name, length);
-       }
-       dev_kfree_skb(skb);
-       return NETDEV_TX_OK;
-}
-
-/* The ZNET interrupt handler. */
-static irqreturn_t znet_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct znet_private *znet = netdev_priv(dev);
-       int ioaddr;
-       int boguscnt = 20;
-       int handled = 0;
-
-       spin_lock (&znet->lock);
-
-       ioaddr = dev->base_addr;
-
-       outb(CR0_STATUS_0, ioaddr);
-       do {
-               ushort status = inb(ioaddr);
-               if (znet_debug > 5) {
-                       ushort result, rx_ptr, running;
-                       outb(CR0_STATUS_1, ioaddr);
-                       result = inw(ioaddr);
-                       outb(CR0_STATUS_2, ioaddr);
-                       rx_ptr = inw(ioaddr);
-                       outb(CR0_STATUS_3, ioaddr);
-                       running = inb(ioaddr);
-                       printk(KERN_DEBUG "%s: interrupt, status %02x, %04x %04x %02x serial %d.\n",
-                                dev->name, status, result, rx_ptr, running, boguscnt);
-               }
-               if ((status & SR0_INTERRUPT) == 0)
-                       break;
-
-               handled = 1;
-
-               if ((status & SR0_EVENT_MASK) == SR0_TRANSMIT_DONE ||
-                   (status & SR0_EVENT_MASK) == SR0_RETRANSMIT_DONE ||
-                   (status & SR0_EVENT_MASK) == SR0_TRANSMIT_NO_CRC_DONE) {
-                       int tx_status;
-                       outb(CR0_STATUS_1, ioaddr);
-                       tx_status = inw(ioaddr);
-                       /* It's undocumented, but tx_status seems to match the i82586. */
-                       if (tx_status & TX_OK) {
-                               dev->stats.tx_packets++;
-                               dev->stats.collisions += tx_status & TX_NCOL_MASK;
-                       } else {
-                               if (tx_status & (TX_LOST_CTS | TX_LOST_CRS))
-                                       dev->stats.tx_carrier_errors++;
-                               if (tx_status & TX_UND_RUN)
-                                       dev->stats.tx_fifo_errors++;
-                               if (!(tx_status & TX_HRT_BEAT))
-                                       dev->stats.tx_heartbeat_errors++;
-                               if (tx_status & TX_MAX_COL)
-                                       dev->stats.tx_aborted_errors++;
-                               /* ...and the catch-all. */
-                               if ((tx_status | (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL)) != (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL))
-                                       dev->stats.tx_errors++;
-
-                               /* Transceiver may be stuck if cable
-                                * was removed while emitting a
-                                * packet. Flip it off, then on to
-                                * reset it. This is very empirical,
-                                * but it seems to work. */
-
-                               znet_transceiver_power (dev, 0);
-                               znet_transceiver_power (dev, 1);
-                       }
-                       netif_wake_queue (dev);
-               }
-
-               if ((status & SR0_RECEPTION) ||
-                   (status & SR0_EVENT_MASK) == SR0_STOP_REG_HIT) {
-                       znet_rx(dev);
-               }
-               /* Clear the interrupts we've handled. */
-               outb(CR0_INT_ACK, ioaddr);
-       } while (boguscnt--);
-
-       spin_unlock (&znet->lock);
-
-       return IRQ_RETVAL(handled);
-}
-
-static void znet_rx(struct net_device *dev)
-{
-       struct znet_private *znet = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       int boguscount = 1;
-       short next_frame_end_offset = 0;                /* Offset of next frame start. */
-       short *cur_frame_end;
-       short cur_frame_end_offset;
-
-       outb(CR0_STATUS_2, ioaddr);
-       cur_frame_end_offset = inw(ioaddr);
-
-       if (cur_frame_end_offset == znet->rx_cur - znet->rx_start) {
-               printk(KERN_WARNING "%s: Interrupted, but nothing to receive, offset %03x.\n",
-                          dev->name, cur_frame_end_offset);
-               return;
-       }
-
-       /* Use same method as the Crynwr driver: construct a forward list in
-          the same area of the backwards links we now have.  This allows us to
-          pass packets to the upper layers in the order they were received --
-          important for fast-path sequential operations. */
-       while (znet->rx_start + cur_frame_end_offset != znet->rx_cur &&
-              ++boguscount < 5) {
-               unsigned short hi_cnt, lo_cnt, hi_status, lo_status;
-               int count, status;
-
-               if (cur_frame_end_offset < 4) {
-                       /* Oh no, we have a special case: the frame trailer wraps around
-                          the end of the ring buffer.  We've saved space at the end of
-                          the ring buffer for just this problem. */
-                       memcpy(znet->rx_end, znet->rx_start, 8);
-                       cur_frame_end_offset += (RX_BUF_SIZE/2);
-               }
-               cur_frame_end = znet->rx_start + cur_frame_end_offset - 4;
-
-               lo_status = *cur_frame_end++;
-               hi_status = *cur_frame_end++;
-               status = ((hi_status & 0xff) << 8) + (lo_status & 0xff);
-               lo_cnt = *cur_frame_end++;
-               hi_cnt = *cur_frame_end++;
-               count = ((hi_cnt & 0xff) << 8) + (lo_cnt & 0xff);
-
-               if (znet_debug > 5)
-                 printk(KERN_DEBUG "Constructing trailer at location %03x, %04x %04x %04x %04x"
-                                " count %#x status %04x.\n",
-                                cur_frame_end_offset<<1, lo_status, hi_status, lo_cnt, hi_cnt,
-                                count, status);
-               cur_frame_end[-4] = status;
-               cur_frame_end[-3] = next_frame_end_offset;
-               cur_frame_end[-2] = count;
-               next_frame_end_offset = cur_frame_end_offset;
-               cur_frame_end_offset -= ((count + 1)>>1) + 3;
-               if (cur_frame_end_offset < 0)
-                 cur_frame_end_offset += RX_BUF_SIZE/2;
-       }
-
-       /* Now step  forward through the list. */
-       do {
-               ushort *this_rfp_ptr = znet->rx_start + next_frame_end_offset;
-               int status = this_rfp_ptr[-4];
-               int pkt_len = this_rfp_ptr[-2];
-
-               if (znet_debug > 5)
-                 printk(KERN_DEBUG "Looking at trailer ending at %04x status %04x length %03x"
-                                " next %04x.\n", next_frame_end_offset<<1, status, pkt_len,
-                                this_rfp_ptr[-3]<<1);
-               /* Once again we must assume that the i82586 docs apply. */
-               if ( ! (status & RX_RCV_OK)) { /* There was an error. */
-                       dev->stats.rx_errors++;
-                       if (status & RX_CRC_ERR) dev->stats.rx_crc_errors++;
-                       if (status & RX_ALG_ERR) dev->stats.rx_frame_errors++;
-#if 0
-                       if (status & 0x0200) dev->stats.rx_over_errors++; /* Wrong. */
-                       if (status & 0x0100) dev->stats.rx_fifo_errors++;
-#else
-                       /* maz : Wild guess... */
-                       if (status & RX_OVRRUN) dev->stats.rx_over_errors++;
-#endif
-                       if (status & RX_SRT_FRM) dev->stats.rx_length_errors++;
-               } else if (pkt_len > 1536) {
-                       dev->stats.rx_length_errors++;
-               } else {
-                       /* Malloc up new buffer. */
-                       struct sk_buff *skb;
-
-                       skb = netdev_alloc_skb(dev, pkt_len);
-                       if (skb == NULL) {
-                               if (znet_debug)
-                                 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
-                               dev->stats.rx_dropped++;
-                               break;
-                       }
-
-                       if (&znet->rx_cur[(pkt_len+1)>>1] > znet->rx_end) {
-                               int semi_cnt = (znet->rx_end - znet->rx_cur)<<1;
-                               memcpy(skb_put(skb,semi_cnt), znet->rx_cur, semi_cnt);
-                               memcpy(skb_put(skb,pkt_len-semi_cnt), znet->rx_start,
-                                          pkt_len - semi_cnt);
-                       } else {
-                               memcpy(skb_put(skb,pkt_len), znet->rx_cur, pkt_len);
-                               if (znet_debug > 6) {
-                                       unsigned int *packet = (unsigned int *) skb->data;
-                                       printk(KERN_DEBUG "Packet data is %08x %08x %08x %08x.\n", packet[0],
-                                                  packet[1], packet[2], packet[3]);
-                               }
-                 }
-                 skb->protocol=eth_type_trans(skb,dev);
-                 netif_rx(skb);
-                 dev->stats.rx_packets++;
-                 dev->stats.rx_bytes += pkt_len;
-               }
-               znet->rx_cur = this_rfp_ptr;
-               if (znet->rx_cur >= znet->rx_end)
-                       znet->rx_cur -= RX_BUF_SIZE/2;
-               update_stop_hit(ioaddr, (znet->rx_cur - znet->rx_start)<<1);
-               next_frame_end_offset = this_rfp_ptr[-3];
-               if (next_frame_end_offset == 0)         /* Read all the frames? */
-                       break;                  /* Done for now */
-               this_rfp_ptr = znet->rx_start + next_frame_end_offset;
-       } while (--boguscount);
-
-       /* If any worth-while packets have been received, dev_rint()
-          has done a mark_bh(INET_BH) for us and will work on them
-          when we get to the bottom-half routine. */
-}
-
-/* The inverse routine to znet_open(). */
-static int znet_close(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       netif_stop_queue (dev);
-
-       outb(OP0_RESET, ioaddr);                        /* CMD0_RESET */
-
-       if (znet_debug > 1)
-               printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name);
-       /* Turn off transceiver power. */
-       znet_transceiver_power (dev, 0);
-
-       znet_release_resources (dev);
-
-       return 0;
-}
-
-static void show_dma(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-       unsigned char stat = inb (ioaddr);
-       struct znet_private *znet = netdev_priv(dev);
-       unsigned long flags;
-       short dma_port = ((znet->tx_dma&3)<<2) + IO_DMA2_BASE;
-       unsigned addr = inb(dma_port);
-       short residue;
-
-       addr |= inb(dma_port) << 8;
-       residue = get_dma_residue(znet->tx_dma);
-
-       if (znet_debug > 1) {
-               flags=claim_dma_lock();
-               printk(KERN_DEBUG "Stat:%02x Addr: %04x cnt:%3x\n",
-                      stat, addr<<1, residue);
-               release_dma_lock(flags);
-       }
-}
-
-/* Initialize the hardware.  We have to do this when the board is open()ed
-   or when we come out of suspend mode. */
-static void hardware_init(struct net_device *dev)
-{
-       unsigned long flags;
-       short ioaddr = dev->base_addr;
-       struct znet_private *znet = netdev_priv(dev);
-
-       znet->rx_cur = znet->rx_start;
-       znet->tx_cur = znet->tx_start;
-
-       /* Reset the chip, and start it up. */
-       outb(OP0_RESET, ioaddr);
-
-       flags=claim_dma_lock();
-       disable_dma(znet->rx_dma);              /* reset by an interrupting task. */
-       clear_dma_ff(znet->rx_dma);
-       set_dma_mode(znet->rx_dma, DMA_RX_MODE);
-       set_dma_addr(znet->rx_dma, isa_virt_to_bus(znet->rx_start));
-       set_dma_count(znet->rx_dma, RX_BUF_SIZE);
-       enable_dma(znet->rx_dma);
-       /* Now set up the Tx channel. */
-       disable_dma(znet->tx_dma);
-       clear_dma_ff(znet->tx_dma);
-       set_dma_mode(znet->tx_dma, DMA_TX_MODE);
-       set_dma_addr(znet->tx_dma, isa_virt_to_bus(znet->tx_start));
-       set_dma_count(znet->tx_dma, znet->tx_buf_len<<1);
-       enable_dma(znet->tx_dma);
-       release_dma_lock(flags);
-
-       if (znet_debug > 1)
-         printk(KERN_DEBUG "%s: Initializing the i82593, rx buf %p tx buf %p\n",
-                        dev->name, znet->rx_start,znet->tx_start);
-       /* Do an empty configure command, just like the Crynwr driver.  This
-          resets to chip to its default values. */
-       *znet->tx_cur++ = 0;
-       *znet->tx_cur++ = 0;
-       show_dma(dev);
-       outb(OP0_CONFIGURE | CR0_CHNL, ioaddr);
-
-       znet_set_multicast_list (dev);
-
-       *znet->tx_cur++ = 6;
-       memcpy(znet->tx_cur, dev->dev_addr, 6);
-       znet->tx_cur += 3;
-       show_dma(dev);
-       outb(OP0_IA_SETUP | CR0_CHNL, ioaddr);
-       show_dma(dev);
-
-       update_stop_hit(ioaddr, 8192);
-       if (znet_debug > 1)  printk(KERN_DEBUG "enabling Rx.\n");
-       outb(OP0_RCV_ENABLE, ioaddr);
-       netif_start_queue (dev);
-}
-
-static void update_stop_hit(short ioaddr, unsigned short rx_stop_offset)
-{
-       outb(OP0_SWIT_TO_PORT_1 | CR0_CHNL, ioaddr);
-       if (znet_debug > 5)
-         printk(KERN_DEBUG "Updating stop hit with value %02x.\n",
-                        (rx_stop_offset >> 6) | CR1_STOP_REG_UPDATE);
-       outb((rx_stop_offset >> 6) | CR1_STOP_REG_UPDATE, ioaddr);
-       outb(OP1_SWIT_TO_PORT_0, ioaddr);
-}
-
-static __exit void znet_cleanup (void)
-{
-       if (znet_dev) {
-               struct znet_private *znet = netdev_priv(znet_dev);
-
-               unregister_netdev (znet_dev);
-               kfree (znet->rx_start);
-               kfree (znet->tx_start);
-               free_netdev (znet_dev);
-       }
-}
-
-module_init (znet_probe);
-module_exit (znet_cleanup);
index bde4f3db328fddfef3290fb39c6d66dd85c6cba6..21353f0fef63ecf99384455a90b33399e43185e6 100644 (file)
@@ -94,6 +94,8 @@ config IGB
        tristate "Intel(R) 82575/82576 PCI-Express Gigabit Ethernet support"
        depends on PCI
        select PTP_1588_CLOCK
+       select I2C
+       select I2C_ALGOBIT
        ---help---
          This driver supports Intel(R) 82575/82576 gigabit ethernet family of
          adapters.  For more information on how to identify your adapter, go
@@ -112,6 +114,17 @@ config IGB
          To compile this driver as a module, choose M here. The module
          will be called igb.
 
+config IGB_HWMON
+       bool "Intel(R) PCI-Express Gigabit adapters HWMON support"
+       default y
+       depends on IGB && HWMON && !(IGB=y && HWMON=m)
+       ---help---
+         Say Y if you want to expose thermal sensor data on Intel devices.
+
+         Some of our devices contain thermal sensors, both external and internal.
+         This data is available via the hwmon sysfs interface and exposes
+         the onboard sensors.
+
 config IGB_DCA
        bool "Direct Cache Access (DCA) Support"
        default y
index a59f0779e1c3a00a2603c54eb21343cd962945b5..ec800b093e7eb22536b7247289d13c0450b9552f 100644 (file)
@@ -2928,8 +2928,7 @@ static int e100_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        e100_phy_init(nic);
 
        memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN);
-       memcpy(netdev->perm_addr, nic->eeprom, ETH_ALEN);
-       if (!is_valid_ether_addr(netdev->perm_addr)) {
+       if (!is_valid_ether_addr(netdev->dev_addr)) {
                if (!eeprom_bad_csum_allow) {
                        netif_err(nic, probe, nic->netdev, "Invalid MAC address from EEPROM, aborting\n");
                        err = -EAGAIN;
index 294da56b824c3d0c4259b76f01858c80914fccbf..b20fff134378497785ece66e6f08fc226413e2f7 100644 (file)
@@ -1123,9 +1123,8 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
        /* don't block initalization here due to bad MAC address */
        memcpy(netdev->dev_addr, hw->mac_addr, netdev->addr_len);
-       memcpy(netdev->perm_addr, hw->mac_addr, netdev->addr_len);
 
-       if (!is_valid_ether_addr(netdev->perm_addr))
+       if (!is_valid_ether_addr(netdev->dev_addr))
                e_err(probe, "Invalid MAC Address\n");
 
 
index c77d010d5c5992da6c25761f6d1e1747f12d3273..587890d2d55e35b46f010b3e56adab48b963cf67 100644 (file)
@@ -2044,6 +2044,7 @@ const struct e1000_info e1000_82574_info = {
                                  | FLAG_HAS_MSIX
                                  | FLAG_HAS_JUMBO_FRAMES
                                  | FLAG_HAS_WOL
+                                 | FLAG_HAS_HW_TIMESTAMP
                                  | FLAG_APME_IN_CTRL3
                                  | FLAG_HAS_SMART_POWER_DOWN
                                  | FLAG_HAS_AMT
@@ -2065,6 +2066,7 @@ const struct e1000_info e1000_82583_info = {
        .mac                    = e1000_82583,
        .flags                  = FLAG_HAS_HW_VLAN_FILTER
                                  | FLAG_HAS_WOL
+                                 | FLAG_HAS_HW_TIMESTAMP
                                  | FLAG_APME_IN_CTRL3
                                  | FLAG_HAS_SMART_POWER_DOWN
                                  | FLAG_HAS_AMT
index 02a12b69555f6fb5d71fe2089992f5fad5e354cc..36f9fad19a7649cb0d5a919219fcef631c8b1e96 100644 (file)
 #define E1000_RXD_ERR_RXE       0x80    /* Rx Data Error */
 #define E1000_RXD_SPC_VLAN_MASK 0x0FFF  /* VLAN ID is in lower 12 bits */
 
+#define E1000_RXDEXT_STATERR_TST   0x00000100  /* Time Stamp taken */
 #define E1000_RXDEXT_STATERR_CE    0x01000000
 #define E1000_RXDEXT_STATERR_SE    0x02000000
 #define E1000_RXDEXT_STATERR_SEQ   0x04000000
 #define E1000_CTRL_VME      0x40000000  /* IEEE VLAN mode enable */
 #define E1000_CTRL_PHY_RST  0x80000000  /* PHY Reset */
 
-/* Bit definitions for the Management Data IO (MDIO) and Management Data
- * Clock (MDC) pins in the Device Control Register.
- */
+#define E1000_PCS_LCTL_FORCE_FCTRL     0x80
+
+#define E1000_PCS_LSTS_AN_COMPLETE     0x10000
 
 /* Device Status */
 #define E1000_STATUS_FD         0x00000001      /* Full duplex.0=half,1=full */
 #define E1000_TXD_CMD_IP     0x02000000 /* IP packet */
 #define E1000_TXD_CMD_TSE    0x04000000 /* TCP Seg enable */
 #define E1000_TXD_STAT_TC    0x00000004 /* Tx Underrun */
+#define E1000_TXD_EXTCMD_TSTAMP        0x00000010 /* IEEE1588 Timestamp packet */
 
 /* Transmit Control */
 #define E1000_TCTL_EN     0x00000002    /* enable Tx */
 
 #define E1000_KABGTXD_BGSQLBIAS           0x00050000
 
+/* Low Power IDLE Control */
+#define E1000_LPIC_LPIET_SHIFT         24      /* Low Power Idle Entry Time */
+
 /* PBA constants */
 #define E1000_PBA_8K  0x0008    /* 8KB */
 #define E1000_PBA_16K 0x0010    /* 16KB */
 #define E1000_RXCW_C          0x20000000        /* Receive config */
 #define E1000_RXCW_SYNCH      0x40000000        /* Receive config synch */
 
+#define E1000_TSYNCTXCTL_VALID         0x00000001 /* Tx timestamp valid */
+#define E1000_TSYNCRXCTL_TYPE_ALL      0x08
+#define E1000_TSYNCTXCTL_ENABLED       0x00000010 /* enable Tx timestamping */
+
+#define E1000_TSYNCRXCTL_VALID         0x00000001 /* Rx timestamp valid */
+#define E1000_TSYNCRXCTL_TYPE_MASK     0x0000000E /* Rx type mask */
+#define E1000_TSYNCRXCTL_ENABLED       0x00000010 /* enable Rx timestamping */
+#define E1000_TSYNCRXCTL_SYSCFI                0x00000020 /* Sys clock frequency */
+
+#define E1000_TIMINCA_INCPERIOD_SHIFT  24
+#define E1000_TIMINCA_INCVALUE_MASK    0x00FFFFFF
+
 /* PCI Express Control */
 #define E1000_GCR_RXD_NO_SNOOP          0x00000001
 #define E1000_GCR_RXDSCW_NO_SNOOP       0x00000002
 /* NVM Word Offsets */
 #define NVM_COMPAT                 0x0003
 #define NVM_ID_LED_SETTINGS        0x0004
+#define NVM_FUTURE_INIT_WORD1      0x0019
+#define NVM_COMPAT_VALID_CSUM      0x0001
+#define NVM_FUTURE_INIT_WORD1_VALID_CSUM       0x0040
+
 #define NVM_INIT_CONTROL2_REG      0x000F
 #define NVM_INIT_CONTROL3_PORT_B   0x0014
 #define NVM_INIT_3GIO_3            0x001A
 /* BME1000 PHY Specific Control Register */
 #define BME1000_PSCR_ENABLE_DOWNSHIFT   0x0800 /* 1 = enable downshift */
 
+/* PHY Low Power Idle Control */
+#define I82579_LPI_CTRL                                PHY_REG(772, 20)
+#define I82579_LPI_CTRL_100_ENABLE             0x2000
+#define I82579_LPI_CTRL_1000_ENABLE            0x4000
+#define I82579_LPI_CTRL_ENABLE_MASK            0x6000
+#define I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT   0x80
+
+/* Extended Management Interface (EMI) Registers */
+#define I82579_EMI_ADDR                0x10
+#define I82579_EMI_DATA                0x11
+#define I82579_LPI_UPDATE_TIMER        0x4805  /* in 40ns units + 40 ns base value */
+#define I82579_MSE_THRESHOLD   0x084F  /* 82579 Mean Square Error Threshold */
+#define I82577_MSE_THRESHOLD   0x0887  /* 82577 Mean Square Error Threshold */
+#define I82579_MSE_LINK_DOWN   0x2411  /* MSE count before dropping link */
+#define I82579_EEE_PCS_STATUS  0x182D  /* IEEE MMD Register 3.1 >> 8 */
+#define I82579_EEE_CAPABILITY  0x0410  /* IEEE MMD Register 3.20 */
+#define I82579_EEE_ADVERTISEMENT       0x040E  /* IEEE MMD Register 7.60 */
+#define I82579_EEE_LP_ABILITY          0x040F  /* IEEE MMD Register 7.61 */
+#define I82579_EEE_100_SUPPORTED       (1 << 1) /* 100BaseTx EEE supported */
+#define I82579_EEE_1000_SUPPORTED      (1 << 2) /* 1000BaseTx EEE supported */
+#define I217_EEE_PCS_STATUS    0x9401  /* IEEE MMD Register 3.1 */
+#define I217_EEE_CAPABILITY    0x8000  /* IEEE MMD Register 3.20 */
+#define I217_EEE_ADVERTISEMENT 0x8001  /* IEEE MMD Register 7.60 */
+#define I217_EEE_LP_ABILITY    0x8002  /* IEEE MMD Register 7.61 */
+
+#define E1000_EEE_RX_LPI_RCVD  0x0400  /* Tx LP idle received */
+#define E1000_EEE_TX_LPI_RCVD  0x0800  /* Rx LP idle received */
 
 #define PHY_PAGE_SHIFT 5
 #define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \
index 6782a2eea1bcbfb893681b8d26428d8b0410981b..dea9e5552966868de6bed6c28cedac656d9dfc04 100644 (file)
@@ -41,6 +41,8 @@
 #include <linux/pci-aspm.h>
 #include <linux/crc32.h>
 #include <linux/if_vlan.h>
+#include <linux/clocksource.h>
+#include <linux/net_tstamp.h>
 
 #include "hw.h"
 
@@ -353,6 +355,7 @@ struct e1000_adapter {
        u64 gorc_old;
        u32 alloc_rx_buff_failed;
        u32 rx_dma_failed;
+       u32 rx_hwtstamp_cleared;
 
        unsigned int rx_ps_pages;
        u16 rx_ps_bsize0;
@@ -402,6 +405,14 @@ struct e1000_adapter {
 
        u16 tx_ring_count;
        u16 rx_ring_count;
+
+       struct hwtstamp_config hwtstamp_config;
+       struct delayed_work systim_overflow_work;
+       struct sk_buff *tx_hwtstamp_skb;
+       struct work_struct tx_hwtstamp_work;
+       spinlock_t systim_lock; /* protects SYSTIML/H regsters */
+       struct cyclecounter cc;
+       struct timecounter tc;
 };
 
 struct e1000_info {
@@ -416,6 +427,38 @@ struct e1000_info {
        const struct e1000_nvm_operations *nvm_ops;
 };
 
+/* The system time is maintained by a 64-bit counter comprised of the 32-bit
+ * SYSTIMH and SYSTIML registers.  How the counter increments (and therefore
+ * its resolution) is based on the contents of the TIMINCA register - it
+ * increments every incperiod (bits 31:24) clock ticks by incvalue (bits 23:0).
+ * For the best accuracy, the incperiod should be as small as possible.  The
+ * incvalue is scaled by a factor as large as possible (while still fitting
+ * in bits 23:0) so that relatively small clock corrections can be made.
+ *
+ * As a result, a shift of INCVALUE_SHIFT_n is used to fit a value of
+ * INCVALUE_n into the TIMINCA register allowing 32+8+(24-INCVALUE_SHIFT_n)
+ * bits to count nanoseconds leaving the rest for fractional nonseconds.
+ */
+#define INCVALUE_96MHz         125
+#define INCVALUE_SHIFT_96MHz   17
+#define INCPERIOD_SHIFT_96MHz  2
+#define INCPERIOD_96MHz                (12 >> INCPERIOD_SHIFT_96MHz)
+
+#define INCVALUE_25MHz         40
+#define INCVALUE_SHIFT_25MHz   18
+#define INCPERIOD_25MHz                1
+
+/* Another drawback of scaling the incvalue by a large factor is the
+ * 64-bit SYSTIM register overflows more quickly.  This is dealt with
+ * by simply reading the clock before it overflows.
+ *
+ * Clock       ns bits Overflows after
+ * ~~~~~~      ~~~~~~~ ~~~~~~~~~~~~~~~
+ * 96MHz       47-bit  2^(47-INCPERIOD_SHIFT_96MHz) / 10^9 / 3600 = 9.77 hrs
+ * 25MHz       46-bit  2^46 / 10^9 / 3600 = 19.55 hours
+ */
+#define E1000_SYSTIM_OVERFLOW_PERIOD   (HZ * 60 * 60 * 4)
+
 /* hardware capability, feature, and workaround flags */
 #define FLAG_HAS_AMT                      (1 << 0)
 #define FLAG_HAS_FLASH                    (1 << 1)
@@ -431,7 +474,7 @@ struct e1000_info {
 #define FLAG_HAS_SMART_POWER_DOWN         (1 << 11)
 #define FLAG_IS_QUAD_PORT_A               (1 << 12)
 #define FLAG_IS_QUAD_PORT                 (1 << 13)
-/* reserved bit14 */
+#define FLAG_HAS_HW_TIMESTAMP             (1 << 14)
 #define FLAG_APME_IN_WUC                  (1 << 15)
 #define FLAG_APME_IN_CTRL3                (1 << 16)
 #define FLAG_APME_CHECK_PORT_B            (1 << 17)
@@ -447,7 +490,7 @@ struct e1000_info {
 #define FLAG_MSI_ENABLED                  (1 << 27)
 /* reserved (1 << 28) */
 #define FLAG_TSO_FORCE                    (1 << 29)
-#define FLAG_RX_RESTART_NOW               (1 << 30)
+#define FLAG_RESTART_NOW                  (1 << 30)
 #define FLAG_MSI_TEST_FAILED              (1 << 31)
 
 #define FLAG2_CRC_STRIPPING               (1 << 0)
@@ -463,6 +506,7 @@ struct e1000_info {
 #define FLAG2_NO_DISABLE_RX               (1 << 10)
 #define FLAG2_PCIM2PCI_ARBITER_WA         (1 << 11)
 #define FLAG2_DFLT_CRC_STRIPPING          (1 << 12)
+#define FLAG2_CHECK_RX_HWTSTAMP           (1 << 13)
 
 #define E1000_RX_DESC_PS(R, i)     \
        (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
@@ -659,6 +703,7 @@ extern s32 e1000_check_polarity_ife(struct e1000_hw *hw);
 extern s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw);
 extern s32 e1000_check_polarity_igp(struct e1000_hw *hw);
 extern bool e1000_check_phy_82574(struct e1000_hw *hw);
+extern s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data);
 
 static inline s32 e1000_phy_hw_reset(struct e1000_hw *hw)
 {
index f95bc6ee1c227c89a2e158fde491dc03ef173b4b..f268cbcb751d93a3e55b6ea1296d6cb053073567 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/vmalloc.h>
+#include <linux/mdio.h>
 
 #include "e1000.h"
 
@@ -98,7 +99,6 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
        E1000_STAT("rx_flow_control_xoff", stats.xoffrxc),
        E1000_STAT("tx_flow_control_xon", stats.xontxc),
        E1000_STAT("tx_flow_control_xoff", stats.xofftxc),
-       E1000_STAT("rx_long_byte_count", stats.gorc),
        E1000_STAT("rx_csum_offload_good", hw_csum_good),
        E1000_STAT("rx_csum_offload_errors", hw_csum_err),
        E1000_STAT("rx_header_split", rx_hdr_split),
@@ -108,6 +108,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
        E1000_STAT("dropped_smbus", stats.mgpdc),
        E1000_STAT("rx_dma_failed", rx_dma_failed),
        E1000_STAT("tx_dma_failed", tx_dma_failed),
+       E1000_STAT("rx_hwtstamp_cleared", rx_hwtstamp_cleared),
 };
 
 #define E1000_GLOBAL_STATS_LEN ARRAY_SIZE(e1000_gstrings_stats)
@@ -2051,6 +2052,159 @@ static int e1000_get_rxnfc(struct net_device *netdev,
        }
 }
 
+static int e1000e_get_eee(struct net_device *netdev, struct ethtool_eee *edata)
+{
+       struct e1000_adapter *adapter = netdev_priv(netdev);
+       struct e1000_hw *hw = &adapter->hw;
+       u16 cap_addr, adv_addr, lpa_addr, pcs_stat_addr, phy_data, lpi_ctrl;
+       u32 status, ret_val;
+
+       if (!(adapter->flags & FLAG_IS_ICH) ||
+           !(adapter->flags2 & FLAG2_HAS_EEE))
+               return -EOPNOTSUPP;
+
+       switch (hw->phy.type) {
+       case e1000_phy_82579:
+               cap_addr = I82579_EEE_CAPABILITY;
+               adv_addr = I82579_EEE_ADVERTISEMENT;
+               lpa_addr = I82579_EEE_LP_ABILITY;
+               pcs_stat_addr = I82579_EEE_PCS_STATUS;
+               break;
+       case e1000_phy_i217:
+               cap_addr = I217_EEE_CAPABILITY;
+               adv_addr = I217_EEE_ADVERTISEMENT;
+               lpa_addr = I217_EEE_LP_ABILITY;
+               pcs_stat_addr = I217_EEE_PCS_STATUS;
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       ret_val = hw->phy.ops.acquire(hw);
+       if (ret_val)
+               return -EBUSY;
+
+       /* EEE Capability */
+       ret_val = e1000_read_emi_reg_locked(hw, cap_addr, &phy_data);
+       if (ret_val)
+               goto release;
+       edata->supported = mmd_eee_cap_to_ethtool_sup_t(phy_data);
+
+       /* EEE Advertised */
+       ret_val = e1000_read_emi_reg_locked(hw, adv_addr, &phy_data);
+       if (ret_val)
+               goto release;
+       edata->advertised = mmd_eee_adv_to_ethtool_adv_t(phy_data);
+
+       /* EEE Link Partner Advertised */
+       ret_val = e1000_read_emi_reg_locked(hw, lpa_addr, &phy_data);
+       if (ret_val)
+               goto release;
+       edata->lp_advertised = mmd_eee_adv_to_ethtool_adv_t(phy_data);
+
+       /* EEE PCS Status */
+       ret_val = e1000_read_emi_reg_locked(hw, pcs_stat_addr, &phy_data);
+       if (hw->phy.type == e1000_phy_82579)
+               phy_data <<= 8;
+
+release:
+       hw->phy.ops.release(hw);
+       if (ret_val)
+               return -ENODATA;
+
+       e1e_rphy(hw, I82579_LPI_CTRL, &lpi_ctrl);
+       status = er32(STATUS);
+
+       /* Result of the EEE auto negotiation - there is no register that
+        * has the status of the EEE negotiation so do a best-guess based
+        * on whether both Tx and Rx LPI indications have been received or
+        * base it on the link speed, the EEE advertised speeds on both ends
+        * and the speeds on which EEE is enabled locally.
+        */
+       if (((phy_data & E1000_EEE_TX_LPI_RCVD) &&
+            (phy_data & E1000_EEE_RX_LPI_RCVD)) ||
+           ((status & E1000_STATUS_SPEED_100) &&
+            (edata->advertised & ADVERTISED_100baseT_Full) &&
+            (edata->lp_advertised & ADVERTISED_100baseT_Full) &&
+            (lpi_ctrl & I82579_LPI_CTRL_100_ENABLE)) ||
+           ((status & E1000_STATUS_SPEED_1000) &&
+            (edata->advertised & ADVERTISED_1000baseT_Full) &&
+            (edata->lp_advertised & ADVERTISED_1000baseT_Full) &&
+            (lpi_ctrl & I82579_LPI_CTRL_1000_ENABLE)))
+               edata->eee_active = true;
+
+       edata->eee_enabled = !hw->dev_spec.ich8lan.eee_disable;
+       edata->tx_lpi_enabled = true;
+       edata->tx_lpi_timer = er32(LPIC) >> E1000_LPIC_LPIET_SHIFT;
+
+       return 0;
+}
+
+static int e1000e_set_eee(struct net_device *netdev, struct ethtool_eee *edata)
+{
+       struct e1000_adapter *adapter = netdev_priv(netdev);
+       struct e1000_hw *hw = &adapter->hw;
+       struct ethtool_eee eee_curr;
+       s32 ret_val;
+
+       if (!(adapter->flags & FLAG_IS_ICH) ||
+           !(adapter->flags2 & FLAG2_HAS_EEE))
+               return -EOPNOTSUPP;
+
+       ret_val = e1000e_get_eee(netdev, &eee_curr);
+       if (ret_val)
+               return ret_val;
+
+       if (eee_curr.advertised != edata->advertised) {
+               e_err("Setting EEE advertisement is not supported\n");
+               return -EINVAL;
+       }
+
+       if (eee_curr.tx_lpi_enabled != edata->tx_lpi_enabled) {
+               e_err("Setting EEE tx-lpi is not supported\n");
+               return -EINVAL;
+       }
+
+       if (eee_curr.tx_lpi_timer != edata->tx_lpi_timer) {
+               e_err("Setting EEE Tx LPI timer is not supported\n");
+               return -EINVAL;
+       }
+
+       if (hw->dev_spec.ich8lan.eee_disable != !edata->eee_enabled) {
+               hw->dev_spec.ich8lan.eee_disable = !edata->eee_enabled;
+
+               /* reset the link */
+               if (netif_running(netdev))
+                       e1000e_reinit_locked(adapter);
+               else
+                       e1000e_reset(adapter);
+       }
+
+       return 0;
+}
+
+static int e1000e_get_ts_info(struct net_device *netdev,
+                             struct ethtool_ts_info *info)
+{
+       struct e1000_adapter *adapter = netdev_priv(netdev);
+
+       ethtool_op_get_ts_info(netdev, info);
+
+       if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP))
+               return 0;
+
+       info->so_timestamping |= (SOF_TIMESTAMPING_TX_HARDWARE |
+                                 SOF_TIMESTAMPING_RX_HARDWARE |
+                                 SOF_TIMESTAMPING_RAW_HARDWARE);
+
+       info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON);
+
+       info->rx_filters = ((1 << HWTSTAMP_FILTER_NONE) |
+                           (1 << HWTSTAMP_FILTER_ALL));
+
+       return 0;
+}
+
 static const struct ethtool_ops e1000_ethtool_ops = {
        .get_settings           = e1000_get_settings,
        .set_settings           = e1000_set_settings,
@@ -2078,7 +2232,9 @@ static const struct ethtool_ops e1000_ethtool_ops = {
        .get_coalesce           = e1000_get_coalesce,
        .set_coalesce           = e1000_set_coalesce,
        .get_rxnfc              = e1000_get_rxnfc,
-       .get_ts_info            = ethtool_op_get_ts_info,
+       .get_ts_info            = e1000e_get_ts_info,
+       .get_eee                = e1000e_get_eee,
+       .set_eee                = e1000e_set_eee,
 };
 
 void e1000e_set_ethtool_ops(struct net_device *netdev)
index cf217777586c246561120c0877516f22d3ff6b89..8e7e80345a601534c33129a24d85566a2128b34a 100644 (file)
@@ -60,8 +60,10 @@ enum e1e_registers {
        E1000_EIAC_82574 = 0x000DC, /* Ext. Interrupt Auto Clear - RW */
        E1000_IAM      = 0x000E0, /* Interrupt Acknowledge Auto Mask */
        E1000_IVAR     = 0x000E4, /* Interrupt Vector Allocation - RW */
+       E1000_FEXTNVM7  = 0x000E4, /* Future Extended NVM 7 - RW */
        E1000_EITR_82574_BASE = 0x000E8, /* Interrupt Throttling - RW */
 #define E1000_EITR_82574(_n) (E1000_EITR_82574_BASE + (_n << 2))
+       E1000_LPIC     = 0x000FC, /* Low Power Idle Control - RW */
        E1000_RCTL     = 0x00100, /* Rx Control - RW */
        E1000_FCTTV    = 0x00170, /* Flow Control Transmit Timer Value - RW */
        E1000_TXCW     = 0x00178, /* Tx Configuration Word - RW */
@@ -191,6 +193,10 @@ enum e1e_registers {
        E1000_ICTXQMTC = 0x0411C, /* Irq Cause Tx Queue MinThreshold Count */
        E1000_ICRXDMTC = 0x04120, /* Irq Cause Rx Desc MinThreshold Count */
        E1000_ICRXOC   = 0x04124, /* Irq Cause Receiver Overrun Count */
+       E1000_PCS_LCTL = 0x04208, /* PCS Link Control - RW */
+       E1000_PCS_LSTAT = 0x0420C, /* PCS Link Status - RO */
+       E1000_PCS_ANADV = 0x04218, /* AN advertisement - RW */
+       E1000_PCS_LPAB = 0x0421C, /* Link Partner Ability - RW */
        E1000_RXCSUM   = 0x05000, /* Rx Checksum Control - RW */
        E1000_RFCTL    = 0x05008, /* Receive Filter Control */
        E1000_MTA      = 0x05200, /* Multicast Table Array - RW Array */
@@ -236,6 +242,15 @@ enum e1e_registers {
 #define E1000_PCH_RAICC(_n)    (E1000_PCH_RAICC_BASE + ((_n) * 4))
 #define E1000_CRC_OFFSET       E1000_PCH_RAICC_BASE
        E1000_HICR      = 0x08F00, /* Host Interface Control */
+       E1000_SYSTIML   = 0x0B600, /* System time register Low - RO */
+       E1000_SYSTIMH   = 0x0B604, /* System time register High - RO */
+       E1000_TIMINCA   = 0x0B608, /* Increment attributes register - RW */
+       E1000_TSYNCTXCTL = 0x0B614, /* Tx Time Sync Control register - RW */
+       E1000_TXSTMPL   = 0x0B618, /* Tx timestamp value Low - RO */
+       E1000_TXSTMPH   = 0x0B61C, /* Tx timestamp value High - RO */
+       E1000_TSYNCRXCTL = 0x0B620, /* Rx Time Sync Control register - RW */
+       E1000_RXSTMPL   = 0x0B624, /* Rx timestamp Low - RO */
+       E1000_RXSTMPH   = 0x0B628, /* Rx timestamp High - RO */
 };
 
 #define E1000_MAX_PHY_ADDR             4
index 976336547607e31caef68c8eaf528ddac78682da..50935ef481713ca15ff69028b0ae30b688163495 100644 (file)
 #define HV_PM_CTRL             PHY_REG(770, 17)
 #define HV_PM_CTRL_PLL_STOP_IN_K1_GIGA 0x100
 
-/* PHY Low Power Idle Control */
-#define I82579_LPI_CTRL                                PHY_REG(772, 20)
-#define I82579_LPI_CTRL_ENABLE_MASK            0x6000
-#define I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT   0x80
-
-/* EMI Registers */
-#define I82579_EMI_ADDR         0x10
-#define I82579_EMI_DATA         0x11
-#define I82579_LPI_UPDATE_TIMER 0x4805 /* in 40ns units + 40 ns base value */
-#define I82579_MSE_THRESHOLD    0x084F /* Mean Square Error Threshold */
-#define I82579_MSE_LINK_DOWN    0x2411 /* MSE count before dropping link */
-#define I217_EEE_ADVERTISEMENT  0x8001 /* IEEE MMD Register 7.60 */
-#define I217_EEE_LP_ABILITY     0x8002 /* IEEE MMD Register 7.61 */
-#define I217_EEE_100_SUPPORTED  (1 << 1)       /* 100BaseTx EEE supported */
-
 /* Intel Rapid Start Technology Support */
 #define I217_PROXY_CTRL                 BM_PHY_REG(BM_WUC_PAGE, 70)
 #define I217_PROXY_CTRL_AUTO_DISABLE    0x0080
@@ -788,58 +773,140 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw)
        return 0;
 }
 
+/**
+ *  __e1000_access_emi_reg_locked - Read/write EMI register
+ *  @hw: pointer to the HW structure
+ *  @addr: EMI address to program
+ *  @data: pointer to value to read/write from/to the EMI address
+ *  @read: boolean flag to indicate read or write
+ *
+ *  This helper function assumes the SW/FW/HW Semaphore is already acquired.
+ **/
+static s32 __e1000_access_emi_reg_locked(struct e1000_hw *hw, u16 address,
+                                        u16 *data, bool read)
+{
+       s32 ret_val = 0;
+
+       ret_val = e1e_wphy_locked(hw, I82579_EMI_ADDR, address);
+       if (ret_val)
+               return ret_val;
+
+       if (read)
+               ret_val = e1e_rphy_locked(hw, I82579_EMI_DATA, data);
+       else
+               ret_val = e1e_wphy_locked(hw, I82579_EMI_DATA, *data);
+
+       return ret_val;
+}
+
+/**
+ *  e1000_read_emi_reg_locked - Read Extended Management Interface register
+ *  @hw: pointer to the HW structure
+ *  @addr: EMI address to program
+ *  @data: value to be read from the EMI address
+ *
+ *  Assumes the SW/FW/HW Semaphore is already acquired.
+ **/
+s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data)
+{
+       return __e1000_access_emi_reg_locked(hw, addr, data, true);
+}
+
+/**
+ *  e1000_write_emi_reg_locked - Write Extended Management Interface register
+ *  @hw: pointer to the HW structure
+ *  @addr: EMI address to program
+ *  @data: value to be written to the EMI address
+ *
+ *  Assumes the SW/FW/HW Semaphore is already acquired.
+ **/
+static s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data)
+{
+       return __e1000_access_emi_reg_locked(hw, addr, &data, false);
+}
+
 /**
  *  e1000_set_eee_pchlan - Enable/disable EEE support
  *  @hw: pointer to the HW structure
  *
- *  Enable/disable EEE based on setting in dev_spec structure.  The bits in
- *  the LPI Control register will remain set only if/when link is up.
+ *  Enable/disable EEE based on setting in dev_spec structure, the duplex of
+ *  the link and the EEE capabilities of the link partner.  The LPI Control
+ *  register bits will remain set only if/when link is up.
  **/
 static s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
 {
        struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
-       s32 ret_val = 0;
-       u16 phy_reg;
+       s32 ret_val;
+       u16 lpi_ctrl;
 
        if ((hw->phy.type != e1000_phy_82579) &&
            (hw->phy.type != e1000_phy_i217))
                return 0;
 
-       ret_val = e1e_rphy(hw, I82579_LPI_CTRL, &phy_reg);
+       ret_val = hw->phy.ops.acquire(hw);
        if (ret_val)
                return ret_val;
 
-       if (dev_spec->eee_disable)
-               phy_reg &= ~I82579_LPI_CTRL_ENABLE_MASK;
-       else
-               phy_reg |= I82579_LPI_CTRL_ENABLE_MASK;
-
-       ret_val = e1e_wphy(hw, I82579_LPI_CTRL, phy_reg);
+       ret_val = e1e_rphy_locked(hw, I82579_LPI_CTRL, &lpi_ctrl);
        if (ret_val)
-               return ret_val;
+               goto release;
+
+       /* Clear bits that enable EEE in various speeds */
+       lpi_ctrl &= ~I82579_LPI_CTRL_ENABLE_MASK;
+
+       /* Enable EEE if not disabled by user */
+       if (!dev_spec->eee_disable) {
+               u16 lpa, pcs_status, data;
 
-       if ((hw->phy.type == e1000_phy_i217) && !dev_spec->eee_disable) {
                /* Save off link partner's EEE ability */
-               ret_val = hw->phy.ops.acquire(hw);
-               if (ret_val)
-                       return ret_val;
-               ret_val = e1e_wphy_locked(hw, I82579_EMI_ADDR,
-                                         I217_EEE_LP_ABILITY);
+               switch (hw->phy.type) {
+               case e1000_phy_82579:
+                       lpa = I82579_EEE_LP_ABILITY;
+                       pcs_status = I82579_EEE_PCS_STATUS;
+                       break;
+               case e1000_phy_i217:
+                       lpa = I217_EEE_LP_ABILITY;
+                       pcs_status = I217_EEE_PCS_STATUS;
+                       break;
+               default:
+                       ret_val = -E1000_ERR_PHY;
+                       goto release;
+               }
+               ret_val = e1000_read_emi_reg_locked(hw, lpa,
+                                                   &dev_spec->eee_lp_ability);
                if (ret_val)
                        goto release;
-               e1e_rphy_locked(hw, I82579_EMI_DATA, &dev_spec->eee_lp_ability);
 
-               /* EEE is not supported in 100Half, so ignore partner's EEE
-                * in 100 ability if full-duplex is not advertised.
+               /* Enable EEE only for speeds in which the link partner is
+                * EEE capable.
                 */
-               e1e_rphy_locked(hw, PHY_LP_ABILITY, &phy_reg);
-               if (!(phy_reg & NWAY_LPAR_100TX_FD_CAPS))
-                       dev_spec->eee_lp_ability &= ~I217_EEE_100_SUPPORTED;
-release:
-               hw->phy.ops.release(hw);
+               if (dev_spec->eee_lp_ability & I82579_EEE_1000_SUPPORTED)
+                       lpi_ctrl |= I82579_LPI_CTRL_1000_ENABLE;
+
+               if (dev_spec->eee_lp_ability & I82579_EEE_100_SUPPORTED) {
+                       e1e_rphy_locked(hw, PHY_LP_ABILITY, &data);
+                       if (data & NWAY_LPAR_100TX_FD_CAPS)
+                               lpi_ctrl |= I82579_LPI_CTRL_100_ENABLE;
+                       else
+                               /* EEE is not supported in 100Half, so ignore
+                                * partner's EEE in 100 ability if full-duplex
+                                * is not advertised.
+                                */
+                               dev_spec->eee_lp_ability &=
+                                   ~I82579_EEE_100_SUPPORTED;
+               }
+
+               /* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */
+               ret_val = e1000_read_emi_reg_locked(hw, pcs_status, &data);
+               if (ret_val)
+                       goto release;
        }
 
-       return 0;
+       ret_val = e1e_wphy_locked(hw, I82579_LPI_CTRL, lpi_ctrl);
+release:
+       hw->phy.ops.release(hw);
+
+       return ret_val;
 }
 
 /**
@@ -1757,6 +1824,11 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
        if (ret_val)
                goto release;
        ret_val = e1e_wphy_locked(hw, BM_PORT_GEN_CFG, phy_data & 0x00FF);
+       if (ret_val)
+               goto release;
+
+       /* set MSE higher to enable link to stay up when noise is high */
+       ret_val = e1000_write_emi_reg_locked(hw, I82577_MSE_THRESHOLD, 0x0034);
 release:
        hw->phy.ops.release(hw);
 
@@ -1983,22 +2055,18 @@ static s32 e1000_lv_phy_workarounds_ich8lan(struct e1000_hw *hw)
 
        /* Set MDIO slow mode before any other MDIO access */
        ret_val = e1000_set_mdio_slow_mode_hv(hw);
+       if (ret_val)
+               return ret_val;
 
        ret_val = hw->phy.ops.acquire(hw);
        if (ret_val)
                return ret_val;
-       ret_val = e1e_wphy_locked(hw, I82579_EMI_ADDR, I82579_MSE_THRESHOLD);
-       if (ret_val)
-               goto release;
        /* set MSE higher to enable link to stay up when noise is high */
-       ret_val = e1e_wphy_locked(hw, I82579_EMI_DATA, 0x0034);
-       if (ret_val)
-               goto release;
-       ret_val = e1e_wphy_locked(hw, I82579_EMI_ADDR, I82579_MSE_LINK_DOWN);
+       ret_val = e1000_write_emi_reg_locked(hw, I82579_MSE_THRESHOLD, 0x0034);
        if (ret_val)
                goto release;
        /* drop link after 5 times MSE threshold was reached */
-       ret_val = e1e_wphy_locked(hw, I82579_EMI_DATA, 0x0005);
+       ret_val = e1000_write_emi_reg_locked(hw, I82579_MSE_LINK_DOWN, 0x0005);
 release:
        hw->phy.ops.release(hw);
 
@@ -2172,10 +2240,9 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
                ret_val = hw->phy.ops.acquire(hw);
                if (ret_val)
                        return ret_val;
-               ret_val = e1e_wphy_locked(hw, I82579_EMI_ADDR,
-                                         I82579_LPI_UPDATE_TIMER);
-               if (!ret_val)
-                       ret_val = e1e_wphy_locked(hw, I82579_EMI_DATA, 0x1387);
+               ret_val = e1000_write_emi_reg_locked(hw,
+                                                    I82579_LPI_UPDATE_TIMER,
+                                                    0x1387);
                hw->phy.ops.release(hw);
        }
 
@@ -2949,19 +3016,32 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw)
 {
        s32 ret_val;
        u16 data;
+       u16 word;
+       u16 valid_csum_mask;
 
-       /* Read 0x19 and check bit 6.  If this bit is 0, the checksum
-        * needs to be fixed.  This bit is an indication that the NVM
-        * was prepared by OEM software and did not calculate the
-        * checksum...a likely scenario.
+       /* Read NVM and check Invalid Image CSUM bit.  If this bit is 0,
+        * the checksum needs to be fixed.  This bit is an indication that
+        * the NVM was prepared by OEM software and did not calculate
+        * the checksum...a likely scenario.
         */
-       ret_val = e1000_read_nvm(hw, 0x19, 1, &data);
+       switch (hw->mac.type) {
+       case e1000_pch_lpt:
+               word = NVM_COMPAT;
+               valid_csum_mask = NVM_COMPAT_VALID_CSUM;
+               break;
+       default:
+               word = NVM_FUTURE_INIT_WORD1;
+               valid_csum_mask = NVM_FUTURE_INIT_WORD1_VALID_CSUM;
+               break;
+       }
+
+       ret_val = e1000_read_nvm(hw, word, 1, &data);
        if (ret_val)
                return ret_val;
 
-       if (!(data & 0x40)) {
-               data |= 0x40;
-               ret_val = e1000_write_nvm(hw, 0x19, 1, &data);
+       if (!(data & valid_csum_mask)) {
+               data |= valid_csum_mask;
+               ret_val = e1000_write_nvm(hw, word, 1, &data);
                if (ret_val)
                        return ret_val;
                ret_val = e1000e_update_nvm_checksum(hw);
@@ -4000,19 +4080,20 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
                if (!dev_spec->eee_disable) {
                        u16 eee_advert;
 
-                       ret_val = e1e_wphy_locked(hw, I82579_EMI_ADDR,
-                                                 I217_EEE_ADVERTISEMENT);
+                       ret_val =
+                           e1000_read_emi_reg_locked(hw,
+                                                     I217_EEE_ADVERTISEMENT,
+                                                     &eee_advert);
                        if (ret_val)
                                goto release;
-                       e1e_rphy_locked(hw, I82579_EMI_DATA, &eee_advert);
 
                        /* Disable LPLU if both link partners support 100BaseT
                         * EEE and 100Full is advertised on both ends of the
                         * link.
                         */
-                       if ((eee_advert & I217_EEE_100_SUPPORTED) &&
+                       if ((eee_advert & I82579_EEE_100_SUPPORTED) &&
                            (dev_spec->eee_lp_ability &
-                            I217_EEE_100_SUPPORTED) &&
+                            I82579_EEE_100_SUPPORTED) &&
                            (hw->phy.autoneg_advertised & ADVERTISE_100_FULL))
                                phy_ctrl &= ~(E1000_PHY_CTRL_D0A_LPLU |
                                              E1000_PHY_CTRL_NOND0A_LPLU);
@@ -4520,6 +4601,7 @@ const struct e1000_info e1000_pch2_info = {
        .mac                    = e1000_pch2lan,
        .flags                  = FLAG_IS_ICH
                                  | FLAG_HAS_WOL
+                                 | FLAG_HAS_HW_TIMESTAMP
                                  | FLAG_HAS_CTRLEXT_ON_LOAD
                                  | FLAG_HAS_AMT
                                  | FLAG_HAS_FLASH
@@ -4539,6 +4621,7 @@ const struct e1000_info e1000_pch_lpt_info = {
        .mac                    = e1000_pch_lpt,
        .flags                  = FLAG_IS_ICH
                                  | FLAG_HAS_WOL
+                                 | FLAG_HAS_HW_TIMESTAMP
                                  | FLAG_HAS_CTRLEXT_ON_LOAD
                                  | FLAG_HAS_AMT
                                  | FLAG_HAS_FLASH
index 54d9dafaf126609f4e9796b80f8d92de2c966745..0fa4c0656e095002787c9383269fd34e2eb9ed7c 100644 (file)
@@ -1021,6 +1021,7 @@ s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw)
 {
        struct e1000_mac_info *mac = &hw->mac;
        s32 ret_val = 0;
+       u32 pcs_status_reg, pcs_adv_reg, pcs_lp_ability_reg, pcs_ctrl_reg;
        u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg;
        u16 speed, duplex;
 
@@ -1185,6 +1186,130 @@ s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw)
                }
        }
 
+       /* Check for the case where we have SerDes media and auto-neg is
+        * enabled.  In this case, we need to check and see if Auto-Neg
+        * has completed, and if so, how the PHY and link partner has
+        * flow control configured.
+        */
+       if ((hw->phy.media_type == e1000_media_type_internal_serdes) &&
+           mac->autoneg) {
+               /* Read the PCS_LSTS and check to see if AutoNeg
+                * has completed.
+                */
+               pcs_status_reg = er32(PCS_LSTAT);
+
+               if (!(pcs_status_reg & E1000_PCS_LSTS_AN_COMPLETE)) {
+                       e_dbg("PCS Auto Neg has not completed.\n");
+                       return ret_val;
+               }
+
+               /* The AutoNeg process has completed, so we now need to
+                * read both the Auto Negotiation Advertisement
+                * Register (PCS_ANADV) and the Auto_Negotiation Base
+                * Page Ability Register (PCS_LPAB) to determine how
+                * flow control was negotiated.
+                */
+               pcs_adv_reg = er32(PCS_ANADV);
+               pcs_lp_ability_reg = er32(PCS_LPAB);
+
+               /* Two bits in the Auto Negotiation Advertisement Register
+                * (PCS_ANADV) and two bits in the Auto Negotiation Base
+                * Page Ability Register (PCS_LPAB) determine flow control
+                * for both the PHY and the link partner.  The following
+                * table, taken out of the IEEE 802.3ab/D6.0 dated March 25,
+                * 1999, describes these PAUSE resolution bits and how flow
+                * control is determined based upon these settings.
+                * NOTE:  DC = Don't Care
+                *
+                *   LOCAL DEVICE  |   LINK PARTNER
+                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution
+                *-------|---------|-------|---------|--------------------
+                *   0   |    0    |  DC   |   DC    | e1000_fc_none
+                *   0   |    1    |   0   |   DC    | e1000_fc_none
+                *   0   |    1    |   1   |    0    | e1000_fc_none
+                *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
+                *   1   |    0    |   0   |   DC    | e1000_fc_none
+                *   1   |   DC    |   1   |   DC    | e1000_fc_full
+                *   1   |    1    |   0   |    0    | e1000_fc_none
+                *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
+                *
+                * Are both PAUSE bits set to 1?  If so, this implies
+                * Symmetric Flow Control is enabled at both ends.  The
+                * ASM_DIR bits are irrelevant per the spec.
+                *
+                * For Symmetric Flow Control:
+                *
+                *   LOCAL DEVICE  |   LINK PARTNER
+                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
+                *-------|---------|-------|---------|--------------------
+                *   1   |   DC    |   1   |   DC    | e1000_fc_full
+                *
+                */
+               if ((pcs_adv_reg & E1000_TXCW_PAUSE) &&
+                   (pcs_lp_ability_reg & E1000_TXCW_PAUSE)) {
+                       /* Now we need to check if the user selected Rx ONLY
+                        * of pause frames.  In this case, we had to advertise
+                        * FULL flow control because we could not advertise Rx
+                        * ONLY. Hence, we must now check to see if we need to
+                        * turn OFF the TRANSMISSION of PAUSE frames.
+                        */
+                       if (hw->fc.requested_mode == e1000_fc_full) {
+                               hw->fc.current_mode = e1000_fc_full;
+                               e_dbg("Flow Control = FULL.\n");
+                       } else {
+                               hw->fc.current_mode = e1000_fc_rx_pause;
+                               e_dbg("Flow Control = Rx PAUSE frames only.\n");
+                       }
+               }
+               /* For receiving PAUSE frames ONLY.
+                *
+                *   LOCAL DEVICE  |   LINK PARTNER
+                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
+                *-------|---------|-------|---------|--------------------
+                *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
+                */
+               else if (!(pcs_adv_reg & E1000_TXCW_PAUSE) &&
+                        (pcs_adv_reg & E1000_TXCW_ASM_DIR) &&
+                        (pcs_lp_ability_reg & E1000_TXCW_PAUSE) &&
+                        (pcs_lp_ability_reg & E1000_TXCW_ASM_DIR)) {
+                       hw->fc.current_mode = e1000_fc_tx_pause;
+                       e_dbg("Flow Control = Tx PAUSE frames only.\n");
+               }
+               /* For transmitting PAUSE frames ONLY.
+                *
+                *   LOCAL DEVICE  |   LINK PARTNER
+                * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
+                *-------|---------|-------|---------|--------------------
+                *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
+                */
+               else if ((pcs_adv_reg & E1000_TXCW_PAUSE) &&
+                        (pcs_adv_reg & E1000_TXCW_ASM_DIR) &&
+                        !(pcs_lp_ability_reg & E1000_TXCW_PAUSE) &&
+                        (pcs_lp_ability_reg & E1000_TXCW_ASM_DIR)) {
+                       hw->fc.current_mode = e1000_fc_rx_pause;
+                       e_dbg("Flow Control = Rx PAUSE frames only.\n");
+               } else {
+                       /* Per the IEEE spec, at this point flow control
+                        * should be disabled.
+                        */
+                       hw->fc.current_mode = e1000_fc_none;
+                       e_dbg("Flow Control = NONE.\n");
+               }
+
+               /* Now we call a subroutine to actually force the MAC
+                * controller to use the correct flow control settings.
+                */
+               pcs_ctrl_reg = er32(PCS_LCTL);
+               pcs_ctrl_reg |= E1000_PCS_LCTL_FORCE_FCTRL;
+               ew32(PCS_LCTL, pcs_ctrl_reg);
+
+               ret_val = e1000e_force_mac_fc(hw);
+               if (ret_val) {
+                       e_dbg("Error forcing flow control settings\n");
+                       return ret_val;
+               }
+       }
+
        return 0;
 }
 
index fbf75fdca99422743f35d3d9a114fcdef235563f..c15b7e438a442a9884433f8183a9a008380d2156 100644 (file)
@@ -487,21 +487,88 @@ static int e1000_desc_unused(struct e1000_ring *ring)
        return ring->count + ring->next_to_clean - ring->next_to_use - 1;
 }
 
+/**
+ * e1000e_systim_to_hwtstamp - convert system time value to hw time stamp
+ * @adapter: board private structure
+ * @hwtstamps: time stamp structure to update
+ * @systim: unsigned 64bit system time value.
+ *
+ * Convert the system time value stored in the RX/TXSTMP registers into a
+ * hwtstamp which can be used by the upper level time stamping functions.
+ *
+ * The 'systim_lock' spinlock is used to protect the consistency of the
+ * system time value. This is needed because reading the 64 bit time
+ * value involves reading two 32 bit registers. The first read latches the
+ * value.
+ **/
+static void e1000e_systim_to_hwtstamp(struct e1000_adapter *adapter,
+                                     struct skb_shared_hwtstamps *hwtstamps,
+                                     u64 systim)
+{
+       u64 ns;
+       unsigned long flags;
+
+       spin_lock_irqsave(&adapter->systim_lock, flags);
+       ns = timecounter_cyc2time(&adapter->tc, systim);
+       spin_unlock_irqrestore(&adapter->systim_lock, flags);
+
+       memset(hwtstamps, 0, sizeof(*hwtstamps));
+       hwtstamps->hwtstamp = ns_to_ktime(ns);
+}
+
+/**
+ * e1000e_rx_hwtstamp - utility function which checks for Rx time stamp
+ * @adapter: board private structure
+ * @status: descriptor extended error and status field
+ * @skb: particular skb to include time stamp
+ *
+ * If the time stamp is valid, convert it into the timecounter ns value
+ * and store that result into the shhwtstamps structure which is passed
+ * up the network stack.
+ **/
+static void e1000e_rx_hwtstamp(struct e1000_adapter *adapter, u32 status,
+                              struct sk_buff *skb)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       u64 rxstmp;
+
+       if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP) ||
+           !(status & E1000_RXDEXT_STATERR_TST) ||
+           !(er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_VALID))
+               return;
+
+       /* The Rx time stamp registers contain the time stamp.  No other
+        * received packet will be time stamped until the Rx time stamp
+        * registers are read.  Because only one packet can be time stamped
+        * at a time, the register values must belong to this packet and
+        * therefore none of the other additional attributes need to be
+        * compared.
+        */
+       rxstmp = (u64)er32(RXSTMPL);
+       rxstmp |= (u64)er32(RXSTMPH) << 32;
+       e1000e_systim_to_hwtstamp(adapter, skb_hwtstamps(skb), rxstmp);
+
+       adapter->flags2 &= ~FLAG2_CHECK_RX_HWTSTAMP;
+}
+
 /**
  * e1000_receive_skb - helper function to handle Rx indications
  * @adapter: board private structure
- * @status: descriptor status field as written by hardware
+ * @staterr: descriptor extended error and status field as written by hardware
  * @vlan: descriptor vlan field as written by hardware (no le/be conversion)
  * @skb: pointer to sk_buff to be indicated to stack
  **/
 static void e1000_receive_skb(struct e1000_adapter *adapter,
                              struct net_device *netdev, struct sk_buff *skb,
-                             u8 status, __le16 vlan)
+                             u32 staterr, __le16 vlan)
 {
        u16 tag = le16_to_cpu(vlan);
+
+       e1000e_rx_hwtstamp(adapter, staterr, skb);
+
        skb->protocol = eth_type_trans(skb, netdev);
 
-       if (status & E1000_RXD_STAT_VP)
+       if (staterr & E1000_RXD_STAT_VP)
                __vlan_hwaccel_put_tag(skb, tag);
 
        napi_gro_receive(&adapter->napi, skb);
@@ -765,7 +832,7 @@ static void e1000_alloc_jumbo_rx_buffers(struct e1000_ring *rx_ring,
        struct e1000_buffer *buffer_info;
        struct sk_buff *skb;
        unsigned int i;
-       unsigned int bufsz = 256 - 16 /* for skb_reserve */;
+       unsigned int bufsz = 256 - 16;  /* for skb_reserve */
 
        i = rx_ring->next_to_use;
        buffer_info = &rx_ring->buffer_info[i];
@@ -1091,6 +1158,41 @@ static void e1000_print_hw_hang(struct work_struct *work)
                e_err("Try turning off Tx pause (flow control) via ethtool\n");
 }
 
+/**
+ * e1000e_tx_hwtstamp_work - check for Tx time stamp
+ * @work: pointer to work struct
+ *
+ * This work function polls the TSYNCTXCTL valid bit to determine when a
+ * timestamp has been taken for the current stored skb.  The timestamp must
+ * be for this skb because only one such packet is allowed in the queue.
+ */
+static void e1000e_tx_hwtstamp_work(struct work_struct *work)
+{
+       struct e1000_adapter *adapter = container_of(work, struct e1000_adapter,
+                                                    tx_hwtstamp_work);
+       struct e1000_hw *hw = &adapter->hw;
+
+       if (!adapter->tx_hwtstamp_skb)
+               return;
+
+       if (er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID) {
+               struct skb_shared_hwtstamps shhwtstamps;
+               u64 txstmp;
+
+               txstmp = er32(TXSTMPL);
+               txstmp |= (u64)er32(TXSTMPH) << 32;
+
+               e1000e_systim_to_hwtstamp(adapter, &shhwtstamps, txstmp);
+
+               skb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps);
+               dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
+               adapter->tx_hwtstamp_skb = NULL;
+       } else {
+               /* reschedule to check later */
+               schedule_work(&adapter->tx_hwtstamp_work);
+       }
+}
+
 /**
  * e1000_clean_tx_irq - Reclaim resources after transmit completes
  * @tx_ring: Tx descriptor ring
@@ -1345,8 +1447,8 @@ copydone:
                           cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))
                        adapter->rx_hdr_split++;
 
-               e1000_receive_skb(adapter, netdev, skb,
-                                 staterr, rx_desc->wb.middle.vlan);
+               e1000_receive_skb(adapter, netdev, skb, staterr,
+                                 rx_desc->wb.middle.vlan);
 
 next_desc:
                rx_desc->wb.middle.status_error &= cpu_to_le32(~0xFF);
@@ -1671,7 +1773,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data)
                        /* disable receives */
                        u32 rctl = er32(RCTL);
                        ew32(RCTL, rctl & ~E1000_RCTL_EN);
-                       adapter->flags |= FLAG_RX_RESTART_NOW;
+                       adapter->flags |= FLAG_RESTART_NOW;
                }
                /* guard against interrupt when we're going down */
                if (!test_bit(__E1000_DOWN, &adapter->state))
@@ -1734,7 +1836,7 @@ static irqreturn_t e1000_intr(int irq, void *data)
                        /* disable receives */
                        rctl = er32(RCTL);
                        ew32(RCTL, rctl & ~E1000_RCTL_EN);
-                       adapter->flags |= FLAG_RX_RESTART_NOW;
+                       adapter->flags |= FLAG_RESTART_NOW;
                }
                /* guard against interrupt when we're going down */
                if (!test_bit(__E1000_DOWN, &adapter->state))
@@ -2405,7 +2507,6 @@ static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
 
 static void e1000_set_itr(struct e1000_adapter *adapter)
 {
-       struct e1000_hw *hw = &adapter->hw;
        u16 current_itr;
        u32 new_itr = adapter->itr;
 
@@ -2468,10 +2569,7 @@ set_itr_now:
                if (adapter->msix_entries)
                        adapter->rx_ring->set_itr = 1;
                else
-                       if (new_itr)
-                               ew32(ITR, 1000000000 / (new_itr * 256));
-                       else
-                               ew32(ITR, 0);
+                       e1000e_write_itr(adapter, new_itr);
        }
 }
 
@@ -3013,7 +3111,7 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
 
        ew32(RCTL, rctl);
        /* just started the receive unit, no need to restart */
-       adapter->flags &= ~FLAG_RX_RESTART_NOW;
+       adapter->flags &= ~FLAG_RESTART_NOW;
 }
 
 /**
@@ -3307,6 +3405,159 @@ static void e1000e_setup_rss_hash(struct e1000_adapter *adapter)
        ew32(MRQC, mrqc);
 }
 
+/**
+ * e1000e_get_base_timinca - get default SYSTIM time increment attributes
+ * @adapter: board private structure
+ * @timinca: pointer to returned time increment attributes
+ *
+ * Get attributes for incrementing the System Time Register SYSTIML/H at
+ * the default base frequency, and set the cyclecounter shift value.
+ **/
+static s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       u32 incvalue, incperiod, shift;
+
+       /* Make sure clock is enabled on I217 before checking the frequency */
+       if ((hw->mac.type == e1000_pch_lpt) &&
+           !(er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_ENABLED) &&
+           !(er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_ENABLED)) {
+               u32 fextnvm7 = er32(FEXTNVM7);
+
+               if (!(fextnvm7 & (1 << 0))) {
+                       ew32(FEXTNVM7, fextnvm7 | (1 << 0));
+                       e1e_flush();
+               }
+       }
+
+       switch (hw->mac.type) {
+       case e1000_pch2lan:
+       case e1000_pch_lpt:
+               /* On I217, the clock frequency is 25MHz or 96MHz as
+                * indicated by the System Clock Frequency Indication
+                */
+               if ((hw->mac.type != e1000_pch_lpt) ||
+                   (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI)) {
+                       /* Stable 96MHz frequency */
+                       incperiod = INCPERIOD_96MHz;
+                       incvalue = INCVALUE_96MHz;
+                       shift = INCVALUE_SHIFT_96MHz;
+                       adapter->cc.shift = shift + INCPERIOD_SHIFT_96MHz;
+                       break;
+               }
+               /* fall-through */
+       case e1000_82574:
+       case e1000_82583:
+               /* Stable 25MHz frequency */
+               incperiod = INCPERIOD_25MHz;
+               incvalue = INCVALUE_25MHz;
+               shift = INCVALUE_SHIFT_25MHz;
+               adapter->cc.shift = shift;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       *timinca = ((incperiod << E1000_TIMINCA_INCPERIOD_SHIFT) |
+                   ((incvalue << shift) & E1000_TIMINCA_INCVALUE_MASK));
+
+       return 0;
+}
+
+/**
+ * e1000e_config_hwtstamp - configure the hwtstamp registers and enable/disable
+ * @adapter: board private structure
+ *
+ * Outgoing time stamping can be enabled and disabled. Play nice and
+ * disable it when requested, although it shouldn't cause any overhead
+ * when no packet needs it. At most one packet in the queue may be
+ * marked for time stamping, otherwise it would be impossible to tell
+ * for sure to which packet the hardware time stamp belongs.
+ *
+ * Incoming time stamping has to be configured via the hardware filters.
+ * Not all combinations are supported, in particular event type has to be
+ * specified. Matching the kind of event packet is not supported, with the
+ * exception of "all V2 events regardless of level 2 or 4".
+ **/
+static int e1000e_config_hwtstamp(struct e1000_adapter *adapter)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       struct hwtstamp_config *config = &adapter->hwtstamp_config;
+       u32 tsync_tx_ctl = E1000_TSYNCTXCTL_ENABLED;
+       u32 tsync_rx_ctl = E1000_TSYNCRXCTL_ENABLED;
+       u32 regval;
+       s32 ret_val;
+
+       if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP))
+               return -EINVAL;
+
+       /* flags reserved for future extensions - must be zero */
+       if (config->flags)
+               return -EINVAL;
+
+       switch (config->tx_type) {
+       case HWTSTAMP_TX_OFF:
+               tsync_tx_ctl = 0;
+               break;
+       case HWTSTAMP_TX_ON:
+               break;
+       default:
+               return -ERANGE;
+       }
+
+       switch (config->rx_filter) {
+       case HWTSTAMP_FILTER_NONE:
+               tsync_rx_ctl = 0;
+               break;
+       case HWTSTAMP_FILTER_ALL:
+               tsync_rx_ctl |= E1000_TSYNCRXCTL_TYPE_ALL;
+               config->rx_filter = HWTSTAMP_FILTER_ALL;
+               break;
+       default:
+               return -ERANGE;
+       }
+
+       /* enable/disable Tx h/w time stamping */
+       regval = er32(TSYNCTXCTL);
+       regval &= ~E1000_TSYNCTXCTL_ENABLED;
+       regval |= tsync_tx_ctl;
+       ew32(TSYNCTXCTL, regval);
+       if ((er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_ENABLED) !=
+           (regval & E1000_TSYNCTXCTL_ENABLED)) {
+               e_err("Timesync Tx Control register not set as expected\n");
+               return -EAGAIN;
+       }
+
+       /* enable/disable Rx h/w time stamping */
+       regval = er32(TSYNCRXCTL);
+       regval &= ~(E1000_TSYNCRXCTL_ENABLED | E1000_TSYNCRXCTL_TYPE_MASK);
+       regval |= tsync_rx_ctl;
+       ew32(TSYNCRXCTL, regval);
+       if ((er32(TSYNCRXCTL) & (E1000_TSYNCRXCTL_ENABLED |
+                                E1000_TSYNCRXCTL_TYPE_MASK)) !=
+           (regval & (E1000_TSYNCRXCTL_ENABLED |
+                      E1000_TSYNCRXCTL_TYPE_MASK))) {
+               e_err("Timesync Rx Control register not set as expected\n");
+               return -EAGAIN;
+       }
+
+       /* Clear TSYNCRXCTL_VALID & TSYNCTXCTL_VALID bit */
+       regval = er32(RXSTMPH);
+       regval = er32(TXSTMPH);
+
+       /* Get and set the System Time Register SYSTIM base frequency */
+       ret_val = e1000e_get_base_timinca(adapter, &regval);
+       if (ret_val)
+               return ret_val;
+       ew32(TIMINCA, regval);
+
+       /* reset the ns time counter */
+       timecounter_init(&adapter->tc, &adapter->cc,
+                        ktime_to_ns(ktime_get_real()));
+
+       return 0;
+}
+
 /**
  * e1000_configure - configure the hardware for Rx and Tx
  * @adapter: private board structure
@@ -3533,6 +3784,9 @@ void e1000e_reset(struct e1000_adapter *adapter)
 
        e1000e_reset_adaptive(hw);
 
+       /* initialize systim and reset the ns time counter */
+       e1000e_config_hwtstamp(adapter);
+
        if (!netif_running(adapter->netdev) &&
            !test_bit(__E1000_TESTING, &adapter->state)) {
                e1000_power_down_phy(adapter);
@@ -3668,6 +3922,24 @@ void e1000e_reinit_locked(struct e1000_adapter *adapter)
        clear_bit(__E1000_RESETTING, &adapter->state);
 }
 
+/**
+ * e1000e_cyclecounter_read - read raw cycle counter (used by time counter)
+ * @cc: cyclecounter structure
+ **/
+static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)
+{
+       struct e1000_adapter *adapter = container_of(cc, struct e1000_adapter,
+                                                    cc);
+       struct e1000_hw *hw = &adapter->hw;
+       cycle_t systim;
+
+       /* latch SYSTIMH on read of SYSTIML */
+       systim = (cycle_t)er32(SYSTIML);
+       systim |= (cycle_t)er32(SYSTIMH) << 32;
+
+       return systim;
+}
+
 /**
  * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
  * @adapter: board private structure to initialize
@@ -3694,6 +3966,17 @@ static int e1000_sw_init(struct e1000_adapter *adapter)
        if (e1000_alloc_queues(adapter))
                return -ENOMEM;
 
+       /* Setup hardware time stamping cyclecounter */
+       if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) {
+               adapter->cc.read = e1000e_cyclecounter_read;
+               adapter->cc.mask = CLOCKSOURCE_MASK(64);
+               adapter->cc.mult = 1;
+               /* cc.shift set in e1000e_get_base_tininca() */
+
+               spin_lock_init(&adapter->systim_lock);
+               INIT_WORK(&adapter->tx_hwtstamp_work, e1000e_tx_hwtstamp_work);
+       }
+
        /* Explicitly disable IRQ since the NIC can be in any state. */
        e1000_irq_disable(adapter);
 
@@ -4300,9 +4583,8 @@ static void e1000_print_link_info(struct e1000_adapter *adapter)
        u32 ctrl = er32(CTRL);
 
        /* Link status message must follow this format for user tools */
-       printk(KERN_INFO "e1000e: %s NIC Link is Up %d Mbps %s Duplex, Flow Control: %s\n",
-               adapter->netdev->name,
-               adapter->link_speed,
+       pr_info("%s NIC Link is Up %d Mbps %s Duplex, Flow Control: %s\n",
+               adapter->netdev->name, adapter->link_speed,
                adapter->link_duplex == FULL_DUPLEX ? "Full" : "Half",
                (ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE) ? "Rx/Tx" :
                (ctrl & E1000_CTRL_RFCE) ? "Rx" :
@@ -4355,11 +4637,11 @@ static void e1000e_enable_receives(struct e1000_adapter *adapter)
 {
        /* make sure the receive unit is started */
        if ((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
-           (adapter->flags & FLAG_RX_RESTART_NOW)) {
+           (adapter->flags & FLAG_RESTART_NOW)) {
                struct e1000_hw *hw = &adapter->hw;
                u32 rctl = er32(RCTL);
                ew32(RCTL, rctl | E1000_RCTL_EN);
-               adapter->flags &= ~FLAG_RX_RESTART_NOW;
+               adapter->flags &= ~FLAG_RESTART_NOW;
        }
 }
 
@@ -4521,15 +4803,22 @@ static void e1000_watchdog_task(struct work_struct *work)
                        adapter->link_speed = 0;
                        adapter->link_duplex = 0;
                        /* Link status message must follow this format */
-                       printk(KERN_INFO "e1000e: %s NIC Link is Down\n",
-                              adapter->netdev->name);
+                       pr_info("%s NIC Link is Down\n", adapter->netdev->name);
                        netif_carrier_off(netdev);
                        if (!test_bit(__E1000_DOWN, &adapter->state))
                                mod_timer(&adapter->phy_info_timer,
                                          round_jiffies(jiffies + 2 * HZ));
 
-                       if (adapter->flags & FLAG_RX_NEEDS_RESTART)
-                               schedule_work(&adapter->reset_task);
+                       /* The link is lost so the controller stops DMA.
+                        * If there is queued Tx work that cannot be done
+                        * or if on an 8000ES2LAN which requires a Rx packet
+                        * buffer work-around on link down event, reset the
+                        * controller to flush the Tx/Rx packet buffers.
+                        * (Do the reset outside of interrupt context).
+                        */
+                       if ((adapter->flags & FLAG_RX_NEEDS_RESTART) ||
+                           (e1000_desc_unused(tx_ring) + 1 < tx_ring->count))
+                               adapter->flags |= FLAG_RESTART_NOW;
                        else
                                pm_schedule_suspend(netdev->dev.parent,
                                                        LINK_TIMEOUT);
@@ -4551,20 +4840,14 @@ link_up:
        adapter->gotc_old = adapter->stats.gotc;
        spin_unlock(&adapter->stats64_lock);
 
-       e1000e_update_adaptive(&adapter->hw);
-
-       if (!netif_carrier_ok(netdev) &&
-           (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) {
-               /* We've lost link, so the controller stops DMA,
-                * but we've got queued Tx work that's never going
-                * to get done, so reset controller to flush Tx.
-                * (Do the reset outside of interrupt context).
-                */
+       if (adapter->flags & FLAG_RESTART_NOW) {
                schedule_work(&adapter->reset_task);
                /* return immediately since reset is imminent */
                return;
        }
 
+       e1000e_update_adaptive(&adapter->hw);
+
        /* Simple mode for Interrupt Throttle Rate (ITR) */
        if (adapter->itr_setting == 4) {
                /* Symmetric Tx/Rx gets a reduced ITR=2000;
@@ -4601,6 +4884,17 @@ link_up:
        if (adapter->flags2 & FLAG2_CHECK_PHY_HANG)
                e1000e_check_82574_phy_workaround(adapter);
 
+       /* Clear valid timestamp stuck in RXSTMPL/H due to a Rx error */
+       if (adapter->hwtstamp_config.rx_filter != HWTSTAMP_FILTER_NONE) {
+               if ((adapter->flags2 & FLAG2_CHECK_RX_HWTSTAMP) &&
+                   (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_VALID)) {
+                       er32(RXSTMPH);
+                       adapter->rx_hwtstamp_cleared++;
+               } else {
+                       adapter->flags2 |= FLAG2_CHECK_RX_HWTSTAMP;
+               }
+       }
+
        /* Reset the timer */
        if (!test_bit(__E1000_DOWN, &adapter->state))
                mod_timer(&adapter->watchdog_timer,
@@ -4612,6 +4906,7 @@ link_up:
 #define E1000_TX_FLAGS_TSO             0x00000004
 #define E1000_TX_FLAGS_IPV4            0x00000008
 #define E1000_TX_FLAGS_NO_FCS          0x00000010
+#define E1000_TX_FLAGS_HWTSTAMP                0x00000020
 #define E1000_TX_FLAGS_VLAN_MASK       0xffff0000
 #define E1000_TX_FLAGS_VLAN_SHIFT      16
 
@@ -4870,6 +5165,11 @@ static void e1000_tx_queue(struct e1000_ring *tx_ring, int tx_flags, int count)
        if (unlikely(tx_flags & E1000_TX_FLAGS_NO_FCS))
                txd_lower &= ~(E1000_TXD_CMD_IFCS);
 
+       if (unlikely(tx_flags & E1000_TX_FLAGS_HWTSTAMP)) {
+               txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
+               txd_upper |= E1000_TXD_EXTCMD_TSTAMP;
+       }
+
        i = tx_ring->next_to_use;
 
        do {
@@ -4918,12 +5218,11 @@ static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter,
        struct e1000_hw *hw =  &adapter->hw;
        u16 length, offset;
 
-       if (vlan_tx_tag_present(skb)) {
-               if (!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) &&
-                   (adapter->hw.mng_cookie.status &
-                       E1000_MNG_DHCP_COOKIE_STATUS_VLAN)))
-                       return 0;
-       }
+       if (vlan_tx_tag_present(skb) &&
+           !((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) &&
+             (adapter->hw.mng_cookie.status &
+              E1000_MNG_DHCP_COOKIE_STATUS_VLAN)))
+               return 0;
 
        if (skb->len <= MINIMUM_DHCP_PACKET_SIZE)
                return 0;
@@ -5094,7 +5393,15 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
        count = e1000_tx_map(tx_ring, skb, first, adapter->tx_fifo_limit,
                             nr_frags);
        if (count) {
-               skb_tx_timestamp(skb);
+               if (unlikely((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
+                            !adapter->tx_hwtstamp_skb)) {
+                       skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
+                       tx_flags |= E1000_TX_FLAGS_HWTSTAMP;
+                       adapter->tx_hwtstamp_skb = skb_get(skb);
+                       schedule_work(&adapter->tx_hwtstamp_work);
+               } else {
+                       skb_tx_timestamp(skb);
+               }
 
                netdev_sent_queue(netdev, skb->len);
                e1000_tx_queue(tx_ring, tx_flags, count);
@@ -5134,10 +5441,9 @@ static void e1000_reset_task(struct work_struct *work)
        if (test_bit(__E1000_DOWN, &adapter->state))
                return;
 
-       if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
-             (adapter->flags & FLAG_RX_RESTART_NOW))) {
+       if (!(adapter->flags & FLAG_RESTART_NOW)) {
                e1000e_dump(adapter);
-               e_err("Reset adapter\n");
+               e_err("Reset adapter unexpectedly\n");
        }
        e1000e_reinit_locked(adapter);
 }
@@ -5323,6 +5629,43 @@ static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
        return 0;
 }
 
+/**
+ * e1000e_hwtstamp_ioctl - control hardware time stamping
+ * @netdev: network interface device structure
+ * @ifreq: interface request
+ *
+ * Outgoing time stamping can be enabled and disabled. Play nice and
+ * disable it when requested, although it shouldn't cause any overhead
+ * when no packet needs it. At most one packet in the queue may be
+ * marked for time stamping, otherwise it would be impossible to tell
+ * for sure to which packet the hardware time stamp belongs.
+ *
+ * Incoming time stamping has to be configured via the hardware filters.
+ * Not all combinations are supported, in particular event type has to be
+ * specified. Matching the kind of event packet is not supported, with the
+ * exception of "all V2 events regardless of level 2 or 4".
+ **/
+static int e1000e_hwtstamp_ioctl(struct net_device *netdev, struct ifreq *ifr)
+{
+       struct e1000_adapter *adapter = netdev_priv(netdev);
+       struct hwtstamp_config config;
+       int ret_val;
+
+       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
+               return -EFAULT;
+
+       adapter->hwtstamp_config = config;
+
+       ret_val = e1000e_config_hwtstamp(adapter);
+       if (ret_val)
+               return ret_val;
+
+       config = adapter->hwtstamp_config;
+
+       return copy_to_user(ifr->ifr_data, &config,
+                           sizeof(config)) ? -EFAULT : 0;
+}
+
 static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
 {
        switch (cmd) {
@@ -5330,6 +5673,8 @@ static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
        case SIOCGMIIREG:
        case SIOCSMIIREG:
                return e1000_mii_ioctl(netdev, ifr, cmd);
+       case SIOCSHWTSTAMP:
+               return e1000e_hwtstamp_ioctl(netdev, ifr);
        default:
                return -EOPNOTSUPP;
        }
@@ -5554,14 +5899,21 @@ static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
 #else
 static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
 {
+       u16 aspm_ctl = 0;
+
+       if (state & PCIE_LINK_STATE_L0S)
+               aspm_ctl |= PCI_EXP_LNKCTL_ASPM_L0S;
+       if (state & PCIE_LINK_STATE_L1)
+               aspm_ctl |= PCI_EXP_LNKCTL_ASPM_L1;
+
        /* Both device and parent should have the same ASPM setting.
         * Disable ASPM in downstream component first and then upstream.
         */
-       pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, state);
+       pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, aspm_ctl);
 
        if (pdev->bus->self)
                pcie_capability_clear_word(pdev->bus->self, PCI_EXP_LNKCTL,
-                                          state);
+                                          aspm_ctl);
 }
 #endif
 static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
@@ -6228,11 +6580,10 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        "NVM Read Error while reading MAC address\n");
 
        memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
-       memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
 
-       if (!is_valid_ether_addr(netdev->perm_addr)) {
+       if (!is_valid_ether_addr(netdev->dev_addr)) {
                dev_err(&pdev->dev, "Invalid MAC Address: %pM\n",
-                       netdev->perm_addr);
+                       netdev->dev_addr);
                err = -EIO;
                goto err_eeprom;
        }
@@ -6380,6 +6731,14 @@ static void e1000_remove(struct pci_dev *pdev)
        cancel_work_sync(&adapter->update_phy_task);
        cancel_work_sync(&adapter->print_hang_task);
 
+       if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) {
+               cancel_work_sync(&adapter->tx_hwtstamp_work);
+               if (adapter->tx_hwtstamp_skb) {
+                       dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
+                       adapter->tx_hwtstamp_skb = NULL;
+               }
+       }
+
        if (!(netdev->flags & IFF_UP))
                e1000_power_down_phy(adapter);
 
index b6468804cb2e74e8e317622ae4f36067c8f8780e..1e7882c7d6d4aa44e131b05ffd36c9bee5b05471 100644 (file)
@@ -359,7 +359,7 @@ s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
 s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
 {
        struct e1000_nvm_info *nvm = &hw->nvm;
-       s32 ret_val;
+       s32 ret_val = -E1000_ERR_NVM;
        u16 widx = 0;
 
        /* A check for invalid values:  offset too large, too many words,
@@ -371,16 +371,18 @@ s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
                return -E1000_ERR_NVM;
        }
 
-       ret_val = nvm->ops.acquire(hw);
-       if (ret_val)
-               return ret_val;
-
        while (widx < words) {
                u8 write_opcode = NVM_WRITE_OPCODE_SPI;
 
-               ret_val = e1000_ready_nvm_eeprom(hw);
+               ret_val = nvm->ops.acquire(hw);
                if (ret_val)
-                       goto release;
+                       return ret_val;
+
+               ret_val = e1000_ready_nvm_eeprom(hw);
+               if (ret_val) {
+                       nvm->ops.release(hw);
+                       return ret_val;
+               }
 
                e1000_standby_nvm(hw);
 
@@ -413,12 +415,10 @@ s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
                                break;
                        }
                }
+               usleep_range(10000, 20000);
+               nvm->ops.release(hw);
        }
 
-       usleep_range(10000, 20000);
-release:
-       nvm->ops.release(hw);
-
        return ret_val;
 }
 
@@ -464,8 +464,8 @@ s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
        if (nvm_data != NVM_PBA_PTR_GUARD) {
                e_dbg("NVM PBA number is not stored as string\n");
 
-               /* we will need 11 characters to store the PBA */
-               if (pba_num_size < 11) {
+               /* make sure callers buffer is big enough to store the PBA */
+               if (pba_num_size < E1000_PBANUM_LENGTH) {
                        e_dbg("PBA string buffer too small\n");
                        return E1000_ERR_NO_SPACE;
                }
index 89d536dd7ff51e3cbcd688f682cd00a84e000ce7..b29a8a5116a821090e2afc1b22b3483f824e2833 100644 (file)
@@ -447,8 +447,7 @@ void e1000e_check_options(struct e1000_adapter *adapter)
                if (num_SmartPowerDownEnable > bd) {
                        unsigned int spd = SmartPowerDownEnable[bd];
                        e1000_validate_option(&spd, &opt, adapter);
-                       if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN)
-                           && spd)
+                       if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) && spd)
                                adapter->flags |= FLAG_SMART_POWER_DOWN;
                }
        }
index 624476cfa727cc32efc39a8846fb3720742077ed..f19700e285bb5f5397b3ace776453974f4e8a9d5 100644 (file)
@@ -1,7 +1,7 @@
 ################################################################################
 #
 # Intel 82575 PCI-Express Ethernet Linux driver
-# Copyright(c) 1999 - 2012 Intel Corporation.
+# Copyright(c) 1999 - 2013 Intel Corporation.
 #
 # This program is free software; you can redistribute it and/or modify it
 # under the terms and conditions of the GNU General Public License,
@@ -34,4 +34,4 @@ obj-$(CONFIG_IGB) += igb.o
 
 igb-objs := igb_main.o igb_ethtool.o e1000_82575.o \
            e1000_mac.o e1000_nvm.o e1000_phy.o e1000_mbx.o \
-           e1000_i210.o igb_ptp.o
+           e1000_i210.o igb_ptp.o igb_hwmon.o
index fdaaf2709d0ae660480e3c6525e116481a369c4c..54a7c20d9fa08ced8a2fa4effd84f5fdcaa82471 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -33,6 +33,7 @@
 
 #include <linux/types.h>
 #include <linux/if_ether.h>
+#include <linux/i2c.h>
 
 #include "e1000_mac.h"
 #include "e1000_82575.h"
@@ -2302,18 +2303,157 @@ out:
        return ret_val;
 }
 
+static const u8 e1000_emc_temp_data[4] = {
+       E1000_EMC_INTERNAL_DATA,
+       E1000_EMC_DIODE1_DATA,
+       E1000_EMC_DIODE2_DATA,
+       E1000_EMC_DIODE3_DATA
+};
+static const u8 e1000_emc_therm_limit[4] = {
+       E1000_EMC_INTERNAL_THERM_LIMIT,
+       E1000_EMC_DIODE1_THERM_LIMIT,
+       E1000_EMC_DIODE2_THERM_LIMIT,
+       E1000_EMC_DIODE3_THERM_LIMIT
+};
+
+/* igb_get_thermal_sensor_data_generic - Gathers thermal sensor data
+ *  @hw: pointer to hardware structure
+ *
+ *  Updates the temperatures in mac.thermal_sensor_data
+ */
+s32 igb_get_thermal_sensor_data_generic(struct e1000_hw *hw)
+{
+       s32 status = E1000_SUCCESS;
+       u16 ets_offset;
+       u16 ets_cfg;
+       u16 ets_sensor;
+       u8  num_sensors;
+       u8  sensor_index;
+       u8  sensor_location;
+       u8  i;
+       struct e1000_thermal_sensor_data *data = &hw->mac.thermal_sensor_data;
+
+       if ((hw->mac.type != e1000_i350) || (hw->bus.func != 0))
+               return E1000_NOT_IMPLEMENTED;
+
+       data->sensor[0].temp = (rd32(E1000_THMJT) & 0xFF);
+
+       /* Return the internal sensor only if ETS is unsupported */
+       hw->nvm.ops.read(hw, NVM_ETS_CFG, 1, &ets_offset);
+       if ((ets_offset == 0x0000) || (ets_offset == 0xFFFF))
+               return status;
+
+       hw->nvm.ops.read(hw, ets_offset, 1, &ets_cfg);
+       if (((ets_cfg & NVM_ETS_TYPE_MASK) >> NVM_ETS_TYPE_SHIFT)
+           != NVM_ETS_TYPE_EMC)
+               return E1000_NOT_IMPLEMENTED;
+
+       num_sensors = (ets_cfg & NVM_ETS_NUM_SENSORS_MASK);
+       if (num_sensors > E1000_MAX_SENSORS)
+               num_sensors = E1000_MAX_SENSORS;
+
+       for (i = 1; i < num_sensors; i++) {
+               hw->nvm.ops.read(hw, (ets_offset + i), 1, &ets_sensor);
+               sensor_index = ((ets_sensor & NVM_ETS_DATA_INDEX_MASK) >>
+                               NVM_ETS_DATA_INDEX_SHIFT);
+               sensor_location = ((ets_sensor & NVM_ETS_DATA_LOC_MASK) >>
+                                  NVM_ETS_DATA_LOC_SHIFT);
+
+               if (sensor_location != 0)
+                       hw->phy.ops.read_i2c_byte(hw,
+                                       e1000_emc_temp_data[sensor_index],
+                                       E1000_I2C_THERMAL_SENSOR_ADDR,
+                                       &data->sensor[i].temp);
+       }
+       return status;
+}
+
+/* igb_init_thermal_sensor_thresh_generic - Sets thermal sensor thresholds
+ *  @hw: pointer to hardware structure
+ *
+ *  Sets the thermal sensor thresholds according to the NVM map
+ *  and save off the threshold and location values into mac.thermal_sensor_data
+ */
+s32 igb_init_thermal_sensor_thresh_generic(struct e1000_hw *hw)
+{
+       s32 status = E1000_SUCCESS;
+       u16 ets_offset;
+       u16 ets_cfg;
+       u16 ets_sensor;
+       u8  low_thresh_delta;
+       u8  num_sensors;
+       u8  sensor_index;
+       u8  sensor_location;
+       u8  therm_limit;
+       u8  i;
+       struct e1000_thermal_sensor_data *data = &hw->mac.thermal_sensor_data;
+
+       if ((hw->mac.type != e1000_i350) || (hw->bus.func != 0))
+               return E1000_NOT_IMPLEMENTED;
+
+       memset(data, 0, sizeof(struct e1000_thermal_sensor_data));
+
+       data->sensor[0].location = 0x1;
+       data->sensor[0].caution_thresh =
+               (rd32(E1000_THHIGHTC) & 0xFF);
+       data->sensor[0].max_op_thresh =
+               (rd32(E1000_THLOWTC) & 0xFF);
+
+       /* Return the internal sensor only if ETS is unsupported */
+       hw->nvm.ops.read(hw, NVM_ETS_CFG, 1, &ets_offset);
+       if ((ets_offset == 0x0000) || (ets_offset == 0xFFFF))
+               return status;
+
+       hw->nvm.ops.read(hw, ets_offset, 1, &ets_cfg);
+       if (((ets_cfg & NVM_ETS_TYPE_MASK) >> NVM_ETS_TYPE_SHIFT)
+           != NVM_ETS_TYPE_EMC)
+               return E1000_NOT_IMPLEMENTED;
+
+       low_thresh_delta = ((ets_cfg & NVM_ETS_LTHRES_DELTA_MASK) >>
+                           NVM_ETS_LTHRES_DELTA_SHIFT);
+       num_sensors = (ets_cfg & NVM_ETS_NUM_SENSORS_MASK);
+
+       for (i = 1; i <= num_sensors; i++) {
+               hw->nvm.ops.read(hw, (ets_offset + i), 1, &ets_sensor);
+               sensor_index = ((ets_sensor & NVM_ETS_DATA_INDEX_MASK) >>
+                               NVM_ETS_DATA_INDEX_SHIFT);
+               sensor_location = ((ets_sensor & NVM_ETS_DATA_LOC_MASK) >>
+                                  NVM_ETS_DATA_LOC_SHIFT);
+               therm_limit = ets_sensor & NVM_ETS_DATA_HTHRESH_MASK;
+
+               hw->phy.ops.write_i2c_byte(hw,
+                       e1000_emc_therm_limit[sensor_index],
+                       E1000_I2C_THERMAL_SENSOR_ADDR,
+                       therm_limit);
+
+               if ((i < E1000_MAX_SENSORS) && (sensor_location != 0)) {
+                       data->sensor[i].location = sensor_location;
+                       data->sensor[i].caution_thresh = therm_limit;
+                       data->sensor[i].max_op_thresh = therm_limit -
+                                                       low_thresh_delta;
+               }
+       }
+       return status;
+}
+
 static struct e1000_mac_operations e1000_mac_ops_82575 = {
        .init_hw              = igb_init_hw_82575,
        .check_for_link       = igb_check_for_link_82575,
        .rar_set              = igb_rar_set,
        .read_mac_addr        = igb_read_mac_addr_82575,
        .get_speed_and_duplex = igb_get_speed_and_duplex_copper,
+#ifdef CONFIG_IGB_HWMON
+       .get_thermal_sensor_data = igb_get_thermal_sensor_data_generic,
+       .init_thermal_sensor_thresh = igb_init_thermal_sensor_thresh_generic,
+#endif
 };
 
 static struct e1000_phy_operations e1000_phy_ops_82575 = {
        .acquire              = igb_acquire_phy_82575,
        .get_cfg_done         = igb_get_cfg_done_82575,
        .release              = igb_release_phy_82575,
+       .write_i2c_byte       = igb_write_i2c_byte,
+       .read_i2c_byte        = igb_read_i2c_byte,
 };
 
 static struct e1000_nvm_operations e1000_nvm_ops_82575 = {
index 44b76b3b6816692f2bcea6682950791a92164bda..73ab41f0e032009422cf3488c851ea118cd0109c 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -32,6 +32,10 @@ extern void igb_shutdown_serdes_link_82575(struct e1000_hw *hw);
 extern void igb_power_up_serdes_link_82575(struct e1000_hw *hw);
 extern void igb_power_down_phy_copper_82575(struct e1000_hw *hw);
 extern void igb_rx_fifo_flush_82575(struct e1000_hw *hw);
+extern s32 igb_read_i2c_byte(struct e1000_hw *hw, u8 byte_offset,
+                               u8 dev_addr, u8 *data);
+extern s32 igb_write_i2c_byte(struct e1000_hw *hw, u8 byte_offset,
+                                u8 dev_addr, u8 data);
 
 #define ID_LED_DEFAULT_82575_SERDES ((ID_LED_DEF1_DEF2 << 12) | \
                                      (ID_LED_DEF1_DEF2 <<  8) | \
@@ -260,5 +264,16 @@ void igb_vmdq_set_loopback_pf(struct e1000_hw *, bool);
 void igb_vmdq_set_replication_pf(struct e1000_hw *, bool);
 u16 igb_rxpbs_adjust_82580(u32 data);
 s32 igb_set_eee_i350(struct e1000_hw *);
-
+s32 igb_init_thermal_sensor_thresh_generic(struct e1000_hw *);
+s32 igb_get_thermal_sensor_data_generic(struct e1000_hw *hw);
+
+#define E1000_I2C_THERMAL_SENSOR_ADDR  0xF8
+#define E1000_EMC_INTERNAL_DATA                0x00
+#define E1000_EMC_INTERNAL_THERM_LIMIT 0x20
+#define E1000_EMC_DIODE1_DATA          0x01
+#define E1000_EMC_DIODE1_THERM_LIMIT   0x19
+#define E1000_EMC_DIODE2_DATA          0x23
+#define E1000_EMC_DIODE2_THERM_LIMIT   0x1A
+#define E1000_EMC_DIODE3_DATA          0x2A
+#define E1000_EMC_DIODE3_THERM_LIMIT   0x30
 #endif
index 45dce06eff264d77dd5d6b350ef2e3a1dd94447f..7e13337d3b9d519bb33b3df0f362d1d63f77cf69 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
 #define E1000_ERR_NO_SPACE          17
 #define E1000_ERR_NVM_PBA_SECTION   18
 #define E1000_ERR_INVM_VALUE_NOT_FOUND 19
+#define E1000_ERR_I2C               20
 
 /* Loop limit on how long we wait for auto-negotiation to complete */
 #define COPPER_LINK_UP_LIMIT              10
 #define NVM_COMB_VER_SHFT               8
 #define NVM_VER_INVALID            0xFFFF
 #define NVM_ETRACK_SHIFT               16
+#define NVM_ETS_CFG                    0x003E
+#define NVM_ETS_LTHRES_DELTA_MASK      0x07C0
+#define NVM_ETS_LTHRES_DELTA_SHIFT     6
+#define NVM_ETS_TYPE_MASK              0x0038
+#define NVM_ETS_TYPE_SHIFT             3
+#define NVM_ETS_TYPE_EMC               0x000
+#define NVM_ETS_NUM_SENSORS_MASK       0x0007
+#define NVM_ETS_DATA_LOC_MASK          0x3C00
+#define NVM_ETS_DATA_LOC_SHIFT         10
+#define NVM_ETS_DATA_INDEX_MASK                0x0300
+#define NVM_ETS_DATA_INDEX_SHIFT       8
+#define NVM_ETS_DATA_HTHRESH_MASK      0x00FF
 
 #define E1000_NVM_CFG_DONE_PORT_0  0x040000 /* MNG config cycle done */
 #define E1000_NVM_CFG_DONE_PORT_1  0x080000 /* ...for second port */
index c2a51dcda550107e2b266dff9e1ba2f9b1cc83be..0d5cf9c63d0d1192930fdda4e5f12bf254dc3974 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -325,6 +325,10 @@ struct e1000_mac_operations {
        s32  (*get_speed_and_duplex)(struct e1000_hw *, u16 *, u16 *);
        s32  (*acquire_swfw_sync)(struct e1000_hw *, u16);
        void (*release_swfw_sync)(struct e1000_hw *, u16);
+#ifdef CONFIG_IGB_HWMON
+       s32 (*get_thermal_sensor_data)(struct e1000_hw *);
+       s32 (*init_thermal_sensor_thresh)(struct e1000_hw *);
+#endif
 
 };
 
@@ -342,6 +346,8 @@ struct e1000_phy_operations {
        s32  (*set_d0_lplu_state)(struct e1000_hw *, bool);
        s32  (*set_d3_lplu_state)(struct e1000_hw *, bool);
        s32  (*write_reg)(struct e1000_hw *, u32, u16);
+       s32 (*read_i2c_byte)(struct e1000_hw *, u8, u8, u8 *);
+       s32 (*write_i2c_byte)(struct e1000_hw *, u8, u8, u8);
 };
 
 struct e1000_nvm_operations {
@@ -354,6 +360,19 @@ struct e1000_nvm_operations {
        s32  (*valid_led_default)(struct e1000_hw *, u16 *);
 };
 
+#define E1000_MAX_SENSORS              3
+
+struct e1000_thermal_diode_data {
+       u8 location;
+       u8 temp;
+       u8 caution_thresh;
+       u8 max_op_thresh;
+};
+
+struct e1000_thermal_sensor_data {
+       struct e1000_thermal_diode_data sensor[E1000_MAX_SENSORS];
+};
+
 struct e1000_info {
        s32 (*get_invariants)(struct e1000_hw *);
        struct e1000_mac_operations *mac_ops;
@@ -399,6 +418,7 @@ struct e1000_mac_info {
        bool report_tx_early;
        bool serdes_has_link;
        bool tx_pkt_filtering;
+       struct e1000_thermal_sensor_data thermal_sensor_data;
 };
 
 struct e1000_phy_info {
index fbcdbebb0b5fce2c4108a130e24d490cbada6cf7..6a42344f24f1805ed6b3e2fe1c4afa98cb1534cf 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index 1c89358a99ab84b384f4d6819dd550aa7cc2a34d..e4e1a73b7c75a145a17641f3302355107e8b4f4c 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index 101e6e4da97fb5287852d555409618c7cf7bf854..a5c7200b9a71b8637a31de1c74fcfa6eb48018d3 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index e2b2c4b9c951fd704a5d452f00e6efd190ec307b..e6d6ce433261f8be8a125e00ee9fdf1bb114e606 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index 5988b8958baff22cfb0f2de6f71eae4fc578681a..38e0df35090422609b50d00b5834bb4b2a377916 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index dbcfa3d5caeca753cf22a4f37e9cb313d9c30fa7..c13b56d9edb25e8436e8ffbad9c74e8cdcd36e0b 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index fbb7604db364f59729bb3f6c36d41758d4cf40ba..5b62adbe134de0f9bba71e23b25c01aa95e054b8 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index 7012d458c6f7eff8df5ae1c0e25cd4a5abaa486d..6bfc0c43aace635084b265441c1fb91cb6c86bdc 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2012 Intel Corporation.
+  Copyright(c) 2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index fe76004aca4e7a8464811629d9cfec18dac2f8b2..2918c979b5bba54a74a5d3844ee265aaacf62680 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index ed282f877d9a0b08df7b7a2673d0e3d0d67c5216..784fd1c40989fc86bbdb5d750bc61f5cd40da187 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
index e5db48594e8a929daab778dca1fe7c9b92f0e7fa..15343286082e009acc711eecc4d2555875dd807d 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
 #define E1000_FCRTL    0x02160  /* Flow Control Receive Threshold Low - RW */
 #define E1000_FCRTH    0x02168  /* Flow Control Receive Threshold High - RW */
 #define E1000_FCRTV    0x02460  /* Flow Control Refresh Timer Value - RW */
+#define E1000_I2CPARAMS        0x0102C /* SFPI2C Parameters Register - RW */
+#define E1000_I2CBB_EN      0x00000100  /* I2C - Bit Bang Enable */
+#define E1000_I2C_CLK_OUT   0x00000200  /* I2C- Clock */
+#define E1000_I2C_DATA_OUT  0x00000400  /* I2C- Data Out */
+#define E1000_I2C_DATA_OE_N 0x00000800  /* I2C- Data Output Enable */
+#define E1000_I2C_DATA_IN   0x00001000  /* I2C- Data In */
+#define E1000_I2C_CLK_OE_N  0x00002000  /* I2C- Clock Output Enable */
+#define E1000_I2C_CLK_IN    0x00004000  /* I2C- Clock In */
 
 /* IEEE 1588 TIMESYNCH */
 #define E1000_TSYNCRXCTL 0x0B620 /* Rx Time Sync Control register - RW */
 
 /* Split and Replication RX Control - RW */
 #define E1000_RXPBS    0x02404  /* Rx Packet Buffer Size - RW */
+
+/* Thermal sensor configuration and status registers */
+#define E1000_THMJT    0x08100 /* Junction Temperature */
+#define E1000_THLOWTC  0x08104 /* Low Threshold Control */
+#define E1000_THMIDTC  0x08108 /* Mid Threshold Control */
+#define E1000_THHIGHTC 0x0810C /* High Threshold Control */
+#define E1000_THSTAT   0x08110 /* Thermal Sensor Status */
+
 /*
  * Convenience macros
  *
index 17f1686ee411fe3e63aea5fdcfacaa1abe6e8ee1..4b78053592baf8650d89a987348138999d73fcab 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -39,6 +39,8 @@
 #include <linux/ptp_clock_kernel.h>
 #include <linux/bitops.h>
 #include <linux/if_vlan.h>
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
 
 struct igb_adapter;
 
@@ -219,6 +221,7 @@ struct igb_ring {
                struct igb_tx_buffer *tx_buffer_info;
                struct igb_rx_buffer *rx_buffer_info;
        };
+       unsigned long last_rx_timestamp;
        void *desc;                     /* descriptor ring memory */
        unsigned long flags;            /* ring specific flags */
        void __iomem *tail;             /* pointer to ring tail register */
@@ -301,6 +304,32 @@ static inline int igb_desc_unused(struct igb_ring *ring)
        return ring->count + ring->next_to_clean - ring->next_to_use - 1;
 }
 
+struct igb_i2c_client_list {
+       struct i2c_client *client;
+       struct igb_i2c_client_list *next;
+};
+
+#ifdef CONFIG_IGB_HWMON
+
+#define IGB_HWMON_TYPE_LOC     0
+#define IGB_HWMON_TYPE_TEMP    1
+#define IGB_HWMON_TYPE_CAUTION 2
+#define IGB_HWMON_TYPE_MAX     3
+
+struct hwmon_attr {
+       struct device_attribute dev_attr;
+       struct e1000_hw *hw;
+       struct e1000_thermal_diode_data *sensor;
+       char name[12];
+       };
+
+struct hwmon_buff {
+       struct device *device;
+       struct hwmon_attr *hwmon_list;
+       unsigned int n_hwmon;
+       };
+#endif
+
 /* board specific private data structure */
 struct igb_adapter {
        unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
@@ -386,11 +415,22 @@ struct igb_adapter {
        struct delayed_work ptp_overflow_work;
        struct work_struct ptp_tx_work;
        struct sk_buff *ptp_tx_skb;
+       unsigned long ptp_tx_start;
+       unsigned long last_rx_ptp_check;
        spinlock_t tmreg_lock;
        struct cyclecounter cc;
        struct timecounter tc;
+       u32 tx_hwtstamp_timeouts;
+       u32 rx_hwtstamp_cleared;
 
        char fw_version[32];
+#ifdef CONFIG_IGB_HWMON
+       struct hwmon_buff igb_hwmon_buff;
+       bool ets;
+#endif
+       struct i2c_algo_bit_data i2c_algo;
+       struct i2c_adapter i2c_adap;
+       struct igb_i2c_client_list *i2c_clients;
 };
 
 #define IGB_FLAG_HAS_MSI               (1 << 0)
@@ -449,6 +489,7 @@ extern void igb_ptp_init(struct igb_adapter *adapter);
 extern void igb_ptp_stop(struct igb_adapter *adapter);
 extern void igb_ptp_reset(struct igb_adapter *adapter);
 extern void igb_ptp_tx_work(struct work_struct *work);
+extern void igb_ptp_rx_hang(struct igb_adapter *adapter);
 extern void igb_ptp_tx_hwtstamp(struct igb_adapter *adapter);
 extern void igb_ptp_rx_rgtstamp(struct igb_q_vector *q_vector,
                                struct sk_buff *skb);
@@ -466,7 +507,10 @@ static inline void igb_ptp_rx_hwtstamp(struct igb_q_vector *q_vector,
 
 extern int igb_ptp_hwtstamp_ioctl(struct net_device *netdev,
                                  struct ifreq *ifr, int cmd);
-
+#ifdef CONFIG_IGB_HWMON
+extern void igb_sysfs_exit(struct igb_adapter *adapter);
+extern int igb_sysfs_init(struct igb_adapter *adapter);
+#endif
 static inline s32 igb_reset_phy(struct e1000_hw *hw)
 {
        if (hw->phy.ops.reset)
index bfe9208c4b1879db6a52695328d1640a7f3e2064..40b5d568d808745e02eb66523200068d9e5f653c 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -92,6 +92,8 @@ static const struct igb_stats igb_gstrings_stats[] = {
        IGB_STAT("os2bmc_tx_by_bmc", stats.b2ospc),
        IGB_STAT("os2bmc_tx_by_host", stats.o2bspc),
        IGB_STAT("os2bmc_rx_by_host", stats.b2ogprc),
+       IGB_STAT("tx_hwtstamp_timeouts", tx_hwtstamp_timeouts),
+       IGB_STAT("rx_hwtstamp_cleared", rx_hwtstamp_cleared),
 };
 
 #define IGB_NETDEV_STAT(_net_stat) { \
@@ -2272,12 +2274,21 @@ static int igb_get_ts_info(struct net_device *dev,
        struct igb_adapter *adapter = netdev_priv(dev);
 
        switch (adapter->hw.mac.type) {
+       case e1000_82575:
+               info->so_timestamping =
+                       SOF_TIMESTAMPING_TX_SOFTWARE |
+                       SOF_TIMESTAMPING_RX_SOFTWARE |
+                       SOF_TIMESTAMPING_SOFTWARE;
+               return 0;
        case e1000_82576:
        case e1000_82580:
        case e1000_i350:
        case e1000_i210:
        case e1000_i211:
                info->so_timestamping =
+                       SOF_TIMESTAMPING_TX_SOFTWARE |
+                       SOF_TIMESTAMPING_RX_SOFTWARE |
+                       SOF_TIMESTAMPING_SOFTWARE |
                        SOF_TIMESTAMPING_TX_HARDWARE |
                        SOF_TIMESTAMPING_RX_HARDWARE |
                        SOF_TIMESTAMPING_RAW_HARDWARE;
diff --git a/drivers/net/ethernet/intel/igb/igb_hwmon.c b/drivers/net/ethernet/intel/igb/igb_hwmon.c
new file mode 100644 (file)
index 0000000..0a9b073
--- /dev/null
@@ -0,0 +1,242 @@
+/*******************************************************************************
+
+  Intel(R) Gigabit Ethernet Linux driver
+  Copyright(c) 2007-2013 Intel Corporation.
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms and conditions of the GNU General Public License,
+  version 2, as published by the Free Software Foundation.
+
+  This program is distributed in the hope it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+  more details.
+
+  You should have received a copy of the GNU General Public License along with
+  this program; if not, write to the Free Software Foundation, Inc.,
+  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+
+  The full GNU General Public License is included in this distribution in
+  the file called "COPYING".
+
+  Contact Information:
+  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
+  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+
+*******************************************************************************/
+
+#include "igb.h"
+#include "e1000_82575.h"
+#include "e1000_hw.h"
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/sysfs.h>
+#include <linux/kobject.h>
+#include <linux/device.h>
+#include <linux/netdevice.h>
+#include <linux/hwmon.h>
+#include <linux/pci.h>
+
+#ifdef CONFIG_IGB_HWMON
+/* hwmon callback functions */
+static ssize_t igb_hwmon_show_location(struct device *dev,
+                                        struct device_attribute *attr,
+                                        char *buf)
+{
+       struct hwmon_attr *igb_attr = container_of(attr, struct hwmon_attr,
+                                                    dev_attr);
+       return sprintf(buf, "loc%u\n",
+                      igb_attr->sensor->location);
+}
+
+static ssize_t igb_hwmon_show_temp(struct device *dev,
+                                    struct device_attribute *attr,
+                                    char *buf)
+{
+       struct hwmon_attr *igb_attr = container_of(attr, struct hwmon_attr,
+                                                    dev_attr);
+       unsigned int value;
+
+       /* reset the temp field */
+       igb_attr->hw->mac.ops.get_thermal_sensor_data(igb_attr->hw);
+
+       value = igb_attr->sensor->temp;
+
+       /* display millidegree */
+       value *= 1000;
+
+       return sprintf(buf, "%u\n", value);
+}
+
+static ssize_t igb_hwmon_show_cautionthresh(struct device *dev,
+                                    struct device_attribute *attr,
+                                    char *buf)
+{
+       struct hwmon_attr *igb_attr = container_of(attr, struct hwmon_attr,
+                                                    dev_attr);
+       unsigned int value = igb_attr->sensor->caution_thresh;
+
+       /* display millidegree */
+       value *= 1000;
+
+       return sprintf(buf, "%u\n", value);
+}
+
+static ssize_t igb_hwmon_show_maxopthresh(struct device *dev,
+                                    struct device_attribute *attr,
+                                    char *buf)
+{
+       struct hwmon_attr *igb_attr = container_of(attr, struct hwmon_attr,
+                                                    dev_attr);
+       unsigned int value = igb_attr->sensor->max_op_thresh;
+
+       /* display millidegree */
+       value *= 1000;
+
+       return sprintf(buf, "%u\n", value);
+}
+
+/* igb_add_hwmon_attr - Create hwmon attr table for a hwmon sysfs file.
+ * @ adapter: pointer to the adapter structure
+ * @ offset: offset in the eeprom sensor data table
+ * @ type: type of sensor data to display
+ *
+ * For each file we want in hwmon's sysfs interface we need a device_attribute
+ * This is included in our hwmon_attr struct that contains the references to
+ * the data structures we need to get the data to display.
+ */
+static int igb_add_hwmon_attr(struct igb_adapter *adapter,
+                               unsigned int offset, int type) {
+       int rc;
+       unsigned int n_attr;
+       struct hwmon_attr *igb_attr;
+
+       n_attr = adapter->igb_hwmon_buff.n_hwmon;
+       igb_attr = &adapter->igb_hwmon_buff.hwmon_list[n_attr];
+
+       switch (type) {
+       case IGB_HWMON_TYPE_LOC:
+               igb_attr->dev_attr.show = igb_hwmon_show_location;
+               snprintf(igb_attr->name, sizeof(igb_attr->name),
+                        "temp%u_label", offset);
+               break;
+       case IGB_HWMON_TYPE_TEMP:
+               igb_attr->dev_attr.show = igb_hwmon_show_temp;
+               snprintf(igb_attr->name, sizeof(igb_attr->name),
+                        "temp%u_input", offset);
+               break;
+       case IGB_HWMON_TYPE_CAUTION:
+               igb_attr->dev_attr.show = igb_hwmon_show_cautionthresh;
+               snprintf(igb_attr->name, sizeof(igb_attr->name),
+                        "temp%u_max", offset);
+               break;
+       case IGB_HWMON_TYPE_MAX:
+               igb_attr->dev_attr.show = igb_hwmon_show_maxopthresh;
+               snprintf(igb_attr->name, sizeof(igb_attr->name),
+                        "temp%u_crit", offset);
+               break;
+       default:
+               rc = -EPERM;
+               return rc;
+       }
+
+       /* These always the same regardless of type */
+       igb_attr->sensor =
+               &adapter->hw.mac.thermal_sensor_data.sensor[offset];
+       igb_attr->hw = &adapter->hw;
+       igb_attr->dev_attr.store = NULL;
+       igb_attr->dev_attr.attr.mode = S_IRUGO;
+       igb_attr->dev_attr.attr.name = igb_attr->name;
+       sysfs_attr_init(&igb_attr->dev_attr.attr);
+       rc = device_create_file(&adapter->pdev->dev,
+                               &igb_attr->dev_attr);
+       if (rc == 0)
+               ++adapter->igb_hwmon_buff.n_hwmon;
+
+       return rc;
+}
+
+static void igb_sysfs_del_adapter(struct igb_adapter *adapter)
+{
+       int i;
+
+       if (adapter == NULL)
+               return;
+
+       for (i = 0; i < adapter->igb_hwmon_buff.n_hwmon; i++) {
+               device_remove_file(&adapter->pdev->dev,
+                          &adapter->igb_hwmon_buff.hwmon_list[i].dev_attr);
+       }
+
+       kfree(adapter->igb_hwmon_buff.hwmon_list);
+
+       if (adapter->igb_hwmon_buff.device)
+               hwmon_device_unregister(adapter->igb_hwmon_buff.device);
+}
+
+/* called from igb_main.c */
+void igb_sysfs_exit(struct igb_adapter *adapter)
+{
+       igb_sysfs_del_adapter(adapter);
+}
+
+/* called from igb_main.c */
+int igb_sysfs_init(struct igb_adapter *adapter)
+{
+       struct hwmon_buff *igb_hwmon = &adapter->igb_hwmon_buff;
+       unsigned int i;
+       int n_attrs;
+       int rc = 0;
+
+       /* If this method isn't defined we don't support thermals */
+       if (adapter->hw.mac.ops.init_thermal_sensor_thresh == NULL)
+               goto exit;
+
+       /* Don't create thermal hwmon interface if no sensors present */
+       rc = (adapter->hw.mac.ops.init_thermal_sensor_thresh(&adapter->hw));
+               if (rc)
+                       goto exit;
+
+       /* Allocation space for max attributes
+        * max num sensors * values (loc, temp, max, caution)
+        */
+       n_attrs = E1000_MAX_SENSORS * 4;
+       igb_hwmon->hwmon_list = kcalloc(n_attrs, sizeof(struct hwmon_attr),
+                                         GFP_KERNEL);
+       if (!igb_hwmon->hwmon_list) {
+               rc = -ENOMEM;
+               goto err;
+       }
+
+       igb_hwmon->device = hwmon_device_register(&adapter->pdev->dev);
+       if (IS_ERR(igb_hwmon->device)) {
+               rc = PTR_ERR(igb_hwmon->device);
+               goto err;
+       }
+
+       for (i = 0; i < E1000_MAX_SENSORS; i++) {
+
+               /* Only create hwmon sysfs entries for sensors that have
+                * meaningful data.
+                */
+               if (adapter->hw.mac.thermal_sensor_data.sensor[i].location == 0)
+                       continue;
+
+               /* Bail if any hwmon attr struct fails to initialize */
+               rc = igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_CAUTION);
+               rc |= igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_LOC);
+               rc |= igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_TEMP);
+               rc |= igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_MAX);
+               if (rc)
+                       goto err;
+       }
+
+       goto exit;
+
+err:
+       igb_sysfs_del_adapter(adapter);
+exit:
+       return rc;
+}
+#endif
index 31cfe2ec75dfb32b7da36311214c0ac2606015f4..b81a953709142de448786c33f17309bd6beb8e63 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) Gigabit Ethernet Linux driver
-  Copyright(c) 2007-2012 Intel Corporation.
+  Copyright(c) 2007-2013 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -57,6 +57,7 @@
 #ifdef CONFIG_IGB_DCA
 #include <linux/dca.h>
 #endif
+#include <linux/i2c.h>
 #include "igb.h"
 
 #define MAJ 4
@@ -68,7 +69,8 @@ char igb_driver_name[] = "igb";
 char igb_driver_version[] = DRV_VERSION;
 static const char igb_driver_string[] =
                                "Intel(R) Gigabit Ethernet Network Driver";
-static const char igb_copyright[] = "Copyright (c) 2007-2012 Intel Corporation.";
+static const char igb_copyright[] =
+                               "Copyright (c) 2007-2013 Intel Corporation.";
 
 static const struct e1000_info *igb_info_tbl[] = {
        [board_82575] = &e1000_82575_info,
@@ -193,6 +195,7 @@ static const struct dev_pm_ops igb_pm_ops = {
 };
 #endif
 static void igb_shutdown(struct pci_dev *);
+static int igb_pci_sriov_configure(struct pci_dev *dev, int num_vfs);
 #ifdef CONFIG_IGB_DCA
 static int igb_notify_dca(struct notifier_block *, unsigned long, void *);
 static struct notifier_block dca_notifier = {
@@ -234,6 +237,7 @@ static struct pci_driver igb_driver = {
        .driver.pm = &igb_pm_ops,
 #endif
        .shutdown = igb_shutdown,
+       .sriov_configure = igb_pci_sriov_configure,
        .err_handler = &igb_err_handler
 };
 
@@ -565,6 +569,91 @@ exit:
        return;
 }
 
+/*  igb_get_i2c_data - Reads the I2C SDA data bit
+ *  @hw: pointer to hardware structure
+ *  @i2cctl: Current value of I2CCTL register
+ *
+ *  Returns the I2C data bit value
+ */
+static int igb_get_i2c_data(void *data)
+{
+       struct igb_adapter *adapter = (struct igb_adapter *)data;
+       struct e1000_hw *hw = &adapter->hw;
+       s32 i2cctl = rd32(E1000_I2CPARAMS);
+
+       return ((i2cctl & E1000_I2C_DATA_IN) != 0);
+}
+
+/* igb_set_i2c_data - Sets the I2C data bit
+ *  @data: pointer to hardware structure
+ *  @state: I2C data value (0 or 1) to set
+ *
+ *  Sets the I2C data bit
+ */
+static void igb_set_i2c_data(void *data, int state)
+{
+       struct igb_adapter *adapter = (struct igb_adapter *)data;
+       struct e1000_hw *hw = &adapter->hw;
+       s32 i2cctl = rd32(E1000_I2CPARAMS);
+
+       if (state)
+               i2cctl |= E1000_I2C_DATA_OUT;
+       else
+               i2cctl &= ~E1000_I2C_DATA_OUT;
+
+       i2cctl &= ~E1000_I2C_DATA_OE_N;
+       i2cctl |= E1000_I2C_CLK_OE_N;
+       wr32(E1000_I2CPARAMS, i2cctl);
+       wrfl();
+
+}
+
+/* igb_set_i2c_clk - Sets the I2C SCL clock
+ *  @data: pointer to hardware structure
+ *  @state: state to set clock
+ *
+ *  Sets the I2C clock line to state
+ */
+static void igb_set_i2c_clk(void *data, int state)
+{
+       struct igb_adapter *adapter = (struct igb_adapter *)data;
+       struct e1000_hw *hw = &adapter->hw;
+       s32 i2cctl = rd32(E1000_I2CPARAMS);
+
+       if (state) {
+               i2cctl |= E1000_I2C_CLK_OUT;
+               i2cctl &= ~E1000_I2C_CLK_OE_N;
+       } else {
+               i2cctl &= ~E1000_I2C_CLK_OUT;
+               i2cctl &= ~E1000_I2C_CLK_OE_N;
+       }
+       wr32(E1000_I2CPARAMS, i2cctl);
+       wrfl();
+}
+
+/* igb_get_i2c_clk - Gets the I2C SCL clock state
+ *  @data: pointer to hardware structure
+ *
+ *  Gets the I2C clock state
+ */
+static int igb_get_i2c_clk(void *data)
+{
+       struct igb_adapter *adapter = (struct igb_adapter *)data;
+       struct e1000_hw *hw = &adapter->hw;
+       s32 i2cctl = rd32(E1000_I2CPARAMS);
+
+       return ((i2cctl & E1000_I2C_CLK_IN) != 0);
+}
+
+static const struct i2c_algo_bit_data igb_i2c_algo = {
+       .setsda         = igb_set_i2c_data,
+       .setscl         = igb_set_i2c_clk,
+       .getsda         = igb_get_i2c_data,
+       .getscl         = igb_get_i2c_clk,
+       .udelay         = 5,
+       .timeout        = 20,
+};
+
 /**
  * igb_get_hw_dev - return device
  * used by hardware layer to print debugging information
@@ -1708,6 +1797,18 @@ void igb_reset(struct igb_adapter *adapter)
                igb_force_mac_fc(hw);
 
        igb_init_dmac(adapter, pba);
+#ifdef CONFIG_IGB_HWMON
+       /* Re-initialize the thermal sensor on i350 devices. */
+       if (!test_bit(__IGB_DOWN, &adapter->state)) {
+               if (mac->type == e1000_i350 && hw->bus.func == 0) {
+                       /* If present, re-initialize the external thermal sensor
+                        * interface.
+                        */
+                       if (adapter->ets)
+                               mac->ops.init_thermal_sensor_thresh(hw);
+               }
+       }
+#endif
        if (!netif_running(adapter->netdev))
                igb_power_down_link(adapter);
 
@@ -1822,6 +1923,37 @@ void igb_set_fw_version(struct igb_adapter *adapter)
        return;
 }
 
+static const struct i2c_board_info i350_sensor_info = {
+       I2C_BOARD_INFO("i350bb", 0Xf8),
+};
+
+/*  igb_init_i2c - Init I2C interface
+ *  @adapter: pointer to adapter structure
+ *
+ */
+static s32 igb_init_i2c(struct igb_adapter *adapter)
+{
+       s32 status = E1000_SUCCESS;
+
+       /* I2C interface supported on i350 devices */
+       if (adapter->hw.mac.type != e1000_i350)
+               return E1000_SUCCESS;
+
+       /* Initialize the i2c bus which is controlled by the registers.
+        * This bus will use the i2c_algo_bit structue that implements
+        * the protocol through toggling of the 4 bits in the register.
+        */
+       adapter->i2c_adap.owner = THIS_MODULE;
+       adapter->i2c_algo = igb_i2c_algo;
+       adapter->i2c_algo.data = adapter;
+       adapter->i2c_adap.algo_data = &adapter->i2c_algo;
+       adapter->i2c_adap.dev.parent = &adapter->pdev->dev;
+       strlcpy(adapter->i2c_adap.name, "igb BB",
+               sizeof(adapter->i2c_adap.name));
+       status = i2c_bit_add_bus(&adapter->i2c_adap);
+       return status;
+}
+
 /**
  * igb_probe - Device Initialization Routine
  * @pdev: PCI device information struct
@@ -2022,9 +2154,8 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                dev_err(&pdev->dev, "NVM Read Error\n");
 
        memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);
-       memcpy(netdev->perm_addr, hw->mac.addr, netdev->addr_len);
 
-       if (!is_valid_ether_addr(netdev->perm_addr)) {
+       if (!is_valid_ether_addr(netdev->dev_addr)) {
                dev_err(&pdev->dev, "Invalid MAC Address\n");
                err = -EIO;
                goto err_eeprom;
@@ -2115,6 +2246,13 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* reset the hardware with the new settings */
        igb_reset(adapter);
 
+       /* Init the I2C interface */
+       err = igb_init_i2c(adapter);
+       if (err) {
+               dev_err(&pdev->dev, "failed to init i2c interface\n");
+               goto err_eeprom;
+       }
+
        /* let the f/w know that the h/w is now under the control of the
         * driver. */
        igb_get_hw_control(adapter);
@@ -2135,7 +2273,27 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
 #endif
+#ifdef CONFIG_IGB_HWMON
+       /* Initialize the thermal sensor on i350 devices. */
+       if (hw->mac.type == e1000_i350 && hw->bus.func == 0) {
+               u16 ets_word;
 
+               /*
+                * Read the NVM to determine if this i350 device supports an
+                * external thermal sensor.
+                */
+               hw->nvm.ops.read(hw, NVM_ETS_CFG, 1, &ets_word);
+               if (ets_word != 0x0000 && ets_word != 0xFFFF)
+                       adapter->ets = true;
+               else
+                       adapter->ets = false;
+               if (igb_sysfs_init(adapter))
+                       dev_err(&pdev->dev,
+                               "failed to allocate sysfs resources\n");
+       } else {
+               adapter->ets = false;
+       }
+#endif
        /* do hw tstamp init after resetting */
        igb_ptp_init(adapter);
 
@@ -2176,6 +2334,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 err_register:
        igb_release_hw_control(adapter);
+       memset(&adapter->i2c_adap, 0, sizeof(adapter->i2c_adap));
 err_eeprom:
        if (!igb_check_reset_block(hw))
                igb_reset_phy(hw);
@@ -2196,6 +2355,111 @@ err_dma:
        return err;
 }
 
+#ifdef CONFIG_PCI_IOV
+static int  igb_disable_sriov(struct pci_dev *pdev)
+{
+       struct net_device *netdev = pci_get_drvdata(pdev);
+       struct igb_adapter *adapter = netdev_priv(netdev);
+       struct e1000_hw *hw = &adapter->hw;
+
+       /* reclaim resources allocated to VFs */
+       if (adapter->vf_data) {
+               /* disable iov and allow time for transactions to clear */
+               if (igb_vfs_are_assigned(adapter)) {
+                       dev_warn(&pdev->dev,
+                                "Cannot deallocate SR-IOV virtual functions while they are assigned - VFs will not be deallocated\n");
+                       return -EPERM;
+               } else {
+                       pci_disable_sriov(pdev);
+                       msleep(500);
+               }
+
+               kfree(adapter->vf_data);
+               adapter->vf_data = NULL;
+               adapter->vfs_allocated_count = 0;
+               wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ);
+               wrfl();
+               msleep(100);
+               dev_info(&pdev->dev, "IOV Disabled\n");
+
+               /* Re-enable DMA Coalescing flag since IOV is turned off */
+               adapter->flags |= IGB_FLAG_DMAC;
+       }
+
+       return 0;
+}
+
+static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
+{
+       struct net_device *netdev = pci_get_drvdata(pdev);
+       struct igb_adapter *adapter = netdev_priv(netdev);
+       int old_vfs = pci_num_vf(pdev);
+       int err = 0;
+       int i;
+
+       if (!num_vfs)
+               goto out;
+       else if (old_vfs && old_vfs == num_vfs)
+               goto out;
+       else if (old_vfs && old_vfs != num_vfs)
+               err = igb_disable_sriov(pdev);
+
+       if (err)
+               goto out;
+
+       if (num_vfs > 7) {
+               err = -EPERM;
+               goto out;
+       }
+
+       adapter->vfs_allocated_count = num_vfs;
+
+       adapter->vf_data = kcalloc(adapter->vfs_allocated_count,
+                               sizeof(struct vf_data_storage), GFP_KERNEL);
+
+       /* if allocation failed then we do not support SR-IOV */
+       if (!adapter->vf_data) {
+               adapter->vfs_allocated_count = 0;
+               dev_err(&pdev->dev,
+                       "Unable to allocate memory for VF Data Storage\n");
+               err = -ENOMEM;
+               goto out;
+       }
+
+       err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
+       if (err)
+               goto err_out;
+
+       dev_info(&pdev->dev, "%d VFs allocated\n",
+                adapter->vfs_allocated_count);
+       for (i = 0; i < adapter->vfs_allocated_count; i++)
+               igb_vf_configure(adapter, i);
+
+       /* DMA Coalescing is not supported in IOV mode. */
+       adapter->flags &= ~IGB_FLAG_DMAC;
+       goto out;
+
+err_out:
+       kfree(adapter->vf_data);
+       adapter->vf_data = NULL;
+       adapter->vfs_allocated_count = 0;
+out:
+       return err;
+}
+
+#endif
+/*
+ *  igb_remove_i2c - Cleanup  I2C interface
+ *  @adapter: pointer to adapter structure
+ *
+ */
+static void igb_remove_i2c(struct igb_adapter *adapter)
+{
+
+       /* free the adapter bus structure */
+       i2c_del_adapter(&adapter->i2c_adap);
+}
+
 /**
  * igb_remove - Device Removal Routine
  * @pdev: PCI device information struct
@@ -2212,8 +2476,11 @@ static void igb_remove(struct pci_dev *pdev)
        struct e1000_hw *hw = &adapter->hw;
 
        pm_runtime_get_noresume(&pdev->dev);
+#ifdef CONFIG_IGB_HWMON
+       igb_sysfs_exit(adapter);
+#endif
+       igb_remove_i2c(adapter);
        igb_ptp_stop(adapter);
-
        /*
         * The watchdog timer may be rescheduled, so explicitly
         * disable watchdog from being rescheduled.
@@ -2243,23 +2510,7 @@ static void igb_remove(struct pci_dev *pdev)
        igb_clear_interrupt_scheme(adapter);
 
 #ifdef CONFIG_PCI_IOV
-       /* reclaim resources allocated to VFs */
-       if (adapter->vf_data) {
-               /* disable iov and allow time for transactions to clear */
-               if (igb_vfs_are_assigned(adapter)) {
-                       dev_info(&pdev->dev, "Unloading driver while VFs are assigned - VFs will not be deallocated\n");
-               } else {
-                       pci_disable_sriov(pdev);
-                       msleep(500);
-               }
-
-               kfree(adapter->vf_data);
-               adapter->vf_data = NULL;
-               wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ);
-               wrfl();
-               msleep(100);
-               dev_info(&pdev->dev, "IOV Disabled\n");
-       }
+       igb_disable_sriov(pdev);
 #endif
 
        iounmap(hw->hw_addr);
@@ -2290,103 +2541,22 @@ static void igb_probe_vfs(struct igb_adapter *adapter)
 #ifdef CONFIG_PCI_IOV
        struct pci_dev *pdev = adapter->pdev;
        struct e1000_hw *hw = &adapter->hw;
-       int old_vfs = pci_num_vf(adapter->pdev);
-       int i;
 
        /* Virtualization features not supported on i210 family. */
        if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211))
                return;
 
-       if (old_vfs) {
-               dev_info(&pdev->dev, "%d pre-allocated VFs found - override "
-                        "max_vfs setting of %d\n", old_vfs, max_vfs);
-               adapter->vfs_allocated_count = old_vfs;
-       }
-
-       if (!adapter->vfs_allocated_count)
-               return;
-
-       adapter->vf_data = kcalloc(adapter->vfs_allocated_count,
-                               sizeof(struct vf_data_storage), GFP_KERNEL);
+       igb_enable_sriov(pdev, max_vfs);
+       pci_sriov_set_totalvfs(pdev, 7);
 
-       /* if allocation failed then we do not support SR-IOV */
-       if (!adapter->vf_data) {
-               adapter->vfs_allocated_count = 0;
-               dev_err(&pdev->dev, "Unable to allocate memory for VF "
-                       "Data Storage\n");
-               goto out;
-       }
-
-       if (!old_vfs) {
-               if (pci_enable_sriov(pdev, adapter->vfs_allocated_count))
-                       goto err_out;
-       }
-       dev_info(&pdev->dev, "%d VFs allocated\n",
-                adapter->vfs_allocated_count);
-       for (i = 0; i < adapter->vfs_allocated_count; i++)
-               igb_vf_configure(adapter, i);
-
-       /* DMA Coalescing is not supported in IOV mode. */
-       adapter->flags &= ~IGB_FLAG_DMAC;
-       goto out;
-err_out:
-       kfree(adapter->vf_data);
-       adapter->vf_data = NULL;
-       adapter->vfs_allocated_count = 0;
-out:
-       return;
 #endif /* CONFIG_PCI_IOV */
 }
 
-/**
- * igb_sw_init - Initialize general software structures (struct igb_adapter)
- * @adapter: board private structure to initialize
- *
- * igb_sw_init initializes the Adapter private data structure.
- * Fields are initialized based on PCI device information and
- * OS network device settings (MTU size).
- **/
-static int igb_sw_init(struct igb_adapter *adapter)
+static void igb_init_queue_configuration(struct igb_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
-       struct net_device *netdev = adapter->netdev;
-       struct pci_dev *pdev = adapter->pdev;
        u32 max_rss_queues;
 
-       pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
-
-       /* set default ring sizes */
-       adapter->tx_ring_count = IGB_DEFAULT_TXD;
-       adapter->rx_ring_count = IGB_DEFAULT_RXD;
-
-       /* set default ITR values */
-       adapter->rx_itr_setting = IGB_DEFAULT_ITR;
-       adapter->tx_itr_setting = IGB_DEFAULT_ITR;
-
-       /* set default work limits */
-       adapter->tx_work_limit = IGB_DEFAULT_TX_WORK;
-
-       adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN +
-                                 VLAN_HLEN;
-       adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
-
-       spin_lock_init(&adapter->stats64_lock);
-#ifdef CONFIG_PCI_IOV
-       switch (hw->mac.type) {
-       case e1000_82576:
-       case e1000_i350:
-               if (max_vfs > 7) {
-                       dev_warn(&pdev->dev,
-                                "Maximum of 7 VFs per PF, using max\n");
-                       adapter->vfs_allocated_count = 7;
-               } else
-                       adapter->vfs_allocated_count = max_vfs;
-               break;
-       default:
-               break;
-       }
-#endif /* CONFIG_PCI_IOV */
-
        /* Determine the maximum number of RSS queues supported. */
        switch (hw->mac.type) {
        case e1000_i211:
@@ -2445,6 +2615,60 @@ static int igb_sw_init(struct igb_adapter *adapter)
                        adapter->flags |= IGB_FLAG_QUEUE_PAIRS;
                break;
        }
+}
+
+/**
+ * igb_sw_init - Initialize general software structures (struct igb_adapter)
+ * @adapter: board private structure to initialize
+ *
+ * igb_sw_init initializes the Adapter private data structure.
+ * Fields are initialized based on PCI device information and
+ * OS network device settings (MTU size).
+ **/
+static int igb_sw_init(struct igb_adapter *adapter)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       struct net_device *netdev = adapter->netdev;
+       struct pci_dev *pdev = adapter->pdev;
+
+       pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
+
+       /* set default ring sizes */
+       adapter->tx_ring_count = IGB_DEFAULT_TXD;
+       adapter->rx_ring_count = IGB_DEFAULT_RXD;
+
+       /* set default ITR values */
+       adapter->rx_itr_setting = IGB_DEFAULT_ITR;
+       adapter->tx_itr_setting = IGB_DEFAULT_ITR;
+
+       /* set default work limits */
+       adapter->tx_work_limit = IGB_DEFAULT_TX_WORK;
+
+       adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN +
+                                 VLAN_HLEN;
+       adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
+
+       spin_lock_init(&adapter->stats64_lock);
+#ifdef CONFIG_PCI_IOV
+       switch (hw->mac.type) {
+       case e1000_82576:
+       case e1000_i350:
+               if (max_vfs > 7) {
+                       dev_warn(&pdev->dev,
+                                "Maximum of 7 VFs per PF, using max\n");
+                       adapter->vfs_allocated_count = 7;
+               } else
+                       adapter->vfs_allocated_count = max_vfs;
+               if (adapter->vfs_allocated_count)
+                       dev_warn(&pdev->dev,
+                                "Enabling SR-IOV VFs using the module parameter is deprecated - please use the pci sysfs interface.\n");
+               break;
+       default:
+               break;
+       }
+#endif /* CONFIG_PCI_IOV */
+
+       igb_init_queue_configuration(adapter);
 
        /* Setup and initialize a copy of the hw vlan table array */
        adapter->shadow_vfta = kzalloc(sizeof(u32) *
@@ -3768,6 +3992,7 @@ static void igb_watchdog_task(struct work_struct *work)
        }
 
        igb_spoof_check(adapter);
+       igb_ptp_rx_hang(adapter);
 
        /* Reset the timer */
        if (!test_bit(__IGB_DOWN, &adapter->state))
@@ -4387,12 +4612,15 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
        first->bytecount = skb->len;
        first->gso_segs = 1;
 
+       skb_tx_timestamp(skb);
+
        if (unlikely((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
                     !(adapter->ptp_tx_skb))) {
                skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
                tx_flags |= IGB_TX_FLAGS_TSTAMP;
 
                adapter->ptp_tx_skb = skb_get(skb);
+               adapter->ptp_tx_start = jiffies;
                if (adapter->hw.mac.type == e1000_82576)
                        schedule_work(&adapter->ptp_tx_work);
        }
@@ -5703,7 +5931,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
                        break;
 
                /* prevent any other reads prior to eop_desc */
-               rmb();
+               read_barrier_depends();
 
                /* if DD is not set pending work has not been completed */
                if (!(eop_desc->wb.status & cpu_to_le32(E1000_TXD_STAT_DD)))
@@ -6903,6 +7131,72 @@ static void igb_shutdown(struct pci_dev *pdev)
        }
 }
 
+#ifdef CONFIG_PCI_IOV
+static int igb_sriov_reinit(struct pci_dev *dev)
+{
+       struct net_device *netdev = pci_get_drvdata(dev);
+       struct igb_adapter *adapter = netdev_priv(netdev);
+       struct pci_dev *pdev = adapter->pdev;
+
+       rtnl_lock();
+
+       if (netif_running(netdev))
+               igb_close(netdev);
+
+       igb_clear_interrupt_scheme(adapter);
+
+       igb_init_queue_configuration(adapter);
+
+       if (igb_init_interrupt_scheme(adapter, true)) {
+               dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
+               return -ENOMEM;
+       }
+
+       if (netif_running(netdev))
+               igb_open(netdev);
+
+       rtnl_unlock();
+
+       return 0;
+}
+
+static int igb_pci_disable_sriov(struct pci_dev *dev)
+{
+       int err = igb_disable_sriov(dev);
+
+       if (!err)
+               err = igb_sriov_reinit(dev);
+
+       return err;
+}
+
+static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs)
+{
+       int err = igb_enable_sriov(dev, num_vfs);
+
+       if (err)
+               goto out;
+
+       err = igb_sriov_reinit(dev);
+       if (!err)
+               return num_vfs;
+
+out:
+       return err;
+}
+
+#endif
+static int igb_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
+{
+#ifdef CONFIG_PCI_IOV
+       if (num_vfs == 0)
+               return igb_pci_disable_sriov(dev);
+       else
+               return igb_pci_enable_sriov(dev, num_vfs);
+#endif
+       return 0;
+}
+
 #ifdef CONFIG_NET_POLL_CONTROLLER
 /*
  * Polling 'interrupt' - used by things like netconsole to send skbs
@@ -7308,4 +7602,138 @@ static void igb_init_dmac(struct igb_adapter *adapter, u32 pba)
        }
 }
 
+static DEFINE_SPINLOCK(i2c_clients_lock);
+
+/*  igb_get_i2c_client - returns matching client
+ *  in adapters's client list.
+ *  @adapter: adapter struct
+ *  @dev_addr: device address of i2c needed.
+ */
+struct i2c_client *
+igb_get_i2c_client(struct igb_adapter *adapter, u8 dev_addr)
+{
+       ulong flags;
+       struct igb_i2c_client_list *client_list;
+       struct i2c_client *client = NULL;
+       struct i2c_board_info client_info = {
+               I2C_BOARD_INFO("igb", 0x00),
+       };
+
+       spin_lock_irqsave(&i2c_clients_lock, flags);
+       client_list = adapter->i2c_clients;
+
+       /* See if we already have an i2c_client */
+       while (client_list) {
+               if (client_list->client->addr == (dev_addr >> 1)) {
+                       client = client_list->client;
+                       goto exit;
+               } else {
+                       client_list = client_list->next;
+               }
+       }
+
+       /* no client_list found, create a new one as long as
+        * irqs are not disabled
+        */
+       if (unlikely(irqs_disabled()))
+               goto exit;
+
+       client_list = kzalloc(sizeof(*client_list), GFP_KERNEL);
+       if (client_list == NULL)
+               goto exit;
+
+       /* dev_addr passed to us is left-shifted by 1 bit
+        * i2c_new_device call expects it to be flush to the right.
+        */
+       client_info.addr = dev_addr >> 1;
+       client_info.platform_data = adapter;
+       client_list->client = i2c_new_device(&adapter->i2c_adap, &client_info);
+       if (client_list->client == NULL) {
+               dev_info(&adapter->pdev->dev,
+                       "Failed to create new i2c device..\n");
+               goto err_no_client;
+       }
+
+       /* insert new client at head of list */
+       client_list->next = adapter->i2c_clients;
+       adapter->i2c_clients = client_list;
+
+       client = client_list->client;
+       goto exit;
+
+err_no_client:
+       kfree(client_list);
+exit:
+       spin_unlock_irqrestore(&i2c_clients_lock, flags);
+       return client;
+}
+
+/*  igb_read_i2c_byte - Reads 8 bit word over I2C
+ *  @hw: pointer to hardware structure
+ *  @byte_offset: byte offset to read
+ *  @dev_addr: device address
+ *  @data: value read
+ *
+ *  Performs byte read operation over I2C interface at
+ *  a specified device address.
+ */
+s32 igb_read_i2c_byte(struct e1000_hw *hw, u8 byte_offset,
+                               u8 dev_addr, u8 *data)
+{
+       struct igb_adapter *adapter = container_of(hw, struct igb_adapter, hw);
+       struct i2c_client *this_client = igb_get_i2c_client(adapter, dev_addr);
+       s32 status;
+       u16 swfw_mask = 0;
+
+       if (!this_client)
+               return E1000_ERR_I2C;
+
+       swfw_mask = E1000_SWFW_PHY0_SM;
+
+       if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask)
+           != E1000_SUCCESS)
+               return E1000_ERR_SWFW_SYNC;
+
+       status = i2c_smbus_read_byte_data(this_client, byte_offset);
+       hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+
+       if (status < 0)
+               return E1000_ERR_I2C;
+       else {
+               *data = status;
+               return E1000_SUCCESS;
+       }
+}
+
+/*  igb_write_i2c_byte - Writes 8 bit word over I2C
+ *  @hw: pointer to hardware structure
+ *  @byte_offset: byte offset to write
+ *  @dev_addr: device address
+ *  @data: value to write
+ *
+ *  Performs byte write operation over I2C interface at
+ *  a specified device address.
+ */
+s32 igb_write_i2c_byte(struct e1000_hw *hw, u8 byte_offset,
+                                u8 dev_addr, u8 data)
+{
+       struct igb_adapter *adapter = container_of(hw, struct igb_adapter, hw);
+       struct i2c_client *this_client = igb_get_i2c_client(adapter, dev_addr);
+       s32 status;
+       u16 swfw_mask = E1000_SWFW_PHY0_SM;
+
+       if (!this_client)
+               return E1000_ERR_I2C;
+
+       if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != E1000_SUCCESS)
+               return E1000_ERR_SWFW_SYNC;
+       status = i2c_smbus_write_byte_data(this_client, byte_offset, data);
+       hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+
+       if (status)
+               return E1000_ERR_I2C;
+       else
+               return E1000_SUCCESS;
+
+}
 /* igb_main.c */
index ab3429729bde4134a0310a6199cf9eb1737369b6..0987822359f00590d7f36bc5e126c8a4f20ee1ac 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/module.h>
 #include <linux/device.h>
 #include <linux/pci.h>
+#include <linux/ptp_classify.h>
 
 #include "igb.h"
 
@@ -70,6 +71,7 @@
  */
 
 #define IGB_SYSTIM_OVERFLOW_PERIOD     (HZ * 60 * 9)
+#define IGB_PTP_TX_TIMEOUT             (HZ * 15)
 #define INCPERIOD_82576                        (1 << E1000_TIMINCA_16NS_SHIFT)
 #define INCVALUE_82576_MASK            ((1 << E1000_TIMINCA_16NS_SHIFT) - 1)
 #define INCVALUE_82576                 (16 << IGB_82576_TSYNC_SHIFT)
@@ -396,6 +398,15 @@ void igb_ptp_tx_work(struct work_struct *work)
        if (!adapter->ptp_tx_skb)
                return;
 
+       if (time_is_before_jiffies(adapter->ptp_tx_start +
+                                  IGB_PTP_TX_TIMEOUT)) {
+               dev_kfree_skb_any(adapter->ptp_tx_skb);
+               adapter->ptp_tx_skb = NULL;
+               adapter->tx_hwtstamp_timeouts++;
+               dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang");
+               return;
+       }
+
        tsynctxctl = rd32(E1000_TSYNCTXCTL);
        if (tsynctxctl & E1000_TSYNCTXCTL_VALID)
                igb_ptp_tx_hwtstamp(adapter);
@@ -418,6 +429,51 @@ static void igb_ptp_overflow_check(struct work_struct *work)
                              IGB_SYSTIM_OVERFLOW_PERIOD);
 }
 
+/**
+ * igb_ptp_rx_hang - detect error case when Rx timestamp registers latched
+ * @adapter: private network adapter structure
+ *
+ * This watchdog task is scheduled to detect error case where hardware has
+ * dropped an Rx packet that was timestamped when the ring is full. The
+ * particular error is rare but leaves the device in a state unable to timestamp
+ * any future packets.
+ */
+void igb_ptp_rx_hang(struct igb_adapter *adapter)
+{
+       struct e1000_hw *hw = &adapter->hw;
+       struct igb_ring *rx_ring;
+       u32 tsyncrxctl = rd32(E1000_TSYNCRXCTL);
+       unsigned long rx_event;
+       int n;
+
+       if (hw->mac.type != e1000_82576)
+               return;
+
+       /* If we don't have a valid timestamp in the registers, just update the
+        * timeout counter and exit
+        */
+       if (!(tsyncrxctl & E1000_TSYNCRXCTL_VALID)) {
+               adapter->last_rx_ptp_check = jiffies;
+               return;
+       }
+
+       /* Determine the most recent watchdog or rx_timestamp event */
+       rx_event = adapter->last_rx_ptp_check;
+       for (n = 0; n < adapter->num_rx_queues; n++) {
+               rx_ring = adapter->rx_ring[n];
+               if (time_after(rx_ring->last_rx_timestamp, rx_event))
+                       rx_event = rx_ring->last_rx_timestamp;
+       }
+
+       /* Only need to read the high RXSTMP register to clear the lock */
+       if (time_is_before_jiffies(rx_event + 5 * HZ)) {
+               rd32(E1000_RXSTMPH);
+               adapter->last_rx_ptp_check = jiffies;
+               adapter->rx_hwtstamp_cleared++;
+               dev_warn(&adapter->pdev->dev, "clearing Rx timestamp hang");
+       }
+}
+
 /**
  * igb_ptp_tx_hwtstamp - utility function which checks for TX time stamp
  * @adapter: Board private structure.
@@ -643,7 +699,6 @@ int igb_ptp_hwtstamp_ioctl(struct net_device *netdev,
        else
                wr32(E1000_ETQF(3), 0);
 
-#define PTP_PORT 319
        /* L4 Queue Filter[3]: filter by destination port and protocol */
        if (is_l4) {
                u32 ftqf = (IPPROTO_UDP /* UDP */
@@ -652,12 +707,12 @@ int igb_ptp_hwtstamp_ioctl(struct net_device *netdev,
                        | E1000_FTQF_MASK); /* mask all inputs */
                ftqf &= ~E1000_FTQF_MASK_PROTO_BP; /* enable protocol check */
 
-               wr32(E1000_IMIR(3), htons(PTP_PORT));
+               wr32(E1000_IMIR(3), htons(PTP_EV_PORT));
                wr32(E1000_IMIREXT(3),
                     (E1000_IMIREXT_SIZE_BP | E1000_IMIREXT_CTRL_BP));
                if (hw->mac.type == e1000_82576) {
                        /* enable source port check */
-                       wr32(E1000_SPQF(3), htons(PTP_PORT));
+                       wr32(E1000_SPQF(3), htons(PTP_EV_PORT));
                        ftqf &= ~E1000_FTQF_MASK_SOURCE_PORT_BP;
                }
                wr32(E1000_FTQF(3), ftqf);
@@ -801,6 +856,10 @@ void igb_ptp_stop(struct igb_adapter *adapter)
        }
 
        cancel_work_sync(&adapter->ptp_tx_work);
+       if (adapter->ptp_tx_skb) {
+               dev_kfree_skb_any(adapter->ptp_tx_skb);
+               adapter->ptp_tx_skb = NULL;
+       }
 
        if (adapter->ptp_clock) {
                ptp_clock_unregister(adapter->ptp_clock);
index 53281ff17315316b15b423d68b2911bb5bfdc04f..8f66d459218f1b43c50f7572c06ad6aca2a1cd61 100644 (file)
@@ -2757,8 +2757,6 @@ static int igbvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_hw_init;
        }
 
-       memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
-
        setup_timer(&adapter->watchdog_timer, &igbvf_watchdog,
                    (unsigned long) adapter);
 
index ae96c10251be9c0ac64c7ca25a72993ae7eae22c..c7564123dd311b06af9a59adbe48d547ce69e08a 100644 (file)
@@ -500,9 +500,8 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        ixgb_get_ee_mac_addr(&adapter->hw, netdev->dev_addr);
-       memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
 
-       if (!is_valid_ether_addr(netdev->perm_addr)) {
+       if (!is_valid_ether_addr(netdev->dev_addr)) {
                netif_err(adapter, probe, adapter->netdev, "Invalid MAC Address\n");
                err = -EIO;
                goto err_eeprom;
index 8e786764c60ea186084a7c5b18e9641abeef2a0e..f94c085a9c0b1898fd942b98e73530c4cbad749d 100644 (file)
 /* How many Rx Buffers do we bundle into one write to the hardware ? */
 #define IXGBE_RX_BUFFER_WRITE  16      /* Must be power of 2 */
 
-#define IXGBE_TX_FLAGS_CSUM            (u32)(1)
-#define IXGBE_TX_FLAGS_HW_VLAN         (u32)(1 << 1)
-#define IXGBE_TX_FLAGS_SW_VLAN         (u32)(1 << 2)
-#define IXGBE_TX_FLAGS_TSO             (u32)(1 << 3)
-#define IXGBE_TX_FLAGS_IPV4            (u32)(1 << 4)
-#define IXGBE_TX_FLAGS_FCOE            (u32)(1 << 5)
-#define IXGBE_TX_FLAGS_FSO             (u32)(1 << 6)
-#define IXGBE_TX_FLAGS_TXSW            (u32)(1 << 7)
-#define IXGBE_TX_FLAGS_TSTAMP          (u32)(1 << 8)
-#define IXGBE_TX_FLAGS_NO_IFCS         (u32)(1 << 9)
+enum ixgbe_tx_flags {
+       /* cmd_type flags */
+       IXGBE_TX_FLAGS_HW_VLAN  = 0x01,
+       IXGBE_TX_FLAGS_TSO      = 0x02,
+       IXGBE_TX_FLAGS_TSTAMP   = 0x04,
+
+       /* olinfo flags */
+       IXGBE_TX_FLAGS_CC       = 0x08,
+       IXGBE_TX_FLAGS_IPV4     = 0x10,
+       IXGBE_TX_FLAGS_CSUM     = 0x20,
+
+       /* software defined flags */
+       IXGBE_TX_FLAGS_SW_VLAN  = 0x40,
+       IXGBE_TX_FLAGS_FCOE     = 0x80,
+};
+
+/* VLAN info */
 #define IXGBE_TX_FLAGS_VLAN_MASK       0xffff0000
 #define IXGBE_TX_FLAGS_VLAN_PRIO_MASK  0xe0000000
 #define IXGBE_TX_FLAGS_VLAN_PRIO_SHIFT  29
index f1e002d5fa8f5dfb53c9d865dab1fd558bf7ea7b..6718fb42ce1a60e8f59dcd1bcd5e69753d7edc9e 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/dcbnl.h>
 #include "ixgbe_dcb_82598.h"
 #include "ixgbe_dcb_82599.h"
+#include "ixgbe_sriov.h"
 
 /* Callbacks for DCB netlink in the kernel */
 #define BIT_DCB_MODE   0x01
@@ -643,9 +644,11 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
                return err;
 
        err = dcb_ieee_setapp(dev, app);
+       if (err)
+               return err;
 
 #ifdef IXGBE_FCOE
-       if (!err && app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
+       if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
            app->protocol == ETH_P_FCOE) {
                u8 app_mask = dcb_ieee_getapp_mask(dev, app);
 
@@ -656,6 +659,23 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
                ixgbe_dcbnl_devreset(dev);
        }
 #endif
+
+       /* VF devices should use default UP when available */
+       if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
+           app->protocol == 0) {
+               int vf;
+
+               adapter->default_up = app->priority;
+
+               for (vf = 0; vf < adapter->num_vfs; vf++) {
+                       struct vf_data_storage *vfinfo = &adapter->vfinfo[vf];
+
+                       if (!vfinfo->pf_qos)
+                               ixgbe_set_vmvir(adapter, vfinfo->pf_vlan,
+                                               app->priority, vf);
+               }
+       }
+
        return 0;
 }
 
@@ -683,6 +703,24 @@ static int ixgbe_dcbnl_ieee_delapp(struct net_device *dev,
                ixgbe_dcbnl_devreset(dev);
        }
 #endif
+       /* IF default priority is being removed clear VF default UP */
+       if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
+           app->protocol == 0 && adapter->default_up == app->priority) {
+               int vf;
+               long unsigned int app_mask = dcb_ieee_getapp_mask(dev, app);
+               int qos = app_mask ? find_first_bit(&app_mask, 8) : 0;
+
+               adapter->default_up = qos;
+
+               for (vf = 0; vf < adapter->num_vfs; vf++) {
+                       struct vf_data_storage *vfinfo = &adapter->vfinfo[vf];
+
+                       if (!vfinfo->pf_qos)
+                               ixgbe_set_vmvir(adapter, vfinfo->pf_vlan,
+                                               qos, vf);
+               }
+       }
+
        return err;
 }
 
index 252850d9a3e0925b45bcb3524dd7c6e490540616..496836765df8868990241f9e026c5f9e67e6a0da 100644 (file)
@@ -544,15 +544,14 @@ int ixgbe_fso(struct ixgbe_ring *tx_ring,
                first->gso_segs = DIV_ROUND_UP(skb->len - *hdr_len,
                                               skb_shinfo(skb)->gso_size);
                first->bytecount += (first->gso_segs - 1) * *hdr_len;
-               first->tx_flags |= IXGBE_TX_FLAGS_FSO;
+               first->tx_flags |= IXGBE_TX_FLAGS_TSO;
        }
 
        /* set flag indicating FCOE to ixgbe_tx_map call */
-       first->tx_flags |= IXGBE_TX_FLAGS_FCOE;
+       first->tx_flags |= IXGBE_TX_FLAGS_FCOE | IXGBE_TX_FLAGS_CC;
 
-       /* mss_l4len_id: use 1 for FSO as TSO, no need for L4LEN */
+       /* mss_l4len_id: use 0 for FSO as TSO, no need for L4LEN */
        mss_l4len_idx = skb_shinfo(skb)->gso_size << IXGBE_ADVTXD_MSS_SHIFT;
-       mss_l4len_idx |= 1 << IXGBE_ADVTXD_IDX_SHIFT;
 
        /* vlan_macip_lens: HEADLEN, MACLEN, VLAN tag */
        vlan_macip_lens = skb_transport_offset(skb) +
index 20a5af6d87d0e8747027964ba01a03bd7e3ca24c..e7109de2204aecb75615bef77828ffe734646eb1 100644 (file)
@@ -5899,6 +5899,9 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,
        u32 vlan_macip_lens, type_tucmd;
        u32 mss_l4len_idx, l4len;
 
+       if (skb->ip_summed != CHECKSUM_PARTIAL)
+               return 0;
+
        if (!skb_is_gso(skb))
                return 0;
 
@@ -5941,10 +5944,9 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,
        first->gso_segs = skb_shinfo(skb)->gso_segs;
        first->bytecount += (first->gso_segs - 1) * *hdr_len;
 
-       /* mss_l4len_id: use 1 as index for TSO */
+       /* mss_l4len_id: use 0 as index for TSO */
        mss_l4len_idx = l4len << IXGBE_ADVTXD_L4LEN_SHIFT;
        mss_l4len_idx |= skb_shinfo(skb)->gso_size << IXGBE_ADVTXD_MSS_SHIFT;
-       mss_l4len_idx |= 1 << IXGBE_ADVTXD_IDX_SHIFT;
 
        /* vlan_macip_lens: HEADLEN, MACLEN, VLAN tag */
        vlan_macip_lens = skb_network_header_len(skb);
@@ -5966,12 +5968,9 @@ static void ixgbe_tx_csum(struct ixgbe_ring *tx_ring,
        u32 type_tucmd = 0;
 
        if (skb->ip_summed != CHECKSUM_PARTIAL) {
-               if (!(first->tx_flags & IXGBE_TX_FLAGS_HW_VLAN)) {
-                       if (unlikely(skb->no_fcs))
-                               first->tx_flags |= IXGBE_TX_FLAGS_NO_IFCS;
-                       if (!(first->tx_flags & IXGBE_TX_FLAGS_TXSW))
-                               return;
-               }
+               if (!(first->tx_flags & IXGBE_TX_FLAGS_HW_VLAN) &&
+                   !(first->tx_flags & IXGBE_TX_FLAGS_CC))
+                       return;
        } else {
                u8 l4_hdr = 0;
                switch (first->protocol) {
@@ -6029,30 +6028,32 @@ static void ixgbe_tx_csum(struct ixgbe_ring *tx_ring,
                          type_tucmd, mss_l4len_idx);
 }
 
-static __le32 ixgbe_tx_cmd_type(u32 tx_flags)
+#define IXGBE_SET_FLAG(_input, _flag, _result) \
+       ((_flag <= _result) ? \
+        ((u32)(_input & _flag) * (_result / _flag)) : \
+        ((u32)(_input & _flag) / (_flag / _result)))
+
+static u32 ixgbe_tx_cmd_type(struct sk_buff *skb, u32 tx_flags)
 {
        /* set type for advanced descriptor with frame checksum insertion */
-       __le32 cmd_type = cpu_to_le32(IXGBE_ADVTXD_DTYP_DATA |
-                                     IXGBE_ADVTXD_DCMD_DEXT);
+       u32 cmd_type = IXGBE_ADVTXD_DTYP_DATA |
+                      IXGBE_ADVTXD_DCMD_DEXT |
+                      IXGBE_ADVTXD_DCMD_IFCS;
 
        /* set HW vlan bit if vlan is present */
-       if (tx_flags & IXGBE_TX_FLAGS_HW_VLAN)
-               cmd_type |= cpu_to_le32(IXGBE_ADVTXD_DCMD_VLE);
-
-       if (tx_flags & IXGBE_TX_FLAGS_TSTAMP)
-               cmd_type |= cpu_to_le32(IXGBE_ADVTXD_MAC_TSTAMP);
+       cmd_type |= IXGBE_SET_FLAG(tx_flags, IXGBE_TX_FLAGS_HW_VLAN,
+                                  IXGBE_ADVTXD_DCMD_VLE);
 
        /* set segmentation enable bits for TSO/FSO */
-#ifdef IXGBE_FCOE
-       if (tx_flags & (IXGBE_TX_FLAGS_TSO | IXGBE_TX_FLAGS_FSO))
-#else
-       if (tx_flags & IXGBE_TX_FLAGS_TSO)
-#endif
-               cmd_type |= cpu_to_le32(IXGBE_ADVTXD_DCMD_TSE);
+       cmd_type |= IXGBE_SET_FLAG(tx_flags, IXGBE_TX_FLAGS_TSO,
+                                  IXGBE_ADVTXD_DCMD_TSE);
+
+       /* set timestamp bit if present */
+       cmd_type |= IXGBE_SET_FLAG(tx_flags, IXGBE_TX_FLAGS_TSTAMP,
+                                  IXGBE_ADVTXD_MAC_TSTAMP);
 
        /* insert frame checksum */
-       if (!(tx_flags & IXGBE_TX_FLAGS_NO_IFCS))
-               cmd_type |= cpu_to_le32(IXGBE_ADVTXD_DCMD_IFCS);
+       cmd_type ^= IXGBE_SET_FLAG(skb->no_fcs, 1, IXGBE_ADVTXD_DCMD_IFCS);
 
        return cmd_type;
 }
@@ -6060,36 +6061,27 @@ static __le32 ixgbe_tx_cmd_type(u32 tx_flags)
 static void ixgbe_tx_olinfo_status(union ixgbe_adv_tx_desc *tx_desc,
                                   u32 tx_flags, unsigned int paylen)
 {
-       __le32 olinfo_status = cpu_to_le32(paylen << IXGBE_ADVTXD_PAYLEN_SHIFT);
+       u32 olinfo_status = paylen << IXGBE_ADVTXD_PAYLEN_SHIFT;
 
        /* enable L4 checksum for TSO and TX checksum offload */
-       if (tx_flags & IXGBE_TX_FLAGS_CSUM)
-               olinfo_status |= cpu_to_le32(IXGBE_ADVTXD_POPTS_TXSM);
+       olinfo_status |= IXGBE_SET_FLAG(tx_flags,
+                                       IXGBE_TX_FLAGS_CSUM,
+                                       IXGBE_ADVTXD_POPTS_TXSM);
 
        /* enble IPv4 checksum for TSO */
-       if (tx_flags & IXGBE_TX_FLAGS_IPV4)
-               olinfo_status |= cpu_to_le32(IXGBE_ADVTXD_POPTS_IXSM);
-
-       /* use index 1 context for TSO/FSO/FCOE */
-#ifdef IXGBE_FCOE
-       if (tx_flags & (IXGBE_TX_FLAGS_TSO | IXGBE_TX_FLAGS_FCOE))
-#else
-       if (tx_flags & IXGBE_TX_FLAGS_TSO)
-#endif
-               olinfo_status |= cpu_to_le32(1 << IXGBE_ADVTXD_IDX_SHIFT);
+       olinfo_status |= IXGBE_SET_FLAG(tx_flags,
+                                       IXGBE_TX_FLAGS_IPV4,
+                                       IXGBE_ADVTXD_POPTS_IXSM);
 
        /*
         * Check Context must be set if Tx switch is enabled, which it
         * always is for case where virtual functions are running
         */
-#ifdef IXGBE_FCOE
-       if (tx_flags & (IXGBE_TX_FLAGS_TXSW | IXGBE_TX_FLAGS_FCOE))
-#else
-       if (tx_flags & IXGBE_TX_FLAGS_TXSW)
-#endif
-               olinfo_status |= cpu_to_le32(IXGBE_ADVTXD_CC);
+       olinfo_status |= IXGBE_SET_FLAG(tx_flags,
+                                       IXGBE_TX_FLAGS_CC,
+                                       IXGBE_ADVTXD_CC);
 
-       tx_desc->read.olinfo_status = olinfo_status;
+       tx_desc->read.olinfo_status = cpu_to_le32(olinfo_status);
 }
 
 #define IXGBE_TXD_CMD (IXGBE_TXD_CMD_EOP | \
@@ -6099,22 +6091,22 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
                         struct ixgbe_tx_buffer *first,
                         const u8 hdr_len)
 {
-       dma_addr_t dma;
        struct sk_buff *skb = first->skb;
        struct ixgbe_tx_buffer *tx_buffer;
        union ixgbe_adv_tx_desc *tx_desc;
-       struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0];
-       unsigned int data_len = skb->data_len;
-       unsigned int size = skb_headlen(skb);
-       unsigned int paylen = skb->len - hdr_len;
+       struct skb_frag_struct *frag;
+       dma_addr_t dma;
+       unsigned int data_len, size;
        u32 tx_flags = first->tx_flags;
-       __le32 cmd_type;
+       u32 cmd_type = ixgbe_tx_cmd_type(skb, tx_flags);
        u16 i = tx_ring->next_to_use;
 
        tx_desc = IXGBE_TX_DESC(tx_ring, i);
 
-       ixgbe_tx_olinfo_status(tx_desc, tx_flags, paylen);
-       cmd_type = ixgbe_tx_cmd_type(tx_flags);
+       ixgbe_tx_olinfo_status(tx_desc, tx_flags, skb->len - hdr_len);
+
+       size = skb_headlen(skb);
+       data_len = skb->data_len;
 
 #ifdef IXGBE_FCOE
        if (tx_flags & IXGBE_TX_FLAGS_FCOE) {
@@ -6128,19 +6120,22 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
 
 #endif
        dma = dma_map_single(tx_ring->dev, skb->data, size, DMA_TO_DEVICE);
-       if (dma_mapping_error(tx_ring->dev, dma))
-               goto dma_error;
 
-       /* record length, and DMA address */
-       dma_unmap_len_set(first, len, size);
-       dma_unmap_addr_set(first, dma, dma);
+       tx_buffer = first;
 
-       tx_desc->read.buffer_addr = cpu_to_le64(dma);
+       for (frag = &skb_shinfo(skb)->frags[0];; frag++) {
+               if (dma_mapping_error(tx_ring->dev, dma))
+                       goto dma_error;
+
+               /* record length, and DMA address */
+               dma_unmap_len_set(tx_buffer, len, size);
+               dma_unmap_addr_set(tx_buffer, dma, dma);
+
+               tx_desc->read.buffer_addr = cpu_to_le64(dma);
 
-       for (;;) {
                while (unlikely(size > IXGBE_MAX_DATA_PER_TXD)) {
                        tx_desc->read.cmd_type_len =
-                               cmd_type | cpu_to_le32(IXGBE_MAX_DATA_PER_TXD);
+                               cpu_to_le32(cmd_type ^ IXGBE_MAX_DATA_PER_TXD);
 
                        i++;
                        tx_desc++;
@@ -6148,18 +6143,18 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
                                tx_desc = IXGBE_TX_DESC(tx_ring, 0);
                                i = 0;
                        }
+                       tx_desc->read.olinfo_status = 0;
 
                        dma += IXGBE_MAX_DATA_PER_TXD;
                        size -= IXGBE_MAX_DATA_PER_TXD;
 
                        tx_desc->read.buffer_addr = cpu_to_le64(dma);
-                       tx_desc->read.olinfo_status = 0;
                }
 
                if (likely(!data_len))
                        break;
 
-               tx_desc->read.cmd_type_len = cmd_type | cpu_to_le32(size);
+               tx_desc->read.cmd_type_len = cpu_to_le32(cmd_type ^ size);
 
                i++;
                tx_desc++;
@@ -6167,6 +6162,7 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
                        tx_desc = IXGBE_TX_DESC(tx_ring, 0);
                        i = 0;
                }
+               tx_desc->read.olinfo_status = 0;
 
 #ifdef IXGBE_FCOE
                size = min_t(unsigned int, data_len, skb_frag_size(frag));
@@ -6177,22 +6173,13 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
 
                dma = skb_frag_dma_map(tx_ring->dev, frag, 0, size,
                                       DMA_TO_DEVICE);
-               if (dma_mapping_error(tx_ring->dev, dma))
-                       goto dma_error;
 
                tx_buffer = &tx_ring->tx_buffer_info[i];
-               dma_unmap_len_set(tx_buffer, len, size);
-               dma_unmap_addr_set(tx_buffer, dma, dma);
-
-               tx_desc->read.buffer_addr = cpu_to_le64(dma);
-               tx_desc->read.olinfo_status = 0;
-
-               frag++;
        }
 
        /* write last descriptor with RS and EOP bits */
-       cmd_type |= cpu_to_le32(size) | cpu_to_le32(IXGBE_TXD_CMD);
-       tx_desc->read.cmd_type_len = cmd_type;
+       cmd_type |= size | IXGBE_TXD_CMD;
+       tx_desc->read.cmd_type_len = cpu_to_le32(cmd_type);
 
        netdev_tx_sent_queue(txring_txq(tx_ring), first->bytecount);
 
@@ -6453,7 +6440,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
         * Tx switch had been disabled.
         */
        if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
-               tx_flags |= IXGBE_TX_FLAGS_TXSW;
+               tx_flags |= IXGBE_TX_FLAGS_CC;
 
 #endif
        /* DCB maps skb priorities 0-7 onto 3 bit PCP of VLAN tag. */
@@ -7444,9 +7431,8 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        memcpy(netdev->dev_addr, hw->mac.perm_addr, netdev->addr_len);
-       memcpy(netdev->perm_addr, hw->mac.perm_addr, netdev->addr_len);
 
-       if (!is_valid_ether_addr(netdev->perm_addr)) {
+       if (!is_valid_ether_addr(netdev->dev_addr)) {
                e_dev_err("invalid MAC address\n");
                err = -EIO;
                goto err_sw_init;
index 85cddac673ef41716d9a34f027b1bcbb0cfb903d..647734b73202af5c1acf9c19df8e11856e9f5888 100644 (file)
@@ -447,15 +447,6 @@ static void ixgbe_set_vmolr(struct ixgbe_hw *hw, u32 vf, bool aupe)
        IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr);
 }
 
-static void ixgbe_set_vmvir(struct ixgbe_adapter *adapter,
-                           u16 vid, u16 qos, u32 vf)
-{
-       struct ixgbe_hw *hw = &adapter->hw;
-       u32 vmvir = vid | (qos << VLAN_PRIO_SHIFT) | IXGBE_VMVIR_VLANA_DEFAULT;
-
-       IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), vmvir);
-}
-
 static void ixgbe_clear_vmvir(struct ixgbe_adapter *adapter, u32 vf)
 {
        struct ixgbe_hw *hw = &adapter->hw;
index 1be1d30e4e78e15aef20d281aa9a2ca7066ca301..21bc1dd1d33e0b0d564e3922de07d5e2f405c102 100644 (file)
@@ -47,6 +47,14 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter,
                        const struct ixgbe_info *ii);
 #endif
 
+static inline void ixgbe_set_vmvir(struct ixgbe_adapter *adapter,
+                                  u16 vid, u16 qos, u32 vf)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+       u32 vmvir = vid | (qos << VLAN_PRIO_SHIFT) | IXGBE_VMVIR_VLANA_DEFAULT;
+
+       IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), vmvir);
+}
 
 #endif /* _IXGBE_SRIOV_H_ */
 
index 257357ae66c365169d6130306d9180789965c98e..551e31dc25c50123950e2d838f29640a39353448 100644 (file)
@@ -750,12 +750,37 @@ static void ixgbevf_set_itr(struct ixgbevf_q_vector *q_vector)
 static irqreturn_t ixgbevf_msix_other(int irq, void *data)
 {
        struct ixgbevf_adapter *adapter = data;
+       struct pci_dev *pdev = adapter->pdev;
        struct ixgbe_hw *hw = &adapter->hw;
+       u32 msg;
+       bool got_ack = false;
 
        hw->mac.get_link_status = 1;
+       if (!hw->mbx.ops.check_for_ack(hw))
+               got_ack = true;
 
-       if (!test_bit(__IXGBEVF_DOWN, &adapter->state))
-               mod_timer(&adapter->watchdog_timer, jiffies);
+       if (!hw->mbx.ops.check_for_msg(hw)) {
+               hw->mbx.ops.read(hw, &msg, 1);
+
+               if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) {
+                       mod_timer(&adapter->watchdog_timer,
+                                 round_jiffies(jiffies + 1));
+                       adapter->link_up = false;
+               }
+
+               if (msg & IXGBE_VT_MSGTYPE_NACK)
+                       dev_info(&pdev->dev,
+                                "Last Request of type %2.2x to PF Nacked\n",
+                                msg & 0xFF);
+               hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFSTS;
+       }
+
+       /* checking for the ack clears the PFACK bit.  Place
+        * it back in the v2p_mailbox cache so that anyone
+        * polling for an ack will not miss it
+        */
+       if (got_ack)
+               hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFACK;
 
        IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, adapter->eims_other);
 
@@ -2095,6 +2120,9 @@ void ixgbevf_update_stats(struct ixgbevf_adapter *adapter)
        struct ixgbe_hw *hw = &adapter->hw;
        int i;
 
+       if (!adapter->link_up)
+               return;
+
        UPDATE_VF_COUNTER_32bit(IXGBE_VFGPRC, adapter->stats.last_vfgprc,
                                adapter->stats.vfgprc);
        UPDATE_VF_COUNTER_32bit(IXGBE_VFGPTC, adapter->stats.last_vfgptc,
@@ -2217,9 +2245,10 @@ static void ixgbevf_watchdog_task(struct work_struct *work)
 
        if (link_up) {
                if (!netif_carrier_ok(netdev)) {
-                       hw_dbg(&adapter->hw, "NIC Link is Up, %u Gbps\n",
-                              (link_speed == IXGBE_LINK_SPEED_10GB_FULL) ?
-                              10 : 1);
+                       dev_info(&adapter->pdev->dev,
+                               "NIC Link is Up, %u Gbps\n",
+                               (link_speed == IXGBE_LINK_SPEED_10GB_FULL) ?
+                               10 : 1);
                        netif_carrier_on(netdev);
                        netif_tx_wake_all_queues(netdev);
                }
@@ -2227,7 +2256,7 @@ static void ixgbevf_watchdog_task(struct work_struct *work)
                adapter->link_up = false;
                adapter->link_speed = 0;
                if (netif_carrier_ok(netdev)) {
-                       hw_dbg(&adapter->hw, "NIC Link is Down\n");
+                       dev_info(&adapter->pdev->dev, "NIC Link is Down\n");
                        netif_carrier_off(netdev);
                        netif_tx_stop_all_queues(netdev);
                }
@@ -3328,8 +3357,6 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_sw_init;
 
        /* The HW MAC address was set and/or determined in sw_init */
-       memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
-
        if (!is_valid_ether_addr(netdev->dev_addr)) {
                pr_err("invalid MAC address\n");
                err = -EIO;
index 8ead46adc21e6f07913c996405bbc36a5927695c..6a2127489af78e718264f202737ba0667770ba1b 100644 (file)
@@ -393,8 +393,8 @@ ltq_etop_mdio_probe(struct net_device *dev)
                return -ENODEV;
        }
 
-       phydev = phy_connect(dev, dev_name(&phydev->dev), &ltq_etop_mdio_link,
-                       0, priv->pldata->mii_mode);
+       phydev = phy_connect(dev, dev_name(&phydev->dev),
+                            &ltq_etop_mdio_link, priv->pldata->mii_mode);
 
        if (IS_ERR(phydev)) {
                netdev_err(dev, "Could not attach to PHY\n");
index 84c13263c514c988e44d4335d3ccae0147c220d6..c27b23d8f4fc29bee16017ed29eda6ea3bc09507 100644 (file)
@@ -2789,7 +2789,7 @@ static void phy_init(struct mv643xx_eth_private *mp, int speed, int duplex)
 
        phy_reset(mp);
 
-       phy_attach(mp->dev, dev_name(&phy->dev), 0, PHY_INTERFACE_MODE_GMII);
+       phy_attach(mp->dev, dev_name(&phy->dev), PHY_INTERFACE_MODE_GMII);
 
        if (speed == 0) {
                phy->autoneg = AUTONEG_ENABLE;
index c7f2fa60fe6f221538c211955d1550721d529dc1..037ed866c22ffa7cfdd57b54fb45216a0a3dd729 100644 (file)
@@ -1390,7 +1390,7 @@ static void phy_init(struct pxa168_eth_private *pep, int speed, int duplex)
        struct phy_device *phy = pep->phy;
        ethernet_phy_reset(pep);
 
-       phy_attach(pep->dev, dev_name(&phy->dev), 0, PHY_INTERFACE_MODE_MII);
+       phy_attach(pep->dev, dev_name(&phy->dev), PHY_INTERFACE_MODE_MII);
 
        if (speed == 0) {
                phy->autoneg = AUTONEG_ENABLE;
index 5544a1fe2f948f5e64ab2c38e00df0aa82255efa..8b08bc4b8a76a747401e05044fc18fac380f040c 100644 (file)
@@ -3855,7 +3855,6 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port,
 
        /* read the mac address */
        memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN);
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        return dev;
 }
index 3269eb38cc576924a958354b9e664b1a92b26dd2..366a12aa3c74336c51affd951963194ec3ebe713 100644 (file)
@@ -4801,7 +4801,6 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port,
 
        /* read the mac address */
        memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN);
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        return dev;
 }
index 75a3f467bb5be601494653a8406eaf5780e52d5b..b4675138533a5eb8ffbafaad2aa8c1ffe4b30328 100644 (file)
@@ -1655,10 +1655,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
 
        /* Set defualt MAC */
        dev->addr_len = ETH_ALEN;
-       for (i = 0; i < ETH_ALEN; i++) {
+       for (i = 0; i < ETH_ALEN; i++)
                dev->dev_addr[ETH_ALEN - 1 - i] = (u8) (priv->mac >> (8 * i));
-               dev->perm_addr[ETH_ALEN - 1 - i] = (u8) (priv->mac >> (8 * i));
-       }
 
        /*
         * Set driver features
index 2b799f4f1c37100f06eab93aef628d4124182230..16af338880c3f64886c7703f36a20b40247a731e 100644 (file)
@@ -515,10 +515,6 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk
                wmb();
                inl->byte_count = cpu_to_be32(1 << 31 | (skb->len - spc));
        }
-       tx_desc->ctrl.vlan_tag = cpu_to_be16(*vlan_tag);
-       tx_desc->ctrl.ins_vlan = MLX4_WQE_CTRL_INS_VLAN *
-               (!!vlan_tx_tag_present(skb));
-       tx_desc->ctrl.fence_size = (real_size / 16) & 0x3f;
 }
 
 u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb)
diff --git a/drivers/net/ethernet/natsemi/ibmlana.c b/drivers/net/ethernet/natsemi/ibmlana.c
deleted file mode 100644 (file)
index 923e640..0000000
+++ /dev/null
@@ -1,1075 +0,0 @@
-/*
-net-3-driver for the IBM LAN Adapter/A
-
-This is an extension to the Linux operating system, and is covered by the
-same GNU General Public License that covers that work.
-
-Copyright 1999 by Alfred Arnold (alfred@ccac.rwth-aachen.de,
-                                 alfred.arnold@lancom.de)
-
-This driver is based both on the SK_MCA driver, which is itself based on the
-SK_G16 and 3C523 driver.
-
-paper sources:
-  'PC Hardware: Aufbau, Funktionsweise, Programmierung' by
-  Hans-Peter Messmer for the basic Microchannel stuff
-
-  'Linux Geraetetreiber' by Allesandro Rubini, Kalle Dalheimer
-  for help on Ethernet driver programming
-
-  'DP83934CVUL-20/25 MHz SONIC-T Ethernet Controller Datasheet' by National
-  Semiconductor for info on the MAC chip
-
-  'LAN Technical Reference Ethernet Adapter Interface Version 1 Release 1.0
-   Document Number SC30-3661-00' by IBM for info on the adapter itself
-
-  Also see http://www.national.com/analog 
-
-special acknowledgements to:
-  - Bob Eager for helping me out with documentation from IBM
-  - Jim Shorney for his endless patience with me while I was using
-    him as a beta tester to trace down the address filter bug ;-)
-
-  Missing things:
-
-  -> set debug level via ioctl instead of compile-time switches
-  -> I didn't follow the development of the 2.1.x kernels, so my
-     assumptions about which things changed with which kernel version
-     are probably nonsense
-
-History:
-  Nov 6th, 1999
-       startup from SK_MCA driver
-  Dec 6th, 1999
-       finally got docs about the card.  A big thank you to Bob Eager!
-  Dec 12th, 1999
-       first packet received
-  Dec 13th, 1999
-       recv queue done, tcpdump works
-  Dec 15th, 1999
-       transmission part works
-  Dec 28th, 1999
-       added usage of the isa_functions for Linux 2.3 .  Things should
-       still work with 2.0.x....
-  Jan 28th, 2000
-       in Linux 2.2.13, the version.h file mysteriously didn't get
-       included.  Added a workaround for this.  Furthermore, it now
-       not only compiles as a modules ;-)
-  Jan 30th, 2000
-       newer kernels automatically probe more than one board, so the
-       'startslot' as a variable is also needed here
-  Apr 12th, 2000
-       the interrupt mask register is not set 'hard' instead of individually
-       setting registers, since this seems to set bits that shouldn't be
-       set
-  May 21st, 2000
-       reset interrupt status immediately after CAM load
-       add a recovery delay after releasing the chip's reset line
-  May 24th, 2000
-       finally found the bug in the address filter setup - damned signed
-        chars!
-  June 1st, 2000
-       corrected version codes, added support for the latest 2.3 changes
-  Oct 28th, 2002
-       cleaned up for the 2.5 tree <alan@lxorguk.ukuu.org.uk>
-
- *************************************************************************/
-
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/time.h>
-#include <linux/mca.h>
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/if_ether.h>
-#include <linux/skbuff.h>
-#include <linux/bitops.h>
-
-#include <asm/processor.h>
-#include <asm/io.h>
-
-#define _IBM_LANA_DRIVER_
-#include "ibmlana.h"
-
-#undef DEBUG
-
-#define DRV_NAME "ibmlana"
-
-/* ------------------------------------------------------------------------
- * global static data - not more since we can handle multiple boards and
- * have to pack all state info into the device struct!
- * ------------------------------------------------------------------------ */
-
-static char *MediaNames[Media_Count] = {
-       "10BaseT", "10Base5", "Unknown", "10Base2"
-};
-
-/* ------------------------------------------------------------------------
- * private subfunctions
- * ------------------------------------------------------------------------ */
-
-#ifdef DEBUG
-  /* dump all registers */
-
-static void dumpregs(struct net_device *dev)
-{
-       int z;
-
-       for (z = 0; z < 160; z += 2) {
-               if (!(z & 15))
-                       printk("REGS: %04x:", z);
-               printk(" %04x", inw(dev->base_addr + z));
-               if ((z & 15) == 14)
-                       printk("\n");
-       }
-}
-
-/* dump parts of shared memory - only needed during debugging */
-
-static void dumpmem(struct net_device *dev, u32 start, u32 len)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       int z;
-
-       printk("Address %04x:\n", start);
-       for (z = 0; z < len; z++) {
-               if ((z & 15) == 0)
-                       printk("%04x:", z);
-               printk(" %02x", readb(priv->base + start + z));
-               if ((z & 15) == 15)
-                       printk("\n");
-       }
-       if ((z & 15) != 0)
-               printk("\n");
-}
-
-/* print exact time - ditto */
-
-static void PrTime(void)
-{
-       struct timeval tv;
-
-       do_gettimeofday(&tv);
-       printk("%9d:%06d: ", (int) tv.tv_sec, (int) tv.tv_usec);
-}
-#endif                         /* DEBUG */
-
-/* deduce resources out of POS registers */
-
-static void getaddrs(struct mca_device *mdev, int *base, int *memlen,
-                    int *iobase, int *irq, ibmlana_medium *medium)
-{
-       u_char pos0, pos1;
-
-       pos0 = mca_device_read_stored_pos(mdev, 2);
-       pos1 = mca_device_read_stored_pos(mdev, 3);
-
-       *base = 0xc0000 + ((pos1 & 0xf0) << 9);
-       *memlen = (pos1 & 0x01) ? 0x8000 : 0x4000;
-       *iobase = (pos0 & 0xe0) << 7;
-       switch (pos0 & 0x06) {
-       case 0:
-               *irq = 5;
-               break;
-       case 2:
-               *irq = 15;
-               break;
-       case 4:
-               *irq = 10;
-               break;
-       case 6:
-               *irq = 11;
-               break;
-       }
-       *medium = (pos0 & 0x18) >> 3;
-}
-
-/* wait on register value with mask and timeout */
-
-static int wait_timeout(struct net_device *dev, int regoffs, u16 mask,
-                       u16 value, int timeout)
-{
-       unsigned long fin = jiffies + timeout;
-
-       while (time_before(jiffies,fin))
-               if ((inw(dev->base_addr + regoffs) & mask) == value)
-                       return 1;
-
-       return 0;
-}
-
-
-/* reset the whole board */
-
-static void ResetBoard(struct net_device *dev)
-{
-       unsigned char bcmval;
-
-       /* read original board control value */
-
-       bcmval = inb(dev->base_addr + BCMREG);
-
-       /* set reset bit for a while */
-
-       bcmval |= BCMREG_RESET;
-       outb(bcmval, dev->base_addr + BCMREG);
-       udelay(10);
-       bcmval &= ~BCMREG_RESET;
-       outb(bcmval, dev->base_addr + BCMREG);
-
-       /* switch over to RAM again */
-
-       bcmval |= BCMREG_RAMEN | BCMREG_RAMWIN;
-       outb(bcmval, dev->base_addr + BCMREG);
-}
-
-/* calculate RAM layout & set up descriptors in RAM */
-
-static void InitDscrs(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       u32 addr, baddr, raddr;
-       int z;
-       tda_t tda;
-       rda_t rda;
-       rra_t rra;
-
-       /* initialize RAM */
-
-       memset_io(priv->base, 0xaa,
-                     dev->mem_start - dev->mem_start); /* XXX: typo? */
-
-       /* setup n TX descriptors - independent of RAM size */
-
-       priv->tdastart = addr = 0;
-       priv->txbufstart = baddr = sizeof(tda_t) * TXBUFCNT;
-       for (z = 0; z < TXBUFCNT; z++) {
-               tda.status = 0;
-               tda.config = 0;
-               tda.length = 0;
-               tda.fragcount = 1;
-               tda.startlo = baddr;
-               tda.starthi = 0;
-               tda.fraglength = 0;
-               if (z == TXBUFCNT - 1)
-                       tda.link = priv->tdastart;
-               else
-                       tda.link = addr + sizeof(tda_t);
-               tda.link |= 1;
-               memcpy_toio(priv->base + addr, &tda, sizeof(tda_t));
-               addr += sizeof(tda_t);
-               baddr += PKTSIZE;
-       }
-
-       /* calculate how many receive buffers fit into remaining memory */
-
-       priv->rxbufcnt = (dev->mem_end - dev->mem_start - baddr) / (sizeof(rra_t) + sizeof(rda_t) + PKTSIZE);
-
-       /* calculate receive addresses */
-
-       priv->rrastart = raddr = priv->txbufstart + (TXBUFCNT * PKTSIZE);
-       priv->rdastart = addr = priv->rrastart + (priv->rxbufcnt * sizeof(rra_t));
-       priv->rxbufstart = baddr = priv->rdastart + (priv->rxbufcnt * sizeof(rda_t));
-
-       for (z = 0; z < priv->rxbufcnt; z++) {
-               rra.startlo = baddr;
-               rra.starthi = 0;
-               rra.cntlo = PKTSIZE >> 1;
-               rra.cnthi = 0;
-               memcpy_toio(priv->base + raddr, &rra, sizeof(rra_t));
-
-               rda.status = 0;
-               rda.length = 0;
-               rda.startlo = 0;
-               rda.starthi = 0;
-               rda.seqno = 0;
-               if (z < priv->rxbufcnt - 1)
-                       rda.link = addr + sizeof(rda_t);
-               else
-                       rda.link = 1;
-               rda.inuse = 1;
-               memcpy_toio(priv->base + addr, &rda, sizeof(rda_t));
-
-               baddr += PKTSIZE;
-               raddr += sizeof(rra_t);
-               addr += sizeof(rda_t);
-       }
-
-       /* initialize current pointers */
-
-       priv->nextrxdescr = 0;
-       priv->lastrxdescr = priv->rxbufcnt - 1;
-       priv->nexttxdescr = 0;
-       priv->currtxdescr = 0;
-       priv->txusedcnt = 0;
-       memset(priv->txused, 0, sizeof(priv->txused));
-}
-
-/* set up Rx + Tx descriptors in SONIC */
-
-static int InitSONIC(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-
-       /* set up start & end of resource area */
-
-       outw(0, SONIC_URRA);
-       outw(priv->rrastart, dev->base_addr + SONIC_RSA);
-       outw(priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)), dev->base_addr + SONIC_REA);
-       outw(priv->rrastart, dev->base_addr + SONIC_RRP);
-       outw(priv->rrastart, dev->base_addr + SONIC_RWP);
-
-       /* set EOBC so that only one packet goes into one buffer */
-
-       outw((PKTSIZE - 4) >> 1, dev->base_addr + SONIC_EOBC);
-
-       /* let SONIC read the first RRA descriptor */
-
-       outw(CMDREG_RRRA, dev->base_addr + SONIC_CMDREG);
-       if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_RRRA, 0, 2)) {
-               printk(KERN_ERR "%s: SONIC did not respond on RRRA command - giving up.", dev->name);
-               return 0;
-       }
-
-       /* point SONIC to the first RDA */
-
-       outw(0, dev->base_addr + SONIC_URDA);
-       outw(priv->rdastart, dev->base_addr + SONIC_CRDA);
-
-       /* set upper half of TDA address */
-
-       outw(0, dev->base_addr + SONIC_UTDA);
-
-       return 1;
-}
-
-/* stop SONIC so we can reinitialize it */
-
-static void StopSONIC(struct net_device *dev)
-{
-       /* disable interrupts */
-
-       outb(inb(dev->base_addr + BCMREG) & (~BCMREG_IEN), dev->base_addr + BCMREG);
-       outb(0, dev->base_addr + SONIC_IMREG);
-
-       /* reset the SONIC */
-
-       outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
-       udelay(10);
-       outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
-}
-
-/* initialize card and SONIC for proper operation */
-
-static void putcam(camentry_t * cams, int *camcnt, char *addr)
-{
-       camentry_t *pcam = cams + (*camcnt);
-       u8 *uaddr = (u8 *) addr;
-
-       pcam->index = *camcnt;
-       pcam->addr0 = (((u16) uaddr[1]) << 8) | uaddr[0];
-       pcam->addr1 = (((u16) uaddr[3]) << 8) | uaddr[2];
-       pcam->addr2 = (((u16) uaddr[5]) << 8) | uaddr[4];
-       (*camcnt)++;
-}
-
-static void InitBoard(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       int camcnt;
-       camentry_t cams[16];
-       u32 cammask;
-       struct netdev_hw_addr *ha;
-       u16 rcrval;
-
-       /* reset the SONIC */
-
-       outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
-       udelay(10);
-
-       /* clear all spurious interrupts */
-
-       outw(inw(dev->base_addr + SONIC_ISREG), dev->base_addr + SONIC_ISREG);
-
-       /* set up the SONIC's bus interface - constant for this adapter -
-          must be done while the SONIC is in reset */
-
-       outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, dev->base_addr + SONIC_DCREG);
-       outw(0, dev->base_addr + SONIC_DCREG2);
-
-       /* remove reset form the SONIC */
-
-       outw(0, dev->base_addr + SONIC_CMDREG);
-       udelay(10);
-
-       /* data sheet requires URRA to be programmed before setting up the CAM contents */
-
-       outw(0, dev->base_addr + SONIC_URRA);
-
-       /* program the CAM entry 0 to the device address */
-
-       camcnt = 0;
-       putcam(cams, &camcnt, dev->dev_addr);
-
-       /* start putting the multicast addresses into the CAM list.  Stop if
-          it is full. */
-
-       netdev_for_each_mc_addr(ha, dev) {
-               putcam(cams, &camcnt, ha->addr);
-               if (camcnt == 16)
-                       break;
-       }
-
-       /* calculate CAM mask */
-
-       cammask = (1 << camcnt) - 1;
-
-       /* feed CDA into SONIC, initialize RCR value (always get broadcasts) */
-
-       memcpy_toio(priv->base, cams, sizeof(camentry_t) * camcnt);
-       memcpy_toio(priv->base + (sizeof(camentry_t) * camcnt), &cammask, sizeof(cammask));
-
-#ifdef DEBUG
-       printk("CAM setup:\n");
-       dumpmem(dev, 0, sizeof(camentry_t) * camcnt + sizeof(cammask));
-#endif
-
-       outw(0, dev->base_addr + SONIC_CAMPTR);
-       outw(camcnt, dev->base_addr + SONIC_CAMCNT);
-       outw(CMDREG_LCAM, dev->base_addr + SONIC_CMDREG);
-       if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_LCAM, 0, 2)) {
-               printk(KERN_ERR "%s:SONIC did not respond on LCAM command - giving up.", dev->name);
-               return;
-       } else {
-               /* clear interrupt condition */
-
-               outw(ISREG_LCD, dev->base_addr + SONIC_ISREG);
-
-#ifdef DEBUG
-               printk("Loading CAM done, address pointers %04x:%04x\n",
-                      inw(dev->base_addr + SONIC_URRA),
-                      inw(dev->base_addr + SONIC_CAMPTR));
-               {
-                       int z;
-
-                       printk("\n-->CAM: PTR %04x CNT %04x\n",
-                              inw(dev->base_addr + SONIC_CAMPTR),
-                              inw(dev->base_addr + SONIC_CAMCNT));
-                       outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
-                       for (z = 0; z < camcnt; z++) {
-                               outw(z, dev->base_addr + SONIC_CAMEPTR);
-                               printk("Entry %d: %04x %04x %04x\n", z,
-                                      inw(dev->base_addr + SONIC_CAMADDR0),
-                                      inw(dev->base_addr + SONIC_CAMADDR1),
-                                      inw(dev->base_addr + SONIC_CAMADDR2));
-                       }
-                       outw(0, dev->base_addr + SONIC_CMDREG);
-               }
-#endif
-       }
-
-       rcrval = RCREG_BRD | RCREG_LB_NONE;
-
-       /* if still multicast addresses left or ALLMULTI is set, set the multicast
-          enable bit */
-
-       if ((dev->flags & IFF_ALLMULTI) || netdev_mc_count(dev) > camcnt)
-               rcrval |= RCREG_AMC;
-
-       /* promiscuous mode ? */
-
-       if (dev->flags & IFF_PROMISC)
-               rcrval |= RCREG_PRO;
-
-       /* program receive mode */
-
-       outw(rcrval, dev->base_addr + SONIC_RCREG);
-#ifdef DEBUG
-       printk("\nRCRVAL: %04x\n", rcrval);
-#endif
-
-       /* set up descriptors in shared memory + feed them into SONIC registers */
-
-       InitDscrs(dev);
-       if (!InitSONIC(dev))
-               return;
-
-       /* reset all pending interrupts */
-
-       outw(0xffff, dev->base_addr + SONIC_ISREG);
-
-       /* enable transmitter + receiver interrupts */
-
-       outw(CMDREG_RXEN, dev->base_addr + SONIC_CMDREG);
-       outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, dev->base_addr + SONIC_IMREG);
-
-       /* turn on card interrupts */
-
-       outb(inb(dev->base_addr + BCMREG) | BCMREG_IEN, dev->base_addr + BCMREG);
-
-#ifdef DEBUG
-       printk("Register dump after initialization:\n");
-       dumpregs(dev);
-#endif
-}
-
-/* start transmission of a descriptor */
-
-static void StartTx(struct net_device *dev, int descr)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       int addr;
-
-       addr = priv->tdastart + (descr * sizeof(tda_t));
-
-       /* put descriptor address into SONIC */
-
-       outw(addr, dev->base_addr + SONIC_CTDA);
-
-       /* trigger transmitter */
-
-       priv->currtxdescr = descr;
-       outw(CMDREG_TXP, dev->base_addr + SONIC_CMDREG);
-}
-
-/* ------------------------------------------------------------------------
- * interrupt handler(s)
- * ------------------------------------------------------------------------ */
-
-/* receive buffer area exhausted */
-
-static void irqrbe_handler(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-
-       /* point the SONIC back to the RRA start */
-
-       outw(priv->rrastart, dev->base_addr + SONIC_RRP);
-       outw(priv->rrastart, dev->base_addr + SONIC_RWP);
-}
-
-/* receive interrupt */
-
-static void irqrx_handler(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       rda_t rda;
-       u32 rdaaddr, lrdaaddr;
-
-       /* loop until ... */
-
-       while (1) {
-               /* read descriptor that was next to be filled by SONIC */
-
-               rdaaddr = priv->rdastart + (priv->nextrxdescr * sizeof(rda_t));
-               lrdaaddr = priv->rdastart + (priv->lastrxdescr * sizeof(rda_t));
-               memcpy_fromio(&rda, priv->base + rdaaddr, sizeof(rda_t));
-
-               /* iron out upper word halves of fields we use - SONIC will duplicate
-                  bits 0..15 to 16..31 */
-
-               rda.status &= 0xffff;
-               rda.length &= 0xffff;
-               rda.startlo &= 0xffff;
-
-               /* stop if the SONIC still owns it, i.e. there is no data for us */
-
-               if (rda.inuse)
-                       break;
-
-               /* good packet? */
-
-               else if (rda.status & RCREG_PRX) {
-                       struct sk_buff *skb;
-
-                       /* fetch buffer */
-
-                       skb = netdev_alloc_skb(dev, rda.length + 2);
-                       if (skb == NULL)
-                               dev->stats.rx_dropped++;
-                       else {
-                               /* copy out data */
-
-                               memcpy_fromio(skb_put(skb, rda.length),
-                                              priv->base +
-                                              rda.startlo, rda.length);
-
-                               /* set up skb fields */
-
-                               skb->protocol = eth_type_trans(skb, dev);
-                               skb_checksum_none_assert(skb);
-
-                               /* bookkeeping */
-                               dev->stats.rx_packets++;
-                               dev->stats.rx_bytes += rda.length;
-
-                               /* pass to the upper layers */
-                               netif_rx(skb);
-                       }
-               }
-
-               /* otherwise check error status bits and increase statistics */
-
-               else {
-                       dev->stats.rx_errors++;
-                       if (rda.status & RCREG_FAER)
-                               dev->stats.rx_frame_errors++;
-                       if (rda.status & RCREG_CRCR)
-                               dev->stats.rx_crc_errors++;
-               }
-
-               /* descriptor processed, will become new last descriptor in queue */
-
-               rda.link = 1;
-               rda.inuse = 1;
-               memcpy_toio(priv->base + rdaaddr, &rda,
-                            sizeof(rda_t));
-
-               /* set up link and EOL = 0 in currently last descriptor. Only write
-                  the link field since the SONIC may currently already access the
-                  other fields. */
-
-               memcpy_toio(priv->base + lrdaaddr + 20, &rdaaddr, 4);
-
-               /* advance indices */
-
-               priv->lastrxdescr = priv->nextrxdescr;
-               if ((++priv->nextrxdescr) >= priv->rxbufcnt)
-                       priv->nextrxdescr = 0;
-       }
-}
-
-/* transmit interrupt */
-
-static void irqtx_handler(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       tda_t tda;
-
-       /* fetch descriptor (we forgot the size ;-) */
-       memcpy_fromio(&tda, priv->base + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t));
-
-       /* update statistics */
-       dev->stats.tx_packets++;
-       dev->stats.tx_bytes += tda.length;
-
-       /* update our pointers */
-       priv->txused[priv->currtxdescr] = 0;
-       priv->txusedcnt--;
-
-       /* if there are more descriptors present in RAM, start them */
-       if (priv->txusedcnt > 0)
-               StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
-
-       /* tell the upper layer we can go on transmitting */
-       netif_wake_queue(dev);
-}
-
-static void irqtxerr_handler(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       tda_t tda;
-
-       /* fetch descriptor to check status */
-       memcpy_fromio(&tda, priv->base + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t));
-
-       /* update statistics */
-       dev->stats.tx_errors++;
-       if (tda.status & (TCREG_NCRS | TCREG_CRSL))
-               dev->stats.tx_carrier_errors++;
-       if (tda.status & TCREG_EXC)
-               dev->stats.tx_aborted_errors++;
-       if (tda.status & TCREG_OWC)
-               dev->stats.tx_window_errors++;
-       if (tda.status & TCREG_FU)
-               dev->stats.tx_fifo_errors++;
-
-       /* update our pointers */
-       priv->txused[priv->currtxdescr] = 0;
-       priv->txusedcnt--;
-
-       /* if there are more descriptors present in RAM, start them */
-       if (priv->txusedcnt > 0)
-               StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
-
-       /* tell the upper layer we can go on transmitting */
-       netif_wake_queue(dev);
-}
-
-/* general interrupt entry */
-
-static irqreturn_t irq_handler(int dummy, void *device)
-{
-       struct net_device *dev = device;
-       u16 ival;
-
-       /* in case we're not meant... */
-       if (!(inb(dev->base_addr + BCMREG) & BCMREG_IPEND))
-               return IRQ_NONE;
-
-       /* loop through the interrupt bits until everything is clear */
-       while (1) {
-               ival = inw(dev->base_addr + SONIC_ISREG);
-
-               if (ival & ISREG_RBE) {
-                       irqrbe_handler(dev);
-                       outw(ISREG_RBE, dev->base_addr + SONIC_ISREG);
-               }
-               if (ival & ISREG_PKTRX) {
-                       irqrx_handler(dev);
-                       outw(ISREG_PKTRX, dev->base_addr + SONIC_ISREG);
-               }
-               if (ival & ISREG_TXDN) {
-                       irqtx_handler(dev);
-                       outw(ISREG_TXDN, dev->base_addr + SONIC_ISREG);
-               }
-               if (ival & ISREG_TXER) {
-                       irqtxerr_handler(dev);
-                       outw(ISREG_TXER, dev->base_addr + SONIC_ISREG);
-               }
-               break;
-       }
-       return IRQ_HANDLED;
-}
-
-/* ------------------------------------------------------------------------
- * driver methods
- * ------------------------------------------------------------------------ */
-
-/* MCA info */
-
-#if 0 /* info available elsewhere, but this is kept for reference */
-static int ibmlana_getinfo(char *buf, int slot, void *d)
-{
-       int len = 0, i;
-       struct net_device *dev = (struct net_device *) d;
-       ibmlana_priv *priv;
-
-       /* can't say anything about an uninitialized device... */
-
-       if (dev == NULL)
-               return len;
-       priv = netdev_priv(dev);
-
-       /* print info */
-
-       len += sprintf(buf + len, "IRQ: %d\n", priv->realirq);
-       len += sprintf(buf + len, "I/O: %#lx\n", dev->base_addr);
-       len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start, dev->mem_end - 1);
-       len += sprintf(buf + len, "Transceiver: %s\n", MediaNames[priv->medium]);
-       len += sprintf(buf + len, "Device: %s\n", dev->name);
-       len += sprintf(buf + len, "MAC address:");
-       for (i = 0; i < 6; i++)
-               len += sprintf(buf + len, " %02x", dev->dev_addr[i]);
-       buf[len++] = '\n';
-       buf[len] = 0;
-
-       return len;
-}
-#endif
-
-/* open driver.  Means also initialization and start of LANCE */
-
-static int ibmlana_open(struct net_device *dev)
-{
-       int result;
-       ibmlana_priv *priv = netdev_priv(dev);
-
-       /* register resources - only necessary for IRQ */
-
-       result = request_irq(priv->realirq, irq_handler, IRQF_SHARED,
-                            dev->name, dev);
-       if (result != 0) {
-               printk(KERN_ERR "%s: failed to register irq %d\n", dev->name, dev->irq);
-               return result;
-       }
-       dev->irq = priv->realirq;
-
-       /* set up the card and SONIC */
-       InitBoard(dev);
-
-       /* initialize operational flags */
-       netif_start_queue(dev);
-       return 0;
-}
-
-/* close driver.  Shut down board and free allocated resources */
-
-static int ibmlana_close(struct net_device *dev)
-{
-       /* turn off board */
-
-       /* release resources */
-       if (dev->irq != 0)
-               free_irq(dev->irq, dev);
-       dev->irq = 0;
-       return 0;
-}
-
-/* transmit a block. */
-
-static netdev_tx_t ibmlana_tx(struct sk_buff *skb, struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       int tmplen, addr;
-       unsigned long flags;
-       tda_t tda;
-       int baddr;
-
-       /* find out if there are free slots for a frame to transmit. If not,
-          the upper layer is in deep desperation and we simply ignore the frame. */
-
-       if (priv->txusedcnt >= TXBUFCNT) {
-               dev->stats.tx_dropped++;
-               goto tx_done;
-       }
-
-       /* copy the frame data into the next free transmit buffer - fillup missing */
-       tmplen = skb->len;
-       if (tmplen < 60)
-               tmplen = 60;
-       baddr = priv->txbufstart + (priv->nexttxdescr * PKTSIZE);
-       memcpy_toio(priv->base + baddr, skb->data, skb->len);
-
-       /* copy filler into RAM - in case we're filling up...
-          we're filling a bit more than necessary, but that doesn't harm
-          since the buffer is far larger...
-          Sorry Linus for the filler string but I couldn't resist ;-) */
-
-       if (tmplen > skb->len) {
-               char *fill = "NetBSD is a nice OS too! ";
-               unsigned int destoffs = skb->len, l = strlen(fill);
-
-               while (destoffs < tmplen) {
-                       memcpy_toio(priv->base + baddr + destoffs, fill, l);
-                       destoffs += l;
-               }
-       }
-
-       /* set up the new frame descriptor */
-       addr = priv->tdastart + (priv->nexttxdescr * sizeof(tda_t));
-       memcpy_fromio(&tda, priv->base + addr, sizeof(tda_t));
-       tda.length = tda.fraglength = tmplen;
-       memcpy_toio(priv->base + addr, &tda, sizeof(tda_t));
-
-       /* if there were no active descriptors, trigger the SONIC */
-       spin_lock_irqsave(&priv->lock, flags);
-
-       priv->txusedcnt++;
-       priv->txused[priv->nexttxdescr] = 1;
-
-       /* are all transmission slots used up ? */
-       if (priv->txusedcnt >= TXBUFCNT)
-               netif_stop_queue(dev);
-
-       if (priv->txusedcnt == 1)
-               StartTx(dev, priv->nexttxdescr);
-       priv->nexttxdescr = (priv->nexttxdescr + 1) % TXBUFCNT;
-
-       spin_unlock_irqrestore(&priv->lock, flags);
-tx_done:
-       dev_kfree_skb(skb);
-       return NETDEV_TX_OK;
-}
-
-/* switch receiver mode. */
-
-static void ibmlana_set_multicast_list(struct net_device *dev)
-{
-       /* first stop the SONIC... */
-       StopSONIC(dev);
-       /* ...then reinit it with the new flags */
-       InitBoard(dev);
-}
-
-/* ------------------------------------------------------------------------
- * hardware check
- * ------------------------------------------------------------------------ */
-
-static int ibmlana_irq;
-static int ibmlana_io;
-static int startslot;          /* counts through slots when probing multiple devices */
-
-static short ibmlana_adapter_ids[] __initdata = {
-       IBM_LANA_ID,
-       0x0000
-};
-
-static char *ibmlana_adapter_names[] = {
-       "IBM LAN Adapter/A",
-       NULL
-};
-
-
-static const struct net_device_ops ibmlana_netdev_ops = {
-       .ndo_open               = ibmlana_open,
-       .ndo_stop               = ibmlana_close,
-       .ndo_start_xmit         = ibmlana_tx,
-       .ndo_set_rx_mode        = ibmlana_set_multicast_list,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-static int ibmlana_init_one(struct device *kdev)
-{
-       struct mca_device *mdev = to_mca_device(kdev);
-       struct net_device *dev;
-       int slot = mdev->slot, z, rc;
-       int base = 0, irq = 0, iobase = 0, memlen = 0;
-       ibmlana_priv *priv;
-       ibmlana_medium medium;
-
-       dev = alloc_etherdev(sizeof(ibmlana_priv));
-       if (!dev)
-               return -ENOMEM;
-
-       dev->irq = ibmlana_irq;
-       dev->base_addr = ibmlana_io;
-
-       base = dev->mem_start;
-       irq = dev->irq;
-
-       /* deduce card addresses */
-       getaddrs(mdev, &base, &memlen, &iobase, &irq, &medium);
-
-       /* were we looking for something different ? */
-       if (dev->irq && dev->irq != irq) {
-               rc = -ENODEV;
-               goto err_out;
-       }
-       if (dev->mem_start && dev->mem_start != base) {
-               rc = -ENODEV;
-               goto err_out;
-       }
-
-       /* announce success */
-       printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1);
-
-       /* try to obtain I/O range */
-       if (!request_region(iobase, IBM_LANA_IORANGE, DRV_NAME)) {
-               printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", DRV_NAME, iobase);
-               startslot = slot + 1;
-               rc = -EBUSY;
-               goto err_out;
-       }
-
-       priv = netdev_priv(dev);
-       priv->slot = slot;
-       priv->realirq = mca_device_transform_irq(mdev, irq);
-       priv->medium = medium;
-       spin_lock_init(&priv->lock);
-
-       /* set base + irq for this device (irq not allocated so far) */
-
-       dev->irq = 0;
-       dev->mem_start = base;
-       dev->mem_end = base + memlen;
-       dev->base_addr = iobase;
-
-       priv->base = ioremap(base, memlen);
-       if (!priv->base) {
-               printk(KERN_ERR "%s: cannot remap memory!\n", DRV_NAME);
-               startslot = slot + 1;
-               rc = -EBUSY;
-               goto err_out_reg;
-       }
-
-       mca_device_set_name(mdev, ibmlana_adapter_names[mdev->index]);
-       mca_device_set_claim(mdev, 1);
-
-       /* set methods */
-       dev->netdev_ops = &ibmlana_netdev_ops;
-       dev->flags |= IFF_MULTICAST;
-
-       /* copy out MAC address */
-
-       for (z = 0; z < ETH_ALEN; z++)
-               dev->dev_addr[z] = inb(dev->base_addr + MACADDRPROM + z);
-
-       /* print config */
-
-       printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, "
-              "MAC address %pM.\n",
-              dev->name, priv->realirq, dev->base_addr,
-              dev->mem_start, dev->mem_end - 1,
-              dev->dev_addr);
-       printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]);
-
-       /* reset board */
-
-       ResetBoard(dev);
-
-       /* next probe will start at next slot */
-
-       startslot = slot + 1;
-
-       rc = register_netdev(dev);
-       if (rc)
-               goto err_out_claimed;
-
-       dev_set_drvdata(kdev, dev);
-       return 0;
-
-err_out_claimed:
-       mca_device_set_claim(mdev, 0);
-       iounmap(priv->base);
-err_out_reg:
-       release_region(iobase, IBM_LANA_IORANGE);
-err_out:
-       free_netdev(dev);
-       return rc;
-}
-
-static int ibmlana_remove_one(struct device *kdev)
-{
-       struct mca_device *mdev = to_mca_device(kdev);
-       struct net_device *dev = dev_get_drvdata(kdev);
-       ibmlana_priv *priv = netdev_priv(dev);
-
-       unregister_netdev(dev);
-       /*DeinitBoard(dev); */
-       release_region(dev->base_addr, IBM_LANA_IORANGE);
-       mca_device_set_claim(mdev, 0);
-       iounmap(priv->base);
-       free_netdev(dev);
-       return 0;
-}
-
-/* ------------------------------------------------------------------------
- * modularization support
- * ------------------------------------------------------------------------ */
-
-module_param_named(irq, ibmlana_irq, int, 0);
-module_param_named(io, ibmlana_io, int, 0);
-MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number");
-MODULE_PARM_DESC(io, "IBM LAN/A I/O base address");
-MODULE_LICENSE("GPL");
-
-static struct mca_driver ibmlana_driver = {
-       .id_table = ibmlana_adapter_ids,
-       .driver = {
-               .name   = "ibmlana",
-               .bus    = &mca_bus_type,
-               .probe  = ibmlana_init_one,
-               .remove = ibmlana_remove_one,
-       },
-};
-
-static int __init ibmlana_init_module(void)
-{
-       return mca_register_driver(&ibmlana_driver);
-}
-
-static void __exit ibmlana_cleanup_module(void)
-{
-       mca_unregister_driver(&ibmlana_driver);
-}
-
-module_init(ibmlana_init_module);
-module_exit(ibmlana_cleanup_module);
diff --git a/drivers/net/ethernet/natsemi/ibmlana.h b/drivers/net/ethernet/natsemi/ibmlana.h
deleted file mode 100644 (file)
index accd5ef..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-#ifndef _IBM_LANA_INCLUDE_
-#define _IBM_LANA_INCLUDE_
-
-#ifdef _IBM_LANA_DRIVER_
-
-/* maximum packet size */
-
-#define PKTSIZE 1524
-
-/* number of transmit buffers */
-
-#define TXBUFCNT 4
-
-/* Adapter ID's */
-#define IBM_LANA_ID 0xffe0
-
-/* media enumeration - defined in a way that it fits onto the LAN/A's
-   POS registers... */
-
-typedef enum {
-       Media_10BaseT, Media_10Base5,
-       Media_Unknown, Media_10Base2, Media_Count
-} ibmlana_medium;
-
-/* private structure */
-
-typedef struct {
-       unsigned int slot;              /* MCA-Slot-#                       */
-       int realirq;                    /* memorizes actual IRQ, even when
-                                          currently not allocated          */
-       ibmlana_medium medium;          /* physical cannector               */
-       u32     tdastart, txbufstart,   /* addresses                        */
-               rrastart, rxbufstart, rdastart, rxbufcnt, txusedcnt;
-       int     nextrxdescr,            /* next rx descriptor to be used    */
-               lastrxdescr,            /* last free rx descriptor          */
-               nexttxdescr,            /* last tx descriptor to be used    */
-               currtxdescr,            /* tx descriptor currently tx'ed    */
-               txused[TXBUFCNT];       /* busy flags                       */
-       void __iomem *base;
-       spinlock_t lock;
-} ibmlana_priv;
-
-/* this card uses quite a lot of I/O ports...luckily the MCA bus decodes
-   a full 64K I/O range... */
-
-#define IBM_LANA_IORANGE 0xa0
-
-/* Command Register: */
-
-#define SONIC_CMDREG     0x00
-#define CMDREG_HTX       0x0001        /* halt transmission                */
-#define CMDREG_TXP       0x0002        /* start transmission               */
-#define CMDREG_RXDIS     0x0004        /* disable receiver                 */
-#define CMDREG_RXEN      0x0008        /* enable receiver                  */
-#define CMDREG_STP       0x0010        /* stop timer                       */
-#define CMDREG_ST        0x0020        /* start timer                      */
-#define CMDREG_RST       0x0080        /* software reset                   */
-#define CMDREG_RRRA      0x0100        /* force SONIC to read first RRA    */
-#define CMDREG_LCAM      0x0200        /* force SONIC to read CAM descrs   */
-
-/* Data Configuration Register */
-
-#define SONIC_DCREG      0x02
-#define DCREG_EXBUS      0x8000        /* Extended Bus Mode                */
-#define DCREG_LBR        0x2000        /* Latched Bus Retry                */
-#define DCREG_PO1        0x1000        /* Programmable Outputs             */
-#define DCREG_PO0        0x0800
-#define DCREG_SBUS       0x0400        /* Synchronous Bus Mode             */
-#define DCREG_USR1       0x0200        /* User Definable Pins              */
-#define DCREG_USR0       0x0100
-#define DCREG_WC0        0x0000        /* 0..3 Wait States                 */
-#define DCREG_WC1        0x0040
-#define DCREG_WC2        0x0080
-#define DCREG_WC3        0x00c0
-#define DCREG_DW16       0x0000        /* 16 bit Bus Mode                  */
-#define DCREG_DW32       0x0020        /* 32 bit Bus Mode                  */
-#define DCREG_BMS        0x0010        /* Block Mode Select                */
-#define DCREG_RFT4       0x0000        /* 4/8/16/24 bytes RX  Threshold    */
-#define DCREG_RFT8       0x0004
-#define DCREG_RFT16      0x0008
-#define DCREG_RFT24      0x000c
-#define DCREG_TFT8       0x0000        /* 8/16/24/28 bytes TX Threshold    */
-#define DCREG_TFT16      0x0001
-#define DCREG_TFT24      0x0002
-#define DCREG_TFT28      0x0003
-
-/* Receive Control Register */
-
-#define SONIC_RCREG      0x04
-#define RCREG_ERR        0x8000        /* accept damaged and collided pkts */
-#define RCREG_RNT        0x4000        /* accept packets that are < 64     */
-#define RCREG_BRD        0x2000        /* accept broadcasts                */
-#define RCREG_PRO        0x1000        /* promiscuous mode                  */
-#define RCREG_AMC        0x0800        /* accept all multicasts            */
-#define RCREG_LB_NONE    0x0000        /* no loopback                      */
-#define RCREG_LB_MAC     0x0200        /* MAC loopback                     */
-#define RCREG_LB_ENDEC   0x0400        /* ENDEC loopback                   */
-#define RCREG_LB_XVR     0x0600        /* Transceiver loopback             */
-#define RCREG_MC         0x0100        /* Multicast received               */
-#define RCREG_BC         0x0080        /* Broadcast received               */
-#define RCREG_LPKT       0x0040        /* last packet in RBA               */
-#define RCREG_CRS        0x0020        /* carrier sense present            */
-#define RCREG_COL        0x0010        /* recv'd packet with collision     */
-#define RCREG_CRCR       0x0008        /* recv'd packet with CRC error     */
-#define RCREG_FAER       0x0004        /* recv'd packet with inv. framing  */
-#define RCREG_LBK        0x0002        /* recv'd loopback packet           */
-#define RCREG_PRX        0x0001        /* recv'd packet is OK              */
-
-/* Transmit Control Register */
-
-#define SONIC_TCREG      0x06
-#define TCREG_PINT       0x8000        /* generate interrupt after TDA read */
-#define TCREG_POWC       0x4000        /* timer start out of window detect */
-#define TCREG_CRCI       0x2000        /* inhibit CRC generation           */
-#define TCREG_EXDIS      0x1000        /* disable excessive deferral timer */
-#define TCREG_EXD        0x0400        /* excessive deferral occurred       */
-#define TCREG_DEF        0x0200        /* single deferral occurred          */
-#define TCREG_NCRS       0x0100        /* no carrier detected              */
-#define TCREG_CRSL       0x0080        /* carrier lost                     */
-#define TCREG_EXC        0x0040        /* excessive collisions occurred     */
-#define TCREG_OWC        0x0020        /* out of window collision occurred  */
-#define TCREG_PMB        0x0008        /* packet monitored bad             */
-#define TCREG_FU         0x0004        /* FIFO underrun                    */
-#define TCREG_BCM        0x0002        /* byte count mismatch of fragments */
-#define TCREG_PTX        0x0001        /* packet transmitted OK            */
-
-/* Interrupt Mask Register */
-
-#define SONIC_IMREG      0x08
-#define IMREG_BREN       0x4000        /* interrupt when bus retry occurred */
-#define IMREG_HBLEN      0x2000        /* interrupt when heartbeat lost    */
-#define IMREG_LCDEN      0x1000        /* interrupt when CAM loaded        */
-#define IMREG_PINTEN     0x0800        /* interrupt when PINT in TDA set   */
-#define IMREG_PRXEN      0x0400        /* interrupt when packet received   */
-#define IMREG_PTXEN      0x0200        /* interrupt when packet was sent   */
-#define IMREG_TXEREN     0x0100        /* interrupt when send failed       */
-#define IMREG_TCEN       0x0080        /* interrupt when timer completed   */
-#define IMREG_RDEEN      0x0040        /* interrupt when RDA exhausted     */
-#define IMREG_RBEEN      0x0020        /* interrupt when RBA exhausted     */
-#define IMREG_RBAEEN     0x0010        /* interrupt when RBA too short     */
-#define IMREG_CRCEN      0x0008        /* interrupt when CRC counter rolls */
-#define IMREG_FAEEN      0x0004        /* interrupt when FAE counter rolls */
-#define IMREG_MPEN       0x0002        /* interrupt when MP counter rolls  */
-#define IMREG_RFOEN      0x0001        /* interrupt when Rx FIFO overflows */
-
-/* Interrupt Status Register */
-
-#define SONIC_ISREG      0x0a
-#define ISREG_BR         0x4000        /* bus retry occurred                */
-#define ISREG_HBL        0x2000        /* heartbeat lost                   */
-#define ISREG_LCD        0x1000        /* CAM loaded                       */
-#define ISREG_PINT       0x0800        /* PINT in TDA set                  */
-#define ISREG_PKTRX      0x0400        /* packet received                  */
-#define ISREG_TXDN       0x0200        /* packet was sent                  */
-#define ISREG_TXER       0x0100        /* send failed                      */
-#define ISREG_TC         0x0080        /* timer completed                  */
-#define ISREG_RDE        0x0040        /* RDA exhausted                    */
-#define ISREG_RBE        0x0020        /* RBA exhausted                    */
-#define ISREG_RBAE       0x0010        /* RBA too short for received frame */
-#define ISREG_CRC        0x0008        /* CRC counter rolls over           */
-#define ISREG_FAE        0x0004        /* FAE counter rolls over           */
-#define ISREG_MP         0x0002        /* MP counter rolls  over           */
-#define ISREG_RFO        0x0001        /* Rx FIFO overflows                */
-
-#define SONIC_UTDA       0x0c  /* current transmit descr address   */
-#define SONIC_CTDA       0x0e
-
-#define SONIC_URDA       0x1a  /* current receive descr address    */
-#define SONIC_CRDA       0x1c
-
-#define SONIC_CRBA0      0x1e  /* current receive buffer address   */
-#define SONIC_CRBA1      0x20
-
-#define SONIC_RBWC0      0x22  /* word count in receive buffer     */
-#define SONIC_RBWC1      0x24
-
-#define SONIC_EOBC       0x26  /* minimum space to be free in RBA  */
-
-#define SONIC_URRA       0x28  /* upper address of CDA & Recv Area */
-
-#define SONIC_RSA        0x2a  /* start of receive resource area   */
-
-#define SONIC_REA        0x2c  /* end of receive resource area     */
-
-#define SONIC_RRP        0x2e  /* resource read pointer            */
-
-#define SONIC_RWP        0x30  /* resource write pointer           */
-
-#define SONIC_CAMEPTR    0x42  /* CAM entry pointer                */
-
-#define SONIC_CAMADDR2   0x44  /* CAM address ports                */
-#define SONIC_CAMADDR1   0x46
-#define SONIC_CAMADDR0   0x48
-
-#define SONIC_CAMPTR     0x4c  /* lower address of CDA             */
-
-#define SONIC_CAMCNT     0x4e  /* # of CAM descriptors to load     */
-
-/* Data Configuration Register 2    */
-
-#define SONIC_DCREG2     0x7e
-#define DCREG2_EXPO3     0x8000        /* extended programmable outputs    */
-#define DCREG2_EXPO2     0x4000
-#define DCREG2_EXPO1     0x2000
-#define DCREG2_EXPO0     0x1000
-#define DCREG2_HD        0x0800        /* heartbeat disable                */
-#define DCREG2_JD        0x0200        /* jabber timer disable             */
-#define DCREG2_AUTO      0x0100        /* enable AUI/TP auto selection     */
-#define DCREG2_XWRAP     0x0040        /* TP transceiver loopback          */
-#define DCREG2_PH        0x0010        /* HOLD request timing              */
-#define DCREG2_PCM       0x0004        /* packet compress when matched     */
-#define DCREG2_PCNM      0x0002        /* packet compress when not matched */
-#define DCREG2_RJCM      0x0001        /* inverse packet match via CAM     */
-
-/* Board Control Register: Enable RAM, Interrupts... */
-
-#define BCMREG           0x80
-#define BCMREG_RAMEN     0x80  /* switch over to RAM               */
-#define BCMREG_IPEND     0x40  /* interrupt pending ?              */
-#define BCMREG_RESET     0x08  /* reset board                      */
-#define BCMREG_16BIT     0x04  /* adapter in 16-bit slot           */
-#define BCMREG_RAMWIN    0x02  /* enable RAM window                */
-#define BCMREG_IEN       0x01  /* interrupt enable                 */
-
-/* MAC Address PROM */
-
-#define MACADDRPROM      0x92
-
-/* structure of a CAM entry */
-
-typedef struct {
-       u32 index;              /* pointer into CAM area            */
-       u32 addr0;              /* address part (bits 0..15 used)   */
-       u32 addr1;
-       u32 addr2;
-} camentry_t;
-
-/* structure of a receive resource */
-
-typedef struct {
-       u32 startlo;            /* start address (bits 0..15 used)  */
-       u32 starthi;
-       u32 cntlo;              /* size in 16-bit quantities        */
-       u32 cnthi;
-} rra_t;
-
-/* structure of a receive descriptor */
-
-typedef struct {
-       u32 status;             /* packet status                    */
-       u32 length;             /* length in bytes                  */
-       u32 startlo;            /* start address                    */
-       u32 starthi;
-       u32 seqno;              /* frame sequence                   */
-       u32 link;               /* pointer to next descriptor       */
-       /* bit 0 = EOL                      */
-       u32 inuse;              /* !=0 --> free for SONIC to write  */
-} rda_t;
-
-/* structure of a transmit descriptor */
-
-typedef struct {
-       u32 status;             /* transmit status                  */
-       u32 config;             /* value for TCR                    */
-       u32 length;             /* total length                     */
-       u32 fragcount;          /* number of fragments              */
-       u32 startlo;            /* start address of fragment        */
-       u32 starthi;
-       u32 fraglength;         /* length of this fragment          */
-       /* more address/length triplets may */
-       /* follow here                      */
-       u32 link;               /* pointer to next descriptor       */
-       /* bit 0 = EOL                      */
-} tda_t;
-
-#endif                         /* _IBM_LANA_DRIVER_ */
-
-#endif /* _IBM_LANA_INCLUDE_ */
index f4ad60c97eae4b0f271923694b19dd187416445c..7a5e295588b0740f38c288364de1a51be6898fd9 100644 (file)
@@ -862,9 +862,6 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
                prev_eedata = eedata;
        }
 
-       /* Store MAC Address in perm_addr */
-       memcpy(dev->perm_addr, dev->dev_addr, ETH_ALEN);
-
        np = netdev_priv(dev);
        np->ioaddr = ioaddr;
 
index 7c94c089212f9ffe638b0628ffb1635be407c19c..bfd887382e1962cfc5d73ef71813ad5a04084688 100644 (file)
@@ -8014,7 +8014,6 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
        /*  Set the factory defined MAC address initially   */
        dev->addr_len = ETH_ALEN;
        memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN);
-       memcpy(dev->perm_addr, dev->dev_addr, ETH_ALEN);
 
        /* initialize number of multicast & unicast MAC entries variables */
        if (sp->device_type == XFRAME_I_DEVICE) {
index 7c87105ca04999d55d4fea2f5f2adc9d3846a660..794444e09492978ffd5154e065a0a2bd5fbe846f 100644 (file)
@@ -4682,7 +4682,6 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
        /* Store the fw version for ethttool option */
        strcpy(vdev->fw_version, ll_config->device_hw_info.fw_version.version);
        memcpy(vdev->ndev->dev_addr, (u8 *)vdev->vpaths[0].macaddr, ETH_ALEN);
-       memcpy(vdev->ndev->perm_addr, vdev->ndev->dev_addr, ETH_ALEN);
 
        /* Copy the station mac address to the list */
        for (i = 0; i < vdev->no_of_vpath; i++) {
index b53bf9db471aa88c5ac493f4af1f6fb690bb37e0..0b8de12bcbca998410f2097d27e239eb31607f83 100644 (file)
@@ -1821,6 +1821,11 @@ static int nv_alloc_rx(struct net_device *dev)
                                                             skb->data,
                                                             skb_tailroom(skb),
                                                             PCI_DMA_FROMDEVICE);
+                       if (pci_dma_mapping_error(np->pci_dev,
+                                                 np->put_rx_ctx->dma)) {
+                               kfree_skb(skb);
+                               goto packet_dropped;
+                       }
                        np->put_rx_ctx->dma_len = skb_tailroom(skb);
                        np->put_rx.orig->buf = cpu_to_le32(np->put_rx_ctx->dma);
                        wmb();
@@ -1830,6 +1835,7 @@ static int nv_alloc_rx(struct net_device *dev)
                        if (unlikely(np->put_rx_ctx++ == np->last_rx_ctx))
                                np->put_rx_ctx = np->first_rx_ctx;
                } else {
+packet_dropped:
                        u64_stats_update_begin(&np->swstats_rx_syncp);
                        np->stat_rx_dropped++;
                        u64_stats_update_end(&np->swstats_rx_syncp);
@@ -1856,6 +1862,11 @@ static int nv_alloc_rx_optimized(struct net_device *dev)
                                                             skb->data,
                                                             skb_tailroom(skb),
                                                             PCI_DMA_FROMDEVICE);
+                       if (pci_dma_mapping_error(np->pci_dev,
+                                                 np->put_rx_ctx->dma)) {
+                               kfree_skb(skb);
+                               goto packet_dropped;
+                       }
                        np->put_rx_ctx->dma_len = skb_tailroom(skb);
                        np->put_rx.ex->bufhigh = cpu_to_le32(dma_high(np->put_rx_ctx->dma));
                        np->put_rx.ex->buflow = cpu_to_le32(dma_low(np->put_rx_ctx->dma));
@@ -1866,6 +1877,7 @@ static int nv_alloc_rx_optimized(struct net_device *dev)
                        if (unlikely(np->put_rx_ctx++ == np->last_rx_ctx))
                                np->put_rx_ctx = np->first_rx_ctx;
                } else {
+packet_dropped:
                        u64_stats_update_begin(&np->swstats_rx_syncp);
                        np->stat_rx_dropped++;
                        u64_stats_update_end(&np->swstats_rx_syncp);
@@ -2217,6 +2229,15 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
                bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size;
                np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt,
                                                PCI_DMA_TODEVICE);
+               if (pci_dma_mapping_error(np->pci_dev,
+                                         np->put_tx_ctx->dma)) {
+                       /* on DMA mapping error - drop the packet */
+                       kfree_skb(skb);
+                       u64_stats_update_begin(&np->swstats_tx_syncp);
+                       np->stat_tx_dropped++;
+                       u64_stats_update_end(&np->swstats_tx_syncp);
+                       return NETDEV_TX_OK;
+               }
                np->put_tx_ctx->dma_len = bcnt;
                np->put_tx_ctx->dma_single = 1;
                put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma);
@@ -2337,6 +2358,15 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,
                bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size;
                np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt,
                                                PCI_DMA_TODEVICE);
+               if (pci_dma_mapping_error(np->pci_dev,
+                                         np->put_tx_ctx->dma)) {
+                       /* on DMA mapping error - drop the packet */
+                       kfree_skb(skb);
+                       u64_stats_update_begin(&np->swstats_tx_syncp);
+                       np->stat_tx_dropped++;
+                       u64_stats_update_end(&np->swstats_tx_syncp);
+                       return NETDEV_TX_OK;
+               }
                np->put_tx_ctx->dma_len = bcnt;
                np->put_tx_ctx->dma_single = 1;
                put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma));
@@ -5002,6 +5032,11 @@ static int nv_loopback_test(struct net_device *dev)
        test_dma_addr = pci_map_single(np->pci_dev, tx_skb->data,
                                       skb_tailroom(tx_skb),
                                       PCI_DMA_FROMDEVICE);
+       if (pci_dma_mapping_error(np->pci_dev,
+                                 test_dma_addr)) {
+               dev_kfree_skb_any(tx_skb);
+               goto out;
+       }
        pkt_data = skb_put(tx_skb, pkt_len);
        for (i = 0; i < pkt_len; i++)
                pkt_data[i] = (u8)(i & 0xff);
@@ -5730,9 +5765,8 @@ static int nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
                        "%s: set workaround bit for reversed mac addr\n",
                        __func__);
        }
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
-       if (!is_valid_ether_addr(dev->perm_addr)) {
+       if (!is_valid_ether_addr(dev->dev_addr)) {
                /*
                 * Bad mac address. At least one bios sets the mac address
                 * to 01:23:45:67:89:ab
index 6fda51ebcc765477bd0768c5829dadb0d73cd9e6..c4122c86f829293cc60d6dd48c72602d7dded49f 100644 (file)
@@ -800,7 +800,7 @@ static int lpc_mii_probe(struct net_device *ndev)
        else
                netdev_info(ndev, "using RMII interface\n");
        phydev = phy_connect(ndev, dev_name(&phydev->dev),
-                            &lpc_handle_link_change, 0,
+                            &lpc_handle_link_change,
                             lpc_phy_interface_mode(&pldat->pdev->dev));
 
        if (IS_ERR(phydev)) {
index 6098fd4adfeb89ef5ed9c15407799ddbdcf02e7a..8e40ea09d7fc4d6d9795fcf66b3c7214a235788e 100644 (file)
@@ -501,12 +501,11 @@ netxen_read_mac_addr(struct netxen_adapter *adapter)
        for (i = 0; i < 6; i++)
                netdev->dev_addr[i] = *(p + 5 - i);
 
-       memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
        memcpy(adapter->mac_addr, netdev->dev_addr, netdev->addr_len);
 
        /* set station address */
 
-       if (!is_valid_ether_addr(netdev->perm_addr))
+       if (!is_valid_ether_addr(netdev->dev_addr))
                dev_warn(&pdev->dev, "Bad MAC address %pM.\n", netdev->dev_addr);
 
        return 0;
index 67a679aaf29adf949a2b8dfa79e230b308807615..c0ed12d325b462865a6a6914a1e0b6f197b576cd 100644 (file)
@@ -3867,7 +3867,6 @@ static int ql3xxx_probe(struct pci_dev *pdev,
                ndev->mtu = qdev->nvram_data.macCfg_port0.etherMtu_mac ;
                ql_set_mac_addr(ndev, qdev->nvram_data.funcCfg_fn0.macAddress);
        }
-       memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len);
 
        ndev->tx_queue_len = NUM_REQ_Q_ENTRIES;
 
index 3655ca2de525960e0291fd130e0c718f7d314d08..fb7ac8ecd45a6302c58949ca8a813579654df954 100644 (file)
@@ -208,12 +208,11 @@ qlcnic_read_mac_addr(struct qlcnic_adapter *adapter)
                return -EIO;
 
        memcpy(netdev->dev_addr, mac_addr, ETH_ALEN);
-       memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
        memcpy(adapter->mac_addr, netdev->dev_addr, netdev->addr_len);
 
        /* set station address */
 
-       if (!is_valid_ether_addr(netdev->perm_addr))
+       if (!is_valid_ether_addr(netdev->dev_addr))
                dev_warn(&pdev->dev, "Bad MAC address %pM.\n",
                                        netdev->dev_addr);
 
@@ -1718,7 +1717,7 @@ int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter,
        return 0;
 }
 
-static int __devinit
+static int
 qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct net_device *netdev = NULL;
@@ -1910,7 +1909,7 @@ err_out_disable_pdev:
        return err;
 }
 
-static void __devexit qlcnic_remove(struct pci_dev *pdev)
+static void qlcnic_remove(struct pci_dev *pdev)
 {
        struct qlcnic_adapter *adapter;
        struct net_device *netdev;
index f80cd975daed2b84a31af47db58b828d28139638..e9381584e4b3ae390010696cf2118bb0263a307b 100644 (file)
@@ -4586,7 +4586,6 @@ static int ql_init_device(struct pci_dev *pdev, struct net_device *ndev,
                goto err_out2;
        }
 
-       memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len);
        /* Keep local copy of current mac address. */
        memcpy(qdev->current_mac_addr, ndev->dev_addr, ndev->addr_len);
 
@@ -4678,7 +4677,7 @@ static int qlge_probe(struct pci_dev *pdev,
        qdev = netdev_priv(ndev);
        SET_NETDEV_DEV(ndev, &pdev->dev);
        ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
-               NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN |
+               NETIF_F_TSO | NETIF_F_TSO_ECN |
                NETIF_F_HW_VLAN_TX | NETIF_F_RXCSUM;
        ndev->features = ndev->hw_features |
                NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER;
diff --git a/drivers/net/ethernet/racal/Kconfig b/drivers/net/ethernet/racal/Kconfig
deleted file mode 100644 (file)
index 01969e0..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Racal-Interlan device configuration
-#
-
-config NET_VENDOR_RACAL
-       bool "Racal-Interlan (Micom) NI devices"
-       default y
-       depends on ISA
-       ---help---
-         If you have a network (Ethernet) card belonging to this class, such
-         as the NI5010, NI5210 or NI6210, say Y and read the Ethernet-HOWTO,
-         available from <http://www.tldp.org/docs.html#howto>.
-
-         Note that the answer to this question doesn't directly affect the
-         kernel: saying N will just cause the configurator to skip all
-         the questions about NI cards. If you say Y, you will be asked for
-         your specific card in the following questions.
-
-if NET_VENDOR_RACAL
-
-config NI5010
-       tristate "NI5010 support (EXPERIMENTAL)"
-       depends on ISA && EXPERIMENTAL && BROKEN_ON_SMP
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>. Note that this is still
-         experimental code.
-
-         To compile this driver as a module, choose M here. The module
-         will be called ni5010.
-
-endif # NET_VENDOR_RACAL
diff --git a/drivers/net/ethernet/racal/Makefile b/drivers/net/ethernet/racal/Makefile
deleted file mode 100644 (file)
index 1e210ca..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Makefile for the Racal-Interlan network device drivers.
-#
-
-obj-$(CONFIG_NI5010) += ni5010.o
diff --git a/drivers/net/ethernet/racal/ni5010.c b/drivers/net/ethernet/racal/ni5010.c
deleted file mode 100644 (file)
index 8079822..0000000
+++ /dev/null
@@ -1,771 +0,0 @@
-/*     ni5010.c: A network driver for the MiCom-Interlan NI5010 ethercard.
- *
- *     Copyright 1996,1997,2006 Jan-Pascal van Best and Andreas Mohr.
- *
- *     This software may be used and distributed according to the terms
- *     of the GNU General Public License, incorporated herein by reference.
- *
- *     The authors may be reached as:
- *             janpascal@vanbest.org           andi@lisas.de
- *
- *     Sources:
- *             Donald Becker's "skeleton.c"
- *             Crynwr ni5010 packet driver
- *
- *     Changes:
- *             v0.0: First test version
- *             v0.1: First working version
- *             v0.2:
- *             v0.3->v0.90: Now demand setting io and irq when loading as module
- *     970430  v0.91: modified for Linux 2.1.14
- *             v0.92: Implemented Andreas' (better) NI5010 probe
- *     970503  v0.93: Fixed auto-irq failure on warm reboot (JB)
- *     970623  v1.00: First kernel version (AM)
- *     970814  v1.01: Added detection of onboard receive buffer size (AM)
- *     060611  v1.02: slight cleanup: email addresses, driver modernization.
- *     Bugs:
- *             - not SMP-safe (no locking of I/O accesses)
- *             - Note that you have to patch ifconfig for the new /proc/net/dev
- *             format. It gives incorrect stats otherwise.
- *
- *     To do:
- *             Fix all bugs :-)
- *             Move some stuff to chipset_init()
- *             Handle xmt errors other than collisions
- *             Complete merge with Andreas' driver
- *             Implement ring buffers (Is this useful? You can't squeeze
- *                     too many packet in a 2k buffer!)
- *             Implement DMA (Again, is this useful? Some docs say DMA is
- *                     slower than programmed I/O)
- *
- *     Compile with:
- *             gcc -O2 -fomit-frame-pointer -m486 -D__KERNEL__ \
- *                     -DMODULE -c ni5010.c
- *
- *     Insert with e.g.:
- *             insmod ni5010.ko io=0x300 irq=5
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/bitops.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-
-#include "ni5010.h"
-
-static const char boardname[] = "NI5010";
-static char version[] __initdata =
-       "ni5010.c: v1.02 20060611 Jan-Pascal van Best and Andreas Mohr\n";
-
-/* bufsize_rcv == 0 means autoprobing */
-static unsigned int bufsize_rcv;
-
-#define JUMPERED_INTERRUPTS    /* IRQ line jumpered on board */
-#undef JUMPERED_DMA            /* No DMA used */
-#undef FULL_IODETECT           /* Only detect in portlist */
-
-#ifndef FULL_IODETECT
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int ports[] __initdata =
-       { 0x300, 0x320, 0x340, 0x360, 0x380, 0x3a0, 0 };
-#endif
-
-/* Use 0 for production, 1 for verification, >2 for debug */
-#ifndef NI5010_DEBUG
-#define NI5010_DEBUG 0
-#endif
-
-/* Information that needs to be kept for each board. */
-struct ni5010_local {
-       int o_pkt_size;
-       spinlock_t lock;
-};
-
-/* Index to functions, as function prototypes. */
-
-static int     ni5010_probe1(struct net_device *dev, int ioaddr);
-static int     ni5010_open(struct net_device *dev);
-static int     ni5010_send_packet(struct sk_buff *skb, struct net_device *dev);
-static irqreturn_t ni5010_interrupt(int irq, void *dev_id);
-static void    ni5010_rx(struct net_device *dev);
-static void    ni5010_timeout(struct net_device *dev);
-static int     ni5010_close(struct net_device *dev);
-static void    ni5010_set_multicast_list(struct net_device *dev);
-static void    reset_receiver(struct net_device *dev);
-
-static int     process_xmt_interrupt(struct net_device *dev);
-#define tx_done(dev) 1
-static void    hardware_send_packet(struct net_device *dev, char *buf, int length, int pad);
-static void    chipset_init(struct net_device *dev, int startp);
-static void    dump_packet(void *buf, int len);
-static void    ni5010_show_registers(struct net_device *dev);
-
-static int io;
-static int irq;
-
-struct net_device * __init ni5010_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct ni5010_local));
-       int *port;
-       int err = 0;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-               io = dev->base_addr;
-               irq = dev->irq;
-       }
-
-       PRINTK2((KERN_DEBUG "%s: Entering ni5010_probe\n", dev->name));
-
-       if (io > 0x1ff) {       /* Check a single specified location. */
-               err = ni5010_probe1(dev, io);
-       } else if (io != 0) {   /* Don't probe at all. */
-               err = -ENXIO;
-       } else {
-#ifdef FULL_IODETECT
-               for (io=0x200; io<0x400 && ni5010_probe1(dev, io) ; io+=0x20)
-                       ;
-               if (io == 0x400)
-                       err = -ENODEV;
-
-#else
-               for (port = ports; *port && ni5010_probe1(dev, *port); port++)
-                       ;
-               if (!*port)
-                       err = -ENODEV;
-#endif /* FULL_IODETECT */
-       }
-       if (err)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-       release_region(dev->base_addr, NI5010_IO_EXTENT);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-static inline int rd_port(int ioaddr)
-{
-       inb(IE_RBUF);
-       return inb(IE_SAPROM);
-}
-
-static void __init trigger_irq(int ioaddr)
-{
-               outb(0x00, EDLC_RESET); /* Clear EDLC hold RESET state */
-               outb(0x00, IE_RESET);   /* Board reset */
-               outb(0x00, EDLC_XMASK); /* Disable all Xmt interrupts */
-               outb(0x00, EDLC_RMASK); /* Disable all Rcv interrupt */
-               outb(0xff, EDLC_XCLR);  /* Clear all pending Xmt interrupts */
-               outb(0xff, EDLC_RCLR);  /* Clear all pending Rcv interrupts */
-               /*
-                * Transmit packet mode: Ignore parity, Power xcvr,
-                *      Enable loopback
-                */
-               outb(XMD_IG_PAR | XMD_T_MODE | XMD_LBC, EDLC_XMODE);
-               outb(RMD_BROADCAST, EDLC_RMODE); /* Receive normal&broadcast */
-               outb(XM_ALL, EDLC_XMASK);       /* Enable all Xmt interrupts */
-               udelay(50);                     /* FIXME: Necessary? */
-               outb(MM_EN_XMT|MM_MUX, IE_MMODE); /* Start transmission */
-}
-
-static const struct net_device_ops ni5010_netdev_ops = {
-       .ndo_open               = ni5010_open,
-       .ndo_stop               = ni5010_close,
-       .ndo_start_xmit         = ni5010_send_packet,
-       .ndo_set_rx_mode        = ni5010_set_multicast_list,
-       .ndo_tx_timeout         = ni5010_timeout,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-};
-
-/*
- *      This is the real probe routine.  Linux has a history of friendly device
- *      probes on the ISA bus.  A good device probes avoids doing writes, and
- *      verifies that the correct device exists and functions.
- */
-
-static int __init ni5010_probe1(struct net_device *dev, int ioaddr)
-{
-       static unsigned version_printed;
-       struct ni5010_local *lp;
-       int i;
-       unsigned int data = 0;
-       int boguscount = 40;
-       int err = -ENODEV;
-
-       dev->base_addr = ioaddr;
-       dev->irq = irq;
-
-       if (!request_region(ioaddr, NI5010_IO_EXTENT, boardname))
-               return -EBUSY;
-
-       /*
-        * This is no "official" probe method, I've rather tested which
-        * probe works best with my seven NI5010 cards
-        * (they have very different serial numbers)
-        * Suggestions or failure reports are very, very welcome !
-        * But I think it is a relatively good probe method
-        * since it doesn't use any "outb"
-        * It should be nearly 100% reliable !
-        * well-known WARNING: this probe method (like many others)
-        * will hang the system if a NE2000 card region is probed !
-        *
-        *   - Andreas
-        */
-
-       PRINTK2((KERN_DEBUG "%s: entering ni5010_probe1(%#3x)\n",
-               dev->name, ioaddr));
-
-       if (inb(ioaddr+0) == 0xff)
-               goto out;
-
-       while ( (rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) &
-                rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr)) != 0xff)
-       {
-               if (boguscount-- == 0)
-                       goto out;
-       }
-
-       PRINTK2((KERN_DEBUG "%s: I/O #1 passed!\n", dev->name));
-
-       for (i=0; i<32; i++)
-               if ( (data = rd_port(ioaddr)) != 0xff) break;
-       if (data==0xff)
-               goto out;
-
-       PRINTK2((KERN_DEBUG "%s: I/O #2 passed!\n", dev->name));
-
-       if ((data != SA_ADDR0) || (rd_port(ioaddr) != SA_ADDR1) ||
-           (rd_port(ioaddr) != SA_ADDR2))
-               goto out;
-
-       for (i=0; i<4; i++)
-               rd_port(ioaddr);
-
-       if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) ||
-            (rd_port(ioaddr) != NI5010_MAGICVAL2) )
-               goto out;
-
-       PRINTK2((KERN_DEBUG "%s: I/O #3 passed!\n", dev->name));
-
-       if (NI5010_DEBUG && version_printed++ == 0)
-               printk(KERN_INFO "%s", version);
-
-       printk("NI5010 ethercard probe at 0x%x: ", ioaddr);
-
-       dev->base_addr = ioaddr;
-
-       for (i=0; i<6; i++) {
-               outw(i, IE_GP);
-               dev->dev_addr[i] = inb(IE_SAPROM);
-       }
-       printk("%pM ", dev->dev_addr);
-
-       PRINTK2((KERN_DEBUG "%s: I/O #4 passed!\n", dev->name));
-
-#ifdef JUMPERED_INTERRUPTS
-       if (dev->irq == 0xff)
-               ;
-       else if (dev->irq < 2) {
-               unsigned long irq_mask;
-
-               PRINTK2((KERN_DEBUG "%s: I/O #5 passed!\n", dev->name));
-
-               irq_mask = probe_irq_on();
-               trigger_irq(ioaddr);
-               mdelay(20);
-               dev->irq = probe_irq_off(irq_mask);
-
-               PRINTK2((KERN_DEBUG "%s: I/O #6 passed!\n", dev->name));
-
-               if (dev->irq == 0) {
-                       err = -EAGAIN;
-                       printk(KERN_WARNING "%s: no IRQ found!\n", dev->name);
-                       goto out;
-               }
-               PRINTK2((KERN_DEBUG "%s: I/O #7 passed!\n", dev->name));
-       } else if (dev->irq == 2) {
-               dev->irq = 9;
-       }
-#endif /* JUMPERED_INTERRUPTS */
-       PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name));
-
-       /* DMA is not supported (yet?), so no use detecting it */
-       lp = netdev_priv(dev);
-
-       spin_lock_init(&lp->lock);
-
-       PRINTK2((KERN_DEBUG "%s: I/O #10 passed!\n", dev->name));
-
-/* get the size of the onboard receive buffer
- * higher addresses than bufsize are wrapped into real buffer
- * i.e. data for offs. 0x801 is written to 0x1 with a 2K onboard buffer
- */
-       if (!bufsize_rcv) {
-               outb(1, IE_MMODE);      /* Put Rcv buffer on system bus */
-               outw(0, IE_GP);         /* Point GP at start of packet */
-               outb(0, IE_RBUF);       /* set buffer byte 0 to 0 */
-               for (i = 1; i < 0xff; i++) {
-                       outw(i << 8, IE_GP); /* Point GP at packet size to be tested */
-                       outb(i, IE_RBUF);
-                       outw(0x0, IE_GP); /* Point GP at start of packet */
-                       data = inb(IE_RBUF);
-                       if (data == i) break;
-               }
-               bufsize_rcv = i << 8;
-               outw(0, IE_GP);         /* Point GP at start of packet */
-               outb(0, IE_RBUF);       /* set buffer byte 0 to 0 again */
-       }
-        printk("-> bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE);
-
-       dev->netdev_ops         = &ni5010_netdev_ops;
-       dev->watchdog_timeo     = HZ/20;
-
-       dev->flags &= ~IFF_MULTICAST;   /* Multicast doesn't work */
-
-       /* Shut up the ni5010 */
-       outb(0, EDLC_RMASK);    /* Mask all receive interrupts */
-       outb(0, EDLC_XMASK);    /* Mask all xmit interrupts */
-       outb(0xff, EDLC_RCLR);  /* Kill all pending rcv interrupts */
-       outb(0xff, EDLC_XCLR);  /* Kill all pending xmt interrupts */
-
-       printk(KERN_INFO "%s: NI5010 found at 0x%x, using IRQ %d", dev->name, ioaddr, dev->irq);
-       if (dev->dma)
-               printk(" & DMA %d", dev->dma);
-       printk(".\n");
-       return 0;
-out:
-       release_region(dev->base_addr, NI5010_IO_EXTENT);
-       return err;
-}
-
-/*
- * Open/initialize the board.  This is called (in the current kernel)
- * sometime after booting when the 'ifconfig' program is run.
- *
- * This routine should set everything up anew at each open, even
- * registers that "should" only need to be set once at boot, so that
- * there is a non-reboot way to recover if something goes wrong.
- */
-
-static int ni5010_open(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       int i;
-
-       PRINTK2((KERN_DEBUG "%s: entering ni5010_open()\n", dev->name));
-
-       if (request_irq(dev->irq, ni5010_interrupt, 0, boardname, dev)) {
-               printk(KERN_WARNING "%s: Cannot get irq %#2x\n", dev->name, dev->irq);
-               return -EAGAIN;
-       }
-       PRINTK3((KERN_DEBUG "%s: passed open() #1\n", dev->name));
-        /*
-         * Always allocate the DMA channel after the IRQ,
-         * and clean up on failure.
-         */
-#ifdef JUMPERED_DMA
-        if (request_dma(dev->dma, cardname)) {
-               printk(KERN_WARNING "%s: Cannot get dma %#2x\n", dev->name, dev->dma);
-                free_irq(dev->irq, NULL);
-                return -EAGAIN;
-        }
-#endif /* JUMPERED_DMA */
-
-       PRINTK3((KERN_DEBUG "%s: passed open() #2\n", dev->name));
-       /* Reset the hardware here.  Don't forget to set the station address. */
-
-       outb(RS_RESET, EDLC_RESET);     /* Hold up EDLC_RESET while configing board */
-       outb(0, IE_RESET);              /* Hardware reset of ni5010 board */
-       outb(XMD_LBC, EDLC_XMODE);      /* Only loopback xmits */
-
-       PRINTK3((KERN_DEBUG "%s: passed open() #3\n", dev->name));
-       /* Set the station address */
-       for(i = 0;i < 6; i++) {
-               outb(dev->dev_addr[i], EDLC_ADDR + i);
-       }
-
-       PRINTK3((KERN_DEBUG "%s: Initialising ni5010\n", dev->name));
-       outb(0, EDLC_XMASK);    /* No xmit interrupts for now */
-       outb(XMD_IG_PAR | XMD_T_MODE | XMD_LBC, EDLC_XMODE);
-                               /* Normal packet xmit mode */
-       outb(0xff, EDLC_XCLR);  /* Clear all pending xmit interrupts */
-       outb(RMD_BROADCAST, EDLC_RMODE);
-                               /* Receive broadcast and normal packets */
-       reset_receiver(dev);    /* Ready ni5010 for receiving packets */
-
-       outb(0, EDLC_RESET);    /* Un-reset the ni5010 */
-
-       netif_start_queue(dev);
-
-       if (NI5010_DEBUG) ni5010_show_registers(dev);
-
-       PRINTK((KERN_DEBUG "%s: open successful\n", dev->name));
-       return 0;
-}
-
-static void reset_receiver(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       PRINTK3((KERN_DEBUG "%s: resetting receiver\n", dev->name));
-       outw(0, IE_GP);         /* Receive packet at start of buffer */
-       outb(0xff, EDLC_RCLR);  /* Clear all pending rcv interrupts */
-       outb(0, IE_MMODE);      /* Put EDLC to rcv buffer */
-       outb(MM_EN_RCV, IE_MMODE); /* Enable rcv */
-       outb(0xff, EDLC_RMASK); /* Enable all rcv interrupts */
-}
-
-static void ni5010_timeout(struct net_device *dev)
-{
-       printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
-                  tx_done(dev) ? "IRQ conflict" : "network cable problem");
-       /* Try to restart the adaptor. */
-       /* FIXME: Give it a real kick here */
-       chipset_init(dev, 1);
-       dev->trans_start = jiffies; /* prevent tx timeout */
-       netif_wake_queue(dev);
-}
-
-static int ni5010_send_packet(struct sk_buff *skb, struct net_device *dev)
-{
-       int length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
-
-       PRINTK2((KERN_DEBUG "%s: entering ni5010_send_packet\n", dev->name));
-
-       /*
-         * Block sending
-        */
-
-       netif_stop_queue(dev);
-       hardware_send_packet(dev, (unsigned char *)skb->data, skb->len, length-skb->len);
-       dev_kfree_skb (skb);
-       return NETDEV_TX_OK;
-}
-
-/*
- * The typical workload of the driver:
- * Handle the network interface interrupts.
- */
-static irqreturn_t ni5010_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct ni5010_local *lp;
-       int ioaddr, status;
-       int xmit_was_error = 0;
-
-       PRINTK2((KERN_DEBUG "%s: entering ni5010_interrupt\n", dev->name));
-
-       ioaddr = dev->base_addr;
-       lp = netdev_priv(dev);
-
-       spin_lock(&lp->lock);
-       status = inb(IE_ISTAT);
-       PRINTK3((KERN_DEBUG "%s: IE_ISTAT = %#02x\n", dev->name, status));
-
-        if ((status & IS_R_INT) == 0) ni5010_rx(dev);
-
-        if ((status & IS_X_INT) == 0) {
-                xmit_was_error = process_xmt_interrupt(dev);
-        }
-
-        if ((status & IS_DMA_INT) == 0) {
-                PRINTK((KERN_DEBUG "%s: DMA complete (?)\n", dev->name));
-                outb(0, IE_DMA_RST); /* Reset DMA int */
-        }
-
-       if (!xmit_was_error)
-               reset_receiver(dev);
-       spin_unlock(&lp->lock);
-       return IRQ_HANDLED;
-}
-
-
-static void dump_packet(void *buf, int len)
-{
-       int i;
-
-       printk(KERN_DEBUG "Packet length = %#4x\n", len);
-       for (i = 0; i < len; i++){
-               if (i % 16 == 0) printk(KERN_DEBUG "%#4.4x", i);
-               if (i % 2 == 0) printk(" ");
-               printk("%2.2x", ((unsigned char *)buf)[i]);
-               if (i % 16 == 15) printk("\n");
-       }
-       printk("\n");
-}
-
-/* We have a good packet, get it out of the buffer. */
-static void ni5010_rx(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       unsigned char rcv_stat;
-       struct sk_buff *skb;
-       int i_pkt_size;
-
-       PRINTK2((KERN_DEBUG "%s: entering ni5010_rx()\n", dev->name));
-
-       rcv_stat = inb(EDLC_RSTAT);
-       PRINTK3((KERN_DEBUG "%s: EDLC_RSTAT = %#2x\n", dev->name, rcv_stat));
-
-       if ( (rcv_stat & RS_VALID_BITS) != RS_PKT_OK) {
-               PRINTK((KERN_INFO "%s: receive error.\n", dev->name));
-               dev->stats.rx_errors++;
-               if (rcv_stat & RS_RUNT) dev->stats.rx_length_errors++;
-               if (rcv_stat & RS_ALIGN) dev->stats.rx_frame_errors++;
-               if (rcv_stat & RS_CRC_ERR) dev->stats.rx_crc_errors++;
-               if (rcv_stat & RS_OFLW) dev->stats.rx_fifo_errors++;
-               outb(0xff, EDLC_RCLR); /* Clear the interrupt */
-               return;
-       }
-
-        outb(0xff, EDLC_RCLR);  /* Clear the interrupt */
-
-       i_pkt_size = inw(IE_RCNT);
-       if (i_pkt_size > ETH_FRAME_LEN || i_pkt_size < 10 ) {
-               PRINTK((KERN_DEBUG "%s: Packet size error, packet size = %#4.4x\n",
-                       dev->name, i_pkt_size));
-               dev->stats.rx_errors++;
-               dev->stats.rx_length_errors++;
-               return;
-       }
-
-       /* Malloc up new buffer. */
-       skb = netdev_alloc_skb(dev, i_pkt_size + 3);
-       if (skb == NULL) {
-               printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
-               dev->stats.rx_dropped++;
-               return;
-       }
-
-       skb_reserve(skb, 2);
-
-       /* Read packet into buffer */
-        outb(MM_MUX, IE_MMODE); /* Rcv buffer to system bus */
-       outw(0, IE_GP); /* Seek to beginning of packet */
-       insb(IE_RBUF, skb_put(skb, i_pkt_size), i_pkt_size);
-
-       if (NI5010_DEBUG >= 4)
-               dump_packet(skb->data, skb->len);
-
-       skb->protocol = eth_type_trans(skb,dev);
-       netif_rx(skb);
-       dev->stats.rx_packets++;
-       dev->stats.rx_bytes += i_pkt_size;
-
-       PRINTK2((KERN_DEBUG "%s: Received packet, size=%#4.4x\n",
-               dev->name, i_pkt_size));
-}
-
-static int process_xmt_interrupt(struct net_device *dev)
-{
-       struct ni5010_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       int xmit_stat;
-
-       PRINTK2((KERN_DEBUG "%s: entering process_xmt_interrupt\n", dev->name));
-
-       xmit_stat = inb(EDLC_XSTAT);
-       PRINTK3((KERN_DEBUG "%s: EDLC_XSTAT = %2.2x\n", dev->name, xmit_stat));
-
-       outb(0, EDLC_XMASK);    /* Disable xmit IRQ's */
-       outb(0xff, EDLC_XCLR);  /* Clear all pending xmit IRQ's */
-
-       if (xmit_stat & XS_COLL){
-               PRINTK((KERN_DEBUG "%s: collision detected, retransmitting\n",
-                       dev->name));
-               outw(NI5010_BUFSIZE - lp->o_pkt_size, IE_GP);
-               /* outb(0, IE_MMODE); */ /* xmt buf on sysbus FIXME: needed ? */
-               outb(MM_EN_XMT | MM_MUX, IE_MMODE);
-               outb(XM_ALL, EDLC_XMASK); /* Enable xmt IRQ's */
-               dev->stats.collisions++;
-               return 1;
-       }
-
-       /* FIXME: handle other xmt error conditions */
-
-       dev->stats.tx_packets++;
-       dev->stats.tx_bytes += lp->o_pkt_size;
-       netif_wake_queue(dev);
-
-       PRINTK2((KERN_DEBUG "%s: sent packet, size=%#4.4x\n",
-               dev->name, lp->o_pkt_size));
-
-       return 0;
-}
-
-/* The inverse routine to ni5010_open(). */
-static int ni5010_close(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       PRINTK2((KERN_DEBUG "%s: entering ni5010_close\n", dev->name));
-#ifdef JUMPERED_INTERRUPTS
-       free_irq(dev->irq, NULL);
-#endif
-       /* Put card in held-RESET state */
-       outb(0, IE_MMODE);
-       outb(RS_RESET, EDLC_RESET);
-
-       netif_stop_queue(dev);
-
-       PRINTK((KERN_DEBUG "%s: %s closed down\n", dev->name, boardname));
-       return 0;
-
-}
-
-/* Set or clear the multicast filter for this adaptor.
-   num_addrs == -1      Promiscuous mode, receive all packets
-   num_addrs == 0       Normal mode, clear multicast list
-   num_addrs > 0        Multicast mode, receive normal and MC packets, and do
-                        best-effort filtering.
-*/
-static void ni5010_set_multicast_list(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-
-       PRINTK2((KERN_DEBUG "%s: entering set_multicast_list\n", dev->name));
-
-       if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI ||
-           !netdev_mc_empty(dev)) {
-               outb(RMD_PROMISC, EDLC_RMODE); /* Enable promiscuous mode */
-               PRINTK((KERN_DEBUG "%s: Entering promiscuous mode\n", dev->name));
-       } else {
-               PRINTK((KERN_DEBUG "%s: Entering broadcast mode\n", dev->name));
-               outb(RMD_BROADCAST, EDLC_RMODE);  /* Disable promiscuous mode, use normal mode */
-       }
-}
-
-static void hardware_send_packet(struct net_device *dev, char *buf, int length, int pad)
-{
-       struct ni5010_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       unsigned long flags;
-       unsigned int buf_offs;
-
-       PRINTK2((KERN_DEBUG "%s: entering hardware_send_packet\n", dev->name));
-
-        if (length > ETH_FRAME_LEN) {
-                PRINTK((KERN_WARNING "%s: packet too large, not possible\n",
-                        dev->name));
-                return;
-        }
-
-       if (NI5010_DEBUG) ni5010_show_registers(dev);
-
-       if (inb(IE_ISTAT) & IS_EN_XMT) {
-               PRINTK((KERN_WARNING "%s: sending packet while already transmitting, not possible\n",
-                       dev->name));
-               return;
-       }
-
-       if (NI5010_DEBUG > 3) dump_packet(buf, length);
-
-       buf_offs = NI5010_BUFSIZE - length - pad;
-
-       spin_lock_irqsave(&lp->lock, flags);
-       lp->o_pkt_size = length + pad;
-
-       outb(0, EDLC_RMASK);    /* Mask all receive interrupts */
-       outb(0, IE_MMODE);      /* Put Xmit buffer on system bus */
-       outb(0xff, EDLC_RCLR);  /* Clear out pending rcv interrupts */
-
-       outw(buf_offs, IE_GP); /* Point GP at start of packet */
-       outsb(IE_XBUF, buf, length); /* Put data in buffer */
-       while(pad--)
-               outb(0, IE_XBUF);
-
-       outw(buf_offs, IE_GP); /* Rewrite where packet starts */
-
-       /* should work without that outb() (Crynwr used it) */
-       /*outb(MM_MUX, IE_MMODE);*/ /* Xmt buffer to EDLC bus */
-       outb(MM_EN_XMT | MM_MUX, IE_MMODE); /* Begin transmission */
-       outb(XM_ALL, EDLC_XMASK); /* Cause interrupt after completion or fail */
-
-       spin_unlock_irqrestore(&lp->lock, flags);
-
-       netif_wake_queue(dev);
-
-       if (NI5010_DEBUG) ni5010_show_registers(dev);
-}
-
-static void chipset_init(struct net_device *dev, int startp)
-{
-       /* FIXME: Move some stuff here */
-       PRINTK3((KERN_DEBUG "%s: doing NOTHING in chipset_init\n", dev->name));
-}
-
-static void ni5010_show_registers(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-
-       PRINTK3((KERN_DEBUG "%s: XSTAT %#2.2x\n", dev->name, inb(EDLC_XSTAT)));
-       PRINTK3((KERN_DEBUG "%s: XMASK %#2.2x\n", dev->name, inb(EDLC_XMASK)));
-       PRINTK3((KERN_DEBUG "%s: RSTAT %#2.2x\n", dev->name, inb(EDLC_RSTAT)));
-       PRINTK3((KERN_DEBUG "%s: RMASK %#2.2x\n", dev->name, inb(EDLC_RMASK)));
-       PRINTK3((KERN_DEBUG "%s: RMODE %#2.2x\n", dev->name, inb(EDLC_RMODE)));
-       PRINTK3((KERN_DEBUG "%s: XMODE %#2.2x\n", dev->name, inb(EDLC_XMODE)));
-       PRINTK3((KERN_DEBUG "%s: ISTAT %#2.2x\n", dev->name, inb(IE_ISTAT)));
-}
-
-#ifdef MODULE
-static struct net_device *dev_ni5010;
-
-module_param(io, int, 0);
-module_param(irq, int, 0);
-MODULE_PARM_DESC(io, "ni5010 I/O base address");
-MODULE_PARM_DESC(irq, "ni5010 IRQ number");
-
-static int __init ni5010_init_module(void)
-{
-       PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname));
-       /*
-       if(io <= 0 || irq == 0){
-               printk(KERN_WARNING "%s: Autoprobing not allowed for modules.\n", boardname);
-               printk(KERN_WARNING "%s: Set symbols 'io' and 'irq'\n", boardname);
-               return -EINVAL;
-       }
-       */
-       if (io <= 0){
-               printk(KERN_WARNING "%s: Autoprobing for modules is hazardous, trying anyway..\n", boardname);
-       }
-
-       PRINTK2((KERN_DEBUG "%s: init_module irq=%#2x, io=%#3x\n", boardname, irq, io));
-       dev_ni5010 = ni5010_probe(-1);
-       if (IS_ERR(dev_ni5010))
-               return PTR_ERR(dev_ni5010);
-        return 0;
-}
-
-static void __exit ni5010_cleanup_module(void)
-{
-       PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname));
-       unregister_netdev(dev_ni5010);
-       release_region(dev_ni5010->base_addr, NI5010_IO_EXTENT);
-       free_netdev(dev_ni5010);
-}
-module_init(ni5010_init_module);
-module_exit(ni5010_cleanup_module);
-#endif /* MODULE */
-MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/racal/ni5010.h b/drivers/net/ethernet/racal/ni5010.h
deleted file mode 100644 (file)
index e10e717..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Racal-Interlan ni5010 Ethernet definitions
- *
- * This is an extension to the Linux operating system, and is covered by the
- * same GNU General Public License that covers that work.
- *
- * copyrights (c) 1996 by Jan-Pascal van Best (jvbest@wi.leidenuniv.nl)
- *
- * I have done a look in the following sources:
- *   crynwr-packet-driver by Russ Nelson
- */
-
-#define NI5010_BUFSIZE 2048    /* number of bytes in a buffer */
-
-#define NI5010_MAGICVAL0 0x00  /* magic-values for ni5010 card */
-#define NI5010_MAGICVAL1 0x55
-#define NI5010_MAGICVAL2 0xAA
-
-#define SA_ADDR0 0x02
-#define SA_ADDR1 0x07
-#define SA_ADDR2 0x01
-
-/* The number of low I/O ports used by the ni5010 ethercard. */
-#define NI5010_IO_EXTENT       32
-
-#define PRINTK(x) if (NI5010_DEBUG) printk x
-#define PRINTK2(x) if (NI5010_DEBUG>=2) printk x
-#define PRINTK3(x) if (NI5010_DEBUG>=3) printk x
-
-/* The various IE command registers */
-#define EDLC_XSTAT     (ioaddr + 0x00) /* EDLC transmit csr */
-#define EDLC_XCLR      (ioaddr + 0x00) /* EDLC transmit "Clear IRQ" */
-#define EDLC_XMASK     (ioaddr + 0x01) /* EDLC transmit "IRQ Masks" */
-#define EDLC_RSTAT     (ioaddr + 0x02) /* EDLC receive csr */
-#define EDLC_RCLR      (ioaddr + 0x02) /* EDLC receive "Clear IRQ" */
-#define EDLC_RMASK     (ioaddr + 0x03) /* EDLC receive "IRQ Masks" */
-#define EDLC_XMODE     (ioaddr + 0x04) /* EDLC transmit Mode */
-#define EDLC_RMODE     (ioaddr + 0x05) /* EDLC receive Mode */
-#define EDLC_RESET     (ioaddr + 0x06) /* EDLC RESET register */
-#define EDLC_TDR1      (ioaddr + 0x07) /* "Time Domain Reflectometry" reg1 */
-#define EDLC_ADDR      (ioaddr + 0x08) /* EDLC station address, 6 bytes */
-                               /* 0x0E doesn't exist for r/w */
-#define EDLC_TDR2      (ioaddr + 0x0f) /* "Time Domain Reflectometry" reg2 */
-#define IE_GP          (ioaddr + 0x10) /* GP pointer (word register) */
-                               /* 0x11 is 2nd byte of GP Pointer */
-#define IE_RCNT                (ioaddr + 0x10) /* Count of bytes in rcv'd packet */
-                               /* 0x11 is 2nd byte of "Byte Count" */
-#define IE_MMODE       (ioaddr + 0x12) /* Memory Mode register */
-#define IE_DMA_RST     (ioaddr + 0x13) /* IE DMA Reset.  write only */
-#define IE_ISTAT       (ioaddr + 0x13) /* IE Interrupt Status.  read only */
-#define IE_RBUF                (ioaddr + 0x14) /* IE Receive Buffer port */
-#define IE_XBUF                (ioaddr + 0x15) /* IE Transmit Buffer port */
-#define IE_SAPROM      (ioaddr + 0x16) /* window on station addr prom */
-#define IE_RESET       (ioaddr + 0x17) /* any write causes Board Reset */
-
-/* bits in EDLC_XSTAT, interrupt clear on write, status when read */
-#define XS_TPOK                0x80    /* transmit packet successful */
-#define XS_CS          0x40    /* carrier sense */
-#define XS_RCVD                0x20    /* transmitted packet received */
-#define XS_SHORT       0x10    /* transmission media is shorted */
-#define XS_UFLW                0x08    /* underflow.  iff failed board */
-#define XS_COLL                0x04    /* collision occurred */
-#define XS_16COLL      0x02    /* 16th collision occurred */
-#define XS_PERR                0x01    /* parity error */
-
-#define XS_CLR_UFLW    0x08    /* clear underflow */
-#define XS_CLR_COLL    0x04    /* clear collision */
-#define XS_CLR_16COLL  0x02    /* clear 16th collision */
-#define XS_CLR_PERR    0x01    /* clear parity error */
-
-/* bits in EDLC_XMASK, mask/enable transmit interrupts.  register is r/w */
-#define XM_TPOK                0x80    /* =1 to enable Xmt Pkt OK interrupts */
-#define XM_RCVD                0x20    /* =1 to enable Xmt Pkt Rcvd ints */
-#define XM_UFLW                0x08    /* =1 to enable Xmt Underflow ints */
-#define XM_COLL                0x04    /* =1 to enable Xmt Collision ints */
-#define XM_COLL16      0x02    /* =1 to enable Xmt 16th Coll ints */
-#define XM_PERR                0x01    /* =1 to enable Xmt Parity Error ints */
-                               /* note: always clear this bit */
-#define XM_ALL         (XM_TPOK | XM_RCVD | XM_UFLW | XM_COLL | XM_COLL16)
-
-/* bits in EDLC_RSTAT, interrupt clear on write, status when read */
-#define RS_PKT_OK      0x80    /* received good packet */
-#define RS_RST_PKT     0x10    /* RESET packet received */
-#define RS_RUNT                0x08    /* Runt Pkt rcvd.  Len < 64 Bytes */
-#define RS_ALIGN       0x04    /* Alignment error. not 8 bit aligned */
-#define RS_CRC_ERR     0x02    /* Bad CRC on rcvd pkt */
-#define RS_OFLW                0x01    /* overflow for rcv FIFO */
-#define RS_VALID_BITS  ( RS_PKT_OK | RS_RST_PKT | RS_RUNT | RS_ALIGN | RS_CRC_ERR | RS_OFLW )
-                               /* all valid RSTAT bits */
-
-#define RS_CLR_PKT_OK  0x80    /* clear rcvd packet interrupt */
-#define RS_CLR_RST_PKT 0x10    /* clear RESET packet received */
-#define RS_CLR_RUNT    0x08    /* clear Runt Pckt received */
-#define RS_CLR_ALIGN   0x04    /* clear Alignment error */
-#define RS_CLR_CRC_ERR 0x02    /* clear CRC error */
-#define RS_CLR_OFLW    0x01    /* clear rcv FIFO Overflow */
-
-/* bits in EDLC_RMASK, mask/enable receive interrupts.  register is r/w */
-#define RM_PKT_OK      0x80    /* =1 to enable rcvd good packet ints */
-#define RM_RST_PKT     0x10    /* =1 to enable RESET packet ints */
-#define RM_RUNT                0x08    /* =1 to enable Runt Pkt rcvd ints */
-#define RM_ALIGN       0x04    /* =1 to enable Alignment error ints */
-#define RM_CRC_ERR     0x02    /* =1 to enable Bad CRC error ints */
-#define RM_OFLW                0x01    /* =1 to enable overflow error ints */
-
-/* bits in EDLC_RMODE, set Receive Packet mode.  register is r/w */
-#define RMD_TEST       0x80    /* =1 for Chip testing.  normally 0 */
-#define RMD_ADD_SIZ    0x10    /* =1 5-byte addr match.  normally 0 */
-#define RMD_EN_RUNT    0x08    /* =1 enable runt rcv.  normally 0 */
-#define RMD_EN_RST     0x04    /* =1 to rcv RESET pkt.  normally 0 */
-
-#define RMD_PROMISC    0x03    /* receive *all* packets.  unusual */
-#define RMD_MULTICAST  0x02    /* receive multicasts too.  unusual */
-#define RMD_BROADCAST  0x01    /* receive broadcasts & normal. usual */
-#define RMD_NO_PACKETS 0x00    /* don't receive any packets. unusual */
-
-/* bits in EDLC_XMODE, set Transmit Packet mode.  register is r/w */
-#define XMD_COLL_CNT   0xf0    /* coll's since success.  read-only */
-#define XMD_IG_PAR     0x08    /* =1 to ignore parity.  ALWAYS set */
-#define XMD_T_MODE     0x04    /* =1 to power xcvr. ALWAYS set this */
-#define XMD_LBC                0x02    /* =1 for loopbakc.  normally set */
-#define XMD_DIS_C      0x01    /* =1 disables contention. normally 0 */
-
-/* bits in EDLC_RESET, write only */
-#define RS_RESET       0x80    /* =1 to hold EDLC in reset state */
-
-/* bits in IE_MMODE, write only */
-#define MM_EN_DMA      0x80    /* =1 begin DMA xfer, Cplt clrs it */
-#define MM_EN_RCV      0x40    /* =1 allows Pkt rcv.  clr'd by rcv */
-#define MM_EN_XMT      0x20    /* =1 begin Xmt pkt.  Cplt clrs it */
-#define MM_BUS_PAGE    0x18    /* =00 ALWAYS.  Used when MUX=1 */
-#define MM_NET_PAGE    0x06    /* =00 ALWAYS.  Used when MUX=0 */
-#define MM_MUX         0x01    /* =1 means Rcv Buff on system bus */
-                               /* =0 means Xmt Buff on system bus */
-
-/* bits in IE_ISTAT, read only */
-#define IS_TDIAG       0x80    /* =1 if Diagnostic problem */
-#define IS_EN_RCV      0x20    /* =1 until frame is rcv'd cplt */
-#define IS_EN_XMT      0x10    /* =1 until frame is xmt'd cplt */
-#define IS_EN_DMA      0x08    /* =1 until DMA is cplt or aborted */
-#define IS_DMA_INT     0x04    /* =0 iff DMA done interrupt. */
-#define IS_R_INT       0x02    /* =0 iff unmasked Rcv interrupt */
-#define IS_X_INT       0x01    /* =0 iff unmasked Xmt interrupt */
-
index ba0be4b943ddff104cfaa06400bafcdaee8f3e51..34f76e99dc8ac4f0ca1029c82030e8f0791d07cd 100644 (file)
@@ -755,9 +755,6 @@ static void r6040_mac_address(struct net_device *dev)
        iowrite16(adrp[0], ioaddr + MID_0L);
        iowrite16(adrp[1], ioaddr + MID_0M);
        iowrite16(adrp[2], ioaddr + MID_0H);
-
-       /* Store MAC Address in perm_addr */
-       memcpy(dev->perm_addr, dev->dev_addr, ETH_ALEN);
 }
 
 static int r6040_open(struct net_device *dev)
@@ -1045,7 +1042,7 @@ static int r6040_mii_probe(struct net_device *dev)
        }
 
        phydev = phy_connect(dev, dev_name(&phydev->dev), &r6040_adjust_link,
-                               0, PHY_INTERFACE_MODE_MII);
+                            PHY_INTERFACE_MODE_MII);
 
        if (IS_ERR(phydev)) {
                dev_err(&lp->pdev->dev, "could not attach to PHY\n");
index 5ac93323a40cfa40995fbbaa3a4bc5ce0c3bea0a..b62a32484f6a629874413e045eb364b75d38d596 100644 (file)
@@ -1949,7 +1949,6 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        for (i = 0; i < 3; i++)
                ((__le16 *) (dev->dev_addr))[i] =
                    cpu_to_le16(read_eeprom (regs, i + 7, addr_len));
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        dev->netdev_ops = &cp_netdev_ops;
        netif_napi_add(dev, &cp->napi, cp_rx_poll, 16);
index 5dc1616301277346f9d5a931d89c82b340470442..1276ac71353ae1c85d74da90ef83e2f2c31b9d8b 100644 (file)
@@ -991,7 +991,6 @@ static int rtl8139_init_one(struct pci_dev *pdev,
        for (i = 0; i < 3; i++)
                ((__le16 *) (dev->dev_addr))[i] =
                    cpu_to_le16(read_eeprom (ioaddr, i + 7, addr_len));
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        /* The Rtl8139-specific entries in the device structure. */
        dev->netdev_ops = &rtl8139_netdev_ops;
index ed96f309bca8e030a0c098df8b8e728314f04bb0..97fdbb1d64121c90abc7e95159468327503bcd0f 100644 (file)
@@ -83,7 +83,7 @@ static const int multicast_filter_limit = 32;
 #define R8169_REGS_SIZE                256
 #define R8169_NAPI_WEIGHT      64
 #define NUM_TX_DESC    64      /* Number of Tx descriptor registers */
-#define NUM_RX_DESC    256     /* Number of Rx descriptor registers */
+#define NUM_RX_DESC    256U    /* Number of Rx descriptor registers */
 #define R8169_TX_RING_BYTES    (NUM_TX_DESC * sizeof(struct TxDesc))
 #define R8169_RX_RING_BYTES    (NUM_RX_DESC * sizeof(struct RxDesc))
 
@@ -727,7 +727,6 @@ struct rtl8169_private {
        u16 mac_version;
        u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
        u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
-       u32 dirty_rx;
        u32 dirty_tx;
        struct rtl8169_stats rx_stats;
        struct rtl8169_stats tx_stats;
@@ -4177,7 +4176,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp)
 
 static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
 {
-       tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
+       tp->dirty_tx = tp->cur_tx = tp->cur_rx = 0;
 }
 
 static void rtl_hw_jumbo_enable(struct rtl8169_private *tp)
@@ -5920,7 +5919,7 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)
                PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
 
        /* The infamous DAC f*ckup only happens at boot time */
-       if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
+       if ((tp->cp_cmd & PCIDAC) && !tp->cur_rx) {
                void __iomem *ioaddr = tp->mmio_addr;
 
                netif_info(tp, intr, dev, "disabling PCI DAC\n");
@@ -6035,10 +6034,8 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget
        unsigned int count;
 
        cur_rx = tp->cur_rx;
-       rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
-       rx_left = min(rx_left, budget);
 
-       for (; rx_left > 0; rx_left--, cur_rx++) {
+       for (rx_left = min(budget, NUM_RX_DESC); rx_left > 0; rx_left--, cur_rx++) {
                unsigned int entry = cur_rx % NUM_RX_DESC;
                struct RxDesc *desc = tp->RxDescArray + entry;
                u32 status;
@@ -6123,8 +6120,6 @@ process_pkt:
        count = cur_rx - tp->cur_rx;
        tp->cur_rx = cur_rx;
 
-       tp->dirty_rx += count;
-
        return count;
 }
 
@@ -6948,7 +6943,6 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* Get MAC address */
        for (i = 0; i < ETH_ALEN; i++)
                dev->dev_addr[i] = RTL_R8(MAC0 + i);
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
        dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
index 3d705862bd7d1176ec62235bc7fadc508b9dddbc..e195c1e89d6164670eae151bd9bec99b0951e3fe 100644 (file)
@@ -1422,7 +1422,7 @@ static int sh_eth_phy_init(struct net_device *ndev)
 
        /* Try connect to PHY */
        phydev = phy_connect(ndev, phy_id, sh_eth_adjust_link,
-                               0, mdp->phy_interface);
+                            mdp->phy_interface);
        if (IS_ERR(phydev)) {
                dev_err(&ndev->dev, "phy_connect failed\n");
                return PTR_ERR(phydev);
index 72fc57dd084d1a6b57a9301a8ae2bc43a3ffd249..21683e2b1ff412817213fa206416a6813235367d 100644 (file)
@@ -795,7 +795,7 @@ static inline int s6gmac_phy_start(struct net_device *dev)
        struct phy_device *p = NULL;
        while ((i < PHY_MAX_ADDR) && (!(p = pd->mii.bus->phy_map[i])))
                i++;
-       p = phy_connect(dev, dev_name(&p->dev), &s6gmac_adjust_link, 0,
+       p = phy_connect(dev, dev_name(&p->dev), &s6gmac_adjust_link,
                        PHY_INTERFACE_MODE_RGMII);
        if (IS_ERR(p)) {
                printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
index 29f18533fdc7663f6fe9552d629da322d5febb96..a71e1ec068ed3b45652a5a30613ec9de9f9fecac 100644 (file)
@@ -26,17 +26,6 @@ config ARM_ETHER3
          If you have an Acorn system with one of these network cards, you
          should say Y to this option if you wish to use it with Linux.
 
-config SEEQ8005
-       tristate "SEEQ8005 support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       ---help---
-         This is a driver for the SEEQ 8005 network (Ethernet) card.  If this
-         is for you, read the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called seeq8005.
-
 config SGISEEQ
        tristate "SGI Seeq ethernet controller support"
        depends on SGI_HAS_SEEQ
index 3e258a580c0599f084564f4b2eb2b3392f966ff6..0488e99b831f7a64a22400a9afab0180b0d937c5 100644 (file)
@@ -3,5 +3,4 @@
 #
 
 obj-$(CONFIG_ARM_ETHER3) += ether3.o
-obj-$(CONFIG_SEEQ8005) += seeq8005.o
 obj-$(CONFIG_SGISEEQ) += sgiseeq.o
diff --git a/drivers/net/ethernet/seeq/seeq8005.c b/drivers/net/ethernet/seeq/seeq8005.c
deleted file mode 100644 (file)
index d6e50de..0000000
+++ /dev/null
@@ -1,749 +0,0 @@
-/* seeq8005.c: A network driver for linux. */
-/*
-       Based on skeleton.c,
-       Written 1993-94 by Donald Becker.
-       See the skeleton.c file for further copyright information.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       The author may be reached as hamish@zot.apana.org.au
-
-       This file is a network device driver for the SEEQ 8005 chipset and
-       the Linux operating system.
-
-*/
-
-static const char version[] =
-       "seeq8005.c:v1.00 8/07/95 Hamish Coleman (hamish@zot.apana.org.au)\n";
-
-/*
-  Sources:
-       SEEQ 8005 databook
-
-  Version history:
-       1.00    Public release. cosmetic changes (no warnings now)
-       0.68    Turning per- packet,interrupt debug messages off - testing for release.
-       0.67    timing problems/bad buffer reads seem to be fixed now
-       0.63    *!@$ protocol=eth_type_trans -- now packets flow
-       0.56    Send working
-       0.48    Receive working
-*/
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/in.h>
-#include <linux/string.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/errno.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/bitops.h>
-#include <linux/jiffies.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#include "seeq8005.h"
-
-/* First, a few definitions that the brave might change. */
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int seeq8005_portlist[] __initdata =
-   { 0x300, 0x320, 0x340, 0x360, 0};
-
-/* use 0 for production, 1 for verification, >2 for debug */
-#ifndef NET_DEBUG
-#define NET_DEBUG 1
-#endif
-static unsigned int net_debug = NET_DEBUG;
-
-/* Information that need to be kept for each board. */
-struct net_local {
-       unsigned short receive_ptr;             /* What address in packet memory do we expect a recv_pkt_header? */
-       long open_time;                         /* Useless example local info. */
-};
-
-/* The station (ethernet) address prefix, used for IDing the board. */
-#define SA_ADDR0 0x00
-#define SA_ADDR1 0x80
-#define SA_ADDR2 0x4b
-
-/* Index to functions, as function prototypes. */
-
-static int seeq8005_probe1(struct net_device *dev, int ioaddr);
-static int seeq8005_open(struct net_device *dev);
-static void seeq8005_timeout(struct net_device *dev);
-static netdev_tx_t seeq8005_send_packet(struct sk_buff *skb,
-                                       struct net_device *dev);
-static irqreturn_t seeq8005_interrupt(int irq, void *dev_id);
-static void seeq8005_rx(struct net_device *dev);
-static int seeq8005_close(struct net_device *dev);
-static void set_multicast_list(struct net_device *dev);
-
-/* Example routines you must write ;->. */
-#define tx_done(dev)   (inw(SEEQ_STATUS) & SEEQSTAT_TX_ON)
-static void hardware_send_packet(struct net_device *dev, char *buf, int length);
-extern void seeq8005_init(struct net_device *dev, int startp);
-static inline void wait_for_buffer(struct net_device *dev);
-
-
-/* Check for a network adaptor of this type, and return '0' iff one exists.
-   If dev->base_addr == 0, probe all likely locations.
-   If dev->base_addr == 1, always return failure.
-   */
-
-static int io = 0x320;
-static int irq = 10;
-
-struct net_device * __init seeq8005_probe(int unit)
-{
-       struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-       unsigned *port;
-       int err = 0;
-
-       if (!dev)
-               return ERR_PTR(-ENODEV);
-
-       if (unit >= 0) {
-               sprintf(dev->name, "eth%d", unit);
-               netdev_boot_setup_check(dev);
-               io = dev->base_addr;
-               irq = dev->irq;
-       }
-
-       if (io > 0x1ff) {       /* Check a single specified location. */
-               err = seeq8005_probe1(dev, io);
-       } else if (io != 0) {   /* Don't probe at all. */
-               err = -ENXIO;
-       } else {
-               for (port = seeq8005_portlist; *port; port++) {
-                       if (seeq8005_probe1(dev, *port) == 0)
-                               break;
-               }
-               if (!*port)
-                       err = -ENODEV;
-       }
-       if (err)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       return dev;
-out1:
-       release_region(dev->base_addr, SEEQ8005_IO_EXTENT);
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-
-static const struct net_device_ops seeq8005_netdev_ops = {
-       .ndo_open               = seeq8005_open,
-       .ndo_stop               = seeq8005_close,
-       .ndo_start_xmit         = seeq8005_send_packet,
-       .ndo_tx_timeout         = seeq8005_timeout,
-       .ndo_set_rx_mode        = set_multicast_list,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-/* This is the real probe routine.  Linux has a history of friendly device
-   probes on the ISA bus.  A good device probes avoids doing writes, and
-   verifies that the correct device exists and functions.  */
-
-static int __init seeq8005_probe1(struct net_device *dev, int ioaddr)
-{
-       static unsigned version_printed;
-       int i,j;
-       unsigned char SA_prom[32];
-       int old_cfg1;
-       int old_cfg2;
-       int old_stat;
-       int old_dmaar;
-       int old_rear;
-       int retval;
-
-       if (!request_region(ioaddr, SEEQ8005_IO_EXTENT, "seeq8005"))
-               return -ENODEV;
-
-       if (net_debug>1)
-               printk("seeq8005: probing at 0x%x\n",ioaddr);
-
-       old_stat = inw(SEEQ_STATUS);                                    /* read status register */
-       if (old_stat == 0xffff) {
-               retval = -ENODEV;
-               goto out;                                               /* assume that 0xffff == no device */
-       }
-       if ( (old_stat & 0x1800) != 0x1800 ) {                          /* assume that unused bits are 1, as my manual says */
-               if (net_debug>1) {
-                       printk("seeq8005: reserved stat bits != 0x1800\n");
-                       printk("          == 0x%04x\n",old_stat);
-               }
-               retval = -ENODEV;
-               goto out;
-       }
-
-       old_rear = inw(SEEQ_REA);
-       if (old_rear == 0xffff) {
-               outw(0,SEEQ_REA);
-               if (inw(SEEQ_REA) == 0xffff) {                          /* assume that 0xffff == no device */
-                       retval = -ENODEV;
-                       goto out;
-               }
-       } else if ((old_rear & 0xff00) != 0xff00) {                     /* assume that unused bits are 1 */
-               if (net_debug>1) {
-                       printk("seeq8005: unused rear bits != 0xff00\n");
-                       printk("          == 0x%04x\n",old_rear);
-               }
-               retval = -ENODEV;
-               goto out;
-       }
-
-       old_cfg2 = inw(SEEQ_CFG2);                                      /* read CFG2 register */
-       old_cfg1 = inw(SEEQ_CFG1);
-       old_dmaar = inw(SEEQ_DMAAR);
-
-       if (net_debug>4) {
-               printk("seeq8005: stat = 0x%04x\n",old_stat);
-               printk("seeq8005: cfg1 = 0x%04x\n",old_cfg1);
-               printk("seeq8005: cfg2 = 0x%04x\n",old_cfg2);
-               printk("seeq8005: raer = 0x%04x\n",old_rear);
-               printk("seeq8005: dmaar= 0x%04x\n",old_dmaar);
-       }
-
-       outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);      /* setup for reading PROM */
-       outw( 0, SEEQ_DMAAR);                                           /* set starting PROM address */
-       outw( SEEQCFG1_BUFFER_PROM, SEEQ_CFG1);                         /* set buffer to look at PROM */
-
-
-       j=0;
-       for(i=0; i <32; i++) {
-               j+= SA_prom[i] = inw(SEEQ_BUFFER) & 0xff;
-       }
-
-#if 0
-       /* untested because I only have the one card */
-       if ( (j&0xff) != 0 ) {                                          /* checksum appears to be 8bit = 0 */
-               if (net_debug>1) {                                      /* check this before deciding that we have a card */
-                       printk("seeq8005: prom sum error\n");
-               }
-               outw( old_stat, SEEQ_STATUS);
-               outw( old_dmaar, SEEQ_DMAAR);
-               outw( old_cfg1, SEEQ_CFG1);
-               retval = -ENODEV;
-               goto out;
-       }
-#endif
-
-       outw( SEEQCFG2_RESET, SEEQ_CFG2);                               /* reset the card */
-       udelay(5);
-       outw( SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
-
-       if (net_debug) {
-               printk("seeq8005: prom sum = 0x%08x\n",j);
-               for(j=0; j<32; j+=16) {
-                       printk("seeq8005: prom %02x: ",j);
-                       for(i=0;i<16;i++) {
-                               printk("%02x ",SA_prom[j|i]);
-                       }
-                       printk(" ");
-                       for(i=0;i<16;i++) {
-                               if ((SA_prom[j|i]>31)&&(SA_prom[j|i]<127)) {
-                                       printk("%c", SA_prom[j|i]);
-                               } else {
-                                       printk(" ");
-                               }
-                       }
-                       printk("\n");
-               }
-       }
-
-#if 0
-       /*
-        * testing the packet buffer memory doesn't work yet
-        * but all other buffer accesses do
-        *                      - fixing is not a priority
-        */
-       if (net_debug>1) {                                      /* test packet buffer memory */
-               printk("seeq8005: testing packet buffer ... ");
-               outw( SEEQCFG1_BUFFER_BUFFER, SEEQ_CFG1);
-               outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
-               outw( 0 , SEEQ_DMAAR);
-               for(i=0;i<32768;i++) {
-                       outw(0x5a5a, SEEQ_BUFFER);
-               }
-               j=jiffies+HZ;
-               while ( ((inw(SEEQ_STATUS) & SEEQSTAT_FIFO_EMPTY) != SEEQSTAT_FIFO_EMPTY) && time_before(jiffies, j) )
-                       mb();
-               outw( 0 , SEEQ_DMAAR);
-               while ( ((inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, j+HZ))
-                       mb();
-               if ( (inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
-                       outw( SEEQCMD_WINDOW_INT_ACK | (inw(SEEQ_STATUS)& SEEQCMD_INT_MASK), SEEQ_CMD);
-               outw( SEEQCMD_FIFO_READ | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
-               j=0;
-               for(i=0;i<32768;i++) {
-                       if (inw(SEEQ_BUFFER) != 0x5a5a)
-                               j++;
-               }
-               if (j) {
-                       printk("%i\n",j);
-               } else {
-                       printk("ok.\n");
-               }
-       }
-#endif
-
-       if (net_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       printk("%s: %s found at %#3x, ", dev->name, "seeq8005", ioaddr);
-
-       /* Fill in the 'dev' fields. */
-       dev->base_addr = ioaddr;
-       dev->irq = irq;
-
-       /* Retrieve and print the ethernet address. */
-       for (i = 0; i < 6; i++)
-               dev->dev_addr[i] = SA_prom[i+6];
-       printk("%pM", dev->dev_addr);
-
-       if (dev->irq == 0xff)
-               ;                       /* Do nothing: a user-level program will set it. */
-       else if (dev->irq < 2) {        /* "Auto-IRQ" */
-               unsigned long cookie = probe_irq_on();
-
-               outw( SEEQCMD_RX_INT_EN | SEEQCMD_SET_RX_ON | SEEQCMD_SET_RX_OFF, SEEQ_CMD );
-
-               dev->irq = probe_irq_off(cookie);
-
-               if (net_debug >= 2)
-                       printk(" autoirq is %d\n", dev->irq);
-       } else if (dev->irq == 2)
-         /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
-          * or don't know which one to set.
-          */
-         dev->irq = 9;
-
-#if 0
-       {
-                int irqval = request_irq(dev->irq, seeq8005_interrupt, 0, "seeq8005", dev);
-                if (irqval) {
-                        printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
-                                        dev->irq, irqval);
-                        retval = -EAGAIN;
-                        goto out;
-                }
-       }
-#endif
-       dev->netdev_ops = &seeq8005_netdev_ops;
-       dev->watchdog_timeo     = HZ/20;
-       dev->flags &= ~IFF_MULTICAST;
-
-       return 0;
-out:
-       release_region(ioaddr, SEEQ8005_IO_EXTENT);
-       return retval;
-}
-
-
-/* Open/initialize the board.  This is called (in the current kernel)
-   sometime after booting when the 'ifconfig' program is run.
-
-   This routine should set everything up anew at each open, even
-   registers that "should" only need to be set once at boot, so that
-   there is non-reboot way to recover if something goes wrong.
-   */
-static int seeq8005_open(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-
-       {
-                int irqval = request_irq(dev->irq, seeq8005_interrupt, 0, "seeq8005", dev);
-                if (irqval) {
-                        printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
-                                        dev->irq, irqval);
-                        return -EAGAIN;
-                }
-       }
-
-       /* Reset the hardware here.  Don't forget to set the station address. */
-       seeq8005_init(dev, 1);
-
-       lp->open_time = jiffies;
-
-       netif_start_queue(dev);
-       return 0;
-}
-
-static void seeq8005_timeout(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr;
-       printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
-                  tx_done(dev) ? "IRQ conflict" : "network cable problem");
-       /* Try to restart the adaptor. */
-       seeq8005_init(dev, 1);
-       dev->trans_start = jiffies; /* prevent tx timeout */
-       netif_wake_queue(dev);
-}
-
-static netdev_tx_t seeq8005_send_packet(struct sk_buff *skb,
-                                       struct net_device *dev)
-{
-       short length = skb->len;
-       unsigned char *buf;
-
-       if (length < ETH_ZLEN) {
-               if (skb_padto(skb, ETH_ZLEN))
-                       return NETDEV_TX_OK;
-               length = ETH_ZLEN;
-       }
-       buf = skb->data;
-
-       /* Block a timer-based transmit from overlapping */
-       netif_stop_queue(dev);
-
-       hardware_send_packet(dev, buf, length);
-       dev->stats.tx_bytes += length;
-       dev_kfree_skb (skb);
-       /* You might need to clean up and record Tx statistics here. */
-
-       return NETDEV_TX_OK;
-}
-
-/*
- * wait_for_buffer
- *
- * This routine waits for the SEEQ chip to assert that the FIFO is ready
- * by checking for a window interrupt, and then clearing it. This has to
- * occur in the interrupt handler!
- */
-inline void wait_for_buffer(struct net_device * dev)
-{
-       int ioaddr = dev->base_addr;
-       unsigned long tmp;
-       int status;
-
-       tmp = jiffies + HZ;
-       while ( ( ((status=inw(SEEQ_STATUS)) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, tmp))
-               cpu_relax();
-
-       if ( (status & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
-               outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
-}
-
-/* The typical workload of the driver:
-   Handle the network interface interrupts. */
-static irqreturn_t seeq8005_interrupt(int irq, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-       struct net_local *lp;
-       int ioaddr, status, boguscount = 0;
-       int handled = 0;
-
-       ioaddr = dev->base_addr;
-       lp = netdev_priv(dev);
-
-       status = inw(SEEQ_STATUS);
-       do {
-               if (net_debug >2) {
-                       printk("%s: int, status=0x%04x\n",dev->name,status);
-               }
-
-               if (status & SEEQSTAT_WINDOW_INT) {
-                       handled = 1;
-                       outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
-                       if (net_debug) {
-                               printk("%s: window int!\n",dev->name);
-                       }
-               }
-               if (status & SEEQSTAT_TX_INT) {
-                       handled = 1;
-                       outw( SEEQCMD_TX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
-                       dev->stats.tx_packets++;
-                       netif_wake_queue(dev);  /* Inform upper layers. */
-               }
-               if (status & SEEQSTAT_RX_INT) {
-                       handled = 1;
-                       /* Got a packet(s). */
-                       seeq8005_rx(dev);
-               }
-               status = inw(SEEQ_STATUS);
-       } while ( (++boguscount < 10) && (status & SEEQSTAT_ANY_INT)) ;
-
-       if(net_debug>2) {
-               printk("%s: eoi\n",dev->name);
-       }
-       return IRQ_RETVAL(handled);
-}
-
-/* We have a good packet(s), get it/them out of the buffers. */
-static void seeq8005_rx(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int boguscount = 10;
-       int pkt_hdr;
-       int ioaddr = dev->base_addr;
-
-       do {
-               int next_packet;
-               int pkt_len;
-               int i;
-               int status;
-
-               status = inw(SEEQ_STATUS);
-               outw( lp->receive_ptr, SEEQ_DMAAR);
-               outw(SEEQCMD_FIFO_READ | SEEQCMD_RX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
-               wait_for_buffer(dev);
-               next_packet = ntohs(inw(SEEQ_BUFFER));
-               pkt_hdr = inw(SEEQ_BUFFER);
-
-               if (net_debug>2) {
-                       printk("%s: 0x%04x recv next=0x%04x, hdr=0x%04x\n",dev->name,lp->receive_ptr,next_packet,pkt_hdr);
-               }
-
-               if ((next_packet == 0) || ((pkt_hdr & SEEQPKTH_CHAIN)==0)) {    /* Read all the frames? */
-                       return;                                                 /* Done for now */
-               }
-
-               if ((pkt_hdr & SEEQPKTS_DONE)==0)
-                       break;
-
-               if (next_packet < lp->receive_ptr) {
-                       pkt_len = (next_packet + 0x10000 - ((DEFAULT_TEA+1)<<8)) - lp->receive_ptr - 4;
-               } else {
-                       pkt_len = next_packet - lp->receive_ptr - 4;
-               }
-
-               if (next_packet < ((DEFAULT_TEA+1)<<8)) {                       /* is the next_packet address sane? */
-                       printk("%s: recv packet ring corrupt, resetting board\n",dev->name);
-                       seeq8005_init(dev,1);
-                       return;
-               }
-
-               lp->receive_ptr = next_packet;
-
-               if (net_debug>2) {
-                       printk("%s: recv len=0x%04x\n",dev->name,pkt_len);
-               }
-
-               if (pkt_hdr & SEEQPKTS_ANY_ERROR) {                             /* There was an error. */
-                       dev->stats.rx_errors++;
-                       if (pkt_hdr & SEEQPKTS_SHORT) dev->stats.rx_frame_errors++;
-                       if (pkt_hdr & SEEQPKTS_DRIB) dev->stats.rx_frame_errors++;
-                       if (pkt_hdr & SEEQPKTS_OVERSIZE) dev->stats.rx_over_errors++;
-                       if (pkt_hdr & SEEQPKTS_CRC_ERR) dev->stats.rx_crc_errors++;
-                       /* skip over this packet */
-                       outw( SEEQCMD_FIFO_WRITE | SEEQCMD_DMA_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
-                       outw( (lp->receive_ptr & 0xff00)>>8, SEEQ_REA);
-               } else {
-                       /* Malloc up new buffer. */
-                       struct sk_buff *skb;
-                       unsigned char *buf;
-
-                       skb = netdev_alloc_skb(dev, pkt_len);
-                       if (skb == NULL) {
-                               printk("%s: Memory squeeze, dropping packet.\n", dev->name);
-                               dev->stats.rx_dropped++;
-                               break;
-                       }
-                       skb_reserve(skb, 2);    /* align data on 16 byte */
-                       buf = skb_put(skb,pkt_len);
-
-                       insw(SEEQ_BUFFER, buf, (pkt_len + 1) >> 1);
-
-                       if (net_debug>2) {
-                               char * p = buf;
-                               printk("%s: recv ",dev->name);
-                               for(i=0;i<14;i++) {
-                                       printk("%02x ",*(p++)&0xff);
-                               }
-                               printk("\n");
-                       }
-
-                       skb->protocol=eth_type_trans(skb,dev);
-                       netif_rx(skb);
-                       dev->stats.rx_packets++;
-                       dev->stats.rx_bytes += pkt_len;
-               }
-       } while ((--boguscount) && (pkt_hdr & SEEQPKTH_CHAIN));
-
-       /* If any worth-while packets have been received, netif_rx()
-          has done a mark_bh(NET_BH) for us and will work on them
-          when we get to the bottom-half routine. */
-}
-
-/* The inverse routine to net_open(). */
-static int seeq8005_close(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-
-       lp->open_time = 0;
-
-       netif_stop_queue(dev);
-
-       /* Flush the Tx and disable Rx here. */
-       outw( SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
-
-       free_irq(dev->irq, dev);
-
-       /* Update the statistics here. */
-
-       return 0;
-
-}
-
-/* Set or clear the multicast filter for this adaptor.
-   num_addrs == -1     Promiscuous mode, receive all packets
-   num_addrs == 0      Normal mode, clear multicast list
-   num_addrs > 0       Multicast mode, receive normal and MC packets, and do
-                       best-effort filtering.
- */
-static void set_multicast_list(struct net_device *dev)
-{
-/*
- * I _could_ do up to 6 addresses here, but won't (yet?)
- */
-
-#if 0
-       int ioaddr = dev->base_addr;
-/*
- * hmm, not even sure if my matching works _anyway_ - seem to be receiving
- * _everything_ . . .
- */
-
-       if (num_addrs) {                        /* Enable promiscuous mode */
-               outw( (inw(SEEQ_CFG1) & ~SEEQCFG1_MATCH_MASK)| SEEQCFG1_MATCH_ALL,  SEEQ_CFG1);
-               dev->flags|=IFF_PROMISC;
-       } else {                                /* Disable promiscuous mode, use normal mode */
-               outw( (inw(SEEQ_CFG1) & ~SEEQCFG1_MATCH_MASK)| SEEQCFG1_MATCH_BROAD, SEEQ_CFG1);
-       }
-#endif
-}
-
-void seeq8005_init(struct net_device *dev, int startp)
-{
-       struct net_local *lp = netdev_priv(dev);
-       int ioaddr = dev->base_addr;
-       int i;
-
-       outw(SEEQCFG2_RESET, SEEQ_CFG2);        /* reset device */
-       udelay(5);
-
-       outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
-       outw( 0, SEEQ_DMAAR);                   /* load start address into both low and high byte */
-/*     wait_for_buffer(dev); */                /* I think that you only need a wait for memory buffer */
-       outw( SEEQCFG1_BUFFER_MAC0, SEEQ_CFG1);
-
-       for(i=0;i<6;i++) {                      /* set Station address */
-               outb(dev->dev_addr[i], SEEQ_BUFFER);
-               udelay(2);
-       }
-
-       outw( SEEQCFG1_BUFFER_TEA, SEEQ_CFG1);  /* set xmit end area pointer to 16K */
-       outb( DEFAULT_TEA, SEEQ_BUFFER);        /* this gives us 16K of send buffer and 48K of recv buffer */
-
-       lp->receive_ptr = (DEFAULT_TEA+1)<<8;   /* so we can find our packet_header */
-       outw( lp->receive_ptr, SEEQ_RPR);       /* Receive Pointer Register is set to recv buffer memory */
-
-       outw( 0x00ff, SEEQ_REA);                /* Receive Area End */
-
-       if (net_debug>4) {
-               printk("%s: SA0 = ",dev->name);
-
-               outw( SEEQCMD_FIFO_READ | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
-               outw( 0, SEEQ_DMAAR);
-               outw( SEEQCFG1_BUFFER_MAC0, SEEQ_CFG1);
-
-               for(i=0;i<6;i++) {
-                       printk("%02x ",inb(SEEQ_BUFFER));
-               }
-               printk("\n");
-       }
-
-       outw( SEEQCFG1_MAC0_EN | SEEQCFG1_MATCH_BROAD | SEEQCFG1_BUFFER_BUFFER, SEEQ_CFG1);
-       outw( SEEQCFG2_AUTO_REA | SEEQCFG2_CTRLO, SEEQ_CFG2);
-       outw( SEEQCMD_SET_RX_ON | SEEQCMD_TX_INT_EN | SEEQCMD_RX_INT_EN, SEEQ_CMD);
-
-       if (net_debug>4) {
-               int old_cfg1;
-               old_cfg1 = inw(SEEQ_CFG1);
-               printk("%s: stat = 0x%04x\n",dev->name,inw(SEEQ_STATUS));
-               printk("%s: cfg1 = 0x%04x\n",dev->name,old_cfg1);
-               printk("%s: cfg2 = 0x%04x\n",dev->name,inw(SEEQ_CFG2));
-               printk("%s: raer = 0x%04x\n",dev->name,inw(SEEQ_REA));
-               printk("%s: dmaar= 0x%04x\n",dev->name,inw(SEEQ_DMAAR));
-
-       }
-}
-
-
-static void hardware_send_packet(struct net_device * dev, char *buf, int length)
-{
-       int ioaddr = dev->base_addr;
-       int status = inw(SEEQ_STATUS);
-       int transmit_ptr = 0;
-       unsigned long tmp;
-
-       if (net_debug>4) {
-               printk("%s: send 0x%04x\n",dev->name,length);
-       }
-
-       /* Set FIFO to writemode and set packet-buffer address */
-       outw( SEEQCMD_FIFO_WRITE | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
-       outw( transmit_ptr, SEEQ_DMAAR);
-
-       /* output SEEQ Packet header barfage */
-       outw( htons(length + 4), SEEQ_BUFFER);
-       outw( SEEQPKTH_XMIT | SEEQPKTH_DATA_FOLLOWS | SEEQPKTH_XMIT_INT_EN, SEEQ_BUFFER );
-
-       /* blat the buffer */
-       outsw( SEEQ_BUFFER, buf, (length +1) >> 1);
-       /* paranoia !! */
-       outw( 0, SEEQ_BUFFER);
-       outw( 0, SEEQ_BUFFER);
-
-       /* set address of start of transmit chain */
-       outw( transmit_ptr, SEEQ_TPR);
-
-       /* drain FIFO */
-       tmp = jiffies;
-       while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && time_before(jiffies, tmp + HZ))
-               mb();
-
-       /* doit ! */
-       outw( SEEQCMD_WINDOW_INT_ACK | SEEQCMD_SET_TX_ON | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
-
-}
-
-
-#ifdef MODULE
-
-static struct net_device *dev_seeq;
-MODULE_LICENSE("GPL");
-module_param(io, int, 0);
-module_param(irq, int, 0);
-MODULE_PARM_DESC(io, "SEEQ 8005 I/O base address");
-MODULE_PARM_DESC(irq, "SEEQ 8005 IRQ number");
-
-int __init init_module(void)
-{
-       dev_seeq = seeq8005_probe(-1);
-       return PTR_RET(dev_seeq);
-}
-
-void __exit cleanup_module(void)
-{
-       unregister_netdev(dev_seeq);
-       release_region(dev_seeq->base_addr, SEEQ8005_IO_EXTENT);
-       free_netdev(dev_seeq);
-}
-
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/seeq/seeq8005.h b/drivers/net/ethernet/seeq/seeq8005.h
deleted file mode 100644 (file)
index 5dfb009..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * defines, etc for the seeq8005
- */
-
-/*
- * This file is distributed under GPL.
- *
- * This style and layout of this file is also copied
- * from many of the other linux network device drivers.
- */
-
-/* The number of low I/O ports used by the ethercard. */
-#define SEEQ8005_IO_EXTENT     16
-
-#define SEEQ_B         (ioaddr)
-
-#define        SEEQ_CMD        (SEEQ_B)                /* Write only */
-#define        SEEQ_STATUS     (SEEQ_B)                /* Read only */
-#define SEEQ_CFG1      (SEEQ_B + 2)
-#define SEEQ_CFG2      (SEEQ_B + 4)
-#define        SEEQ_REA        (SEEQ_B + 6)            /* Receive End Area Register */
-#define SEEQ_RPR       (SEEQ_B + 10)           /* Receive Pointer Register */
-#define        SEEQ_TPR        (SEEQ_B + 12)           /* Transmit Pointer Register */
-#define        SEEQ_DMAAR      (SEEQ_B + 14)           /* DMA Address Register */
-#define SEEQ_BUFFER    (SEEQ_B + 8)            /* Buffer Window Register */
-
-#define        DEFAULT_TEA     (0x3f)
-
-#define SEEQCMD_DMA_INT_EN     (0x0001)        /* DMA Interrupt Enable */
-#define SEEQCMD_RX_INT_EN      (0x0002)        /* Receive Interrupt Enable */
-#define SEEQCMD_TX_INT_EN      (0x0004)        /* Transmit Interrupt Enable */
-#define SEEQCMD_WINDOW_INT_EN  (0x0008)        /* What the hell is this for?? */
-#define SEEQCMD_INT_MASK       (0x000f)
-
-#define SEEQCMD_DMA_INT_ACK    (0x0010)        /* DMA ack */
-#define SEEQCMD_RX_INT_ACK     (0x0020)
-#define SEEQCMD_TX_INT_ACK     (0x0040)
-#define        SEEQCMD_WINDOW_INT_ACK  (0x0080)
-#define SEEQCMD_ACK_ALL                (0x00f0)
-
-#define SEEQCMD_SET_DMA_ON     (0x0100)        /* Enables DMA Request logic */
-#define SEEQCMD_SET_RX_ON      (0x0200)        /* Enables Packet RX */
-#define SEEQCMD_SET_TX_ON      (0x0400)        /* Starts TX run */
-#define SEEQCMD_SET_DMA_OFF    (0x0800)
-#define SEEQCMD_SET_RX_OFF     (0x1000)
-#define SEEQCMD_SET_TX_OFF     (0x2000)
-#define SEEQCMD_SET_ALL_OFF    (0x3800)        /* set all logic off */
-
-#define SEEQCMD_FIFO_READ      (0x4000)        /* Set FIFO to read mode (read from Buffer) */
-#define SEEQCMD_FIFO_WRITE     (0x8000)        /* Set FIFO to write mode */
-
-#define SEEQSTAT_DMA_INT_EN    (0x0001)        /* Status of interrupt enable */
-#define SEEQSTAT_RX_INT_EN     (0x0002)
-#define SEEQSTAT_TX_INT_EN     (0x0004)
-#define SEEQSTAT_WINDOW_INT_EN (0x0008)
-
-#define        SEEQSTAT_DMA_INT        (0x0010)        /* Interrupt flagged */
-#define SEEQSTAT_RX_INT                (0x0020)
-#define SEEQSTAT_TX_INT                (0x0040)
-#define        SEEQSTAT_WINDOW_INT     (0x0080)
-#define SEEQSTAT_ANY_INT       (0x00f0)
-
-#define SEEQSTAT_DMA_ON                (0x0100)        /* DMA logic on */
-#define SEEQSTAT_RX_ON         (0x0200)        /* Packet RX on */
-#define SEEQSTAT_TX_ON         (0x0400)        /* TX running */
-
-#define SEEQSTAT_FIFO_FULL     (0x2000)
-#define SEEQSTAT_FIFO_EMPTY    (0x4000)
-#define SEEQSTAT_FIFO_DIR      (0x8000)        /* 1=read, 0=write */
-
-#define SEEQCFG1_BUFFER_MASK   (0x000f)        /* define what maps into the BUFFER register */
-#define SEEQCFG1_BUFFER_MAC0   (0x0000)        /* MAC station addresses 0-5 */
-#define SEEQCFG1_BUFFER_MAC1   (0x0001)
-#define SEEQCFG1_BUFFER_MAC2   (0x0002)
-#define SEEQCFG1_BUFFER_MAC3   (0x0003)
-#define SEEQCFG1_BUFFER_MAC4   (0x0004)
-#define SEEQCFG1_BUFFER_MAC5   (0x0005)
-#define SEEQCFG1_BUFFER_PROM   (0x0006)        /* The Address/CFG PROM */
-#define SEEQCFG1_BUFFER_TEA    (0x0007)        /* Transmit end area */
-#define SEEQCFG1_BUFFER_BUFFER (0x0008)        /* Packet buffer memory */
-#define SEEQCFG1_BUFFER_INT_VEC        (0x0009)        /* Interrupt Vector */
-
-#define SEEQCFG1_DMA_INTVL_MASK        (0x0030)
-#define SEEQCFG1_DMA_CONT      (0x0000)
-#define SEEQCFG1_DMA_800ns     (0x0010)
-#define SEEQCFG1_DMA_1600ns    (0x0020)
-#define SEEQCFG1_DMA_3200ns    (0x0030)
-
-#define SEEQCFG1_DMA_LEN_MASK  (0x00c0)
-#define SEEQCFG1_DMA_LEN1      (0x0000)
-#define SEEQCFG1_DMA_LEN2      (0x0040)
-#define SEEQCFG1_DMA_LEN4      (0x0080)
-#define SEEQCFG1_DMA_LEN8      (0x00c0)
-
-#define SEEQCFG1_MAC_MASK      (0x3f00)        /* Dis/enable bits for MAC addresses */
-#define SEEQCFG1_MAC0_EN       (0x0100)
-#define SEEQCFG1_MAC1_EN       (0x0200)
-#define SEEQCFG1_MAC2_EN       (0x0400)
-#define SEEQCFG1_MAC3_EN       (0x0800)
-#define        SEEQCFG1_MAC4_EN        (0x1000)
-#define SEEQCFG1_MAC5_EN       (0x2000)
-
-#define        SEEQCFG1_MATCH_MASK     (0xc000)        /* Packet matching logic cfg bits */
-#define SEEQCFG1_MATCH_SPECIFIC        (0x0000)        /* only matching MAC addresses */
-#define SEEQCFG1_MATCH_BROAD   (0x4000)        /* matching and broadcast addresses */
-#define SEEQCFG1_MATCH_MULTI   (0x8000)        /* matching, broadcast and multicast */
-#define SEEQCFG1_MATCH_ALL     (0xc000)        /* Promiscuous mode */
-
-#define SEEQCFG1_DEFAULT       (SEEQCFG1_BUFFER_BUFFER | SEEQCFG1_MAC0_EN | SEEQCFG1_MATCH_BROAD)
-
-#define SEEQCFG2_BYTE_SWAP     (0x0001)        /* 0=Intel byte-order */
-#define SEEQCFG2_AUTO_REA      (0x0002)        /* if set, Receive End Area will be updated when reading from Buffer */
-
-#define SEEQCFG2_CRC_ERR_EN    (0x0008)        /* enables receiving of packets with CRC errors */
-#define SEEQCFG2_DRIBBLE_EN    (0x0010)        /* enables receiving of non-aligned packets */
-#define SEEQCFG2_SHORT_EN      (0x0020)        /* enables receiving of short packets */
-
-#define        SEEQCFG2_SLOTSEL        (0x0040)        /* 0= standard IEEE802.3, 1= smaller,faster, non-standard */
-#define SEEQCFG2_NO_PREAM      (0x0080)        /* 1= user supplies Xmit preamble bytes */
-#define SEEQCFG2_ADDR_LEN      (0x0100)        /* 1= 2byte addresses */
-#define SEEQCFG2_REC_CRC       (0x0200)        /* 0= received packets will have CRC stripped from them */
-#define SEEQCFG2_XMIT_NO_CRC   (0x0400)        /* don't xmit CRC with each packet (user supplies it) */
-#define SEEQCFG2_LOOPBACK      (0x0800)
-#define SEEQCFG2_CTRLO         (0x1000)
-#define SEEQCFG2_RESET         (0x8000)        /* software Hard-reset bit */
-
-struct seeq_pkt_hdr {
-       unsigned short  next;                   /* address of next packet header */
-       unsigned char   babble_int:1,           /* enable int on >1514 byte packet */
-                       coll_int:1,             /* enable int on collision */
-                       coll_16_int:1,          /* enable int on >15 collision */
-                       xmit_int:1,             /* enable int on success (or xmit with <15 collision) */
-                       unused:1,
-                       data_follows:1,         /* if not set, process this as a header and pointer only */
-                       chain_cont:1,           /* if set, more headers in chain                only cmd bit valid in recv header */
-                       xmit_recv:1;            /* if set, a xmit packet, else a receive packet.*/
-       unsigned char   status;
-};
-
-#define SEEQPKTH_BAB_INT_EN    (0x01)          /* xmit only */
-#define SEEQPKTH_COL_INT_EN    (0x02)          /* xmit only */
-#define SEEQPKTH_COL16_INT_EN  (0x04)          /* xmit only */
-#define SEEQPKTH_XMIT_INT_EN   (0x08)          /* xmit only */
-#define SEEQPKTH_DATA_FOLLOWS  (0x20)          /* supposedly in xmit only */
-#define SEEQPKTH_CHAIN         (0x40)          /* more headers follow */
-#define SEEQPKTH_XMIT          (0x80)
-
-#define SEEQPKTS_BABBLE                (0x0100)        /* xmit only */
-#define SEEQPKTS_OVERSIZE      (0x0100)        /* recv only */
-#define SEEQPKTS_COLLISION     (0x0200)        /* xmit only */
-#define SEEQPKTS_CRC_ERR       (0x0200)        /* recv only */
-#define SEEQPKTS_COLL16                (0x0400)        /* xmit only */
-#define SEEQPKTS_DRIB          (0x0400)        /* recv only */
-#define SEEQPKTS_SHORT         (0x0800)        /* recv only */
-#define SEEQPKTS_DONE          (0x8000)
-#define SEEQPKTS_ANY_ERROR     (0x0f00)
index 0767043f44a42866d545a8ff843604a3d717af48..3f93624fc27313134fa0682bc67cf154d8af0a31 100644 (file)
@@ -1439,7 +1439,7 @@ static int efx_phc_settime(struct ptp_clock_info *ptp,
 
        delta = timespec_sub(*e_ts, time_now);
 
-       efx_phc_adjtime(ptp, timespec_to_ns(&delta));
+       rc = efx_phc_adjtime(ptp, timespec_to_ns(&delta));
        if (rc != 0)
                return rc;
 
index b2315324cc6d77cbd97195b923bbb4952b1d5bc5..28f7268f1b8802eed15756784b5d68f298a7976a 100644 (file)
@@ -1458,12 +1458,12 @@ static int sc92031_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        mac0 = ioread32(port_base + MAC0);
        mac1 = ioread32(port_base + MAC0 + 4);
-       dev->dev_addr[0] = dev->perm_addr[0] = mac0 >> 24;
-       dev->dev_addr[1] = dev->perm_addr[1] = mac0 >> 16;
-       dev->dev_addr[2] = dev->perm_addr[2] = mac0 >> 8;
-       dev->dev_addr[3] = dev->perm_addr[3] = mac0;
-       dev->dev_addr[4] = dev->perm_addr[4] = mac1 >> 8;
-       dev->dev_addr[5] = dev->perm_addr[5] = mac1;
+       dev->dev_addr[0] = mac0 >> 24;
+       dev->dev_addr[1] = mac0 >> 16;
+       dev->dev_addr[2] = mac0 >> 8;
+       dev->dev_addr[3] = mac0;
+       dev->dev_addr[4] = mac1 >> 8;
+       dev->dev_addr[5] = mac1;
 
        err = register_netdev(dev);
        if (err < 0)
index 5bffd9749a58e0e658a7413cf39ea7d21697756e..efca14eaefa9324487e3a0aa496730145920795d 100644 (file)
@@ -247,8 +247,7 @@ static const struct ethtool_ops sis900_ethtool_ops;
  *     @net_dev: the net device to get address for
  *
  *     Older SiS900 and friends, use EEPROM to store MAC address.
- *     MAC address is read from read_eeprom() into @net_dev->dev_addr and
- *     @net_dev->perm_addr.
+ *     MAC address is read from read_eeprom() into @net_dev->dev_addr.
  */
 
 static int sis900_get_mac_addr(struct pci_dev *pci_dev,
@@ -271,9 +270,6 @@ static int sis900_get_mac_addr(struct pci_dev *pci_dev,
        for (i = 0; i < 3; i++)
                ((u16 *)(net_dev->dev_addr))[i] = read_eeprom(ioaddr, i+EEPROMMACAddr);
 
-       /* Store MAC Address in perm_addr */
-       memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN);
-
        return 1;
 }
 
@@ -284,8 +280,7 @@ static int sis900_get_mac_addr(struct pci_dev *pci_dev,
  *
  *     SiS630E model, use APC CMOS RAM to store MAC address.
  *     APC CMOS RAM is accessed through ISA bridge.
- *     MAC address is read into @net_dev->dev_addr and
- *     @net_dev->perm_addr.
+ *     MAC address is read into @net_dev->dev_addr.
  */
 
 static int sis630e_get_mac_addr(struct pci_dev *pci_dev,
@@ -311,9 +306,6 @@ static int sis630e_get_mac_addr(struct pci_dev *pci_dev,
                ((u8 *)(net_dev->dev_addr))[i] = inb(0x71);
        }
 
-       /* Store MAC Address in perm_addr */
-       memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN);
-
        pci_write_config_byte(isa_bridge, 0x48, reg & ~0x40);
        pci_dev_put(isa_bridge);
 
@@ -328,7 +320,7 @@ static int sis630e_get_mac_addr(struct pci_dev *pci_dev,
  *
  *     SiS635 model, set MAC Reload Bit to load Mac address from APC
  *     to rfdr. rfdr is accessed through rfcr. MAC address is read into
- *     @net_dev->dev_addr and @net_dev->perm_addr.
+ *     @net_dev->dev_addr.
  */
 
 static int sis635_get_mac_addr(struct pci_dev *pci_dev,
@@ -353,9 +345,6 @@ static int sis635_get_mac_addr(struct pci_dev *pci_dev,
                *( ((u16 *)net_dev->dev_addr) + i) = sr16(rfdr);
        }
 
-       /* Store MAC Address in perm_addr */
-       memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN);
-
        /* enable packet filtering */
        sw32(rfcr, rfcrSave | RFEN);
 
@@ -375,7 +364,7 @@ static int sis635_get_mac_addr(struct pci_dev *pci_dev,
  *     EEDONE signal to refuse EEPROM access by LAN.
  *     The EEPROM map of SiS962 or SiS963 is different to SiS900.
  *     The signature field in SiS962 or SiS963 spec is meaningless.
- *     MAC address is read into @net_dev->dev_addr and @net_dev->perm_addr.
+ *     MAC address is read into @net_dev->dev_addr.
  */
 
 static int sis96x_get_mac_addr(struct pci_dev *pci_dev,
@@ -395,9 +384,6 @@ static int sis96x_get_mac_addr(struct pci_dev *pci_dev,
                        for (i = 0; i < 3; i++)
                                mac[i] = read_eeprom(ioaddr, i + EEPROMMACAddr);
 
-                       /* Store MAC Address in perm_addr */
-                       memcpy(net_dev->perm_addr, net_dev->dev_addr, ETH_ALEN);
-
                        rc = 1;
                        break;
                }
index 1538d5442bab734c94402a155b7fd12d1974ab45..9dd842dbb8598b9d7825637238ce2d64aaa53f4a 100644 (file)
@@ -2036,7 +2036,7 @@ static int smc911x_drv_probe(struct platform_device *pdev)
        struct net_device *ndev;
        struct resource *res;
        struct smc911x_local *lp;
-       unsigned int *addr;
+       void __iomem *addr;
        int ret;
 
        DBG(SMC_DEBUG_FUNC, "--> %s\n",  __func__);
index 04ff63cb6544c0bc2ee60901c0e9ac4ebd02d84a..da5cc9a3b34cb3571740d0851569b6b89d236a41 100644 (file)
@@ -997,9 +997,8 @@ static int smsc911x_mii_probe(struct net_device *dev)
        SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X",
                   phydev->addr, phydev->phy_id);
 
-       ret = phy_connect_direct(dev, phydev,
-                       &smsc911x_phy_adjust_link, 0,
-                       pdata->config.phy_interface);
+       ret = phy_connect_direct(dev, phydev, &smsc911x_phy_adjust_link,
+                                pdata->config.phy_interface);
 
        if (ret) {
                netdev_err(dev, "Could not attach to PHY\n");
index 3c586585e1b3f62d3b1eaab29d3bdcbaf4fa6b65..ecfb43614d7b8d2f11ce027a90c3a2e3ddb0785c 100644 (file)
@@ -1179,7 +1179,7 @@ static int smsc9420_mii_probe(struct net_device *dev)
                phydev->phy_id);
 
        phydev = phy_connect(dev, dev_name(&phydev->dev),
-               smsc9420_phy_adjust_link, 0, PHY_INTERFACE_MODE_MII);
+                            smsc9420_phy_adjust_link, PHY_INTERFACE_MODE_MII);
 
        if (IS_ERR(phydev)) {
                pr_err("%s: Could not attach to PHY\n", dev->name);
index f07c0612abf6843ffe7b41a8ecc2623aff42298f..8c657294ce565d71e2fdc23e6af16a649dc7da4d 100644 (file)
@@ -428,8 +428,7 @@ static int stmmac_init_phy(struct net_device *dev)
                 priv->plat->phy_addr);
        pr_debug("stmmac_init_phy:  trying to attach to %s\n", phy_id_fmt);
 
-       phydev = phy_connect(dev, phy_id_fmt, &stmmac_adjust_link, 0,
-                            interface);
+       phydev = phy_connect(dev, phy_id_fmt, &stmmac_adjust_link, interface);
 
        if (IS_ERR(phydev)) {
                pr_err("%s: Could not attach to PHY\n", dev->name);
index a0bdf077946614e50fcf30379d18c8192767b6f9..c8c491564f9ddf70b942b01a6b40f2346fe68f41 100644 (file)
@@ -8366,14 +8366,12 @@ static void niu_pci_vpd_validate(struct niu *np)
                return;
        }
 
-       memcpy(dev->perm_addr, vpd->local_mac, ETH_ALEN);
+       memcpy(dev->dev_addr, vpd->local_mac, ETH_ALEN);
 
-       val8 = dev->perm_addr[5];
-       dev->perm_addr[5] += np->port;
-       if (dev->perm_addr[5] < val8)
-               dev->perm_addr[4]++;
-
-       memcpy(dev->dev_addr, dev->perm_addr, dev->addr_len);
+       val8 = dev->dev_addr[5];
+       dev->dev_addr[5] += np->port;
+       if (dev->dev_addr[5] < val8)
+               dev->dev_addr[4]++;
 }
 
 static int niu_pci_probe_sprom(struct niu *np)
@@ -8470,29 +8468,27 @@ static int niu_pci_probe_sprom(struct niu *np)
        val = nr64(ESPC_MAC_ADDR0);
        netif_printk(np, probe, KERN_DEBUG, np->dev,
                     "SPROM: MAC_ADDR0[%08llx]\n", (unsigned long long)val);
-       dev->perm_addr[0] = (val >>  0) & 0xff;
-       dev->perm_addr[1] = (val >>  8) & 0xff;
-       dev->perm_addr[2] = (val >> 16) & 0xff;
-       dev->perm_addr[3] = (val >> 24) & 0xff;
+       dev->dev_addr[0] = (val >>  0) & 0xff;
+       dev->dev_addr[1] = (val >>  8) & 0xff;
+       dev->dev_addr[2] = (val >> 16) & 0xff;
+       dev->dev_addr[3] = (val >> 24) & 0xff;
 
        val = nr64(ESPC_MAC_ADDR1);
        netif_printk(np, probe, KERN_DEBUG, np->dev,
                     "SPROM: MAC_ADDR1[%08llx]\n", (unsigned long long)val);
-       dev->perm_addr[4] = (val >>  0) & 0xff;
-       dev->perm_addr[5] = (val >>  8) & 0xff;
+       dev->dev_addr[4] = (val >>  0) & 0xff;
+       dev->dev_addr[5] = (val >>  8) & 0xff;
 
-       if (!is_valid_ether_addr(&dev->perm_addr[0])) {
+       if (!is_valid_ether_addr(&dev->dev_addr[0])) {
                dev_err(np->device, "SPROM MAC address invalid [ %pM ]\n",
-                       dev->perm_addr);
+                       dev->dev_addr);
                return -EINVAL;
        }
 
-       val8 = dev->perm_addr[5];
-       dev->perm_addr[5] += np->port;
-       if (dev->perm_addr[5] < val8)
-               dev->perm_addr[4]++;
-
-       memcpy(dev->dev_addr, dev->perm_addr, dev->addr_len);
+       val8 = dev->dev_addr[5];
+       dev->dev_addr[5] += np->port;
+       if (dev->dev_addr[5] < val8)
+               dev->dev_addr[4]++;
 
        val = nr64(ESPC_MOD_STR_LEN);
        netif_printk(np, probe, KERN_DEBUG, np->dev,
@@ -9267,16 +9263,14 @@ static int niu_get_of_props(struct niu *np)
                netdev_err(dev, "%s: OF MAC address prop len (%d) is wrong\n",
                           dp->full_name, prop_len);
        }
-       memcpy(dev->perm_addr, mac_addr, dev->addr_len);
-       if (!is_valid_ether_addr(&dev->perm_addr[0])) {
+       memcpy(dev->dev_addr, mac_addr, dev->addr_len);
+       if (!is_valid_ether_addr(&dev->dev_addr[0])) {
                netdev_err(dev, "%s: OF MAC address is invalid\n",
                           dp->full_name);
-               netdev_err(dev, "%s: [ %pM ]\n", dp->full_name, dev->perm_addr);
+               netdev_err(dev, "%s: [ %pM ]\n", dp->full_name, dev->dev_addr);
                return -EINVAL;
        }
 
-       memcpy(dev->dev_addr, dev->perm_addr, dev->addr_len);
-
        model = of_get_property(dp, "model", &prop_len);
 
        if (model)
index 1cf767eb3ed555b3498c6119dd21795aa21a9247..289b4eefb42f833500706b2e0f88eceb5bec800a 100644 (file)
@@ -1032,8 +1032,6 @@ static struct vnet *vnet_new(const u64 *local_mac)
        for (i = 0; i < ETH_ALEN; i++)
                dev->dev_addr[i] = (*local_mac >> (5 - i) * 8) & 0xff;
 
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
-
        vp = netdev_priv(dev);
 
        spin_lock_init(&vp->lock);
index 70d1920cac9799b279564cd59a336d9210688d77..31bbbca341a7d5cb447c8be546bf44d04a97fc5e 100644 (file)
@@ -1172,8 +1172,8 @@ static int cpmac_probe(struct platform_device *pdev)
        snprintf(priv->phy_name, MII_BUS_ID_SIZE, PHY_ID_FMT,
                                                mdio_bus_id, phy_id);
 
-       priv->phy = phy_connect(dev, priv->phy_name, cpmac_adjust_link, 0,
-                                               PHY_INTERFACE_MODE_MII);
+       priv->phy = phy_connect(dev, priv->phy_name, cpmac_adjust_link,
+                               PHY_INTERFACE_MODE_MII);
 
        if (IS_ERR(priv->phy)) {
                if (netif_msg_drv(priv))
index bea736b8c3ecb602f3c0059eecec2bd58382870e..b35e6a76664cec1882ad7c552c43524a3973f9c6 100644 (file)
@@ -374,6 +374,9 @@ void cpsw_tx_handler(void *token, int len, int status)
        struct net_device       *ndev = skb->dev;
        struct cpsw_priv        *priv = netdev_priv(ndev);
 
+       /* Check whether the queue is stopped due to stalled tx dma, if the
+        * queue is stopped then start the queue as we have free desc for tx
+        */
        if (unlikely(netif_queue_stopped(ndev)))
                netif_start_queue(ndev);
        cpts_tx_timestamp(&priv->cpts, skb);
@@ -592,7 +595,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
                           1 << slave_port, 0, ALE_MCAST_FWD_2);
 
        slave->phy = phy_connect(priv->ndev, slave->data->phy_id,
-                                &cpsw_adjust_link, 0, slave->data->phy_if);
+                                &cpsw_adjust_link, slave->data->phy_if);
        if (IS_ERR(slave->phy)) {
                dev_err(priv->dev, "phy %s not found on slave %d\n",
                        slave->data->phy_id, slave->slave_num);
@@ -736,6 +739,12 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
                goto fail;
        }
 
+       /* If there is no more tx desc left free then we need to
+        * tell the kernel to stop sending us tx frames.
+        */
+       if (unlikely(cpdma_check_free_tx_desc(priv->txch)))
+               netif_stop_queue(ndev);
+
        return NETDEV_TX_OK;
 fail:
        priv->stats.tx_dropped++;
index 49956730cd8db884ac1696d108cb62fe61d49533..f8629186afbe7df4dacff3101be24582eb140cef 100644 (file)
@@ -105,13 +105,13 @@ struct cpdma_ctlr {
 };
 
 struct cpdma_chan {
+       struct cpdma_desc __iomem       *head, *tail;
+       void __iomem                    *hdp, *cp, *rxfree;
        enum cpdma_state                state;
        struct cpdma_ctlr               *ctlr;
        int                             chan_num;
        spinlock_t                      lock;
-       struct cpdma_desc __iomem       *head, *tail;
        int                             count;
-       void __iomem                    *hdp, *cp, *rxfree;
        u32                             mask;
        cpdma_handler_fn                handler;
        enum dma_data_direction         dir;
@@ -217,17 +217,27 @@ desc_from_phys(struct cpdma_desc_pool *pool, dma_addr_t dma)
 }
 
 static struct cpdma_desc __iomem *
-cpdma_desc_alloc(struct cpdma_desc_pool *pool, int num_desc)
+cpdma_desc_alloc(struct cpdma_desc_pool *pool, int num_desc, bool is_rx)
 {
        unsigned long flags;
        int index;
+       int desc_start;
+       int desc_end;
        struct cpdma_desc __iomem *desc = NULL;
 
        spin_lock_irqsave(&pool->lock, flags);
 
-       index = bitmap_find_next_zero_area(pool->bitmap, pool->num_desc, 0,
-                                          num_desc, 0);
-       if (index < pool->num_desc) {
+       if (is_rx) {
+               desc_start = 0;
+               desc_end = pool->num_desc/2;
+        } else {
+               desc_start = pool->num_desc/2;
+               desc_end = pool->num_desc;
+       }
+
+       index = bitmap_find_next_zero_area(pool->bitmap,
+                               desc_end, desc_start, num_desc, 0);
+       if (index < desc_end) {
                bitmap_set(pool->bitmap, index, num_desc);
                desc = pool->iomap + pool->desc_size * index;
                pool->used_desc++;
@@ -668,7 +678,7 @@ int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data,
                goto unlock_ret;
        }
 
-       desc = cpdma_desc_alloc(ctlr->pool, 1);
+       desc = cpdma_desc_alloc(ctlr->pool, 1, is_rx_chan(chan));
        if (!desc) {
                chan->stats.desc_alloc_fail++;
                ret = -ENOMEM;
@@ -704,6 +714,29 @@ unlock_ret:
 }
 EXPORT_SYMBOL_GPL(cpdma_chan_submit);
 
+bool cpdma_check_free_tx_desc(struct cpdma_chan *chan)
+{
+       unsigned long flags;
+       int index;
+       bool ret;
+       struct cpdma_ctlr       *ctlr = chan->ctlr;
+       struct cpdma_desc_pool  *pool = ctlr->pool;
+
+       spin_lock_irqsave(&pool->lock, flags);
+
+       index = bitmap_find_next_zero_area(pool->bitmap,
+                               pool->num_desc, pool->num_desc/2, 1, 0);
+
+       if (index < pool->num_desc)
+               ret = true;
+       else
+               ret = false;
+
+       spin_unlock_irqrestore(&pool->lock, flags);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(cpdma_check_free_tx_desc);
+
 static void __cpdma_chan_free(struct cpdma_chan *chan,
                              struct cpdma_desc __iomem *desc,
                              int outlen, int status)
index afa19a0c0d81000d265a8930c9ecec7220863518..8d2aeb2096ac9c3f34df4bf775fa24acd5814012 100644 (file)
@@ -88,6 +88,7 @@ int cpdma_chan_process(struct cpdma_chan *chan, int quota);
 int cpdma_ctlr_int_ctrl(struct cpdma_ctlr *ctlr, bool enable);
 void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr);
 int cpdma_chan_int_ctrl(struct cpdma_chan *chan, bool enable);
+bool cpdma_check_free_tx_desc(struct cpdma_chan *chan);
 
 enum cpdma_control {
        CPDMA_CMD_IDLE,                 /* write-only */
index 6621ae3a98d9007b211a90c599357a6a3ddaf70a..242ec55110d2c42b2885ff72118d751dd351f10f 100644 (file)
@@ -120,7 +120,6 @@ static const char emac_version_string[] = "TI DaVinci EMAC Linux v6.1";
 #define EMAC_DEF_TX_CH                 (0) /* Default 0th channel */
 #define EMAC_DEF_RX_CH                 (0) /* Default 0th channel */
 #define EMAC_DEF_RX_NUM_DESC           (128)
-#define EMAC_DEF_TX_NUM_DESC           (128)
 #define EMAC_DEF_MAX_TX_CH             (1) /* Max TX channels configured */
 #define EMAC_DEF_MAX_RX_CH             (1) /* Max RX channels configured */
 #define EMAC_POLL_WEIGHT               (64) /* Default NAPI poll weight */
@@ -342,7 +341,6 @@ struct emac_priv {
        u32 mac_hash2;
        u32 multicast_hash_cnt[EMAC_NUM_MULTICAST_BITS];
        u32 rx_addr_type;
-       atomic_t cur_tx;
        const char *phy_id;
 #ifdef CONFIG_OF
        struct device_node *phy_node;
@@ -1050,10 +1048,10 @@ static void emac_tx_handler(void *token, int len, int status)
 {
        struct sk_buff          *skb = token;
        struct net_device       *ndev = skb->dev;
-       struct emac_priv        *priv = netdev_priv(ndev);
-
-       atomic_dec(&priv->cur_tx);
 
+       /* Check whether the queue is stopped due to stalled tx dma, if the
+        * queue is stopped then start the queue as we have free desc for tx
+        */
        if (unlikely(netif_queue_stopped(ndev)))
                netif_start_queue(ndev);
        ndev->stats.tx_packets++;
@@ -1101,7 +1099,10 @@ static int emac_dev_xmit(struct sk_buff *skb, struct net_device *ndev)
                goto fail_tx;
        }
 
-       if (atomic_inc_return(&priv->cur_tx) >= EMAC_DEF_TX_NUM_DESC)
+       /* If there is no more tx desc left free then we need to
+        * tell the kernel to stop sending us tx frames.
+        */
+       if (unlikely(cpdma_check_free_tx_desc(priv->txchan)))
                netif_stop_queue(ndev);
 
        return NETDEV_TX_OK;
@@ -1599,7 +1600,7 @@ static int emac_dev_open(struct net_device *ndev)
 
        if (priv->phy_id && *priv->phy_id) {
                priv->phydev = phy_connect(ndev, priv->phy_id,
-                                          &emac_adjust_link, 0,
+                                          &emac_adjust_link,
                                           PHY_INTERFACE_MODE_MII);
 
                if (IS_ERR(priv->phydev)) {
index 23a789e86de4174ff53e50523e29c1c1cf682975..fe256094db35d8c745873a29851e5622746b999a 100644 (file)
@@ -633,9 +633,8 @@ static int tc_mii_probe(struct net_device *dev)
 
        /* attach the mac to the phy */
        phydev = phy_connect(dev, dev_name(&phydev->dev),
-                            &tc_handle_link_change, 0,
-                            lp->chiptype == TC35815_TX4939 ?
-                            PHY_INTERFACE_MODE_RMII : PHY_INTERFACE_MODE_MII);
+                            &tc_handle_link_change,
+                            lp->chiptype == TC35815_TX4939 ? PHY_INTERFACE_MODE_RMII : PHY_INTERFACE_MODE_MII);
        if (IS_ERR(phydev)) {
                printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
                return PTR_ERR(phydev);
@@ -856,7 +855,6 @@ static int tc35815_init_one(struct pci_dev *pdev,
        if (rc)
                goto err_out;
 
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
        printk(KERN_INFO "%s: %s at 0x%lx, %pM, IRQ %d\n",
                dev->name,
                chip_info[ent->driver_data].name,
index 7992b3e05d3dd5a48f7701114a2264d23f3ce4e8..eab63e1d560904dd8e6d8007df57dc45db1b782b 100644 (file)
@@ -990,7 +990,6 @@ static int rhine_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                netdev_info(dev, "Using random MAC address: %pM\n",
                            dev->dev_addr);
        }
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        /* For Rhine-I/II, phy_id is loaded from EEPROM */
        if (!phy_id)
index 5778a4ae116466d637288fe668fb990ac623fb6e..122d60c0481b0d8eab2a95b56bc495665390a0ec 100644 (file)
@@ -27,7 +27,7 @@ config XILINX_EMACLITE
 
 config XILINX_AXI_EMAC
        tristate "Xilinx 10/100/1000 AXI Ethernet support"
-       depends on (PPC32 || MICROBLAZE)
+       depends on MICROBLAZE
        select PHYLIB
        ---help---
          This driver supports the 10/100/1000 Ethernet from Xilinx for the
index d3b3571b60134bb0f2724bb37af47e867e2d8e95..278c9db3b5b853e4cb41caf83a6990db517a899d 100644 (file)
@@ -1589,7 +1589,7 @@ static int axienet_of_probe(struct platform_device *op)
        lp->rx_irq = irq_of_parse_and_map(np, 1);
        lp->tx_irq = irq_of_parse_and_map(np, 0);
        of_node_put(np);
-       if ((lp->rx_irq == NO_IRQ) || (lp->tx_irq == NO_IRQ)) {
+       if ((lp->rx_irq <= 0) || (lp->tx_irq <= 0)) {
                dev_err(&op->dev, "could not determine irqs\n");
                ret = -ENOMEM;
                goto err_iounmap_2;
index a4be1ad886c50981f7ae1ab24d0e6aa7f7b1c414..6958a5e87703bb3625b917bcdecfe8a7ef50e7e9 100644 (file)
@@ -1451,7 +1451,7 @@ static int eth_init_one(struct platform_device *pdev)
 
        snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT,
                mdio_bus->id, plat->phy);
-       port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0,
+       port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link,
                                   PHY_INTERFACE_MODE_MII);
        if (IS_ERR(port->phydev)) {
                err = PTR_ERR(port->phydev);
index 1e9cb0bbf62cbcf0c4738388802560ab961f0657..8f1c25676d44f2aab087d85e06576d9037d3f87b 100644 (file)
@@ -372,7 +372,6 @@ static int ieee802154fake_probe(struct platform_device *pdev)
 
        memcpy(dev->dev_addr, "\xba\xbe\xca\xfe\xde\xad\xbe\xef",
                        dev->addr_len);
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
 
        /*
         * For now we'd like to emulate 2.4 GHz-only device,
index 344dceb1aaf9e70d3c36540d1ea2b62524fba368..82164381f778fb604b07f5cc2956a16e76d3f563 100644 (file)
@@ -90,7 +90,7 @@ static void ri_tasklet(unsigned long dev)
                u64_stats_update_end(&dp->tsync);
 
                rcu_read_lock();
-               skb->dev = dev_get_by_index_rcu(&init_net, skb->skb_iif);
+               skb->dev = dev_get_by_index_rcu(dev_net(_dev), skb->skb_iif);
                if (!skb->dev) {
                        rcu_read_unlock();
                        dev_kfree_skb(skb);
index 6989ebe2bc7902c44e429dfefda4c432d3eb7131..37add21a3d7d630d2a989312deab132017eb5fcf 100644 (file)
@@ -269,12 +269,18 @@ static ssize_t show_remote_port(struct netconsole_target *nt, char *buf)
 
 static ssize_t show_local_ip(struct netconsole_target *nt, char *buf)
 {
-       return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.local_ip);
+       if (nt->np.ipv6)
+               return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.local_ip.in6);
+       else
+               return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.local_ip);
 }
 
 static ssize_t show_remote_ip(struct netconsole_target *nt, char *buf)
 {
-       return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.remote_ip);
+       if (nt->np.ipv6)
+               return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.remote_ip.in6);
+       else
+               return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.remote_ip);
 }
 
 static ssize_t show_local_mac(struct netconsole_target *nt, char *buf)
@@ -410,7 +416,22 @@ static ssize_t store_local_ip(struct netconsole_target *nt,
                return -EINVAL;
        }
 
-       nt->np.local_ip = in_aton(buf);
+       if (strnchr(buf, count, ':')) {
+               const char *end;
+               if (in6_pton(buf, count, nt->np.local_ip.in6.s6_addr, -1, &end) > 0) {
+                       if (*end && *end != '\n') {
+                               printk(KERN_ERR "netconsole: invalid IPv6 address at: <%c>\n", *end);
+                               return -EINVAL;
+                       }
+                       nt->np.ipv6 = true;
+               } else
+                       return -EINVAL;
+       } else {
+               if (!nt->np.ipv6) {
+                       nt->np.local_ip.ip = in_aton(buf);
+               } else
+                       return -EINVAL;
+       }
 
        return strnlen(buf, count);
 }
@@ -426,7 +447,22 @@ static ssize_t store_remote_ip(struct netconsole_target *nt,
                return -EINVAL;
        }
 
-       nt->np.remote_ip = in_aton(buf);
+       if (strnchr(buf, count, ':')) {
+               const char *end;
+               if (in6_pton(buf, count, nt->np.remote_ip.in6.s6_addr, -1, &end) > 0) {
+                       if (*end && *end != '\n') {
+                               printk(KERN_ERR "netconsole: invalid IPv6 address at: <%c>\n", *end);
+                               return -EINVAL;
+                       }
+                       nt->np.ipv6 = true;
+               } else
+                       return -EINVAL;
+       } else {
+               if (!nt->np.ipv6) {
+                       nt->np.remote_ip.ip = in_aton(buf);
+               } else
+                       return -EINVAL;
+       }
 
        return strnlen(buf, count);
 }
index 8af46e88a1815de2e2f344a85c125ffcb5f12732..9930f999956172fa20ad5e5a34d3db5297fe9c12 100644 (file)
@@ -416,16 +416,15 @@ static void phy_prepare_link(struct phy_device *phydev,
  * @dev: the network device to connect
  * @phydev: the pointer to the phy device
  * @handler: callback function for state change notifications
- * @flags: PHY device's dev_flags
  * @interface: PHY device's interface
  */
 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
-                      void (*handler)(struct net_device *), u32 flags,
+                      void (*handler)(struct net_device *),
                       phy_interface_t interface)
 {
        int rc;
 
-       rc = phy_attach_direct(dev, phydev, flags, interface);
+       rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
        if (rc)
                return rc;
 
@@ -443,7 +442,6 @@ EXPORT_SYMBOL(phy_connect_direct);
  * @dev: the network device to connect
  * @bus_id: the id string of the PHY device to connect
  * @handler: callback function for state change notifications
- * @flags: PHY device's dev_flags
  * @interface: PHY device's interface
  *
  * Description: Convenience function for connecting ethernet
@@ -455,7 +453,7 @@ EXPORT_SYMBOL(phy_connect_direct);
  *   the desired functionality.
  */
 struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
-               void (*handler)(struct net_device *), u32 flags,
+               void (*handler)(struct net_device *),
                phy_interface_t interface)
 {
        struct phy_device *phydev;
@@ -471,7 +469,7 @@ struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
        }
        phydev = to_phy_device(d);
 
-       rc = phy_connect_direct(dev, phydev, handler, flags, interface);
+       rc = phy_connect_direct(dev, phydev, handler, interface);
        if (rc)
                return ERR_PTR(rc);
 
@@ -576,14 +574,13 @@ static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
  * phy_attach - attach a network device to a particular PHY device
  * @dev: network device to attach
  * @bus_id: Bus ID of PHY device to attach
- * @flags: PHY device's dev_flags
  * @interface: PHY device's interface
  *
  * Description: Same as phy_attach_direct() except that a PHY bus_id
  *     string is passed instead of a pointer to a struct phy_device.
  */
 struct phy_device *phy_attach(struct net_device *dev,
-               const char *bus_id, u32 flags, phy_interface_t interface)
+               const char *bus_id, phy_interface_t interface)
 {
        struct bus_type *bus = &mdio_bus_type;
        struct phy_device *phydev;
@@ -599,7 +596,7 @@ struct phy_device *phy_attach(struct net_device *dev,
        }
        phydev = to_phy_device(d);
 
-       rc = phy_attach_direct(dev, phydev, flags, interface);
+       rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
        if (rc)
                return ERR_PTR(rc);
 
index fbd106edbe59bdcae871e29d6fd70c993634cdea..c81680dc10eb7c43baaf61a0bfea1456dbe33c5c 100644 (file)
@@ -185,6 +185,7 @@ struct tun_struct {
        unsigned long ageing_time;
        unsigned int numdisabled;
        struct list_head disabled;
+       void *security;
 };
 
 static inline u32 tun_hashfn(u32 rxhash)
@@ -404,8 +405,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
        struct tun_struct *tun;
        struct net_device *dev;
 
-       tun = rcu_dereference_protected(tfile->tun,
-                                       lockdep_rtnl_is_held());
+       tun = rtnl_dereference(tfile->tun);
+
        if (tun) {
                u16 index = tfile->queue_index;
                BUG_ON(index >= tun->numqueues);
@@ -414,8 +415,7 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
                rcu_assign_pointer(tun->tfiles[index],
                                   tun->tfiles[tun->numqueues - 1]);
                rcu_assign_pointer(tfile->tun, NULL);
-               ntfile = rcu_dereference_protected(tun->tfiles[index],
-                                                  lockdep_rtnl_is_held());
+               ntfile = rtnl_dereference(tun->tfiles[index]);
                ntfile->queue_index = index;
 
                --tun->numqueues;
@@ -429,8 +429,10 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
                /* Drop read queue */
                skb_queue_purge(&tfile->sk.sk_receive_queue);
                tun_set_real_num_queues(tun);
-       } else if (tfile->detached && clean)
+       } else if (tfile->detached && clean) {
                tun = tun_enable_queue(tfile);
+               sock_put(&tfile->sk);
+       }
 
        if (clean) {
                if (tun && tun->numqueues == 0 && tun->numdisabled == 0 &&
@@ -458,8 +460,7 @@ static void tun_detach_all(struct net_device *dev)
        int i, n = tun->numqueues;
 
        for (i = 0; i < n; i++) {
-               tfile = rcu_dereference_protected(tun->tfiles[i],
-                                                 lockdep_rtnl_is_held());
+               tfile = rtnl_dereference(tun->tfiles[i]);
                BUG_ON(!tfile);
                wake_up_all(&tfile->wq.wait);
                rcu_assign_pointer(tfile->tun, NULL);
@@ -469,8 +470,7 @@ static void tun_detach_all(struct net_device *dev)
 
        synchronize_net();
        for (i = 0; i < n; i++) {
-               tfile = rcu_dereference_protected(tun->tfiles[i],
-                                                 lockdep_rtnl_is_held());
+               tfile = rtnl_dereference(tun->tfiles[i]);
                /* Drop read queue */
                skb_queue_purge(&tfile->sk.sk_receive_queue);
                sock_put(&tfile->sk);
@@ -481,6 +481,9 @@ static void tun_detach_all(struct net_device *dev)
                sock_put(&tfile->sk);
        }
        BUG_ON(tun->numdisabled != 0);
+
+       if (tun->flags & TUN_PERSIST)
+               module_put(THIS_MODULE);
 }
 
 static int tun_attach(struct tun_struct *tun, struct file *file)
@@ -488,8 +491,12 @@ static int tun_attach(struct tun_struct *tun, struct file *file)
        struct tun_file *tfile = file->private_data;
        int err;
 
+       err = security_tun_dev_attach(tfile->socket.sk, tun->security);
+       if (err < 0)
+               goto out;
+
        err = -EINVAL;
-       if (rcu_dereference_protected(tfile->tun, lockdep_rtnl_is_held()))
+       if (rtnl_dereference(tfile->tun))
                goto out;
 
        err = -EBUSY;
@@ -1371,6 +1378,7 @@ static void tun_free_netdev(struct net_device *dev)
 
        BUG_ON(!(list_empty(&tun->disabled)));
        tun_flow_uninit(tun);
+       security_tun_dev_free_security(tun->security);
        free_netdev(dev);
 }
 
@@ -1544,6 +1552,9 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
        struct net_device *dev;
        int err;
 
+       if (tfile->detached)
+               return -EINVAL;
+
        dev = __dev_get_by_name(net, ifr->ifr_name);
        if (dev) {
                if (ifr->ifr_flags & IFF_TUN_EXCL)
@@ -1557,7 +1568,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
 
                if (tun_not_capable(tun))
                        return -EPERM;
-               err = security_tun_dev_attach(tfile->socket.sk);
+               err = security_tun_dev_open(tun->security);
                if (err < 0)
                        return err;
 
@@ -1614,7 +1625,9 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
 
                spin_lock_init(&tun->lock);
 
-               security_tun_dev_post_create(&tfile->sk);
+               err = security_tun_dev_alloc_security(&tun->security);
+               if (err < 0)
+                       goto err_free_dev;
 
                tun_net_init(dev);
 
@@ -1738,8 +1751,7 @@ static void tun_detach_filter(struct tun_struct *tun, int n)
        struct tun_file *tfile;
 
        for (i = 0; i < n; i++) {
-               tfile = rcu_dereference_protected(tun->tfiles[i],
-                                                 lockdep_rtnl_is_held());
+               tfile = rtnl_dereference(tun->tfiles[i]);
                sk_detach_filter(tfile->socket.sk);
        }
 
@@ -1752,8 +1764,7 @@ static int tun_attach_filter(struct tun_struct *tun)
        struct tun_file *tfile;
 
        for (i = 0; i < tun->numqueues; i++) {
-               tfile = rcu_dereference_protected(tun->tfiles[i],
-                                                 lockdep_rtnl_is_held());
+               tfile = rtnl_dereference(tun->tfiles[i]);
                ret = sk_attach_filter(&tun->fprog, tfile->socket.sk);
                if (ret) {
                        tun_detach_filter(tun, i);
@@ -1771,8 +1782,7 @@ static void tun_set_sndbuf(struct tun_struct *tun)
        int i;
 
        for (i = 0; i < tun->numqueues; i++) {
-               tfile = rcu_dereference_protected(tun->tfiles[i],
-                                               lockdep_rtnl_is_held());
+               tfile = rtnl_dereference(tun->tfiles[i]);
                tfile->socket.sk->sk_sndbuf = tun->sndbuf;
        }
 }
@@ -1787,15 +1797,16 @@ static int tun_set_queue(struct file *file, struct ifreq *ifr)
 
        if (ifr->ifr_flags & IFF_ATTACH_QUEUE) {
                tun = tfile->detached;
-               if (!tun)
+               if (!tun) {
                        ret = -EINVAL;
-               else if (tun_not_capable(tun))
-                       ret = -EPERM;
-               else
-                       ret = tun_attach(tun, file);
+                       goto unlock;
+               }
+               ret = security_tun_dev_attach_queue(tun->security);
+               if (ret < 0)
+                       goto unlock;
+               ret = tun_attach(tun, file);
        } else if (ifr->ifr_flags & IFF_DETACH_QUEUE) {
-               tun = rcu_dereference_protected(tfile->tun,
-                                               lockdep_rtnl_is_held());
+               tun = rtnl_dereference(tfile->tun);
                if (!tun || !(tun->flags & TUN_TAP_MQ))
                        ret = -EINVAL;
                else
@@ -1803,6 +1814,7 @@ static int tun_set_queue(struct file *file, struct ifreq *ifr)
        } else
                ret = -EINVAL;
 
+unlock:
        rtnl_unlock();
        return ret;
 }
@@ -1880,10 +1892,11 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
                /* Disable/Enable persist mode. Keep an extra reference to the
                 * module to prevent the module being unprobed.
                 */
-               if (arg) {
+               if (arg && !(tun->flags & TUN_PERSIST)) {
                        tun->flags |= TUN_PERSIST;
                        __module_get(THIS_MODULE);
-               } else {
+               }
+               if (!arg && (tun->flags & TUN_PERSIST)) {
                        tun->flags &= ~TUN_PERSIST;
                        module_put(THIS_MODULE);
                }
index e889631161b80f96237a2894c5c4c6ba733699c6..346c032aa7955ba7ff09ca2a698cc1374e2ae630 100644 (file)
@@ -167,6 +167,20 @@ struct asix_data {
        u8 res;
 };
 
+struct asix_rx_fixup_info {
+       struct sk_buff *ax_skb;
+       u32 header;
+       u16 size;
+       bool split_head;
+};
+
+struct asix_common_private {
+       struct asix_rx_fixup_info rx_fixup_info;
+};
+
+/* ASIX specific flags */
+#define FLAG_EEPROM_MAC                (1UL << 0)  /* init device MAC from eeprom */
+
 int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
                  u16 size, void *data);
 
@@ -176,7 +190,9 @@ int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
 void asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value,
                          u16 index, u16 size, void *data);
 
-int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb);
+int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
+                          struct asix_rx_fixup_info *rx);
+int asix_rx_fixup_common(struct usbnet *dev, struct sk_buff *skb);
 
 struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
                              gfp_t flags);
index 19bc23f20526d3f04771e8764cdf1a71264d5ad9..f7f623a5390ee94ec44fbe6dd8a47f1ebfd6a332 100644 (file)
@@ -51,49 +51,89 @@ void asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,
                               value, index, data, size);
 }
 
-int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
+int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
+                          struct asix_rx_fixup_info *rx)
 {
        int offset = 0;
 
-       while (offset + sizeof(u32) < skb->len) {
-               struct sk_buff *ax_skb;
-               u16 size;
-               u32 header = get_unaligned_le32(skb->data + offset);
-
-               offset += sizeof(u32);
-
-               /* get the packet length */
-               size = (u16) (header & 0x7ff);
-               if (size != ((~header >> 16) & 0x07ff)) {
-                       netdev_err(dev->net, "asix_rx_fixup() Bad Header Length\n");
-                       return 0;
+       while (offset + sizeof(u16) <= skb->len) {
+               u16 remaining = 0;
+               unsigned char *data;
+
+               if (!rx->size) {
+                       if ((skb->len - offset == sizeof(u16)) ||
+                           rx->split_head) {
+                               if(!rx->split_head) {
+                                       rx->header = get_unaligned_le16(
+                                                       skb->data + offset);
+                                       rx->split_head = true;
+                                       offset += sizeof(u16);
+                                       break;
+                               } else {
+                                       rx->header |= (get_unaligned_le16(
+                                                       skb->data + offset)
+                                                       << 16);
+                                       rx->split_head = false;
+                                       offset += sizeof(u16);
+                               }
+                       } else {
+                               rx->header = get_unaligned_le32(skb->data +
+                                                               offset);
+                               offset += sizeof(u32);
+                       }
+
+                       /* get the packet length */
+                       rx->size = (u16) (rx->header & 0x7ff);
+                       if (rx->size != ((~rx->header >> 16) & 0x7ff)) {
+                               netdev_err(dev->net, "asix_rx_fixup() Bad Header Length 0x%x, offset %d\n",
+                                          rx->header, offset);
+                               rx->size = 0;
+                               return 0;
+                       }
+                       rx->ax_skb = netdev_alloc_skb_ip_align(dev->net,
+                                                              rx->size);
+                       if (!rx->ax_skb)
+                               return 0;
                }
 
-               if ((size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) ||
-                   (size + offset > skb->len)) {
+               if (rx->size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) {
                        netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n",
-                                  size);
+                                  rx->size);
+                       kfree_skb(rx->ax_skb);
                        return 0;
                }
-               ax_skb = netdev_alloc_skb_ip_align(dev->net, size);
-               if (!ax_skb)
-                       return 0;
 
-               skb_put(ax_skb, size);
-               memcpy(ax_skb->data, skb->data + offset, size);
-               usbnet_skb_return(dev, ax_skb);
+               if (rx->size > skb->len - offset) {
+                       remaining = rx->size - (skb->len - offset);
+                       rx->size = skb->len - offset;
+               }
+
+               data = skb_put(rx->ax_skb, rx->size);
+               memcpy(data, skb->data + offset, rx->size);
+               if (!remaining)
+                       usbnet_skb_return(dev, rx->ax_skb);
 
-               offset += (size + 1) & 0xfffe;
+               offset += (rx->size + 1) & 0xfffe;
+               rx->size = remaining;
        }
 
        if (skb->len != offset) {
-               netdev_err(dev->net, "asix_rx_fixup() Bad SKB Length %d\n",
-                          skb->len);
+               netdev_err(dev->net, "asix_rx_fixup() Bad SKB Length %d, %d\n",
+                          skb->len, offset);
                return 0;
        }
+
        return 1;
 }
 
+int asix_rx_fixup_common(struct usbnet *dev, struct sk_buff *skb)
+{
+       struct asix_common_private *dp = dev->driver_priv;
+       struct asix_rx_fixup_info *rx = &dp->rx_fixup_info;
+
+       return asix_rx_fixup_internal(dev, skb, rx);
+}
+
 struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
                              gfp_t flags)
 {
index 7a6e758f48e738e4652cc11ea39cd2d913d5f4b9..2205dbc8d32fc2bbcb74e5c82047913edc3fdd24 100644 (file)
@@ -422,14 +422,25 @@ static const struct net_device_ops ax88772_netdev_ops = {
 
 static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
 {
-       int ret, embd_phy;
+       int ret, embd_phy, i;
        u8 buf[ETH_ALEN];
        u32 phyid;
 
        usbnet_get_endpoints(dev,intf);
 
        /* Get the MAC address */
-       ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf);
+       if (dev->driver_info->data & FLAG_EEPROM_MAC) {
+               for (i = 0; i < (ETH_ALEN >> 1); i++) {
+                       ret = asix_read_cmd(dev, AX_CMD_READ_EEPROM, 0x04 + i,
+                                       0, 2, buf + i * 2);
+                       if (ret < 0)
+                               break;
+               }
+       } else {
+               ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID,
+                               0, 0, ETH_ALEN, buf);
+       }
+
        if (ret < 0) {
                netdev_dbg(dev->net, "Failed to read MAC address: %d\n", ret);
                return ret;
@@ -484,9 +495,19 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
                dev->rx_urb_size = 2048;
        }
 
+       dev->driver_priv = kzalloc(sizeof(struct asix_common_private), GFP_KERNEL);
+       if (!dev->driver_priv)
+               return -ENOMEM;
+
        return 0;
 }
 
+static void ax88772_unbind(struct usbnet *dev, struct usb_interface *intf)
+{
+       if (dev->driver_priv)
+               kfree(dev->driver_priv);
+}
+
 static const struct ethtool_ops ax88178_ethtool_ops = {
        .get_drvinfo            = asix_get_drvinfo,
        .get_link               = asix_get_link,
@@ -818,6 +839,10 @@ static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf)
                dev->rx_urb_size = 2048;
        }
 
+       dev->driver_priv = kzalloc(sizeof(struct asix_common_private), GFP_KERNEL);
+       if (!dev->driver_priv)
+                       return -ENOMEM;
+
        return 0;
 }
 
@@ -864,22 +889,38 @@ static const struct driver_info hawking_uf200_info = {
 static const struct driver_info ax88772_info = {
        .description = "ASIX AX88772 USB 2.0 Ethernet",
        .bind = ax88772_bind,
+       .unbind = ax88772_unbind,
        .status = asix_status,
        .link_reset = ax88772_link_reset,
        .reset = ax88772_reset,
        .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET,
-       .rx_fixup = asix_rx_fixup,
+       .rx_fixup = asix_rx_fixup_common,
        .tx_fixup = asix_tx_fixup,
 };
 
+static const struct driver_info ax88772b_info = {
+       .description = "ASIX AX88772B USB 2.0 Ethernet",
+       .bind = ax88772_bind,
+       .unbind = ax88772_unbind,
+       .status = asix_status,
+       .link_reset = ax88772_link_reset,
+       .reset = ax88772_reset,
+       .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR |
+                FLAG_MULTI_PACKET,
+       .rx_fixup = asix_rx_fixup_common,
+       .tx_fixup = asix_tx_fixup,
+       .data = FLAG_EEPROM_MAC,
+};
+
 static const struct driver_info ax88178_info = {
        .description = "ASIX AX88178 USB 2.0 Ethernet",
        .bind = ax88178_bind,
+       .unbind = ax88772_unbind,
        .status = asix_status,
        .link_reset = ax88178_link_reset,
        .reset = ax88178_reset,
        .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR,
-       .rx_fixup = asix_rx_fixup,
+       .rx_fixup = asix_rx_fixup_common,
        .tx_fixup = asix_tx_fixup,
 };
 
@@ -953,7 +994,7 @@ static const struct usb_device_id   products [] = {
 }, {
        // ASIX AX88772B 10/100
        USB_DEVICE (0x0b95, 0x772b),
-       .driver_info = (unsigned long) &ax88772_info,
+       .driver_info = (unsigned long) &ax88772b_info,
 }, {
        // ASIX AX88772 10/100
        USB_DEVICE (0x0b95, 0x7720),
index c8e0aa85fb8e64ea5c610505a130d196ebe858ed..76ee5410d69e55074b6b9b34d93686add1a8910f 100644 (file)
@@ -35,6 +35,7 @@ struct ax88172a_private {
        u16 phy_addr;
        u16 oldmode;
        int use_embdphy;
+       struct asix_rx_fixup_info rx_fixup_info;
 };
 
 /* MDIO read and write wrappers for phylib */
@@ -377,7 +378,7 @@ static int ax88172a_reset(struct usbnet *dev)
 
        priv->phydev = phy_connect(dev->net, priv->phy_name,
                                   &ax88172a_adjust_link,
-                                  0, PHY_INTERFACE_MODE_MII);
+                                  PHY_INTERFACE_MODE_MII);
        if (IS_ERR(priv->phydev)) {
                netdev_err(dev->net, "Could not connect to PHY device %s\n",
                           priv->phy_name);
@@ -400,6 +401,14 @@ out:
 
 }
 
+static int ax88172a_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
+{
+       struct ax88172a_private *dp = dev->driver_priv;
+       struct asix_rx_fixup_info *rx = &dp->rx_fixup_info;
+
+       return asix_rx_fixup_internal(dev, skb, rx);
+}
+
 const struct driver_info ax88172a_info = {
        .description = "ASIX AX88172A USB 2.0 Ethernet",
        .bind = ax88172a_bind,
@@ -409,6 +418,6 @@ const struct driver_info ax88172a_info = {
        .status = ax88172a_status,
        .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR |
                 FLAG_MULTI_PACKET,
-       .rx_fixup = asix_rx_fixup,
+       .rx_fixup = ax88172a_rx_fixup,
        .tx_fixup = asix_tx_fixup,
 };
index 3f554c1149f36d2cf3221ee38e4f02507d566ba7..0794004fd9d88bc352fdf4439d1e209d9098615f 100644 (file)
@@ -122,7 +122,7 @@ static int dm_read_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 *valu
        dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0xc : 0x4);
 
        for (i = 0; i < DM_TIMEOUT; i++) {
-               u8 tmp;
+               u8 tmp = 0;
 
                udelay(1);
                ret = dm_read_reg(dev, DM_SHARED_CTRL, &tmp);
@@ -165,7 +165,7 @@ static int dm_write_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 valu
        dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1a : 0x12);
 
        for (i = 0; i < DM_TIMEOUT; i++) {
-               u8 tmp;
+               u8 tmp = 0;
 
                udelay(1);
                ret = dm_read_reg(dev, DM_SHARED_CTRL, &tmp);
index 92c49e0a59ec144a93abda0f04515185d9a5d0b0..0192073e53a30723927558e624789874511847b0 100644 (file)
@@ -159,7 +159,6 @@ kalmia_bind(struct usbnet *dev, struct usb_interface *intf)
        }
 
        memcpy(dev->net->dev_addr, ethernet_addr, ETH_ALEN);
-       memcpy(dev->net->perm_addr, ethernet_addr, ETH_ALEN);
 
        return status;
 }
index 3c02f950a3d2018b50a90b32991a32e018c1e0eb..8ee5ab0db12788523f52ee8d3137799c2547b1ac 100644 (file)
@@ -1097,6 +1097,7 @@ pegasus_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
        pegasus_t       *pegasus = netdev_priv(dev);
        u8              reg78 = 0x04;
+       int             ret;
 
        if (wol->wolopts & ~WOL_SUPPORTED)
                return -EINVAL;
@@ -1111,7 +1112,12 @@ pegasus_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
        else
                pegasus->eth_regs[0] &= ~0x10;
        pegasus->wolopts = wol->wolopts;
-       return set_register(pegasus, WakeupControl, reg78);
+
+       ret = set_register(pegasus, WakeupControl, reg78);
+       if (!ret)
+               ret = device_set_wakeup_enable(&pegasus->usb->dev,
+                                               wol->wolopts);
+       return ret;
 }
 
 static inline void pegasus_reset_wol(struct net_device *dev)
index 91d7cb9728eb5998afc44c0bbaec395243524d01..6a1ca500e61267e9ba8858d3ed7405990b28e43d 100644 (file)
@@ -458,6 +458,7 @@ static const struct usb_device_id products[] = {
        {QMI_FIXED_INTF(0x1199, 0x68a2, 8)},    /* Sierra Wireless MC7710 in QMI mode */
        {QMI_FIXED_INTF(0x1199, 0x68a2, 19)},   /* Sierra Wireless MC7710 in QMI mode */
        {QMI_FIXED_INTF(0x1199, 0x901c, 8)},    /* Sierra Wireless EM7700 */
+       {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)},    /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */
 
        /* 4. Gobi 1000 devices */
        {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)},    /* Acer Gobi Modem Device */
index 4a4335833c36760548c67373ef71f17d05bba23c..cc49aac70224910f63fc6c5ed6b0b2fc720ff674 100644 (file)
@@ -431,7 +431,6 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
                goto halt_fail_and_release;
        }
        memcpy(net->dev_addr, bp, ETH_ALEN);
-       memcpy(net->perm_addr, bp, ETH_ALEN);
 
        /* set a nonzero filter to enable data transfers */
        memset(u.set, 0, sizeof *u.set);
index 8b2e11238efadea62fc3624a086df82a5e6e846b..e1da42aaf9de94891e6bff691b129c2e362334fd 100644 (file)
@@ -32,7 +32,7 @@ struct pcpu_vstats {
 };
 
 struct veth_priv {
-       struct net_device       *peer;
+       struct net_device __rcu *peer;
        atomic64_t              dropped;
 };
 
@@ -89,10 +89,10 @@ static int veth_get_sset_count(struct net_device *dev, int sset)
 static void veth_get_ethtool_stats(struct net_device *dev,
                struct ethtool_stats *stats, u64 *data)
 {
-       struct veth_priv *priv;
+       struct veth_priv *priv = netdev_priv(dev);
+       struct net_device *peer = rtnl_dereference(priv->peer);
 
-       priv = netdev_priv(dev);
-       data[0] = priv->peer->ifindex;
+       data[0] = peer ? peer->ifindex : 0;
 }
 
 static const struct ethtool_ops veth_ethtool_ops = {
@@ -107,9 +107,15 @@ static const struct ethtool_ops veth_ethtool_ops = {
 static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct veth_priv *priv = netdev_priv(dev);
-       struct net_device *rcv = priv->peer;
+       struct net_device *rcv;
        int length = skb->len;
 
+       rcu_read_lock();
+       rcv = rcu_dereference(priv->peer);
+       if (unlikely(!rcv)) {
+               kfree_skb(skb);
+               goto drop;
+       }
        /* don't change ip_summed == CHECKSUM_PARTIAL, as that
         * will cause bad checksum on forwarded packets
         */
@@ -125,9 +131,10 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
                stats->packets++;
                u64_stats_update_end(&stats->syncp);
        } else {
+drop:
                atomic64_inc(&priv->dropped);
        }
-
+       rcu_read_unlock();
        return NETDEV_TX_OK;
 }
 
@@ -162,30 +169,36 @@ static struct rtnl_link_stats64 *veth_get_stats64(struct net_device *dev,
                                                  struct rtnl_link_stats64 *tot)
 {
        struct veth_priv *priv = netdev_priv(dev);
+       struct net_device *peer;
        struct pcpu_vstats one;
 
        tot->tx_dropped = veth_stats_one(&one, dev);
        tot->tx_bytes = one.bytes;
        tot->tx_packets = one.packets;
 
-       tot->rx_dropped = veth_stats_one(&one, priv->peer);
-       tot->rx_bytes = one.bytes;
-       tot->rx_packets = one.packets;
+       rcu_read_lock();
+       peer = rcu_dereference(priv->peer);
+       if (peer) {
+               tot->rx_dropped = veth_stats_one(&one, peer);
+               tot->rx_bytes = one.bytes;
+               tot->rx_packets = one.packets;
+       }
+       rcu_read_unlock();
 
        return tot;
 }
 
 static int veth_open(struct net_device *dev)
 {
-       struct veth_priv *priv;
+       struct veth_priv *priv = netdev_priv(dev);
+       struct net_device *peer = rtnl_dereference(priv->peer);
 
-       priv = netdev_priv(dev);
-       if (priv->peer == NULL)
+       if (!peer)
                return -ENOTCONN;
 
-       if (priv->peer->flags & IFF_UP) {
+       if (peer->flags & IFF_UP) {
                netif_carrier_on(dev);
-               netif_carrier_on(priv->peer);
+               netif_carrier_on(peer);
        }
        return 0;
 }
@@ -193,9 +206,11 @@ static int veth_open(struct net_device *dev)
 static int veth_close(struct net_device *dev)
 {
        struct veth_priv *priv = netdev_priv(dev);
+       struct net_device *peer = rtnl_dereference(priv->peer);
 
        netif_carrier_off(dev);
-       netif_carrier_off(priv->peer);
+       if (peer)
+               netif_carrier_off(peer);
 
        return 0;
 }
@@ -380,10 +395,10 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
         */
 
        priv = netdev_priv(dev);
-       priv->peer = peer;
+       rcu_assign_pointer(priv->peer, peer);
 
        priv = netdev_priv(peer);
-       priv->peer = dev;
+       rcu_assign_pointer(priv->peer, dev);
        return 0;
 
 err_register_dev:
@@ -404,7 +419,16 @@ static void veth_dellink(struct net_device *dev, struct list_head *head)
        struct net_device *peer;
 
        priv = netdev_priv(dev);
-       peer = priv->peer;
+       peer = rtnl_dereference(priv->peer);
+
+       /* Note : dellink() is called from default_device_exit_batch(),
+        * before a rcu_synchronize() point. The devices are guaranteed
+        * not being freed before one RCU grace period.
+        */
+       RCU_INIT_POINTER(priv->peer, NULL);
+
+       priv = netdev_priv(peer);
+       RCU_INIT_POINTER(priv->peer, NULL);
 
        unregister_netdevice_queue(dev, head);
        unregister_netdevice_queue(peer, head);
index a6fcf15adc4ff3d36d928f44cc0ac1f49d249820..701408a1ded6b50aae333b1cd709d9da7bfc35f8 100644 (file)
@@ -753,19 +753,77 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
        return NETDEV_TX_OK;
 }
 
+/*
+ * Send command via the control virtqueue and check status.  Commands
+ * supported by the hypervisor, as indicated by feature bits, should
+ * never fail unless improperly formated.
+ */
+static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
+                                struct scatterlist *data, int out, int in)
+{
+       struct scatterlist *s, sg[VIRTNET_SEND_COMMAND_SG_MAX + 2];
+       struct virtio_net_ctrl_hdr ctrl;
+       virtio_net_ctrl_ack status = ~0;
+       unsigned int tmp;
+       int i;
+
+       /* Caller should know better */
+       BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ) ||
+               (out + in > VIRTNET_SEND_COMMAND_SG_MAX));
+
+       out++; /* Add header */
+       in++; /* Add return status */
+
+       ctrl.class = class;
+       ctrl.cmd = cmd;
+
+       sg_init_table(sg, out + in);
+
+       sg_set_buf(&sg[0], &ctrl, sizeof(ctrl));
+       for_each_sg(data, s, out + in - 2, i)
+               sg_set_buf(&sg[i + 1], sg_virt(s), s->length);
+       sg_set_buf(&sg[out + in - 1], &status, sizeof(status));
+
+       BUG_ON(virtqueue_add_buf(vi->cvq, sg, out, in, vi, GFP_ATOMIC) < 0);
+
+       virtqueue_kick(vi->cvq);
+
+       /* Spin for a response, the kick causes an ioport write, trapping
+        * into the hypervisor, so the request should be handled immediately.
+        */
+       while (!virtqueue_get_buf(vi->cvq, &tmp))
+               cpu_relax();
+
+       return status == VIRTIO_NET_OK;
+}
+
 static int virtnet_set_mac_address(struct net_device *dev, void *p)
 {
        struct virtnet_info *vi = netdev_priv(dev);
        struct virtio_device *vdev = vi->vdev;
        int ret;
+       struct sockaddr *addr = p;
+       struct scatterlist sg;
 
-       ret = eth_mac_addr(dev, p);
+       ret = eth_prepare_mac_addr_change(dev, p);
        if (ret)
                return ret;
 
-       if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC))
+       if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
+               sg_init_one(&sg, addr->sa_data, dev->addr_len);
+               if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_MAC,
+                                         VIRTIO_NET_CTRL_MAC_ADDR_SET,
+                                         &sg, 1, 0)) {
+                       dev_warn(&vdev->dev,
+                                "Failed to set mac address by vq command.\n");
+                       return -EINVAL;
+               }
+       } else if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) {
                vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
-                                 dev->dev_addr, dev->addr_len);
+                                 addr->sa_data, dev->addr_len);
+       }
+
+       eth_commit_mac_addr_change(dev, p);
 
        return 0;
 }
@@ -819,51 +877,6 @@ static void virtnet_netpoll(struct net_device *dev)
 }
 #endif
 
-/*
- * Send command via the control virtqueue and check status.  Commands
- * supported by the hypervisor, as indicated by feature bits, should
- * never fail unless improperly formated.
- */
-static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
-                                struct scatterlist *data, int out, int in)
-{
-       struct scatterlist *s, sg[VIRTNET_SEND_COMMAND_SG_MAX + 2];
-       struct virtio_net_ctrl_hdr ctrl;
-       virtio_net_ctrl_ack status = ~0;
-       unsigned int tmp;
-       int i;
-
-       /* Caller should know better */
-       BUG_ON(!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ) ||
-               (out + in > VIRTNET_SEND_COMMAND_SG_MAX));
-
-       out++; /* Add header */
-       in++; /* Add return status */
-
-       ctrl.class = class;
-       ctrl.cmd = cmd;
-
-       sg_init_table(sg, out + in);
-
-       sg_set_buf(&sg[0], &ctrl, sizeof(ctrl));
-       for_each_sg(data, s, out + in - 2, i)
-               sg_set_buf(&sg[i + 1], sg_virt(s), s->length);
-       sg_set_buf(&sg[out + in - 1], &status, sizeof(status));
-
-       BUG_ON(virtqueue_add_buf(vi->cvq, sg, out, in, vi, GFP_ATOMIC) < 0);
-
-       virtqueue_kick(vi->cvq);
-
-       /*
-        * Spin for a response, the kick causes an ioport write, trapping
-        * into the hypervisor, so the request should be handled immediately.
-        */
-       while (!virtqueue_get_buf(vi->cvq, &tmp))
-               cpu_relax();
-
-       return status == VIRTIO_NET_OK;
-}
-
 static void virtnet_ack_link_announce(struct virtnet_info *vi)
 {
        rtnl_lock();
@@ -1628,6 +1641,7 @@ static unsigned int features[] = {
        VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
        VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
        VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
+       VIRTIO_NET_F_CTRL_MAC_ADDR,
 };
 
 static struct virtio_driver virtio_net_driver = {
index dc8913c6238c965b0905ef7ad6784bf669f06388..b1c90f8ccd3d39a4dfb806c428cd8e665d2f0a82 100644 (file)
@@ -43,11 +43,7 @@ static DEFINE_PCI_DEVICE_TABLE(vmxnet3_pciid_table) = {
 
 MODULE_DEVICE_TABLE(pci, vmxnet3_pciid_table);
 
-static atomic_t devices_found;
-
-#define VMXNET3_MAX_DEVICES 10
 static int enable_mq = 1;
-static int irq_share_mode;
 
 static void
 vmxnet3_write_mac_addr(struct vmxnet3_adapter *adapter, u8 *mac);
@@ -152,8 +148,8 @@ vmxnet3_check_link(struct vmxnet3_adapter *adapter, bool affectTxQueue)
 
        adapter->link_speed = ret >> 16;
        if (ret & 1) { /* Link is up. */
-               printk(KERN_INFO "%s: NIC Link is Up %d Mbps\n",
-                      adapter->netdev->name, adapter->link_speed);
+               netdev_info(adapter->netdev, "NIC Link is Up %d Mbps\n",
+                           adapter->link_speed);
                if (!netif_carrier_ok(adapter->netdev))
                        netif_carrier_on(adapter->netdev);
 
@@ -163,8 +159,7 @@ vmxnet3_check_link(struct vmxnet3_adapter *adapter, bool affectTxQueue)
                                                 adapter);
                }
        } else {
-               printk(KERN_INFO "%s: NIC Link is Down\n",
-                      adapter->netdev->name);
+               netdev_info(adapter->netdev, "NIC Link is Down\n");
                if (netif_carrier_ok(adapter->netdev))
                        netif_carrier_off(adapter->netdev);
 
@@ -510,8 +505,7 @@ vmxnet3_tq_create(struct vmxnet3_tx_queue *tq,
                           * sizeof(struct Vmxnet3_TxDesc),
                           &tq->tx_ring.basePA);
        if (!tq->tx_ring.base) {
-               printk(KERN_ERR "%s: failed to allocate tx ring\n",
-                      adapter->netdev->name);
+               netdev_err(adapter->netdev, "failed to allocate tx ring\n");
                goto err;
        }
 
@@ -520,8 +514,7 @@ vmxnet3_tq_create(struct vmxnet3_tx_queue *tq,
                             sizeof(struct Vmxnet3_TxDataDesc),
                             &tq->data_ring.basePA);
        if (!tq->data_ring.base) {
-               printk(KERN_ERR "%s: failed to allocate data ring\n",
-                      adapter->netdev->name);
+               netdev_err(adapter->netdev, "failed to allocate data ring\n");
                goto err;
        }
 
@@ -530,8 +523,7 @@ vmxnet3_tq_create(struct vmxnet3_tx_queue *tq,
                             sizeof(struct Vmxnet3_TxCompDesc),
                             &tq->comp_ring.basePA);
        if (!tq->comp_ring.base) {
-               printk(KERN_ERR "%s: failed to allocate tx comp ring\n",
-                      adapter->netdev->name);
+               netdev_err(adapter->netdev, "failed to allocate tx comp ring\n");
                goto err;
        }
 
@@ -580,15 +572,14 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx,
 
                if (rbi->buf_type == VMXNET3_RX_BUF_SKB) {
                        if (rbi->skb == NULL) {
-                               rbi->skb = dev_alloc_skb(rbi->len +
-                                                        NET_IP_ALIGN);
+                               rbi->skb = __netdev_alloc_skb_ip_align(adapter->netdev,
+                                                                      rbi->len,
+                                                                      GFP_KERNEL);
                                if (unlikely(rbi->skb == NULL)) {
                                        rq->stats.rx_buf_alloc_failure++;
                                        break;
                                }
-                               rbi->skb->dev = adapter->netdev;
 
-                               skb_reserve(rbi->skb, NET_IP_ALIGN);
                                rbi->dma_addr = pci_map_single(adapter->pdev,
                                                rbi->skb->data, rbi->len,
                                                PCI_DMA_FROMDEVICE);
@@ -629,12 +620,10 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx,
                num_allocated++;
                vmxnet3_cmd_ring_adv_next2fill(ring);
        }
-       rq->uncommitted[ring_idx] += num_allocated;
 
-       dev_dbg(&adapter->netdev->dev,
-               "alloc_rx_buf: %d allocated, next2fill %u, next2comp "
-               "%u, uncommitted %u\n", num_allocated, ring->next2fill,
-               ring->next2comp, rq->uncommitted[ring_idx]);
+       netdev_dbg(adapter->netdev,
+               "alloc_rx_buf: %d allocated, next2fill %u, next2comp %u\n",
+               num_allocated, ring->next2fill, ring->next2comp);
 
        /* so that the device can distinguish a full ring and an empty ring */
        BUG_ON(num_allocated != 0 && ring->next2fill == ring->next2comp);
@@ -691,7 +680,7 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx,
                tbi = tq->buf_info + tq->tx_ring.next2fill;
                tbi->map_type = VMXNET3_MAP_NONE;
 
-               dev_dbg(&adapter->netdev->dev,
+               netdev_dbg(adapter->netdev,
                        "txd[%u]: 0x%Lx 0x%x 0x%x\n",
                        tq->tx_ring.next2fill,
                        le64_to_cpu(ctx->sop_txd->txd.addr),
@@ -731,7 +720,7 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx,
                gdesc->dword[2] = cpu_to_le32(dw2);
                gdesc->dword[3] = 0;
 
-               dev_dbg(&adapter->netdev->dev,
+               netdev_dbg(adapter->netdev,
                        "txd[%u]: 0x%Lx 0x%x 0x%x\n",
                        tq->tx_ring.next2fill, le64_to_cpu(gdesc->txd.addr),
                        le32_to_cpu(gdesc->dword[2]), gdesc->dword[3]);
@@ -771,7 +760,7 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx,
                        gdesc->dword[2] = cpu_to_le32(dw2);
                        gdesc->dword[3] = 0;
 
-                       dev_dbg(&adapter->netdev->dev,
+                       netdev_dbg(adapter->netdev,
                                "txd[%u]: 0x%llu %u %u\n",
                                tq->tx_ring.next2fill, le64_to_cpu(gdesc->txd.addr),
                                le32_to_cpu(gdesc->dword[2]), gdesc->dword[3]);
@@ -871,7 +860,7 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
        tdd = tq->data_ring.base + tq->tx_ring.next2fill;
 
        memcpy(tdd->data, skb->data, ctx->copy_size);
-       dev_dbg(&adapter->netdev->dev,
+       netdev_dbg(adapter->netdev,
                "copy %u bytes to dataRing[%u]\n",
                ctx->copy_size, tq->tx_ring.next2fill);
        return 1;
@@ -977,7 +966,7 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
 
        if (count > vmxnet3_cmd_ring_desc_avail(&tq->tx_ring)) {
                tq->stats.tx_ring_full++;
-               dev_dbg(&adapter->netdev->dev,
+               netdev_dbg(adapter->netdev,
                        "tx queue stopped on %s, next2comp %u"
                        " next2fill %u\n", adapter->netdev->name,
                        tq->tx_ring.next2comp, tq->tx_ring.next2fill);
@@ -1060,7 +1049,7 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,
                           (struct Vmxnet3_TxDesc *)ctx.sop_txd);
        gdesc = ctx.sop_txd;
 #endif
-       dev_dbg(&adapter->netdev->dev,
+       netdev_dbg(adapter->netdev,
                "txd[%u]: SOP 0x%Lx 0x%x 0x%x\n",
                (u32)(ctx.sop_txd -
                tq->tx_ring.base), le64_to_cpu(gdesc->txd.addr),
@@ -1213,7 +1202,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
                        if (unlikely(rcd->len == 0)) {
                                /* Pretend the rx buffer is skipped. */
                                BUG_ON(!(rcd->sop && rcd->eop));
-                               dev_dbg(&adapter->netdev->dev,
+                               netdev_dbg(adapter->netdev,
                                        "rxRing[%u][%u] 0 length\n",
                                        ring_idx, idx);
                                goto rcd_done;
@@ -1221,7 +1210,8 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
 
                        skip_page_frags = false;
                        ctx->skb = rbi->skb;
-                       new_skb = dev_alloc_skb(rbi->len + NET_IP_ALIGN);
+                       new_skb = netdev_alloc_skb_ip_align(adapter->netdev,
+                                                           rbi->len);
                        if (new_skb == NULL) {
                                /* Skb allocation failed, do not handover this
                                 * skb to stack. Reuse it. Drop the existing pkt
@@ -1236,11 +1226,14 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
                        pci_unmap_single(adapter->pdev, rbi->dma_addr, rbi->len,
                                         PCI_DMA_FROMDEVICE);
 
+#ifdef VMXNET3_RSS
+                       if (rcd->rssType != VMXNET3_RCD_RSS_TYPE_NONE &&
+                           (adapter->netdev->features & NETIF_F_RXHASH))
+                               ctx->skb->rxhash = le32_to_cpu(rcd->rssHash);
+#endif
                        skb_put(ctx->skb, rcd->len);
 
                        /* Immediate refill */
-                       new_skb->dev = adapter->netdev;
-                       skb_reserve(new_skb, NET_IP_ALIGN);
                        rbi->skb = new_skb;
                        rbi->dma_addr = pci_map_single(adapter->pdev,
                                                       rbi->skb->data, rbi->len,
@@ -1333,7 +1326,6 @@ rcd_done:
                        VMXNET3_WRITE_BAR0_REG(adapter,
                                               rxprod_reg[ring_idx] + rq->qid * 8,
                                               ring->next2fill);
-                       rq->uncommitted[ring_idx] = 0;
                }
 
                vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring);
@@ -1378,7 +1370,6 @@ vmxnet3_rq_cleanup(struct vmxnet3_rx_queue *rq,
                rq->rx_ring[ring_idx].gen = VMXNET3_INIT_GEN;
                rq->rx_ring[ring_idx].next2fill =
                                        rq->rx_ring[ring_idx].next2comp = 0;
-               rq->uncommitted[ring_idx] = 0;
        }
 
        rq->comp_ring.gen = VMXNET3_INIT_GEN;
@@ -1459,7 +1450,6 @@ vmxnet3_rq_init(struct vmxnet3_rx_queue *rq,
        /* reset internal state and allocate buffers for both rings */
        for (i = 0; i < 2; i++) {
                rq->rx_ring[i].next2fill = rq->rx_ring[i].next2comp = 0;
-               rq->uncommitted[i] = 0;
 
                memset(rq->rx_ring[i].base, 0, rq->rx_ring[i].size *
                       sizeof(struct Vmxnet3_RxDesc));
@@ -1518,8 +1508,8 @@ vmxnet3_rq_create(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter)
                rq->rx_ring[i].base = pci_alloc_consistent(adapter->pdev, sz,
                                                        &rq->rx_ring[i].basePA);
                if (!rq->rx_ring[i].base) {
-                       printk(KERN_ERR "%s: failed to allocate rx ring %d\n",
-                              adapter->netdev->name, i);
+                       netdev_err(adapter->netdev,
+                                  "failed to allocate rx ring %d\n", i);
                        goto err;
                }
        }
@@ -1528,8 +1518,7 @@ vmxnet3_rq_create(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter)
        rq->comp_ring.base = pci_alloc_consistent(adapter->pdev, sz,
                                                  &rq->comp_ring.basePA);
        if (!rq->comp_ring.base) {
-               printk(KERN_ERR "%s: failed to allocate rx comp ring\n",
-                      adapter->netdev->name);
+               netdev_err(adapter->netdev, "failed to allocate rx comp ring\n");
                goto err;
        }
 
@@ -1821,9 +1810,10 @@ vmxnet3_request_irqs(struct vmxnet3_adapter *adapter)
                                          adapter->rx_queue[i].name,
                                          &(adapter->rx_queue[i]));
                        if (err) {
-                               printk(KERN_ERR "Failed to request irq for MSIX"
-                                      ", %s, error %d\n",
-                                      adapter->rx_queue[i].name, err);
+                               netdev_err(adapter->netdev,
+                                          "Failed to request irq for MSIX, "
+                                          "%s, error %d\n",
+                                          adapter->rx_queue[i].name, err);
                                return err;
                        }
 
@@ -1852,8 +1842,9 @@ vmxnet3_request_irqs(struct vmxnet3_adapter *adapter)
 #endif
        intr->num_intrs = vector + 1;
        if (err) {
-               printk(KERN_ERR "Failed to request irq %s (intr type:%d), error"
-                      ":%d\n", adapter->netdev->name, intr->type, err);
+               netdev_err(adapter->netdev,
+                          "Failed to request irq (intr type:%d), error %d\n",
+                          intr->type, err);
        } else {
                /* Number of rx queues will not change after this */
                for (i = 0; i < adapter->num_rx_queues; i++) {
@@ -1874,9 +1865,9 @@ vmxnet3_request_irqs(struct vmxnet3_adapter *adapter)
                        adapter->rx_queue[0].comp_ring.intr_idx = 0;
                }
 
-               printk(KERN_INFO "%s: intr type %u, mode %u, %u vectors "
-                      "allocated\n", adapter->netdev->name, intr->type,
-                      intr->mask_mode, intr->num_intrs);
+               netdev_info(adapter->netdev,
+                           "intr type %u, mode %u, %u vectors allocated\n",
+                           intr->type, intr->mask_mode, intr->num_intrs);
        }
 
        return err;
@@ -2042,8 +2033,8 @@ vmxnet3_set_mc(struct net_device *netdev)
                                rxConf->mfTablePA = cpu_to_le64(virt_to_phys(
                                                    new_table));
                        } else {
-                               printk(KERN_INFO "%s: failed to copy mcast list"
-                                      ", setting ALL_MULTI\n", netdev->name);
+                               netdev_info(netdev, "failed to copy mcast list"
+                                           ", setting ALL_MULTI\n");
                                new_mode |= VMXNET3_RXM_ALL_MULTI;
                        }
                }
@@ -2171,6 +2162,14 @@ vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter)
 
        if (adapter->rss) {
                struct UPT1_RSSConf *rssConf = adapter->rss_conf;
+               static const uint8_t rss_key[UPT1_RSS_MAX_KEY_SIZE] = {
+                       0x3b, 0x56, 0xd1, 0x56, 0x13, 0x4a, 0xe7, 0xac,
+                       0xe8, 0x79, 0x09, 0x75, 0xe8, 0x65, 0x79, 0x28,
+                       0x35, 0x12, 0xb9, 0x56, 0x7c, 0x76, 0x4b, 0x70,
+                       0xd8, 0x56, 0xa3, 0x18, 0x9b, 0x0a, 0xee, 0xf3,
+                       0x96, 0xa6, 0x9f, 0x8f, 0x9e, 0x8c, 0x90, 0xc9,
+               };
+
                devRead->misc.uptFeatures |= UPT1_F_RSS;
                devRead->misc.numRxQueues = adapter->num_rx_queues;
                rssConf->hashType = UPT1_RSS_HASH_TYPE_TCP_IPV4 |
@@ -2180,7 +2179,8 @@ vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter)
                rssConf->hashFunc = UPT1_RSS_HASH_FUNC_TOEPLITZ;
                rssConf->hashKeySize = UPT1_RSS_MAX_KEY_SIZE;
                rssConf->indTableSize = VMXNET3_RSS_IND_TABLE_SIZE;
-               get_random_bytes(&rssConf->hashKey[0], rssConf->hashKeySize);
+               memcpy(rssConf->hashKey, rss_key, sizeof(rss_key));
+
                for (i = 0; i < rssConf->indTableSize; i++)
                        rssConf->indTable[i] = ethtool_rxfh_indir_default(
                                i, adapter->num_rx_queues);
@@ -2218,7 +2218,7 @@ vmxnet3_activate_dev(struct vmxnet3_adapter *adapter)
        u32 ret;
        unsigned long flags;
 
-       dev_dbg(&adapter->netdev->dev, "%s: skb_buf_size %d, rx_buf_per_pkt %d,"
+       netdev_dbg(adapter->netdev, "%s: skb_buf_size %d, rx_buf_per_pkt %d,"
                " ring sizes %u %u %u\n", adapter->netdev->name,
                adapter->skb_buf_size, adapter->rx_buf_per_pkt,
                adapter->tx_queue[0].tx_ring.size,
@@ -2228,15 +2228,15 @@ vmxnet3_activate_dev(struct vmxnet3_adapter *adapter)
        vmxnet3_tq_init_all(adapter);
        err = vmxnet3_rq_init_all(adapter);
        if (err) {
-               printk(KERN_ERR "Failed to init rx queue for %s: error %d\n",
-                      adapter->netdev->name, err);
+               netdev_err(adapter->netdev,
+                          "Failed to init rx queue error %d\n", err);
                goto rq_err;
        }
 
        err = vmxnet3_request_irqs(adapter);
        if (err) {
-               printk(KERN_ERR "Failed to setup irq for %s: error %d\n",
-                      adapter->netdev->name, err);
+               netdev_err(adapter->netdev,
+                          "Failed to setup irq for error %d\n", err);
                goto irq_err;
        }
 
@@ -2253,8 +2253,8 @@ vmxnet3_activate_dev(struct vmxnet3_adapter *adapter)
        spin_unlock_irqrestore(&adapter->cmd_lock, flags);
 
        if (ret != 0) {
-               printk(KERN_ERR "Failed to activate dev %s: error %u\n",
-                      adapter->netdev->name, ret);
+               netdev_err(adapter->netdev,
+                          "Failed to activate dev: error %u\n", ret);
                err = -EINVAL;
                goto activate_err;
        }
@@ -2369,23 +2369,22 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
 
        err = pci_enable_device(pdev);
        if (err) {
-               printk(KERN_ERR "Failed to enable adapter %s: error %d\n",
-                      pci_name(pdev), err);
+               dev_err(&pdev->dev, "Failed to enable adapter: error %d\n", err);
                return err;
        }
 
        if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
                if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
-                       printk(KERN_ERR "pci_set_consistent_dma_mask failed "
-                              "for adapter %s\n", pci_name(pdev));
+                       dev_err(&pdev->dev,
+                               "pci_set_consistent_dma_mask failed\n");
                        err = -EIO;
                        goto err_set_mask;
                }
                *dma64 = true;
        } else {
                if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
-                       printk(KERN_ERR "pci_set_dma_mask failed for adapter "
-                              "%s\n",  pci_name(pdev));
+                       dev_err(&pdev->dev,
+                               "pci_set_dma_mask failed\n");
                        err = -EIO;
                        goto err_set_mask;
                }
@@ -2395,8 +2394,8 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
        err = pci_request_selected_regions(pdev, (1 << 2) - 1,
                                           vmxnet3_driver_name);
        if (err) {
-               printk(KERN_ERR "Failed to request region for adapter %s: "
-                      "error %d\n", pci_name(pdev), err);
+               dev_err(&pdev->dev,
+                       "Failed to request region for adapter: error %d\n", err);
                goto err_set_mask;
        }
 
@@ -2406,8 +2405,7 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
        mmio_len = pci_resource_len(pdev, 0);
        adapter->hw_addr0 = ioremap(mmio_start, mmio_len);
        if (!adapter->hw_addr0) {
-               printk(KERN_ERR "Failed to map bar0 for adapter %s\n",
-                      pci_name(pdev));
+               dev_err(&pdev->dev, "Failed to map bar0\n");
                err = -EIO;
                goto err_ioremap;
        }
@@ -2416,8 +2414,7 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
        mmio_len = pci_resource_len(pdev, 1);
        adapter->hw_addr1 = ioremap(mmio_start, mmio_len);
        if (!adapter->hw_addr1) {
-               printk(KERN_ERR "Failed to map bar1 for adapter %s\n",
-                      pci_name(pdev));
+               dev_err(&pdev->dev, "Failed to map bar1\n");
                err = -EIO;
                goto err_bar1;
        }
@@ -2524,12 +2521,14 @@ vmxnet3_create_queues(struct vmxnet3_adapter *adapter, u32 tx_ring_size,
                err = vmxnet3_rq_create(rq, adapter);
                if (err) {
                        if (i == 0) {
-                               printk(KERN_ERR "Could not allocate any rx"
-                                      "queues. Aborting.\n");
+                               netdev_err(adapter->netdev,
+                                          "Could not allocate any rx queues. "
+                                          "Aborting.\n");
                                goto queue_err;
                        } else {
-                               printk(KERN_INFO "Number of rx queues changed "
-                                      "to : %d.\n", i);
+                               netdev_info(adapter->netdev,
+                                           "Number of rx queues changed "
+                                           "to : %d.\n", i);
                                adapter->num_rx_queues = i;
                                err = 0;
                                break;
@@ -2642,15 +2641,17 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu)
                vmxnet3_adjust_rx_ring_size(adapter);
                err = vmxnet3_rq_create_all(adapter);
                if (err) {
-                       printk(KERN_ERR "%s: failed to re-create rx queues,"
-                               " error %d. Closing it.\n", netdev->name, err);
+                       netdev_err(netdev,
+                                  "failed to re-create rx queues, "
+                                  " error %d. Closing it.\n", err);
                        goto out;
                }
 
                err = vmxnet3_activate_dev(adapter);
                if (err) {
-                       printk(KERN_ERR "%s: failed to re-activate, error %d. "
-                               "Closing it\n", netdev->name, err);
+                       netdev_err(netdev,
+                                  "failed to re-activate, error %d. "
+                                  "Closing it\n", err);
                        goto out;
                }
        }
@@ -2678,10 +2679,6 @@ vmxnet3_declare_features(struct vmxnet3_adapter *adapter, bool dma64)
        netdev->vlan_features = netdev->hw_features &
                                ~(NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX);
        netdev->features = netdev->hw_features | NETIF_F_HW_VLAN_FILTER;
-
-       netdev_info(adapter->netdev,
-               "features: sg csum vlan jf tso tsoIPv6 lro%s\n",
-               dma64 ? " highDMA" : "");
 }
 
 
@@ -2724,7 +2721,7 @@ vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter,
                        adapter->intr.num_intrs = vectors;
                        return 0;
                } else if (err < 0) {
-                       netdev_err(adapter->netdev,
+                       dev_err(&adapter->netdev->dev,
                                   "Failed to enable MSI-X, error: %d\n", err);
                        vectors = 0;
                } else if (err < vector_threshold) {
@@ -2733,15 +2730,16 @@ vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter,
                        /* If fails to enable required number of MSI-x vectors
                         * try enabling minimum number of vectors required.
                         */
-                       netdev_err(adapter->netdev,
-                                  "Failed to enable %d MSI-X, trying %d instead\n",
+                       dev_err(&adapter->netdev->dev,
+                               "Failed to enable %d MSI-X, trying %d instead\n",
                                    vectors, vector_threshold);
                        vectors = vector_threshold;
                }
        }
 
-       netdev_info(adapter->netdev,
-                   "Number of MSI-X interrupts which can be allocated are lower than min threshold required.\n");
+       dev_info(&adapter->pdev->dev,
+                "Number of MSI-X interrupts which can be allocated "
+                "is lower than min threshold required.\n");
        return err;
 }
 
@@ -2796,7 +2794,8 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)
                        if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE
                            || adapter->num_rx_queues != 1) {
                                adapter->share_intr = VMXNET3_INTR_TXSHARE;
-                               printk(KERN_ERR "Number of rx queues : 1\n");
+                               netdev_err(adapter->netdev,
+                                          "Number of rx queues : 1\n");
                                adapter->num_rx_queues = 1;
                                adapter->intr.num_intrs =
                                                VMXNET3_LINUX_MIN_MSIX_VECT;
@@ -2807,9 +2806,9 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)
                        return;
 
                /* If we cannot allocate MSIx vectors use only one rx queue */
-               netdev_info(adapter->netdev,
-                           "Failed to enable MSI-X, error %d . Limiting #rx queues to 1, try MSI.\n",
-                           err);
+               dev_info(&adapter->pdev->dev,
+                        "Failed to enable MSI-X, error %d. "
+                        "Limiting #rx queues to 1, try MSI.\n", err);
 
                adapter->intr.type = VMXNET3_IT_MSI;
        }
@@ -2826,7 +2825,8 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)
 #endif /* CONFIG_PCI_MSI */
 
        adapter->num_rx_queues = 1;
-       printk(KERN_INFO "Using INTx interrupt, #Rx queues: 1.\n");
+       dev_info(&adapter->netdev->dev,
+                "Using INTx interrupt, #Rx queues: 1.\n");
        adapter->intr.type = VMXNET3_IT_INTX;
 
        /* INT-X related setting */
@@ -2852,7 +2852,7 @@ vmxnet3_tx_timeout(struct net_device *netdev)
        struct vmxnet3_adapter *adapter = netdev_priv(netdev);
        adapter->tx_timeout_count++;
 
-       printk(KERN_ERR "%s: tx hang\n", adapter->netdev->name);
+       netdev_err(adapter->netdev, "tx hang\n");
        schedule_work(&adapter->work);
        netif_wake_queue(adapter->netdev);
 }
@@ -2872,12 +2872,12 @@ vmxnet3_reset_work(struct work_struct *data)
        /* if the device is closed, we must leave it alone */
        rtnl_lock();
        if (netif_running(adapter->netdev)) {
-               printk(KERN_INFO "%s: resetting\n", adapter->netdev->name);
+               netdev_notice(adapter->netdev, "resetting\n");
                vmxnet3_quiesce_dev(adapter);
                vmxnet3_reset_dev(adapter);
                vmxnet3_activate_dev(adapter);
        } else {
-               printk(KERN_INFO "%s: already closed\n", adapter->netdev->name);
+               netdev_info(adapter->netdev, "already closed\n");
        }
        rtnl_unlock();
 
@@ -2936,8 +2936,9 @@ vmxnet3_probe_device(struct pci_dev *pdev,
        num_tx_queues = rounddown_pow_of_two(num_tx_queues);
        netdev = alloc_etherdev_mq(sizeof(struct vmxnet3_adapter),
                                   max(num_tx_queues, num_rx_queues));
-       printk(KERN_INFO "# of Tx queues : %d, # of Rx queues : %d\n",
-              num_tx_queues, num_rx_queues);
+       dev_info(&pdev->dev,
+                "# of Tx queues : %d, # of Rx queues : %d\n",
+                num_tx_queues, num_rx_queues);
 
        if (!netdev)
                return -ENOMEM;
@@ -2952,8 +2953,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
                                               sizeof(struct Vmxnet3_DriverShared),
                                               &adapter->shared_pa);
        if (!adapter->shared) {
-               printk(KERN_ERR "Failed to allocate memory for %s\n",
-                      pci_name(pdev));
+               dev_err(&pdev->dev, "Failed to allocate memory\n");
                err = -ENOMEM;
                goto err_alloc_shared;
        }
@@ -2967,8 +2967,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
                                                  &adapter->queue_desc_pa);
 
        if (!adapter->tqd_start) {
-               printk(KERN_ERR "Failed to allocate memory for %s\n",
-                      pci_name(pdev));
+               dev_err(&pdev->dev, "Failed to allocate memory\n");
                err = -ENOMEM;
                goto err_alloc_queue_desc;
        }
@@ -2998,8 +2997,8 @@ vmxnet3_probe_device(struct pci_dev *pdev,
        if (ver & 1) {
                VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_VRRS, 1);
        } else {
-               printk(KERN_ERR "Incompatible h/w version (0x%x) for adapter"
-                      " %s\n", ver, pci_name(pdev));
+               dev_err(&pdev->dev,
+                       "Incompatible h/w version (0x%x) for adapter\n", ver);
                err = -EBUSY;
                goto err_ver;
        }
@@ -3008,8 +3007,8 @@ vmxnet3_probe_device(struct pci_dev *pdev,
        if (ver & 1) {
                VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_UVRS, 1);
        } else {
-               printk(KERN_ERR "Incompatible upt version (0x%x) for "
-                      "adapter %s\n", ver, pci_name(pdev));
+               dev_err(&pdev->dev,
+                       "Incompatible upt version (0x%x) for adapter\n", ver);
                err = -EBUSY;
                goto err_ver;
        }
@@ -3017,11 +3016,9 @@ vmxnet3_probe_device(struct pci_dev *pdev,
        SET_NETDEV_DEV(netdev, &pdev->dev);
        vmxnet3_declare_features(adapter, dma64);
 
-       adapter->dev_number = atomic_read(&devices_found);
-
-       adapter->share_intr = irq_share_mode;
-       if (adapter->share_intr == VMXNET3_INTR_BUDDYSHARE &&
-           adapter->num_tx_queues != adapter->num_rx_queues)
+       if (adapter->num_tx_queues == adapter->num_rx_queues)
+               adapter->share_intr = VMXNET3_INTR_BUDDYSHARE;
+       else
                adapter->share_intr = VMXNET3_INTR_DONTSHARE;
 
        vmxnet3_alloc_intr_resources(adapter);
@@ -3030,7 +3027,9 @@ vmxnet3_probe_device(struct pci_dev *pdev,
        if (adapter->num_rx_queues > 1 &&
            adapter->intr.type == VMXNET3_IT_MSIX) {
                adapter->rss = true;
-               printk(KERN_INFO "RSS is enabled.\n");
+               netdev->hw_features |= NETIF_F_RXHASH;
+               netdev->features |= NETIF_F_RXHASH;
+               dev_dbg(&pdev->dev, "RSS is enabled.\n");
        } else {
                adapter->rss = false;
        }
@@ -3064,13 +3063,11 @@ vmxnet3_probe_device(struct pci_dev *pdev,
        err = register_netdev(netdev);
 
        if (err) {
-               printk(KERN_ERR "Failed to register adapter %s\n",
-                      pci_name(pdev));
+               dev_err(&pdev->dev, "Failed to register adapter\n");
                goto err_register;
        }
 
        vmxnet3_check_link(adapter, false);
-       atomic_inc(&devices_found);
        return 0;
 
 err_register:
@@ -3312,7 +3309,7 @@ static struct pci_driver vmxnet3_driver = {
 static int __init
 vmxnet3_init_module(void)
 {
-       printk(KERN_INFO "%s - version %s\n", VMXNET3_DRIVER_DESC,
+       pr_info("%s - version %s\n", VMXNET3_DRIVER_DESC,
                VMXNET3_DRIVER_VERSION_REPORT);
        return pci_register_driver(&vmxnet3_driver);
 }
index 8c9fa4b41d78616bd0efe46a45f3b3eeb30a5167..9bc542be293765a7f618b7adef6002a54ef5cf15 100644 (file)
@@ -522,24 +522,23 @@ vmxnet3_set_ringparam(struct net_device *netdev,
                if (err) {
                        /* failed, most likely because of OOM, try default
                         * size */
-                       printk(KERN_ERR "%s: failed to apply new sizes, try the"
-                               " default ones\n", netdev->name);
+                       netdev_err(netdev, "failed to apply new sizes, "
+                                  "try the default ones\n");
                        err = vmxnet3_create_queues(adapter,
                                                    VMXNET3_DEF_TX_RING_SIZE,
                                                    VMXNET3_DEF_RX_RING_SIZE,
                                                    VMXNET3_DEF_RX_RING_SIZE);
                        if (err) {
-                               printk(KERN_ERR "%s: failed to create queues "
-                                       "with default sizes. Closing it\n",
-                                       netdev->name);
+                               netdev_err(netdev, "failed to create queues "
+                                          "with default sizes. Closing it\n");
                                goto out;
                        }
                }
 
                err = vmxnet3_activate_dev(adapter);
                if (err)
-                       printk(KERN_ERR "%s: failed to re-activate, error %d."
-                               " Closing it\n", netdev->name, err);
+                       netdev_err(netdev, "failed to re-activate, error %d."
+                                  " Closing it\n", err);
        }
 
 out:
index fc46a81ad5384969b1670114765e3df12799a256..3198384689d9fbcb5119c029706844b7d8bc86bc 100644 (file)
@@ -276,8 +276,6 @@ struct vmxnet3_rx_queue {
        struct vmxnet3_rx_ctx     rx_ctx;
        u32 qid;            /* rqID in RCD for buffer from 1st ring */
        u32 qid2;           /* rqID in RCD for buffer from 2nd ring */
-       u32 uncommitted[2]; /* # of buffers allocated since last RXPROD
-                               * update */
        struct vmxnet3_rx_buf_info     *buf_info[2];
        struct Vmxnet3_RxQueueCtrl            *shared;
        struct vmxnet3_rq_driver_stats  stats;
@@ -354,7 +352,6 @@ struct vmxnet3_adapter {
 
        unsigned long  state;    /* VMXNET3_STATE_BIT_xxx */
 
-       int dev_number;
        int share_intr;
 };
 
index 40f2cc135a491a32d4ee4a6059f1ead869bc876d..656230e0d18c7bb1f79892910c56a341f856d862 100644 (file)
@@ -1191,6 +1191,7 @@ static void vxlan_setup(struct net_device *dev)
 
        dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXCSUM;
        dev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
+       dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
 
        spin_lock_init(&vxlan->hash_lock);
 
index def12b38cbf7002d27b83253c3be238e7e7f0802..c9c711dcd0e6bb9d7ce988f42bc7e6dd7877a37b 100644 (file)
@@ -1055,7 +1055,6 @@ int i2400m_read_mac_addr(struct i2400m *i2400m)
                result = 0;
        }
        net_dev->addr_len = ETH_ALEN;
-       memcpy(net_dev->perm_addr, ack_buf.ack_pl, ETH_ALEN);
        memcpy(net_dev->dev_addr, ack_buf.ack_pl, ETH_ALEN);
 error_read_mac:
        d_fnend(5, dev, "(i2400m %p) = %d\n", i2400m, result);
index 1a67a4f829fe9f3fca15a6ad3533e335bec70a25..2c02b4e84094d32fc5605deaebb0ed148087fbf5 100644 (file)
@@ -30,5 +30,6 @@ source "drivers/net/wireless/ath/ath9k/Kconfig"
 source "drivers/net/wireless/ath/carl9170/Kconfig"
 source "drivers/net/wireless/ath/ath6kl/Kconfig"
 source "drivers/net/wireless/ath/ar5523/Kconfig"
+source "drivers/net/wireless/ath/wil6210/Kconfig"
 
 endif
index 1e18621326dc2fc5c70335e43e4e781436820a84..97b964ded2bef25e4218cc3843377ada32732077 100644 (file)
@@ -3,6 +3,7 @@ obj-$(CONFIG_ATH9K_HW)          += ath9k/
 obj-$(CONFIG_CARL9170)         += carl9170/
 obj-$(CONFIG_ATH6KL)           += ath6kl/
 obj-$(CONFIG_AR5523)           += ar5523/
+obj-$(CONFIG_WIL6210)          += wil6210/
 
 obj-$(CONFIG_ATH_COMMON)       += ath.o
 
index 5fc15bf8be09449cffe2a7b19a47843ad615af7b..7647ed6b73d770278ca63875c314bcce9f98ddf2 100644 (file)
@@ -2,6 +2,7 @@ config ATH9K_HW
        tristate
 config ATH9K_COMMON
        tristate
+       select ATH_COMMON
 config ATH9K_DFS_DEBUGFS
        def_bool y
        depends on ATH9K_DEBUGFS && ATH9K_DFS_CERTIFIED
@@ -17,7 +18,6 @@ config ATH9K_BTCOEX_SUPPORT
 config ATH9K
        tristate "Atheros 802.11n wireless cards support"
        depends on MAC80211
-       select ATH_COMMON
        select ATH9K_HW
        select MAC80211_LEDS
        select LEDS_CLASS
@@ -56,7 +56,8 @@ config ATH9K_AHB
 
 config ATH9K_DEBUGFS
        bool "Atheros ath9k debugging"
-       depends on ATH9K && DEBUG_FS
+       depends on ATH9K
+       select MAC80211_DEBUGFS
        ---help---
          Say Y, if you need access to ath9k's statistics for
          interrupts, rate control, etc.
index 74fd3977feeb845adf93f6ed0fd650d506ca2ee1..59bf5f31e212c07bfef14251384aa3f5d2de0c8b 100644 (file)
@@ -544,7 +544,7 @@ static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
                                ar9340Common_rx_gain_table_1p0);
        else if (AR_SREV_9485_11(ah))
                INIT_INI_ARRAY(&ah->iniModesRxGain,
-                               ar9485Common_wo_xlna_rx_gain_1_1);
+                              ar9485_common_rx_gain_1_1);
        else if (AR_SREV_9550(ah)) {
                INIT_INI_ARRAY(&ah->iniModesRxGain,
                                ar955x_1p0_common_rx_gain_table);
index aaebecd19e5975f449bdd73bcc9c73411b6f37af..63fd9af3fd39dd2c1d7ddb183902ae5e587b1ada 100644 (file)
@@ -336,8 +336,12 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)
                if (SUPP(CARL9170FW_WLANTX_CAB)) {
                        if_comb_types |=
                                BIT(NL80211_IFTYPE_AP) |
-                               BIT(NL80211_IFTYPE_MESH_POINT) |
                                BIT(NL80211_IFTYPE_P2P_GO);
+
+#ifdef CONFIG_MAC80211_MESH
+                       if_comb_types |=
+                               BIT(NL80211_IFTYPE_MESH_POINT);
+#endif /* CONFIG_MAC80211_MESH */
                }
        }
 
diff --git a/drivers/net/wireless/ath/wil6210/Kconfig b/drivers/net/wireless/ath/wil6210/Kconfig
new file mode 100644 (file)
index 0000000..bac3d98
--- /dev/null
@@ -0,0 +1,29 @@
+config WIL6210
+       tristate "Wilocity 60g WiFi card wil6210 support"
+       depends on CFG80211
+       depends on PCI
+       default n
+       ---help---
+         This module adds support for wireless adapter based on
+         wil6210 chip by Wilocity. It supports operation on the
+         60 GHz band, covered by the IEEE802.11ad standard.
+
+         http://wireless.kernel.org/en/users/Drivers/wil6210
+
+         If you choose to build it as a module, it will be called
+         wil6210
+
+config WIL6210_ISR_COR
+       bool "Use Clear-On-Read mode for ISR registers for wil6210"
+       depends on WIL6210
+       default y
+       ---help---
+         ISR registers on wil6210 chip may operate in either
+         COR (Clear-On-Read) or W1C (Write-1-to-Clear) mode.
+         For production code, use COR (say y); is default since
+         it saves extra target transaction;
+         For ISR debug, use W1C (say n); is allows to monitor ISR
+         registers with debugfs. If COR were used, ISR would
+         self-clear when accessed for debug purposes, it makes
+         such monitoring impossible.
+         Say y unless you debug interrupts
diff --git a/drivers/net/wireless/ath/wil6210/Makefile b/drivers/net/wireless/ath/wil6210/Makefile
new file mode 100644 (file)
index 0000000..9396dc9
--- /dev/null
@@ -0,0 +1,13 @@
+obj-$(CONFIG_WIL6210) += wil6210.o
+
+wil6210-objs := main.o
+wil6210-objs += netdev.o
+wil6210-objs += cfg80211.o
+wil6210-objs += pcie_bus.o
+wil6210-objs += debugfs.o
+wil6210-objs += wmi.o
+wil6210-objs += interrupt.o
+wil6210-objs += txrx.o
+
+subdir-ccflags-y += -Werror
+subdir-ccflags-y += -D__CHECK_ENDIAN__
diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c
new file mode 100644 (file)
index 0000000..116f4e8
--- /dev/null
@@ -0,0 +1,573 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/sched.h>
+#include <linux/etherdevice.h>
+#include <linux/wireless.h>
+#include <linux/ieee80211.h>
+#include <linux/slab.h>
+#include <linux/version.h>
+#include <net/cfg80211.h>
+
+#include "wil6210.h"
+#include "wmi.h"
+
+#define CHAN60G(_channel, _flags) {                            \
+       .band                   = IEEE80211_BAND_60GHZ,         \
+       .center_freq            = 56160 + (2160 * (_channel)),  \
+       .hw_value               = (_channel),                   \
+       .flags                  = (_flags),                     \
+       .max_antenna_gain       = 0,                            \
+       .max_power              = 40,                           \
+}
+
+static struct ieee80211_channel wil_60ghz_channels[] = {
+       CHAN60G(1, 0),
+       CHAN60G(2, 0),
+       CHAN60G(3, 0),
+/* channel 4 not supported yet */
+};
+
+static struct ieee80211_supported_band wil_band_60ghz = {
+       .channels = wil_60ghz_channels,
+       .n_channels = ARRAY_SIZE(wil_60ghz_channels),
+       .ht_cap = {
+               .ht_supported = true,
+               .cap = 0, /* TODO */
+               .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, /* TODO */
+               .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, /* TODO */
+               .mcs = {
+                               /* MCS 1..12 - SC PHY */
+                       .rx_mask = {0xfe, 0x1f}, /* 1..12 */
+                       .tx_params = IEEE80211_HT_MCS_TX_DEFINED, /* TODO */
+               },
+       },
+};
+
+static const struct ieee80211_txrx_stypes
+wil_mgmt_stypes[NUM_NL80211_IFTYPES] = {
+       [NL80211_IFTYPE_STATION] = {
+               .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
+               .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+       },
+       [NL80211_IFTYPE_AP] = {
+               .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
+               .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+       },
+       [NL80211_IFTYPE_P2P_CLIENT] = {
+               .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
+               .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+       },
+       [NL80211_IFTYPE_P2P_GO] = {
+               .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
+               .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+               BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+       },
+};
+
+static const u32 wil_cipher_suites[] = {
+       WLAN_CIPHER_SUITE_GCMP,
+};
+
+int wil_iftype_nl2wmi(enum nl80211_iftype type)
+{
+       static const struct {
+               enum nl80211_iftype nl;
+               enum wmi_network_type wmi;
+       } __nl2wmi[] = {
+               {NL80211_IFTYPE_ADHOC,          WMI_NETTYPE_ADHOC},
+               {NL80211_IFTYPE_STATION,        WMI_NETTYPE_INFRA},
+               {NL80211_IFTYPE_AP,             WMI_NETTYPE_AP},
+               {NL80211_IFTYPE_P2P_CLIENT,     WMI_NETTYPE_P2P},
+               {NL80211_IFTYPE_P2P_GO,         WMI_NETTYPE_P2P},
+               {NL80211_IFTYPE_MONITOR,        WMI_NETTYPE_ADHOC}, /* FIXME */
+       };
+       uint i;
+
+       for (i = 0; i < ARRAY_SIZE(__nl2wmi); i++) {
+               if (__nl2wmi[i].nl == type)
+                       return __nl2wmi[i].wmi;
+       }
+
+       return -EOPNOTSUPP;
+}
+
+static int wil_cfg80211_get_station(struct wiphy *wiphy,
+                                   struct net_device *ndev,
+                                   u8 *mac, struct station_info *sinfo)
+{
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+       int rc;
+       struct wmi_notify_req_cmd cmd = {
+               .cid = 0,
+               .interval_usec = 0,
+       };
+
+       if (memcmp(mac, wil->dst_addr[0], ETH_ALEN))
+               return -ENOENT;
+
+       /* WMI_NOTIFY_REQ_DONE_EVENTID handler fills wil->stats.bf_mcs */
+       rc = wmi_call(wil, WMI_NOTIFY_REQ_CMDID, &cmd, sizeof(cmd),
+                     WMI_NOTIFY_REQ_DONE_EVENTID, NULL, 0, 20);
+       if (rc)
+               return rc;
+
+       sinfo->generation = wil->sinfo_gen;
+
+       sinfo->filled |= STATION_INFO_TX_BITRATE;
+       sinfo->txrate.flags = RATE_INFO_FLAGS_MCS | RATE_INFO_FLAGS_60G;
+       sinfo->txrate.mcs = wil->stats.bf_mcs;
+       sinfo->filled |= STATION_INFO_RX_BITRATE;
+       sinfo->rxrate.flags = RATE_INFO_FLAGS_MCS | RATE_INFO_FLAGS_60G;
+       sinfo->rxrate.mcs = wil->stats.last_mcs_rx;
+
+       if (test_bit(wil_status_fwconnected, &wil->status)) {
+               sinfo->filled |= STATION_INFO_SIGNAL;
+               sinfo->signal = 12; /* TODO: provide real value */
+       }
+
+       return 0;
+}
+
+static int wil_cfg80211_change_iface(struct wiphy *wiphy,
+                                    struct net_device *ndev,
+                                    enum nl80211_iftype type, u32 *flags,
+                                    struct vif_params *params)
+{
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+       struct wireless_dev *wdev = wil->wdev;
+
+       switch (type) {
+       case NL80211_IFTYPE_STATION:
+       case NL80211_IFTYPE_AP:
+       case NL80211_IFTYPE_P2P_CLIENT:
+       case NL80211_IFTYPE_P2P_GO:
+               break;
+       case NL80211_IFTYPE_MONITOR:
+               if (flags)
+                       wil->monitor_flags = *flags;
+               else
+                       wil->monitor_flags = 0;
+
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       wdev->iftype = type;
+
+       return 0;
+}
+
+static int wil_cfg80211_scan(struct wiphy *wiphy,
+                            struct cfg80211_scan_request *request)
+{
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+       struct wireless_dev *wdev = wil->wdev;
+       struct {
+               struct wmi_start_scan_cmd cmd;
+               u16 chnl[4];
+       } __packed cmd;
+       uint i, n;
+
+       if (wil->scan_request) {
+               wil_err(wil, "Already scanning\n");
+               return -EAGAIN;
+       }
+
+       /* check we are client side */
+       switch (wdev->iftype) {
+       case NL80211_IFTYPE_STATION:
+       case NL80211_IFTYPE_P2P_CLIENT:
+               break;
+       default:
+               return -EOPNOTSUPP;
+
+       }
+
+       /* FW don't support scan after connection attempt */
+       if (test_bit(wil_status_dontscan, &wil->status)) {
+               wil_err(wil, "Scan after connect attempt not supported\n");
+               return -EBUSY;
+       }
+
+       wil->scan_request = request;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.cmd.num_channels = 0;
+       n = min(request->n_channels, 4U);
+       for (i = 0; i < n; i++) {
+               int ch = request->channels[i]->hw_value;
+               if (ch == 0) {
+                       wil_err(wil,
+                               "Scan requested for unknown frequency %dMhz\n",
+                               request->channels[i]->center_freq);
+                       continue;
+               }
+               /* 0-based channel indexes */
+               cmd.cmd.channel_list[cmd.cmd.num_channels++].channel = ch - 1;
+               wil_dbg(wil, "Scan for ch %d  : %d MHz\n", ch,
+                       request->channels[i]->center_freq);
+       }
+
+       return wmi_send(wil, WMI_START_SCAN_CMDID, &cmd, sizeof(cmd.cmd) +
+                       cmd.cmd.num_channels * sizeof(cmd.cmd.channel_list[0]));
+}
+
+static int wil_cfg80211_connect(struct wiphy *wiphy,
+                               struct net_device *ndev,
+                               struct cfg80211_connect_params *sme)
+{
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+       struct cfg80211_bss *bss;
+       struct wmi_connect_cmd conn;
+       const u8 *ssid_eid;
+       const u8 *rsn_eid;
+       int ch;
+       int rc = 0;
+
+       bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid,
+                              sme->ssid, sme->ssid_len,
+                              WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
+       if (!bss) {
+               wil_err(wil, "Unable to find BSS\n");
+               return -ENOENT;
+       }
+
+       ssid_eid = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
+       if (!ssid_eid) {
+               wil_err(wil, "No SSID\n");
+               rc = -ENOENT;
+               goto out;
+       }
+
+       rsn_eid = sme->ie ?
+                       cfg80211_find_ie(WLAN_EID_RSN, sme->ie, sme->ie_len) :
+                       NULL;
+       if (rsn_eid) {
+               if (sme->ie_len > WMI_MAX_IE_LEN) {
+                       rc = -ERANGE;
+                       wil_err(wil, "IE too large (%td bytes)\n",
+                               sme->ie_len);
+                       goto out;
+               }
+               /*
+                * For secure assoc, send:
+                * (1) WMI_DELETE_CIPHER_KEY_CMD
+                * (2) WMI_SET_APPIE_CMD
+                */
+               rc = wmi_del_cipher_key(wil, 0, bss->bssid);
+               if (rc) {
+                       wil_err(wil, "WMI_DELETE_CIPHER_KEY_CMD failed\n");
+                       goto out;
+               }
+               /* WMI_SET_APPIE_CMD */
+               rc = wmi_set_ie(wil, WMI_FRAME_ASSOC_REQ, sme->ie_len, sme->ie);
+               if (rc) {
+                       wil_err(wil, "WMI_SET_APPIE_CMD failed\n");
+                       goto out;
+               }
+       }
+
+       /* WMI_CONNECT_CMD */
+       memset(&conn, 0, sizeof(conn));
+       switch (bss->capability & 0x03) {
+       case WLAN_CAPABILITY_DMG_TYPE_AP:
+               conn.network_type = WMI_NETTYPE_INFRA;
+               break;
+       case WLAN_CAPABILITY_DMG_TYPE_PBSS:
+               conn.network_type = WMI_NETTYPE_P2P;
+               break;
+       default:
+               wil_err(wil, "Unsupported BSS type, capability= 0x%04x\n",
+                       bss->capability);
+               goto out;
+       }
+       if (rsn_eid) {
+               conn.dot11_auth_mode = WMI_AUTH11_SHARED;
+               conn.auth_mode = WMI_AUTH_WPA2_PSK;
+               conn.pairwise_crypto_type = WMI_CRYPT_AES_GCMP;
+               conn.pairwise_crypto_len = 16;
+       } else {
+               conn.dot11_auth_mode = WMI_AUTH11_OPEN;
+               conn.auth_mode = WMI_AUTH_NONE;
+       }
+
+       conn.ssid_len = min_t(u8, ssid_eid[1], 32);
+       memcpy(conn.ssid, ssid_eid+2, conn.ssid_len);
+
+       ch = bss->channel->hw_value;
+       if (ch == 0) {
+               wil_err(wil, "BSS at unknown frequency %dMhz\n",
+                       bss->channel->center_freq);
+               rc = -EOPNOTSUPP;
+               goto out;
+       }
+       conn.channel = ch - 1;
+
+       memcpy(conn.bssid, bss->bssid, 6);
+       memcpy(conn.dst_mac, bss->bssid, 6);
+       /*
+        * FW don't support scan after connection attempt
+        */
+       set_bit(wil_status_dontscan, &wil->status);
+
+       rc = wmi_send(wil, WMI_CONNECT_CMDID, &conn, sizeof(conn));
+       if (rc == 0) {
+               /* Connect can take lots of time */
+               mod_timer(&wil->connect_timer,
+                         jiffies + msecs_to_jiffies(2000));
+       }
+
+ out:
+       cfg80211_put_bss(bss);
+
+       return rc;
+}
+
+static int wil_cfg80211_disconnect(struct wiphy *wiphy,
+                                  struct net_device *ndev,
+                                  u16 reason_code)
+{
+       int rc;
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+
+       rc = wmi_send(wil, WMI_DISCONNECT_CMDID, NULL, 0);
+
+       return rc;
+}
+
+static int wil_cfg80211_set_channel(struct wiphy *wiphy,
+                                   struct cfg80211_chan_def *chandef)
+{
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+       struct wireless_dev *wdev = wil->wdev;
+
+       wdev->preset_chandef = *chandef;
+
+       return 0;
+}
+
+static int wil_cfg80211_add_key(struct wiphy *wiphy,
+                               struct net_device *ndev,
+                               u8 key_index, bool pairwise,
+                               const u8 *mac_addr,
+                               struct key_params *params)
+{
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+
+       /* group key is not used */
+       if (!pairwise)
+               return 0;
+
+       return wmi_add_cipher_key(wil, key_index, mac_addr,
+                                 params->key_len, params->key);
+}
+
+static int wil_cfg80211_del_key(struct wiphy *wiphy,
+                               struct net_device *ndev,
+                               u8 key_index, bool pairwise,
+                               const u8 *mac_addr)
+{
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+
+       /* group key is not used */
+       if (!pairwise)
+               return 0;
+
+       return wmi_del_cipher_key(wil, key_index, mac_addr);
+}
+
+/* Need to be present or wiphy_new() will WARN */
+static int wil_cfg80211_set_default_key(struct wiphy *wiphy,
+                                       struct net_device *ndev,
+                                       u8 key_index, bool unicast,
+                                       bool multicast)
+{
+       return 0;
+}
+
+static int wil_cfg80211_start_ap(struct wiphy *wiphy,
+                                struct net_device *ndev,
+                                struct cfg80211_ap_settings *info)
+{
+       int rc = 0;
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+       struct wireless_dev *wdev = ndev->ieee80211_ptr;
+       struct ieee80211_channel *channel = info->chandef.chan;
+       struct cfg80211_beacon_data *bcon = &info->beacon;
+       u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype);
+
+       if (!channel) {
+               wil_err(wil, "AP: No channel???\n");
+               return -EINVAL;
+       }
+
+       wil_dbg(wil, "AP on Channel %d %d MHz, %s\n", channel->hw_value,
+               channel->center_freq, info->privacy ? "secure" : "open");
+       print_hex_dump_bytes("SSID ", DUMP_PREFIX_OFFSET,
+                            info->ssid, info->ssid_len);
+
+       rc = wil_reset(wil);
+       if (rc)
+               return rc;
+
+       rc = wmi_set_ssid(wil, info->ssid_len, info->ssid);
+       if (rc)
+               return rc;
+
+       rc = wmi_set_channel(wil, channel->hw_value);
+       if (rc)
+               return rc;
+
+       /* MAC address - pre-requisite for other commands */
+       wmi_set_mac_address(wil, ndev->dev_addr);
+
+       /* IE's */
+       /* bcon 'head IE's are not relevant for 60g band */
+       wmi_set_ie(wil, WMI_FRAME_BEACON, bcon->beacon_ies_len,
+                  bcon->beacon_ies);
+       wmi_set_ie(wil, WMI_FRAME_PROBE_RESP, bcon->proberesp_ies_len,
+                  bcon->proberesp_ies);
+       wmi_set_ie(wil, WMI_FRAME_ASSOC_RESP, bcon->assocresp_ies_len,
+                  bcon->assocresp_ies);
+
+       wil->secure_pcp = info->privacy;
+
+       rc = wmi_set_bcon(wil, info->beacon_interval, wmi_nettype);
+       if (rc)
+               return rc;
+
+       /* Rx VRING. After MAC and beacon */
+       rc = wil_rx_init(wil);
+
+       netif_carrier_on(ndev);
+
+       return rc;
+}
+
+static int wil_cfg80211_stop_ap(struct wiphy *wiphy,
+                               struct net_device *ndev)
+{
+       int rc = 0;
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+       struct wireless_dev *wdev = ndev->ieee80211_ptr;
+       u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype);
+
+       /* To stop beaconing, set BI to 0 */
+       rc = wmi_set_bcon(wil, 0, wmi_nettype);
+
+       return rc;
+}
+
+static struct cfg80211_ops wil_cfg80211_ops = {
+       .scan = wil_cfg80211_scan,
+       .connect = wil_cfg80211_connect,
+       .disconnect = wil_cfg80211_disconnect,
+       .change_virtual_intf = wil_cfg80211_change_iface,
+       .get_station = wil_cfg80211_get_station,
+       .set_monitor_channel = wil_cfg80211_set_channel,
+       .add_key = wil_cfg80211_add_key,
+       .del_key = wil_cfg80211_del_key,
+       .set_default_key = wil_cfg80211_set_default_key,
+       /* AP mode */
+       .start_ap = wil_cfg80211_start_ap,
+       .stop_ap = wil_cfg80211_stop_ap,
+};
+
+static void wil_wiphy_init(struct wiphy *wiphy)
+{
+       /* TODO: set real value */
+       wiphy->max_scan_ssids = 10;
+       wiphy->max_num_pmkids = 0 /* TODO: */;
+       wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                BIT(NL80211_IFTYPE_AP) |
+                                BIT(NL80211_IFTYPE_MONITOR);
+       /* TODO: enable P2P when integrated with supplicant:
+        * BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO)
+        */
+       wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME |
+                       WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
+       dev_warn(wiphy_dev(wiphy), "%s : flags = 0x%08x\n",
+                __func__, wiphy->flags);
+       wiphy->probe_resp_offload =
+               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
+               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
+               NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
+
+       wiphy->bands[IEEE80211_BAND_60GHZ] = &wil_band_60ghz;
+
+       /* TODO: figure this out */
+       wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
+
+       wiphy->cipher_suites = wil_cipher_suites;
+       wiphy->n_cipher_suites = ARRAY_SIZE(wil_cipher_suites);
+       wiphy->mgmt_stypes = wil_mgmt_stypes;
+}
+
+struct wireless_dev *wil_cfg80211_init(struct device *dev)
+{
+       int rc = 0;
+       struct wireless_dev *wdev;
+
+       wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
+       if (!wdev)
+               return ERR_PTR(-ENOMEM);
+
+       wdev->wiphy = wiphy_new(&wil_cfg80211_ops,
+                               sizeof(struct wil6210_priv));
+       if (!wdev->wiphy) {
+               rc = -ENOMEM;
+               goto out;
+       }
+
+       set_wiphy_dev(wdev->wiphy, dev);
+       wil_wiphy_init(wdev->wiphy);
+
+       rc = wiphy_register(wdev->wiphy);
+       if (rc < 0)
+               goto out_failed_reg;
+
+       return wdev;
+
+out_failed_reg:
+       wiphy_free(wdev->wiphy);
+out:
+       kfree(wdev);
+
+       return ERR_PTR(rc);
+}
+
+void wil_wdev_free(struct wil6210_priv *wil)
+{
+       struct wireless_dev *wdev = wil_to_wdev(wil);
+
+       if (!wdev)
+               return;
+
+       wiphy_unregister(wdev->wiphy);
+       wiphy_free(wdev->wiphy);
+       kfree(wdev);
+}
diff --git a/drivers/net/wireless/ath/wil6210/dbg_hexdump.h b/drivers/net/wireless/ath/wil6210/dbg_hexdump.h
new file mode 100644 (file)
index 0000000..6a315ba
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef WIL_DBG_HEXDUMP_H_
+#define WIL_DBG_HEXDUMP_H_
+
+#if defined(CONFIG_DYNAMIC_DEBUG)
+#define wil_dynamic_hex_dump(prefix_str, prefix_type, rowsize, \
+                            groupsize, buf, len, ascii)        \
+do {                                                           \
+       DEFINE_DYNAMIC_DEBUG_METADATA(descriptor,               \
+               __builtin_constant_p(prefix_str) ? prefix_str : "hexdump");\
+       if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))  \
+               print_hex_dump(KERN_DEBUG, prefix_str,          \
+                              prefix_type, rowsize, groupsize, \
+                              buf, len, ascii);                \
+} while (0)
+
+#define wil_print_hex_dump_debug(prefix_str, prefix_type, rowsize,     \
+                                groupsize, buf, len, ascii)            \
+       wil_dynamic_hex_dump(prefix_str, prefix_type, rowsize,          \
+                            groupsize, buf, len, ascii)
+
+#define print_hex_dump_bytes(prefix_str, prefix_type, buf, len)        \
+       wil_dynamic_hex_dump(prefix_str, prefix_type, 16, 1, buf, len, true)
+#else /* defined(CONFIG_DYNAMIC_DEBUG) */
+#define wil_print_hex_dump_debug(prefix_str, prefix_type, rowsize,     \
+                                groupsize, buf, len, ascii)            \
+       print_hex_dump(KERN_DEBUG, prefix_str, prefix_type, rowsize,    \
+                      groupsize, buf, len, ascii)
+#endif /* defined(CONFIG_DYNAMIC_DEBUG) */
+
+#endif /* WIL_DBG_HEXDUMP_H_ */
diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c
new file mode 100644 (file)
index 0000000..65fc968
--- /dev/null
@@ -0,0 +1,603 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/module.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
+#include <linux/pci.h>
+#include <linux/rtnetlink.h>
+
+#include "wil6210.h"
+#include "txrx.h"
+
+/* Nasty hack. Better have per device instances */
+static u32 mem_addr;
+static u32 dbg_txdesc_index;
+
+static void wil_print_vring(struct seq_file *s, struct wil6210_priv *wil,
+                           const char *name, struct vring *vring)
+{
+       void __iomem *x = wmi_addr(wil, vring->hwtail);
+
+       seq_printf(s, "VRING %s = {\n", name);
+       seq_printf(s, "  pa     = 0x%016llx\n", (unsigned long long)vring->pa);
+       seq_printf(s, "  va     = 0x%p\n", vring->va);
+       seq_printf(s, "  size   = %d\n", vring->size);
+       seq_printf(s, "  swtail = %d\n", vring->swtail);
+       seq_printf(s, "  swhead = %d\n", vring->swhead);
+       seq_printf(s, "  hwtail = [0x%08x] -> ", vring->hwtail);
+       if (x)
+               seq_printf(s, "0x%08x\n", ioread32(x));
+       else
+               seq_printf(s, "???\n");
+
+       if (vring->va && (vring->size < 1025)) {
+               uint i;
+               for (i = 0; i < vring->size; i++) {
+                       volatile struct vring_tx_desc *d = &vring->va[i].tx;
+                       if ((i % 64) == 0 && (i != 0))
+                               seq_printf(s, "\n");
+                       seq_printf(s, "%s", (d->dma.status & BIT(0)) ?
+                                       "S" : (vring->ctx[i] ? "H" : "h"));
+               }
+               seq_printf(s, "\n");
+       }
+       seq_printf(s, "}\n");
+}
+
+static int wil_vring_debugfs_show(struct seq_file *s, void *data)
+{
+       uint i;
+       struct wil6210_priv *wil = s->private;
+
+       wil_print_vring(s, wil, "rx", &wil->vring_rx);
+
+       for (i = 0; i < ARRAY_SIZE(wil->vring_tx); i++) {
+               struct vring *vring = &(wil->vring_tx[i]);
+               if (vring->va) {
+                       char name[10];
+                       snprintf(name, sizeof(name), "tx_%2d", i);
+                       wil_print_vring(s, wil, name, vring);
+               }
+       }
+
+       return 0;
+}
+
+static int wil_vring_seq_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, wil_vring_debugfs_show, inode->i_private);
+}
+
+static const struct file_operations fops_vring = {
+       .open           = wil_vring_seq_open,
+       .release        = single_release,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+};
+
+static void wil_print_ring(struct seq_file *s, const char *prefix,
+                          void __iomem *off)
+{
+       struct wil6210_priv *wil = s->private;
+       struct wil6210_mbox_ring r;
+       int rsize;
+       uint i;
+
+       wil_memcpy_fromio_32(&r, off, sizeof(r));
+       wil_mbox_ring_le2cpus(&r);
+       /*
+        * we just read memory block from NIC. This memory may be
+        * garbage. Check validity before using it.
+        */
+       rsize = r.size / sizeof(struct wil6210_mbox_ring_desc);
+
+       seq_printf(s, "ring %s = {\n", prefix);
+       seq_printf(s, "  base = 0x%08x\n", r.base);
+       seq_printf(s, "  size = 0x%04x bytes -> %d entries\n", r.size, rsize);
+       seq_printf(s, "  tail = 0x%08x\n", r.tail);
+       seq_printf(s, "  head = 0x%08x\n", r.head);
+       seq_printf(s, "  entry size = %d\n", r.entry_size);
+
+       if (r.size % sizeof(struct wil6210_mbox_ring_desc)) {
+               seq_printf(s, "  ??? size is not multiple of %zd, garbage?\n",
+                          sizeof(struct wil6210_mbox_ring_desc));
+               goto out;
+       }
+
+       if (!wmi_addr(wil, r.base) ||
+           !wmi_addr(wil, r.tail) ||
+           !wmi_addr(wil, r.head)) {
+               seq_printf(s, "  ??? pointers are garbage?\n");
+               goto out;
+       }
+
+       for (i = 0; i < rsize; i++) {
+               struct wil6210_mbox_ring_desc d;
+               struct wil6210_mbox_hdr hdr;
+               size_t delta = i * sizeof(d);
+               void __iomem *x = wil->csr + HOSTADDR(r.base) + delta;
+
+               wil_memcpy_fromio_32(&d, x, sizeof(d));
+
+               seq_printf(s, "  [%2x] %s %s%s 0x%08x", i,
+                          d.sync ? "F" : "E",
+                          (r.tail - r.base == delta) ? "t" : " ",
+                          (r.head - r.base == delta) ? "h" : " ",
+                          le32_to_cpu(d.addr));
+               if (0 == wmi_read_hdr(wil, d.addr, &hdr)) {
+                       u16 len = le16_to_cpu(hdr.len);
+                       seq_printf(s, " -> %04x %04x %04x %02x\n",
+                                  le16_to_cpu(hdr.seq), len,
+                                  le16_to_cpu(hdr.type), hdr.flags);
+                       if (len <= MAX_MBOXITEM_SIZE) {
+                               int n = 0;
+                               unsigned char printbuf[16 * 3 + 2];
+                               unsigned char databuf[MAX_MBOXITEM_SIZE];
+                               void __iomem *src = wmi_buffer(wil, d.addr) +
+                                       sizeof(struct wil6210_mbox_hdr);
+                               /*
+                                * No need to check @src for validity -
+                                * we already validated @d.addr while
+                                * reading header
+                                */
+                               wil_memcpy_fromio_32(databuf, src, len);
+                               while (n < len) {
+                                       int l = min(len - n, 16);
+                                       hex_dump_to_buffer(databuf + n, l,
+                                                          16, 1, printbuf,
+                                                          sizeof(printbuf),
+                                                          false);
+                                       seq_printf(s, "      : %s\n", printbuf);
+                                       n += l;
+                               }
+                       }
+               } else {
+                       seq_printf(s, "\n");
+               }
+       }
+ out:
+       seq_printf(s, "}\n");
+}
+
+static int wil_mbox_debugfs_show(struct seq_file *s, void *data)
+{
+       struct wil6210_priv *wil = s->private;
+
+       wil_print_ring(s, "tx", wil->csr + HOST_MBOX +
+                      offsetof(struct wil6210_mbox_ctl, tx));
+       wil_print_ring(s, "rx", wil->csr + HOST_MBOX +
+                      offsetof(struct wil6210_mbox_ctl, rx));
+
+       return 0;
+}
+
+static int wil_mbox_seq_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, wil_mbox_debugfs_show, inode->i_private);
+}
+
+static const struct file_operations fops_mbox = {
+       .open           = wil_mbox_seq_open,
+       .release        = single_release,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+};
+
+static int wil_debugfs_iomem_x32_set(void *data, u64 val)
+{
+       iowrite32(val, (void __iomem *)data);
+       wmb(); /* make sure write propagated to HW */
+
+       return 0;
+}
+
+static int wil_debugfs_iomem_x32_get(void *data, u64 *val)
+{
+       *val = ioread32((void __iomem *)data);
+
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(fops_iomem_x32, wil_debugfs_iomem_x32_get,
+                       wil_debugfs_iomem_x32_set, "0x%08llx\n");
+
+static struct dentry *wil_debugfs_create_iomem_x32(const char *name,
+                                                  mode_t mode,
+                                                  struct dentry *parent,
+                                                  void __iomem *value)
+{
+       return debugfs_create_file(name, mode, parent, (void * __force)value,
+                                  &fops_iomem_x32);
+}
+
+static int wil6210_debugfs_create_ISR(struct wil6210_priv *wil,
+                                     const char *name,
+                                     struct dentry *parent, u32 off)
+{
+       struct dentry *d = debugfs_create_dir(name, parent);
+
+       if (IS_ERR_OR_NULL(d))
+               return -ENODEV;
+
+       wil_debugfs_create_iomem_x32("ICC", S_IRUGO | S_IWUSR, d,
+                                    wil->csr + off);
+       wil_debugfs_create_iomem_x32("ICR", S_IRUGO | S_IWUSR, d,
+                                    wil->csr + off + 4);
+       wil_debugfs_create_iomem_x32("ICM", S_IRUGO | S_IWUSR, d,
+                                    wil->csr + off + 8);
+       wil_debugfs_create_iomem_x32("ICS", S_IWUSR, d,
+                                    wil->csr + off + 12);
+       wil_debugfs_create_iomem_x32("IMV", S_IRUGO | S_IWUSR, d,
+                                    wil->csr + off + 16);
+       wil_debugfs_create_iomem_x32("IMS", S_IWUSR, d,
+                                    wil->csr + off + 20);
+       wil_debugfs_create_iomem_x32("IMC", S_IWUSR, d,
+                                    wil->csr + off + 24);
+
+       return 0;
+}
+
+static int wil6210_debugfs_create_pseudo_ISR(struct wil6210_priv *wil,
+                                            struct dentry *parent)
+{
+       struct dentry *d = debugfs_create_dir("PSEUDO_ISR", parent);
+
+       if (IS_ERR_OR_NULL(d))
+               return -ENODEV;
+
+       wil_debugfs_create_iomem_x32("CAUSE", S_IRUGO, d, wil->csr +
+                                    HOSTADDR(RGF_DMA_PSEUDO_CAUSE));
+       wil_debugfs_create_iomem_x32("MASK_SW", S_IRUGO, d, wil->csr +
+                                    HOSTADDR(RGF_DMA_PSEUDO_CAUSE_MASK_SW));
+       wil_debugfs_create_iomem_x32("MASK_FW", S_IRUGO, d, wil->csr +
+                                    HOSTADDR(RGF_DMA_PSEUDO_CAUSE_MASK_FW));
+
+       return 0;
+}
+
+static int wil6210_debugfs_create_ITR_CNT(struct wil6210_priv *wil,
+                                         struct dentry *parent)
+{
+       struct dentry *d = debugfs_create_dir("ITR_CNT", parent);
+
+       if (IS_ERR_OR_NULL(d))
+               return -ENODEV;
+
+       wil_debugfs_create_iomem_x32("TRSH", S_IRUGO, d, wil->csr +
+                                    HOSTADDR(RGF_DMA_ITR_CNT_TRSH));
+       wil_debugfs_create_iomem_x32("DATA", S_IRUGO, d, wil->csr +
+                                    HOSTADDR(RGF_DMA_ITR_CNT_DATA));
+       wil_debugfs_create_iomem_x32("CTL", S_IRUGO, d, wil->csr +
+                                    HOSTADDR(RGF_DMA_ITR_CNT_CRL));
+
+       return 0;
+}
+
+static int wil_memread_debugfs_show(struct seq_file *s, void *data)
+{
+       struct wil6210_priv *wil = s->private;
+       void __iomem *a = wmi_buffer(wil, cpu_to_le32(mem_addr));
+
+       if (a)
+               seq_printf(s, "[0x%08x] = 0x%08x\n", mem_addr, ioread32(a));
+       else
+               seq_printf(s, "[0x%08x] = INVALID\n", mem_addr);
+
+       return 0;
+}
+
+static int wil_memread_seq_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, wil_memread_debugfs_show, inode->i_private);
+}
+
+static const struct file_operations fops_memread = {
+       .open           = wil_memread_seq_open,
+       .release        = single_release,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+};
+
+static int wil_default_open(struct inode *inode, struct file *file)
+{
+       if (inode->i_private)
+               file->private_data = inode->i_private;
+
+       return 0;
+}
+
+static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
+                               size_t count, loff_t *ppos)
+{
+       enum { max_count = 4096 };
+       struct debugfs_blob_wrapper *blob = file->private_data;
+       loff_t pos = *ppos;
+       size_t available = blob->size;
+       void *buf;
+       size_t ret;
+
+       if (pos < 0)
+               return -EINVAL;
+
+       if (pos >= available || !count)
+               return 0;
+
+       if (count > available - pos)
+               count = available - pos;
+       if (count > max_count)
+               count = max_count;
+
+       buf = kmalloc(count, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+
+       wil_memcpy_fromio_32(buf, (const volatile void __iomem *)blob->data +
+                            pos, count);
+
+       ret = copy_to_user(user_buf, buf, count);
+       kfree(buf);
+       if (ret == count)
+               return -EFAULT;
+
+       count -= ret;
+       *ppos = pos + count;
+
+       return count;
+}
+
+static const struct file_operations fops_ioblob = {
+       .read =         wil_read_file_ioblob,
+       .open =         wil_default_open,
+       .llseek =       default_llseek,
+};
+
+static
+struct dentry *wil_debugfs_create_ioblob(const char *name,
+                                        mode_t mode,
+                                        struct dentry *parent,
+                                        struct debugfs_blob_wrapper *blob)
+{
+       return debugfs_create_file(name, mode, parent, blob, &fops_ioblob);
+}
+/*---reset---*/
+static ssize_t wil_write_file_reset(struct file *file, const char __user *buf,
+                                   size_t len, loff_t *ppos)
+{
+       struct wil6210_priv *wil = file->private_data;
+       struct net_device *ndev = wil_to_ndev(wil);
+
+       /**
+        * BUG:
+        * this code does NOT sync device state with the rest of system
+        * use with care, debug only!!!
+        */
+       rtnl_lock();
+       dev_close(ndev);
+       ndev->flags &= ~IFF_UP;
+       rtnl_unlock();
+       wil_reset(wil);
+
+       return len;
+}
+
+static const struct file_operations fops_reset = {
+       .write = wil_write_file_reset,
+       .open  = wil_default_open,
+};
+/*---------Tx descriptor------------*/
+
+static int wil_txdesc_debugfs_show(struct seq_file *s, void *data)
+{
+       struct wil6210_priv *wil = s->private;
+       struct vring *vring = &(wil->vring_tx[0]);
+
+       if (!vring->va) {
+               seq_printf(s, "No Tx VRING\n");
+               return 0;
+       }
+
+       if (dbg_txdesc_index < vring->size) {
+               volatile struct vring_tx_desc *d =
+                               &(vring->va[dbg_txdesc_index].tx);
+               volatile u32 *u = (volatile u32 *)d;
+               struct sk_buff *skb = vring->ctx[dbg_txdesc_index];
+
+               seq_printf(s, "Tx[%3d] = {\n", dbg_txdesc_index);
+               seq_printf(s, "  MAC = 0x%08x 0x%08x 0x%08x 0x%08x\n",
+                          u[0], u[1], u[2], u[3]);
+               seq_printf(s, "  DMA = 0x%08x 0x%08x 0x%08x 0x%08x\n",
+                          u[4], u[5], u[6], u[7]);
+               seq_printf(s, "  SKB = %p\n", skb);
+
+               if (skb) {
+                       unsigned char printbuf[16 * 3 + 2];
+                       int i = 0;
+                       int len = skb_headlen(skb);
+                       void *p = skb->data;
+
+                       seq_printf(s, "    len = %d\n", len);
+
+                       while (i < len) {
+                               int l = min(len - i, 16);
+                               hex_dump_to_buffer(p + i, l, 16, 1, printbuf,
+                                                  sizeof(printbuf), false);
+                               seq_printf(s, "      : %s\n", printbuf);
+                               i += l;
+                       }
+               }
+               seq_printf(s, "}\n");
+       } else {
+               seq_printf(s, "TxDesc index (%d) >= size (%d)\n",
+                          dbg_txdesc_index, vring->size);
+       }
+
+       return 0;
+}
+
+static int wil_txdesc_seq_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, wil_txdesc_debugfs_show, inode->i_private);
+}
+
+static const struct file_operations fops_txdesc = {
+       .open           = wil_txdesc_seq_open,
+       .release        = single_release,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+};
+
+/*---------beamforming------------*/
+static int wil_bf_debugfs_show(struct seq_file *s, void *data)
+{
+       struct wil6210_priv *wil = s->private;
+       seq_printf(s,
+                  "TSF : 0x%016llx\n"
+                  "TxMCS : %d\n"
+                  "Sectors(rx:tx) my %2d:%2d peer %2d:%2d\n",
+                  wil->stats.tsf, wil->stats.bf_mcs,
+                  wil->stats.my_rx_sector, wil->stats.my_tx_sector,
+                  wil->stats.peer_rx_sector, wil->stats.peer_tx_sector);
+       return 0;
+}
+
+static int wil_bf_seq_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, wil_bf_debugfs_show, inode->i_private);
+}
+
+static const struct file_operations fops_bf = {
+       .open           = wil_bf_seq_open,
+       .release        = single_release,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+};
+/*---------SSID------------*/
+static ssize_t wil_read_file_ssid(struct file *file, char __user *user_buf,
+                                 size_t count, loff_t *ppos)
+{
+       struct wil6210_priv *wil = file->private_data;
+       struct wireless_dev *wdev = wil_to_wdev(wil);
+
+       return simple_read_from_buffer(user_buf, count, ppos,
+                                      wdev->ssid, wdev->ssid_len);
+}
+
+static ssize_t wil_write_file_ssid(struct file *file, const char __user *buf,
+                                  size_t count, loff_t *ppos)
+{
+       struct wil6210_priv *wil = file->private_data;
+       struct wireless_dev *wdev = wil_to_wdev(wil);
+       struct net_device *ndev = wil_to_ndev(wil);
+
+       if (*ppos != 0) {
+               wil_err(wil, "Unable to set SSID substring from [%d]\n",
+                       (int)*ppos);
+               return -EINVAL;
+       }
+
+       if (count > sizeof(wdev->ssid)) {
+               wil_err(wil, "SSID too long, len = %d\n", (int)count);
+               return -EINVAL;
+       }
+       if (netif_running(ndev)) {
+               wil_err(wil, "Unable to change SSID on running interface\n");
+               return -EINVAL;
+       }
+
+       wdev->ssid_len = count;
+       return simple_write_to_buffer(wdev->ssid, wdev->ssid_len, ppos,
+                                     buf, count);
+}
+
+static const struct file_operations fops_ssid = {
+       .read = wil_read_file_ssid,
+       .write = wil_write_file_ssid,
+       .open  = wil_default_open,
+};
+
+/*----------------*/
+int wil6210_debugfs_init(struct wil6210_priv *wil)
+{
+       struct dentry *dbg = wil->debug = debugfs_create_dir(WIL_NAME,
+                       wil_to_wiphy(wil)->debugfsdir);
+
+       if (IS_ERR_OR_NULL(dbg))
+               return -ENODEV;
+
+       debugfs_create_file("mbox", S_IRUGO, dbg, wil, &fops_mbox);
+       debugfs_create_file("vrings", S_IRUGO, dbg, wil, &fops_vring);
+       debugfs_create_file("txdesc", S_IRUGO, dbg, wil, &fops_txdesc);
+       debugfs_create_u32("txdesc_index", S_IRUGO | S_IWUSR, dbg,
+                          &dbg_txdesc_index);
+       debugfs_create_file("bf", S_IRUGO, dbg, wil, &fops_bf);
+       debugfs_create_file("ssid", S_IRUGO | S_IWUSR, dbg, wil, &fops_ssid);
+       debugfs_create_u32("secure_pcp", S_IRUGO | S_IWUSR, dbg,
+                          &wil->secure_pcp);
+
+       wil6210_debugfs_create_ISR(wil, "USER_ICR", dbg,
+                                  HOSTADDR(RGF_USER_USER_ICR));
+       wil6210_debugfs_create_ISR(wil, "DMA_EP_TX_ICR", dbg,
+                                  HOSTADDR(RGF_DMA_EP_TX_ICR));
+       wil6210_debugfs_create_ISR(wil, "DMA_EP_RX_ICR", dbg,
+                                  HOSTADDR(RGF_DMA_EP_RX_ICR));
+       wil6210_debugfs_create_ISR(wil, "DMA_EP_MISC_ICR", dbg,
+                                  HOSTADDR(RGF_DMA_EP_MISC_ICR));
+       wil6210_debugfs_create_pseudo_ISR(wil, dbg);
+       wil6210_debugfs_create_ITR_CNT(wil, dbg);
+
+       debugfs_create_u32("mem_addr", S_IRUGO | S_IWUSR, dbg, &mem_addr);
+       debugfs_create_file("mem_val", S_IRUGO, dbg, wil, &fops_memread);
+
+       debugfs_create_file("reset", S_IWUSR, dbg, wil, &fops_reset);
+
+       wil->rgf_blob.data = (void * __force)wil->csr + 0;
+       wil->rgf_blob.size = 0xa000;
+       wil_debugfs_create_ioblob("blob_rgf", S_IRUGO, dbg, &wil->rgf_blob);
+
+       wil->fw_code_blob.data = (void * __force)wil->csr + 0x40000;
+       wil->fw_code_blob.size = 0x40000;
+       wil_debugfs_create_ioblob("blob_fw_code", S_IRUGO, dbg,
+                                 &wil->fw_code_blob);
+
+       wil->fw_data_blob.data = (void * __force)wil->csr + 0x80000;
+       wil->fw_data_blob.size = 0x8000;
+       wil_debugfs_create_ioblob("blob_fw_data", S_IRUGO, dbg,
+                                 &wil->fw_data_blob);
+
+       wil->fw_peri_blob.data = (void * __force)wil->csr + 0x88000;
+       wil->fw_peri_blob.size = 0x18000;
+       wil_debugfs_create_ioblob("blob_fw_peri", S_IRUGO, dbg,
+                                 &wil->fw_peri_blob);
+
+       wil->uc_code_blob.data = (void * __force)wil->csr + 0xa0000;
+       wil->uc_code_blob.size = 0x10000;
+       wil_debugfs_create_ioblob("blob_uc_code", S_IRUGO, dbg,
+                                 &wil->uc_code_blob);
+
+       wil->uc_data_blob.data = (void * __force)wil->csr + 0xb0000;
+       wil->uc_data_blob.size = 0x4000;
+       wil_debugfs_create_ioblob("blob_uc_data", S_IRUGO, dbg,
+                                 &wil->uc_data_blob);
+
+       return 0;
+}
+
+void wil6210_debugfs_remove(struct wil6210_priv *wil)
+{
+       debugfs_remove_recursive(wil->debug);
+       wil->debug = NULL;
+}
diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c
new file mode 100644 (file)
index 0000000..38049da
--- /dev/null
@@ -0,0 +1,471 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/interrupt.h>
+
+#include "wil6210.h"
+
+/**
+ * Theory of operation:
+ *
+ * There is ISR pseudo-cause register,
+ * dma_rgf->DMA_RGF.PSEUDO_CAUSE.PSEUDO_CAUSE
+ * Its bits represents OR'ed bits from 3 real ISR registers:
+ * TX, RX, and MISC.
+ *
+ * Registers may be configured to either "write 1 to clear" or
+ * "clear on read" mode
+ *
+ * When handling interrupt, one have to mask/unmask interrupts for the
+ * real ISR registers, or hardware may malfunction.
+ *
+ */
+
+#define WIL6210_IRQ_DISABLE    (0xFFFFFFFFUL)
+#define WIL6210_IMC_RX         BIT_DMA_EP_RX_ICR_RX_DONE
+#define WIL6210_IMC_TX         (BIT_DMA_EP_TX_ICR_TX_DONE | \
+                               BIT_DMA_EP_TX_ICR_TX_DONE_N(0))
+#define WIL6210_IMC_MISC       (ISR_MISC_FW_READY | ISR_MISC_MBOX_EVT)
+
+#define WIL6210_IRQ_PSEUDO_MASK (u32)(~(BIT_DMA_PSEUDO_CAUSE_RX | \
+                                       BIT_DMA_PSEUDO_CAUSE_TX | \
+                                       BIT_DMA_PSEUDO_CAUSE_MISC))
+
+#if defined(CONFIG_WIL6210_ISR_COR)
+/* configure to Clear-On-Read mode */
+#define WIL_ICR_ICC_VALUE      (0xFFFFFFFFUL)
+
+static inline void wil_icr_clear(u32 x, void __iomem *addr)
+{
+
+}
+#else /* defined(CONFIG_WIL6210_ISR_COR) */
+/* configure to Write-1-to-Clear mode */
+#define WIL_ICR_ICC_VALUE      (0UL)
+
+static inline void wil_icr_clear(u32 x, void __iomem *addr)
+{
+       iowrite32(x, addr);
+}
+#endif /* defined(CONFIG_WIL6210_ISR_COR) */
+
+static inline u32 wil_ioread32_and_clear(void __iomem *addr)
+{
+       u32 x = ioread32(addr);
+
+       wil_icr_clear(x, addr);
+
+       return x;
+}
+
+static void wil6210_mask_irq_tx(struct wil6210_priv *wil)
+{
+       iowrite32(WIL6210_IRQ_DISABLE, wil->csr +
+                 HOSTADDR(RGF_DMA_EP_TX_ICR) +
+                 offsetof(struct RGF_ICR, IMS));
+}
+
+static void wil6210_mask_irq_rx(struct wil6210_priv *wil)
+{
+       iowrite32(WIL6210_IRQ_DISABLE, wil->csr +
+                 HOSTADDR(RGF_DMA_EP_RX_ICR) +
+                 offsetof(struct RGF_ICR, IMS));
+}
+
+static void wil6210_mask_irq_misc(struct wil6210_priv *wil)
+{
+       iowrite32(WIL6210_IRQ_DISABLE, wil->csr +
+                 HOSTADDR(RGF_DMA_EP_MISC_ICR) +
+                 offsetof(struct RGF_ICR, IMS));
+}
+
+static void wil6210_mask_irq_pseudo(struct wil6210_priv *wil)
+{
+       wil_dbg_IRQ(wil, "%s()\n", __func__);
+
+       iowrite32(WIL6210_IRQ_DISABLE, wil->csr +
+                 HOSTADDR(RGF_DMA_PSEUDO_CAUSE_MASK_SW));
+
+       clear_bit(wil_status_irqen, &wil->status);
+}
+
+static void wil6210_unmask_irq_tx(struct wil6210_priv *wil)
+{
+       iowrite32(WIL6210_IMC_TX, wil->csr +
+                 HOSTADDR(RGF_DMA_EP_TX_ICR) +
+                 offsetof(struct RGF_ICR, IMC));
+}
+
+static void wil6210_unmask_irq_rx(struct wil6210_priv *wil)
+{
+       iowrite32(WIL6210_IMC_RX, wil->csr +
+                 HOSTADDR(RGF_DMA_EP_RX_ICR) +
+                 offsetof(struct RGF_ICR, IMC));
+}
+
+static void wil6210_unmask_irq_misc(struct wil6210_priv *wil)
+{
+       iowrite32(WIL6210_IMC_MISC, wil->csr +
+                 HOSTADDR(RGF_DMA_EP_MISC_ICR) +
+                 offsetof(struct RGF_ICR, IMC));
+}
+
+static void wil6210_unmask_irq_pseudo(struct wil6210_priv *wil)
+{
+       wil_dbg_IRQ(wil, "%s()\n", __func__);
+
+       set_bit(wil_status_irqen, &wil->status);
+
+       iowrite32(WIL6210_IRQ_PSEUDO_MASK, wil->csr +
+                 HOSTADDR(RGF_DMA_PSEUDO_CAUSE_MASK_SW));
+}
+
+void wil6210_disable_irq(struct wil6210_priv *wil)
+{
+       wil_dbg_IRQ(wil, "%s()\n", __func__);
+
+       wil6210_mask_irq_tx(wil);
+       wil6210_mask_irq_rx(wil);
+       wil6210_mask_irq_misc(wil);
+       wil6210_mask_irq_pseudo(wil);
+}
+
+void wil6210_enable_irq(struct wil6210_priv *wil)
+{
+       wil_dbg_IRQ(wil, "%s()\n", __func__);
+
+       iowrite32(WIL_ICR_ICC_VALUE, wil->csr + HOSTADDR(RGF_DMA_EP_RX_ICR) +
+                 offsetof(struct RGF_ICR, ICC));
+       iowrite32(WIL_ICR_ICC_VALUE, wil->csr + HOSTADDR(RGF_DMA_EP_TX_ICR) +
+                 offsetof(struct RGF_ICR, ICC));
+       iowrite32(WIL_ICR_ICC_VALUE, wil->csr + HOSTADDR(RGF_DMA_EP_MISC_ICR) +
+                 offsetof(struct RGF_ICR, ICC));
+
+       wil6210_unmask_irq_pseudo(wil);
+       wil6210_unmask_irq_tx(wil);
+       wil6210_unmask_irq_rx(wil);
+       wil6210_unmask_irq_misc(wil);
+}
+
+static irqreturn_t wil6210_irq_rx(int irq, void *cookie)
+{
+       struct wil6210_priv *wil = cookie;
+       u32 isr = wil_ioread32_and_clear(wil->csr +
+                                        HOSTADDR(RGF_DMA_EP_RX_ICR) +
+                                        offsetof(struct RGF_ICR, ICR));
+
+       wil_dbg_IRQ(wil, "ISR RX 0x%08x\n", isr);
+
+       if (!isr) {
+               wil_err(wil, "spurious IRQ: RX\n");
+               return IRQ_NONE;
+       }
+
+       wil6210_mask_irq_rx(wil);
+
+       if (isr & BIT_DMA_EP_RX_ICR_RX_DONE) {
+               wil_dbg_IRQ(wil, "RX done\n");
+               isr &= ~BIT_DMA_EP_RX_ICR_RX_DONE;
+               wil_rx_handle(wil);
+       }
+
+       if (isr)
+               wil_err(wil, "un-handled RX ISR bits 0x%08x\n", isr);
+
+       wil6210_unmask_irq_rx(wil);
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t wil6210_irq_tx(int irq, void *cookie)
+{
+       struct wil6210_priv *wil = cookie;
+       u32 isr = wil_ioread32_and_clear(wil->csr +
+                                        HOSTADDR(RGF_DMA_EP_TX_ICR) +
+                                        offsetof(struct RGF_ICR, ICR));
+
+       wil_dbg_IRQ(wil, "ISR TX 0x%08x\n", isr);
+
+       if (!isr) {
+               wil_err(wil, "spurious IRQ: TX\n");
+               return IRQ_NONE;
+       }
+
+       wil6210_mask_irq_tx(wil);
+
+       if (isr & BIT_DMA_EP_TX_ICR_TX_DONE) {
+               uint i;
+               wil_dbg_IRQ(wil, "TX done\n");
+               isr &= ~BIT_DMA_EP_TX_ICR_TX_DONE;
+               for (i = 0; i < 24; i++) {
+                       u32 mask = BIT_DMA_EP_TX_ICR_TX_DONE_N(i);
+                       if (isr & mask) {
+                               isr &= ~mask;
+                               wil_dbg_IRQ(wil, "TX done(%i)\n", i);
+                               wil_tx_complete(wil, i);
+                       }
+               }
+       }
+
+       if (isr)
+               wil_err(wil, "un-handled TX ISR bits 0x%08x\n", isr);
+
+       wil6210_unmask_irq_tx(wil);
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t wil6210_irq_misc(int irq, void *cookie)
+{
+       struct wil6210_priv *wil = cookie;
+       u32 isr = wil_ioread32_and_clear(wil->csr +
+                                        HOSTADDR(RGF_DMA_EP_MISC_ICR) +
+                                        offsetof(struct RGF_ICR, ICR));
+
+       wil_dbg_IRQ(wil, "ISR MISC 0x%08x\n", isr);
+
+       if (!isr) {
+               wil_err(wil, "spurious IRQ: MISC\n");
+               return IRQ_NONE;
+       }
+
+       wil6210_mask_irq_misc(wil);
+
+       if (isr & ISR_MISC_FW_READY) {
+               wil_dbg_IRQ(wil, "IRQ: FW ready\n");
+               /**
+                * Actual FW ready indicated by the
+                * WMI_FW_READY_EVENTID
+                */
+               isr &= ~ISR_MISC_FW_READY;
+       }
+
+       wil->isr_misc = isr;
+
+       if (isr) {
+               return IRQ_WAKE_THREAD;
+       } else {
+               wil6210_unmask_irq_misc(wil);
+               return IRQ_HANDLED;
+       }
+}
+
+static irqreturn_t wil6210_irq_misc_thread(int irq, void *cookie)
+{
+       struct wil6210_priv *wil = cookie;
+       u32 isr = wil->isr_misc;
+
+       wil_dbg_IRQ(wil, "Thread ISR MISC 0x%08x\n", isr);
+
+       if (isr & ISR_MISC_MBOX_EVT) {
+               wil_dbg_IRQ(wil, "MBOX event\n");
+               wmi_recv_cmd(wil);
+               isr &= ~ISR_MISC_MBOX_EVT;
+       }
+
+       if (isr)
+               wil_err(wil, "un-handled MISC ISR bits 0x%08x\n", isr);
+
+       wil->isr_misc = 0;
+
+       wil6210_unmask_irq_misc(wil);
+
+       return IRQ_HANDLED;
+}
+
+/**
+ * thread IRQ handler
+ */
+static irqreturn_t wil6210_thread_irq(int irq, void *cookie)
+{
+       struct wil6210_priv *wil = cookie;
+
+       wil_dbg_IRQ(wil, "Thread IRQ\n");
+       /* Discover real IRQ cause */
+       if (wil->isr_misc)
+               wil6210_irq_misc_thread(irq, cookie);
+
+       wil6210_unmask_irq_pseudo(wil);
+
+       return IRQ_HANDLED;
+}
+
+/* DEBUG
+ * There is subtle bug in hardware that causes IRQ to raise when it should be
+ * masked. It is quite rare and hard to debug.
+ *
+ * Catch irq issue if it happens and print all I can.
+ */
+static int wil6210_debug_irq_mask(struct wil6210_priv *wil, u32 pseudo_cause)
+{
+       if (!test_bit(wil_status_irqen, &wil->status)) {
+               u32 icm_rx = wil_ioread32_and_clear(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_RX_ICR) +
+                               offsetof(struct RGF_ICR, ICM));
+               u32 icr_rx = wil_ioread32_and_clear(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_RX_ICR) +
+                               offsetof(struct RGF_ICR, ICR));
+               u32 imv_rx = ioread32(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_RX_ICR) +
+                               offsetof(struct RGF_ICR, IMV));
+               u32 icm_tx = wil_ioread32_and_clear(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_TX_ICR) +
+                               offsetof(struct RGF_ICR, ICM));
+               u32 icr_tx = wil_ioread32_and_clear(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_TX_ICR) +
+                               offsetof(struct RGF_ICR, ICR));
+               u32 imv_tx = ioread32(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_TX_ICR) +
+                               offsetof(struct RGF_ICR, IMV));
+               u32 icm_misc = wil_ioread32_and_clear(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_MISC_ICR) +
+                               offsetof(struct RGF_ICR, ICM));
+               u32 icr_misc = wil_ioread32_and_clear(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_MISC_ICR) +
+                               offsetof(struct RGF_ICR, ICR));
+               u32 imv_misc = ioread32(wil->csr +
+                               HOSTADDR(RGF_DMA_EP_MISC_ICR) +
+                               offsetof(struct RGF_ICR, IMV));
+               wil_err(wil, "IRQ when it should be masked: pseudo 0x%08x\n"
+                               "Rx   icm:icr:imv 0x%08x 0x%08x 0x%08x\n"
+                               "Tx   icm:icr:imv 0x%08x 0x%08x 0x%08x\n"
+                               "Misc icm:icr:imv 0x%08x 0x%08x 0x%08x\n",
+                               pseudo_cause,
+                               icm_rx, icr_rx, imv_rx,
+                               icm_tx, icr_tx, imv_tx,
+                               icm_misc, icr_misc, imv_misc);
+
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static irqreturn_t wil6210_hardirq(int irq, void *cookie)
+{
+       irqreturn_t rc = IRQ_HANDLED;
+       struct wil6210_priv *wil = cookie;
+       u32 pseudo_cause = ioread32(wil->csr + HOSTADDR(RGF_DMA_PSEUDO_CAUSE));
+
+       /**
+        * pseudo_cause is Clear-On-Read, no need to ACK
+        */
+       if ((pseudo_cause == 0) || ((pseudo_cause & 0xff) == 0xff))
+               return IRQ_NONE;
+
+       /* FIXME: IRQ mask debug */
+       if (wil6210_debug_irq_mask(wil, pseudo_cause))
+               return IRQ_NONE;
+
+       wil6210_mask_irq_pseudo(wil);
+
+       /* Discover real IRQ cause
+        * There are 2 possible phases for every IRQ:
+        * - hard IRQ handler called right here
+        * - threaded handler called later
+        *
+        * Hard IRQ handler reads and clears ISR.
+        *
+        * If threaded handler requested, hard IRQ handler
+        * returns IRQ_WAKE_THREAD and saves ISR register value
+        * for the threaded handler use.
+        *
+        * voting for wake thread - need at least 1 vote
+        */
+       if ((pseudo_cause & BIT_DMA_PSEUDO_CAUSE_RX) &&
+           (wil6210_irq_rx(irq, cookie) == IRQ_WAKE_THREAD))
+               rc = IRQ_WAKE_THREAD;
+
+       if ((pseudo_cause & BIT_DMA_PSEUDO_CAUSE_TX) &&
+           (wil6210_irq_tx(irq, cookie) == IRQ_WAKE_THREAD))
+               rc = IRQ_WAKE_THREAD;
+
+       if ((pseudo_cause & BIT_DMA_PSEUDO_CAUSE_MISC) &&
+           (wil6210_irq_misc(irq, cookie) == IRQ_WAKE_THREAD))
+               rc = IRQ_WAKE_THREAD;
+
+       /* if thread is requested, it will unmask IRQ */
+       if (rc != IRQ_WAKE_THREAD)
+               wil6210_unmask_irq_pseudo(wil);
+
+       wil_dbg_IRQ(wil, "Hard IRQ 0x%08x\n", pseudo_cause);
+
+       return rc;
+}
+
+static int wil6210_request_3msi(struct wil6210_priv *wil, int irq)
+{
+       int rc;
+       /*
+        * IRQ's are in the following order:
+        * - Tx
+        * - Rx
+        * - Misc
+        */
+
+       rc = request_irq(irq, wil6210_irq_tx, IRQF_SHARED,
+                        WIL_NAME"_tx", wil);
+       if (rc)
+               return rc;
+
+       rc = request_irq(irq + 1, wil6210_irq_rx, IRQF_SHARED,
+                        WIL_NAME"_rx", wil);
+       if (rc)
+               goto free0;
+
+       rc = request_threaded_irq(irq + 2, wil6210_irq_misc,
+                                 wil6210_irq_misc_thread,
+                                 IRQF_SHARED, WIL_NAME"_misc", wil);
+       if (rc)
+               goto free1;
+
+       return 0;
+       /* error branch */
+free1:
+       free_irq(irq + 1, wil);
+free0:
+       free_irq(irq, wil);
+
+       return rc;
+}
+
+int wil6210_init_irq(struct wil6210_priv *wil, int irq)
+{
+       int rc;
+       if (wil->n_msi == 3)
+               rc = wil6210_request_3msi(wil, irq);
+       else
+               rc = request_threaded_irq(irq, wil6210_hardirq,
+                                         wil6210_thread_irq,
+                                         wil->n_msi ? 0 : IRQF_SHARED,
+                                         WIL_NAME, wil);
+       if (rc)
+               return rc;
+
+       wil6210_enable_irq(wil);
+
+       return 0;
+}
+
+void wil6210_fini_irq(struct wil6210_priv *wil, int irq)
+{
+       wil6210_disable_irq(wil);
+       free_irq(irq, wil);
+       if (wil->n_msi == 3) {
+               free_irq(irq + 1, wil);
+               free_irq(irq + 2, wil);
+       }
+}
diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c
new file mode 100644 (file)
index 0000000..95fcd36
--- /dev/null
@@ -0,0 +1,407 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/sched.h>
+#include <linux/ieee80211.h>
+#include <linux/wireless.h>
+#include <linux/slab.h>
+#include <linux/moduleparam.h>
+#include <linux/if_arp.h>
+
+#include "wil6210.h"
+
+/*
+ * Due to a hardware issue,
+ * one has to read/write to/from NIC in 32-bit chunks;
+ * regular memcpy_fromio and siblings will
+ * not work on 64-bit platform - it uses 64-bit transactions
+ *
+ * Force 32-bit transactions to enable NIC on 64-bit platforms
+ *
+ * To avoid byte swap on big endian host, __raw_{read|write}l
+ * should be used - {read|write}l would swap bytes to provide
+ * little endian on PCI value in host endianness.
+ */
+void wil_memcpy_fromio_32(void *dst, const volatile void __iomem *src,
+                         size_t count)
+{
+       u32 *d = dst;
+       const volatile u32 __iomem *s = src;
+
+       /* size_t is unsigned, if (count%4 != 0) it will wrap */
+       for (count += 4; count > 4; count -= 4)
+               *d++ = __raw_readl(s++);
+}
+
+void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
+                       size_t count)
+{
+       volatile u32 __iomem *d = dst;
+       const u32 *s = src;
+
+       for (count += 4; count > 4; count -= 4)
+               __raw_writel(*s++, d++);
+}
+
+static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid)
+{
+       uint i;
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct wireless_dev *wdev = wil->wdev;
+
+       wil_dbg(wil, "%s()\n", __func__);
+
+       wil_link_off(wil);
+       clear_bit(wil_status_fwconnected, &wil->status);
+
+       switch (wdev->sme_state) {
+       case CFG80211_SME_CONNECTED:
+               cfg80211_disconnected(ndev, WLAN_STATUS_UNSPECIFIED_FAILURE,
+                                     NULL, 0, GFP_KERNEL);
+               break;
+       case CFG80211_SME_CONNECTING:
+               cfg80211_connect_result(ndev, bssid, NULL, 0, NULL, 0,
+                                       WLAN_STATUS_UNSPECIFIED_FAILURE,
+                                       GFP_KERNEL);
+               break;
+       default:
+               ;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(wil->vring_tx); i++)
+               wil_vring_fini_tx(wil, i);
+}
+
+static void wil_disconnect_worker(struct work_struct *work)
+{
+       struct wil6210_priv *wil = container_of(work,
+                       struct wil6210_priv, disconnect_worker);
+
+       _wil6210_disconnect(wil, NULL);
+}
+
+static void wil_connect_timer_fn(ulong x)
+{
+       struct wil6210_priv *wil = (void *)x;
+
+       wil_dbg(wil, "Connect timeout\n");
+
+       /* reschedule to thread context - disconnect won't
+        * run from atomic context
+        */
+       schedule_work(&wil->disconnect_worker);
+}
+
+int wil_priv_init(struct wil6210_priv *wil)
+{
+       wil_dbg(wil, "%s()\n", __func__);
+
+       mutex_init(&wil->mutex);
+       mutex_init(&wil->wmi_mutex);
+
+       init_completion(&wil->wmi_ready);
+
+       wil->pending_connect_cid = -1;
+       setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil);
+
+       INIT_WORK(&wil->wmi_connect_worker, wmi_connect_worker);
+       INIT_WORK(&wil->disconnect_worker, wil_disconnect_worker);
+       INIT_WORK(&wil->wmi_event_worker, wmi_event_worker);
+
+       INIT_LIST_HEAD(&wil->pending_wmi_ev);
+       spin_lock_init(&wil->wmi_ev_lock);
+
+       wil->wmi_wq = create_singlethread_workqueue(WIL_NAME"_wmi");
+       if (!wil->wmi_wq)
+               return -EAGAIN;
+
+       wil->wmi_wq_conn = create_singlethread_workqueue(WIL_NAME"_connect");
+       if (!wil->wmi_wq_conn) {
+               destroy_workqueue(wil->wmi_wq);
+               return -EAGAIN;
+       }
+
+       /* make shadow copy of registers that should not change on run time */
+       wil_memcpy_fromio_32(&wil->mbox_ctl, wil->csr + HOST_MBOX,
+                            sizeof(struct wil6210_mbox_ctl));
+       wil_mbox_ring_le2cpus(&wil->mbox_ctl.rx);
+       wil_mbox_ring_le2cpus(&wil->mbox_ctl.tx);
+
+       return 0;
+}
+
+void wil6210_disconnect(struct wil6210_priv *wil, void *bssid)
+{
+       del_timer_sync(&wil->connect_timer);
+       _wil6210_disconnect(wil, bssid);
+}
+
+void wil_priv_deinit(struct wil6210_priv *wil)
+{
+       cancel_work_sync(&wil->disconnect_worker);
+       wil6210_disconnect(wil, NULL);
+       wmi_event_flush(wil);
+       destroy_workqueue(wil->wmi_wq_conn);
+       destroy_workqueue(wil->wmi_wq);
+}
+
+static void wil_target_reset(struct wil6210_priv *wil)
+{
+       wil_dbg(wil, "Resetting...\n");
+
+       /* register write */
+#define W(a, v) iowrite32(v, wil->csr + HOSTADDR(a))
+       /* register set = read, OR, write */
+#define S(a, v) iowrite32(ioread32(wil->csr + HOSTADDR(a)) | v, \
+               wil->csr + HOSTADDR(a))
+
+       /* hpal_perst_from_pad_src_n_mask */
+       S(RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT(6));
+       /* car_perst_rst_src_n_mask */
+       S(RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT(7));
+
+       W(RGF_USER_MAC_CPU_0,  BIT(1)); /* mac_cpu_man_rst */
+       W(RGF_USER_USER_CPU_0, BIT(1)); /* user_cpu_man_rst */
+
+       msleep(100);
+
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0xFE000000);
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0x0000003F);
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x00000170);
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0xFFE7FC00);
+
+       msleep(100);
+
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0);
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0);
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0);
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0);
+
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x00000001);
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0x00000080);
+       W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0);
+
+       msleep(2000);
+
+       W(RGF_USER_USER_CPU_0, BIT(0)); /* user_cpu_man_de_rst */
+
+       msleep(2000);
+
+       wil_dbg(wil, "Reset completed\n");
+
+#undef W
+#undef S
+}
+
+void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r)
+{
+       le32_to_cpus(&r->base);
+       le16_to_cpus(&r->entry_size);
+       le16_to_cpus(&r->size);
+       le32_to_cpus(&r->tail);
+       le32_to_cpus(&r->head);
+}
+
+static int wil_wait_for_fw_ready(struct wil6210_priv *wil)
+{
+       ulong to = msecs_to_jiffies(1000);
+       ulong left = wait_for_completion_timeout(&wil->wmi_ready, to);
+       if (0 == left) {
+               wil_err(wil, "Firmware not ready\n");
+               return -ETIME;
+       } else {
+               wil_dbg(wil, "FW ready after %d ms\n",
+                       jiffies_to_msecs(to-left));
+       }
+       return 0;
+}
+
+/*
+ * We reset all the structures, and we reset the UMAC.
+ * After calling this routine, you're expected to reload
+ * the firmware.
+ */
+int wil_reset(struct wil6210_priv *wil)
+{
+       int rc;
+
+       cancel_work_sync(&wil->disconnect_worker);
+       wil6210_disconnect(wil, NULL);
+
+       wmi_event_flush(wil);
+
+       flush_workqueue(wil->wmi_wq);
+       flush_workqueue(wil->wmi_wq_conn);
+
+       wil6210_disable_irq(wil);
+       wil->status = 0;
+
+       /* TODO: put MAC in reset */
+       wil_target_reset(wil);
+
+       /* init after reset */
+       wil->pending_connect_cid = -1;
+       INIT_COMPLETION(wil->wmi_ready);
+
+       /* make shadow copy of registers that should not change on run time */
+       wil_memcpy_fromio_32(&wil->mbox_ctl, wil->csr + HOST_MBOX,
+                            sizeof(struct wil6210_mbox_ctl));
+       wil_mbox_ring_le2cpus(&wil->mbox_ctl.rx);
+       wil_mbox_ring_le2cpus(&wil->mbox_ctl.tx);
+
+       /* TODO: release MAC reset */
+       wil6210_enable_irq(wil);
+
+       /* we just started MAC, wait for FW ready */
+       rc = wil_wait_for_fw_ready(wil);
+
+       return rc;
+}
+
+
+void wil_link_on(struct wil6210_priv *wil)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+
+       wil_dbg(wil, "%s()\n", __func__);
+
+       netif_carrier_on(ndev);
+       netif_tx_wake_all_queues(ndev);
+}
+
+void wil_link_off(struct wil6210_priv *wil)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+
+       wil_dbg(wil, "%s()\n", __func__);
+
+       netif_tx_stop_all_queues(ndev);
+       netif_carrier_off(ndev);
+}
+
+static int __wil_up(struct wil6210_priv *wil)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct wireless_dev *wdev = wil->wdev;
+       struct ieee80211_channel *channel = wdev->preset_chandef.chan;
+       int rc;
+       int bi;
+       u16 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype);
+
+       rc = wil_reset(wil);
+       if (rc)
+               return rc;
+
+       /* FIXME Firmware works now in PBSS mode(ToDS=0, FromDS=0) */
+       wmi_nettype = wil_iftype_nl2wmi(NL80211_IFTYPE_ADHOC);
+       switch (wdev->iftype) {
+       case NL80211_IFTYPE_STATION:
+               wil_dbg(wil, "type: STATION\n");
+               bi = 0;
+               ndev->type = ARPHRD_ETHER;
+               break;
+       case NL80211_IFTYPE_AP:
+               wil_dbg(wil, "type: AP\n");
+               bi = 100;
+               ndev->type = ARPHRD_ETHER;
+               break;
+       case NL80211_IFTYPE_P2P_CLIENT:
+               wil_dbg(wil, "type: P2P_CLIENT\n");
+               bi = 0;
+               ndev->type = ARPHRD_ETHER;
+               break;
+       case NL80211_IFTYPE_P2P_GO:
+               wil_dbg(wil, "type: P2P_GO\n");
+               bi = 100;
+               ndev->type = ARPHRD_ETHER;
+               break;
+       case NL80211_IFTYPE_MONITOR:
+               wil_dbg(wil, "type: Monitor\n");
+               bi = 0;
+               ndev->type = ARPHRD_IEEE80211_RADIOTAP;
+               /* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_RADIOTAP ? */
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       /* Apply profile in the following order: */
+       /* SSID and channel for the AP */
+       switch (wdev->iftype) {
+       case NL80211_IFTYPE_AP:
+       case NL80211_IFTYPE_P2P_GO:
+               if (wdev->ssid_len == 0) {
+                       wil_err(wil, "SSID not set\n");
+                       return -EINVAL;
+               }
+               wmi_set_ssid(wil, wdev->ssid_len, wdev->ssid);
+               if (channel)
+                       wmi_set_channel(wil, channel->hw_value);
+               break;
+       default:
+               ;
+       }
+
+       /* MAC address - pre-requisite for other commands */
+       wmi_set_mac_address(wil, ndev->dev_addr);
+
+       /* Set up beaconing if required. */
+       rc = wmi_set_bcon(wil, bi, wmi_nettype);
+       if (rc)
+               return rc;
+
+       /* Rx VRING. After MAC and beacon */
+       wil_rx_init(wil);
+
+       return 0;
+}
+
+int wil_up(struct wil6210_priv *wil)
+{
+       int rc;
+
+       mutex_lock(&wil->mutex);
+       rc = __wil_up(wil);
+       mutex_unlock(&wil->mutex);
+
+       return rc;
+}
+
+static int __wil_down(struct wil6210_priv *wil)
+{
+       if (wil->scan_request) {
+               cfg80211_scan_done(wil->scan_request, true);
+               wil->scan_request = NULL;
+       }
+
+       wil6210_disconnect(wil, NULL);
+       wil_rx_fini(wil);
+
+       return 0;
+}
+
+int wil_down(struct wil6210_priv *wil)
+{
+       int rc;
+
+       mutex_lock(&wil->mutex);
+       rc = __wil_down(wil);
+       mutex_unlock(&wil->mutex);
+
+       return rc;
+}
diff --git a/drivers/net/wireless/ath/wil6210/netdev.c b/drivers/net/wireless/ath/wil6210/netdev.c
new file mode 100644 (file)
index 0000000..3068b5c
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/slab.h>
+
+#include "wil6210.h"
+
+static int wil_open(struct net_device *ndev)
+{
+       struct wil6210_priv *wil = ndev_to_wil(ndev);
+
+       return wil_up(wil);
+}
+
+static int wil_stop(struct net_device *ndev)
+{
+       struct wil6210_priv *wil = ndev_to_wil(ndev);
+
+       return wil_down(wil);
+}
+
+/*
+ * AC to queue mapping
+ *
+ * AC_VO -> queue 3
+ * AC_VI -> queue 2
+ * AC_BE -> queue 1
+ * AC_BK -> queue 0
+ */
+static u16 wil_select_queue(struct net_device *ndev, struct sk_buff *skb)
+{
+       static const u16 wil_1d_to_queue[8] = { 1, 0, 0, 1, 2, 2, 3, 3 };
+       struct wil6210_priv *wil = ndev_to_wil(ndev);
+       u16 rc;
+
+       skb->priority = cfg80211_classify8021d(skb);
+
+       rc = wil_1d_to_queue[skb->priority];
+
+       wil_dbg_TXRX(wil, "%s() %d -> %d\n", __func__, (int)skb->priority,
+                    (int)rc);
+
+       return rc;
+}
+
+static const struct net_device_ops wil_netdev_ops = {
+       .ndo_open               = wil_open,
+       .ndo_stop               = wil_stop,
+       .ndo_start_xmit         = wil_start_xmit,
+       .ndo_select_queue       = wil_select_queue,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
+void *wil_if_alloc(struct device *dev, void __iomem *csr)
+{
+       struct net_device *ndev;
+       struct wireless_dev *wdev;
+       struct wil6210_priv *wil;
+       struct ieee80211_channel *ch;
+       int rc = 0;
+
+       wdev = wil_cfg80211_init(dev);
+       if (IS_ERR(wdev)) {
+               dev_err(dev, "wil_cfg80211_init failed\n");
+               return wdev;
+       }
+
+       wil = wdev_to_wil(wdev);
+       wil->csr = csr;
+       wil->wdev = wdev;
+
+       rc = wil_priv_init(wil);
+       if (rc) {
+               dev_err(dev, "wil_priv_init failed\n");
+               goto out_wdev;
+       }
+
+       wdev->iftype = NL80211_IFTYPE_STATION; /* TODO */
+       /* default monitor channel */
+       ch = wdev->wiphy->bands[IEEE80211_BAND_60GHZ]->channels;
+       cfg80211_chandef_create(&wdev->preset_chandef, ch, NL80211_CHAN_NO_HT);
+
+       ndev = alloc_netdev_mqs(0, "wlan%d", ether_setup, WIL6210_TX_QUEUES, 1);
+       if (!ndev) {
+               dev_err(dev, "alloc_netdev_mqs failed\n");
+               rc = -ENOMEM;
+               goto out_priv;
+       }
+
+       ndev->netdev_ops = &wil_netdev_ops;
+       ndev->ieee80211_ptr = wdev;
+       SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy));
+       wdev->netdev = ndev;
+
+       wil_link_off(wil);
+
+       return wil;
+
+ out_priv:
+       wil_priv_deinit(wil);
+
+ out_wdev:
+       wil_wdev_free(wil);
+
+       return ERR_PTR(rc);
+}
+
+void wil_if_free(struct wil6210_priv *wil)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       if (!ndev)
+               return;
+
+       free_netdev(ndev);
+       wil_priv_deinit(wil);
+       wil_wdev_free(wil);
+}
+
+int wil_if_add(struct wil6210_priv *wil)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       int rc;
+
+       rc = register_netdev(ndev);
+       if (rc < 0) {
+               dev_err(&ndev->dev, "Failed to register netdev: %d\n", rc);
+               return rc;
+       }
+
+       wil_link_off(wil);
+
+       return 0;
+}
+
+void wil_if_remove(struct wil6210_priv *wil)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+
+       unregister_netdev(ndev);
+}
diff --git a/drivers/net/wireless/ath/wil6210/pcie_bus.c b/drivers/net/wireless/ath/wil6210/pcie_bus.c
new file mode 100644 (file)
index 0000000..0fc83ed
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/netdevice.h>
+#include <linux/debugfs.h>
+#include <linux/pci.h>
+#include <linux/moduleparam.h>
+
+#include "wil6210.h"
+
+static int use_msi = 1;
+module_param(use_msi, int, S_IRUGO);
+MODULE_PARM_DESC(use_msi,
+                " Use MSI interrupt: "
+                "0 - don't, 1 - (default) - single, or 3");
+
+/* Bus ops */
+static int wil_if_pcie_enable(struct wil6210_priv *wil)
+{
+       struct pci_dev *pdev = wil->pdev;
+       int rc;
+
+       pci_set_master(pdev);
+
+       /*
+        * how many MSI interrupts to request?
+        */
+       switch (use_msi) {
+       case 3:
+       case 1:
+       case 0:
+               break;
+       default:
+               wil_err(wil, "Invalid use_msi=%d, default to 1\n",
+                       use_msi);
+               use_msi = 1;
+       }
+       wil->n_msi = use_msi;
+       if (wil->n_msi) {
+               wil_dbg(wil, "Setup %d MSI interrupts\n", use_msi);
+               rc = pci_enable_msi_block(pdev, wil->n_msi);
+               if (rc && (wil->n_msi == 3)) {
+                       wil_err(wil, "3 MSI mode failed, try 1 MSI\n");
+                       wil->n_msi = 1;
+                       rc = pci_enable_msi_block(pdev, wil->n_msi);
+               }
+               if (rc) {
+                       wil_err(wil, "pci_enable_msi failed, use INTx\n");
+                       wil->n_msi = 0;
+               }
+       } else {
+               wil_dbg(wil, "MSI interrupts disabled, use INTx\n");
+       }
+
+       rc = wil6210_init_irq(wil, pdev->irq);
+       if (rc)
+               goto stop_master;
+
+       /* need reset here to obtain MAC */
+       rc = wil_reset(wil);
+       if (rc)
+               goto release_irq;
+
+       return 0;
+
+ release_irq:
+       wil6210_fini_irq(wil, pdev->irq);
+       /* safe to call if no MSI */
+       pci_disable_msi(pdev);
+ stop_master:
+       pci_clear_master(pdev);
+       return rc;
+}
+
+static int wil_if_pcie_disable(struct wil6210_priv *wil)
+{
+       struct pci_dev *pdev = wil->pdev;
+
+       pci_clear_master(pdev);
+       /* disable and release IRQ */
+       wil6210_fini_irq(wil, pdev->irq);
+       /* safe to call if no MSI */
+       pci_disable_msi(pdev);
+       /* TODO: disable HW */
+
+       return 0;
+}
+
+static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+       struct wil6210_priv *wil;
+       struct device *dev = &pdev->dev;
+       void __iomem *csr;
+       int rc;
+
+       /* check HW */
+       dev_info(&pdev->dev, WIL_NAME " device found [%04x:%04x] (rev %x)\n",
+                (int)pdev->vendor, (int)pdev->device, (int)pdev->revision);
+
+       if (pci_resource_len(pdev, 0) != WIL6210_MEM_SIZE) {
+               dev_err(&pdev->dev, "Not " WIL_NAME "? "
+                       "BAR0 size is %lu while expecting %lu\n",
+                       (ulong)pci_resource_len(pdev, 0), WIL6210_MEM_SIZE);
+               return -ENODEV;
+       }
+
+       rc = pci_enable_device(pdev);
+       if (rc) {
+               dev_err(&pdev->dev, "pci_enable_device failed\n");
+               return -ENODEV;
+       }
+       /* rollback to err_disable_pdev */
+
+       rc = pci_request_region(pdev, 0, WIL_NAME);
+       if (rc) {
+               dev_err(&pdev->dev, "pci_request_region failed\n");
+               goto err_disable_pdev;
+       }
+       /* rollback to err_release_reg */
+
+       csr = pci_ioremap_bar(pdev, 0);
+       if (!csr) {
+               dev_err(&pdev->dev, "pci_ioremap_bar failed\n");
+               rc = -ENODEV;
+               goto err_release_reg;
+       }
+       /* rollback to err_iounmap */
+       dev_info(&pdev->dev, "CSR at %pR -> %p\n", &pdev->resource[0], csr);
+
+       wil = wil_if_alloc(dev, csr);
+       if (IS_ERR(wil)) {
+               rc = (int)PTR_ERR(wil);
+               dev_err(dev, "wil_if_alloc failed: %d\n", rc);
+               goto err_iounmap;
+       }
+       /* rollback to if_free */
+
+       pci_set_drvdata(pdev, wil);
+       wil->pdev = pdev;
+
+       /* FW should raise IRQ when ready */
+       rc = wil_if_pcie_enable(wil);
+       if (rc) {
+               wil_err(wil, "Enable device failed\n");
+               goto if_free;
+       }
+       /* rollback to bus_disable */
+
+       rc = wil_if_add(wil);
+       if (rc) {
+               wil_err(wil, "wil_if_add failed: %d\n", rc);
+               goto bus_disable;
+       }
+
+       wil6210_debugfs_init(wil);
+
+       /* check FW is alive */
+       wmi_echo(wil);
+
+       return 0;
+
+ bus_disable:
+       wil_if_pcie_disable(wil);
+ if_free:
+       wil_if_free(wil);
+ err_iounmap:
+       pci_iounmap(pdev, csr);
+ err_release_reg:
+       pci_release_region(pdev, 0);
+ err_disable_pdev:
+       pci_disable_device(pdev);
+
+       return rc;
+}
+
+static void wil_pcie_remove(struct pci_dev *pdev)
+{
+       struct wil6210_priv *wil = pci_get_drvdata(pdev);
+
+       wil6210_debugfs_remove(wil);
+       wil_if_pcie_disable(wil);
+       wil_if_remove(wil);
+       wil_if_free(wil);
+       pci_iounmap(pdev, wil->csr);
+       pci_release_region(pdev, 0);
+       pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
+}
+
+static DEFINE_PCI_DEVICE_TABLE(wil6210_pcie_ids) = {
+       { PCI_DEVICE(0x1ae9, 0x0301) },
+       { /* end: all zeroes */ },
+};
+MODULE_DEVICE_TABLE(pci, wil6210_pcie_ids);
+
+static struct pci_driver wil6210_driver = {
+       .probe          = wil_pcie_probe,
+       .remove         = wil_pcie_remove,
+       .id_table       = wil6210_pcie_ids,
+       .name           = WIL_NAME,
+};
+
+module_pci_driver(wil6210_driver);
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_AUTHOR("Qualcomm Atheros <wil6210@qca.qualcomm.com>");
+MODULE_DESCRIPTION("Driver for 60g WiFi WIL6210 card");
diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c
new file mode 100644 (file)
index 0000000..f29c294
--- /dev/null
@@ -0,0 +1,871 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/hardirq.h>
+#include <net/ieee80211_radiotap.h>
+#include <linux/if_arp.h>
+#include <linux/moduleparam.h>
+
+#include "wil6210.h"
+#include "wmi.h"
+#include "txrx.h"
+
+static bool rtap_include_phy_info;
+module_param(rtap_include_phy_info, bool, S_IRUGO);
+MODULE_PARM_DESC(rtap_include_phy_info,
+                " Include PHY info in the radiotap header, default - no");
+
+static inline int wil_vring_is_empty(struct vring *vring)
+{
+       return vring->swhead == vring->swtail;
+}
+
+static inline u32 wil_vring_next_tail(struct vring *vring)
+{
+       return (vring->swtail + 1) % vring->size;
+}
+
+static inline void wil_vring_advance_head(struct vring *vring, int n)
+{
+       vring->swhead = (vring->swhead + n) % vring->size;
+}
+
+static inline int wil_vring_is_full(struct vring *vring)
+{
+       return wil_vring_next_tail(vring) == vring->swhead;
+}
+/*
+ * Available space in Tx Vring
+ */
+static inline int wil_vring_avail_tx(struct vring *vring)
+{
+       u32 swhead = vring->swhead;
+       u32 swtail = vring->swtail;
+       int used = (vring->size + swhead - swtail) % vring->size;
+
+       return vring->size - used - 1;
+}
+
+static int wil_vring_alloc(struct wil6210_priv *wil, struct vring *vring)
+{
+       struct device *dev = wil_to_dev(wil);
+       size_t sz = vring->size * sizeof(vring->va[0]);
+       uint i;
+
+       BUILD_BUG_ON(sizeof(vring->va[0]) != 32);
+
+       vring->swhead = 0;
+       vring->swtail = 0;
+       vring->ctx = kzalloc(vring->size * sizeof(vring->ctx[0]), GFP_KERNEL);
+       if (!vring->ctx) {
+               wil_err(wil, "vring_alloc [%d] failed to alloc ctx mem\n",
+                       vring->size);
+               vring->va = NULL;
+               return -ENOMEM;
+       }
+       /*
+        * vring->va should be aligned on its size rounded up to power of 2
+        * This is granted by the dma_alloc_coherent
+        */
+       vring->va = dma_alloc_coherent(dev, sz, &vring->pa, GFP_KERNEL);
+       if (!vring->va) {
+               wil_err(wil, "vring_alloc [%d] failed to alloc DMA mem\n",
+                       vring->size);
+               kfree(vring->ctx);
+               vring->ctx = NULL;
+               return -ENOMEM;
+       }
+       /* initially, all descriptors are SW owned
+        * For Tx and Rx, ownership bit is at the same location, thus
+        * we can use any
+        */
+       for (i = 0; i < vring->size; i++) {
+               volatile struct vring_tx_desc *d = &(vring->va[i].tx);
+               d->dma.status = TX_DMA_STATUS_DU;
+       }
+
+       wil_dbg(wil, "vring[%d] 0x%p:0x%016llx 0x%p\n", vring->size,
+               vring->va, (unsigned long long)vring->pa, vring->ctx);
+
+       return 0;
+}
+
+static void wil_vring_free(struct wil6210_priv *wil, struct vring *vring,
+                          int tx)
+{
+       struct device *dev = wil_to_dev(wil);
+       size_t sz = vring->size * sizeof(vring->va[0]);
+
+       while (!wil_vring_is_empty(vring)) {
+               if (tx) {
+                       volatile struct vring_tx_desc *d =
+                                       &vring->va[vring->swtail].tx;
+                       dma_addr_t pa = d->dma.addr_low |
+                                       ((u64)d->dma.addr_high << 32);
+                       struct sk_buff *skb = vring->ctx[vring->swtail];
+                       if (skb) {
+                               dma_unmap_single(dev, pa, d->dma.length,
+                                                DMA_TO_DEVICE);
+                               dev_kfree_skb_any(skb);
+                               vring->ctx[vring->swtail] = NULL;
+                       } else {
+                               dma_unmap_page(dev, pa, d->dma.length,
+                                              DMA_TO_DEVICE);
+                       }
+                       vring->swtail = wil_vring_next_tail(vring);
+               } else { /* rx */
+                       volatile struct vring_rx_desc *d =
+                                       &vring->va[vring->swtail].rx;
+                       dma_addr_t pa = d->dma.addr_low |
+                                       ((u64)d->dma.addr_high << 32);
+                       struct sk_buff *skb = vring->ctx[vring->swhead];
+                       dma_unmap_single(dev, pa, d->dma.length,
+                                        DMA_FROM_DEVICE);
+                       kfree_skb(skb);
+                       wil_vring_advance_head(vring, 1);
+               }
+       }
+       dma_free_coherent(dev, sz, (void *)vring->va, vring->pa);
+       kfree(vring->ctx);
+       vring->pa = 0;
+       vring->va = NULL;
+       vring->ctx = NULL;
+}
+
+/**
+ * Allocate one skb for Rx VRING
+ *
+ * Safe to call from IRQ
+ */
+static int wil_vring_alloc_skb(struct wil6210_priv *wil, struct vring *vring,
+                              u32 i, int headroom)
+{
+       struct device *dev = wil_to_dev(wil);
+       unsigned int sz = RX_BUF_LEN;
+       volatile struct vring_rx_desc *d = &(vring->va[i].rx);
+       dma_addr_t pa;
+
+       /* TODO align */
+       struct sk_buff *skb = dev_alloc_skb(sz + headroom);
+       if (unlikely(!skb))
+               return -ENOMEM;
+
+       skb_reserve(skb, headroom);
+       skb_put(skb, sz);
+
+       pa = dma_map_single(dev, skb->data, skb->len, DMA_FROM_DEVICE);
+       if (unlikely(dma_mapping_error(dev, pa))) {
+               kfree_skb(skb);
+               return -ENOMEM;
+       }
+
+       d->dma.d0 = BIT(9) | RX_DMA_D0_CMD_DMA_IT;
+       d->dma.addr_low = lower_32_bits(pa);
+       d->dma.addr_high = (u16)upper_32_bits(pa);
+       /* ip_length don't care */
+       /* b11 don't care */
+       /* error don't care */
+       d->dma.status = 0; /* BIT(0) should be 0 for HW_OWNED */
+       d->dma.length = sz;
+       vring->ctx[i] = skb;
+
+       return 0;
+}
+
+/**
+ * Adds radiotap header
+ *
+ * Any error indicated as "Bad FCS"
+ *
+ * Vendor data for 04:ce:14-1 (Wilocity-1) consists of:
+ *  - Rx descriptor: 32 bytes
+ *  - Phy info
+ */
+static void wil_rx_add_radiotap_header(struct wil6210_priv *wil,
+                                      struct sk_buff *skb,
+                                      volatile struct vring_rx_desc *d)
+{
+       struct wireless_dev *wdev = wil->wdev;
+       struct wil6210_rtap {
+               struct ieee80211_radiotap_header rthdr;
+               /* fields should be in the order of bits in rthdr.it_present */
+               /* flags */
+               u8 flags;
+               /* channel */
+               __le16 chnl_freq __aligned(2);
+               __le16 chnl_flags;
+               /* MCS */
+               u8 mcs_present;
+               u8 mcs_flags;
+               u8 mcs_index;
+       } __packed;
+       struct wil6210_rtap_vendor {
+               struct wil6210_rtap rtap;
+               /* vendor */
+               u8 vendor_oui[3] __aligned(2);
+               u8 vendor_ns;
+               __le16 vendor_skip;
+               u8 vendor_data[0];
+       } __packed;
+       struct wil6210_rtap_vendor *rtap_vendor;
+       int rtap_len = sizeof(struct wil6210_rtap);
+       int phy_length = 0; /* phy info header size, bytes */
+       static char phy_data[128];
+       struct ieee80211_channel *ch = wdev->preset_chandef.chan;
+
+       if (rtap_include_phy_info) {
+               rtap_len = sizeof(*rtap_vendor) + sizeof(*d);
+               /* calculate additional length */
+               if (d->dma.status & RX_DMA_STATUS_PHY_INFO) {
+                       /**
+                        * PHY info starts from 8-byte boundary
+                        * there are 8-byte lines, last line may be partially
+                        * written (HW bug), thus FW configures for last line
+                        * to be excessive. Driver skips this last line.
+                        */
+                       int len = min_t(int, 8 + sizeof(phy_data),
+                                       wil_rxdesc_phy_length(d));
+                       if (len > 8) {
+                               void *p = skb_tail_pointer(skb);
+                               void *pa = PTR_ALIGN(p, 8);
+                               if (skb_tailroom(skb) >= len + (pa - p)) {
+                                       phy_length = len - 8;
+                                       memcpy(phy_data, pa, phy_length);
+                               }
+                       }
+               }
+               rtap_len += phy_length;
+       }
+
+       if (skb_headroom(skb) < rtap_len &&
+           pskb_expand_head(skb, rtap_len, 0, GFP_ATOMIC)) {
+               wil_err(wil, "Unable to expand headrom to %d\n", rtap_len);
+               return;
+       }
+
+       rtap_vendor = (void *)skb_push(skb, rtap_len);
+       memset(rtap_vendor, 0, rtap_len);
+
+       rtap_vendor->rtap.rthdr.it_version = PKTHDR_RADIOTAP_VERSION;
+       rtap_vendor->rtap.rthdr.it_len = cpu_to_le16(rtap_len);
+       rtap_vendor->rtap.rthdr.it_present = cpu_to_le32(
+                       (1 << IEEE80211_RADIOTAP_FLAGS) |
+                       (1 << IEEE80211_RADIOTAP_CHANNEL) |
+                       (1 << IEEE80211_RADIOTAP_MCS));
+       if (d->dma.status & RX_DMA_STATUS_ERROR)
+               rtap_vendor->rtap.flags |= IEEE80211_RADIOTAP_F_BADFCS;
+
+       rtap_vendor->rtap.chnl_freq = cpu_to_le16(ch ? ch->center_freq : 58320);
+       rtap_vendor->rtap.chnl_flags = cpu_to_le16(0);
+
+       rtap_vendor->rtap.mcs_present = IEEE80211_RADIOTAP_MCS_HAVE_MCS;
+       rtap_vendor->rtap.mcs_flags = 0;
+       rtap_vendor->rtap.mcs_index = wil_rxdesc_mcs(d);
+
+       if (rtap_include_phy_info) {
+               rtap_vendor->rtap.rthdr.it_present |= cpu_to_le32(1 <<
+                               IEEE80211_RADIOTAP_VENDOR_NAMESPACE);
+               /* OUI for Wilocity 04:ce:14 */
+               rtap_vendor->vendor_oui[0] = 0x04;
+               rtap_vendor->vendor_oui[1] = 0xce;
+               rtap_vendor->vendor_oui[2] = 0x14;
+               rtap_vendor->vendor_ns = 1;
+               /* Rx descriptor + PHY data  */
+               rtap_vendor->vendor_skip = cpu_to_le16(sizeof(*d) +
+                                                      phy_length);
+               memcpy(rtap_vendor->vendor_data, (void *)d, sizeof(*d));
+               memcpy(rtap_vendor->vendor_data + sizeof(*d), phy_data,
+                      phy_length);
+       }
+}
+
+/*
+ * Fast swap in place between 2 registers
+ */
+static void wil_swap_u16(u16 *a, u16 *b)
+{
+       *a ^= *b;
+       *b ^= *a;
+       *a ^= *b;
+}
+
+static void wil_swap_ethaddr(void *data)
+{
+       struct ethhdr *eth = data;
+       u16 *s = (u16 *)eth->h_source;
+       u16 *d = (u16 *)eth->h_dest;
+
+       wil_swap_u16(s++, d++);
+       wil_swap_u16(s++, d++);
+       wil_swap_u16(s, d);
+}
+
+/**
+ * reap 1 frame from @swhead
+ *
+ * Safe to call from IRQ
+ */
+static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
+                                        struct vring *vring)
+{
+       struct device *dev = wil_to_dev(wil);
+       struct net_device *ndev = wil_to_ndev(wil);
+       volatile struct vring_rx_desc *d;
+       struct sk_buff *skb;
+       dma_addr_t pa;
+       unsigned int sz = RX_BUF_LEN;
+       u8 ftype;
+       u8 ds_bits;
+
+       if (wil_vring_is_empty(vring))
+               return NULL;
+
+       d = &(vring->va[vring->swhead].rx);
+       if (!(d->dma.status & RX_DMA_STATUS_DU)) {
+               /* it is not error, we just reached end of Rx done area */
+               return NULL;
+       }
+
+       pa = d->dma.addr_low | ((u64)d->dma.addr_high << 32);
+       skb = vring->ctx[vring->swhead];
+       dma_unmap_single(dev, pa, sz, DMA_FROM_DEVICE);
+       skb_trim(skb, d->dma.length);
+
+       wil->stats.last_mcs_rx = wil_rxdesc_mcs(d);
+
+       /* use radiotap header only if required */
+       if (ndev->type == ARPHRD_IEEE80211_RADIOTAP)
+               wil_rx_add_radiotap_header(wil, skb, d);
+
+       wil_dbg_TXRX(wil, "Rx[%3d] : %d bytes\n", vring->swhead, d->dma.length);
+       wil_hex_dump_TXRX("Rx ", DUMP_PREFIX_NONE, 32, 4,
+                         (const void *)d, sizeof(*d), false);
+
+       wil_vring_advance_head(vring, 1);
+
+       /* no extra checks if in sniffer mode */
+       if (ndev->type != ARPHRD_ETHER)
+               return skb;
+       /*
+        * Non-data frames may be delivered through Rx DMA channel (ex: BAR)
+        * Driver should recognize it by frame type, that is found
+        * in Rx descriptor. If type is not data, it is 802.11 frame as is
+        */
+       ftype = wil_rxdesc_ftype(d) << 2;
+       if (ftype != IEEE80211_FTYPE_DATA) {
+               wil_dbg_TXRX(wil, "Non-data frame ftype 0x%08x\n", ftype);
+               /* TODO: process it */
+               kfree_skb(skb);
+               return NULL;
+       }
+
+       if (skb->len < ETH_HLEN) {
+               wil_err(wil, "Short frame, len = %d\n", skb->len);
+               /* TODO: process it (i.e. BAR) */
+               kfree_skb(skb);
+               return NULL;
+       }
+
+       ds_bits = wil_rxdesc_ds_bits(d);
+       if (ds_bits == 1) {
+               /*
+                * HW bug - in ToDS mode, i.e. Rx on AP side,
+                * addresses get swapped
+                */
+               wil_swap_ethaddr(skb->data);
+       }
+
+       return skb;
+}
+
+/**
+ * allocate and fill up to @count buffers in rx ring
+ * buffers posted at @swtail
+ */
+static int wil_rx_refill(struct wil6210_priv *wil, int count)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct vring *v = &wil->vring_rx;
+       u32 next_tail;
+       int rc = 0;
+       int headroom = ndev->type == ARPHRD_IEEE80211_RADIOTAP ?
+                       WIL6210_RTAP_SIZE : 0;
+
+       for (; next_tail = wil_vring_next_tail(v),
+                       (next_tail != v->swhead) && (count-- > 0);
+                       v->swtail = next_tail) {
+               rc = wil_vring_alloc_skb(wil, v, v->swtail, headroom);
+               if (rc) {
+                       wil_err(wil, "Error %d in wil_rx_refill[%d]\n",
+                               rc, v->swtail);
+                       break;
+               }
+       }
+       iowrite32(v->swtail, wil->csr + HOSTADDR(v->hwtail));
+
+       return rc;
+}
+
+/*
+ * Pass Rx packet to the netif. Update statistics.
+ */
+static void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev)
+{
+       int rc;
+       unsigned int len = skb->len;
+
+       if (in_interrupt())
+               rc = netif_rx(skb);
+       else
+               rc = netif_rx_ni(skb);
+
+       if (likely(rc == NET_RX_SUCCESS)) {
+               ndev->stats.rx_packets++;
+               ndev->stats.rx_bytes += len;
+
+       } else {
+               ndev->stats.rx_dropped++;
+       }
+}
+
+/**
+ * Proceed all completed skb's from Rx VRING
+ *
+ * Safe to call from IRQ
+ */
+void wil_rx_handle(struct wil6210_priv *wil)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct vring *v = &wil->vring_rx;
+       struct sk_buff *skb;
+
+       if (!v->va) {
+               wil_err(wil, "Rx IRQ while Rx not yet initialized\n");
+               return;
+       }
+       wil_dbg_TXRX(wil, "%s()\n", __func__);
+       while (NULL != (skb = wil_vring_reap_rx(wil, v))) {
+               wil_hex_dump_TXRX("Rx ", DUMP_PREFIX_OFFSET, 16, 1,
+                                 skb->data, skb_headlen(skb), false);
+
+               skb_orphan(skb);
+
+               if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) {
+                       skb->dev = ndev;
+                       skb_reset_mac_header(skb);
+                       skb->ip_summed = CHECKSUM_UNNECESSARY;
+                       skb->pkt_type = PACKET_OTHERHOST;
+                       skb->protocol = htons(ETH_P_802_2);
+
+               } else {
+                       skb->protocol = eth_type_trans(skb, ndev);
+               }
+
+               wil_netif_rx_any(skb, ndev);
+       }
+       wil_rx_refill(wil, v->size);
+}
+
+int wil_rx_init(struct wil6210_priv *wil)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct wireless_dev *wdev = wil->wdev;
+       struct vring *vring = &wil->vring_rx;
+       int rc;
+       struct wmi_cfg_rx_chain_cmd cmd = {
+               .action = WMI_RX_CHAIN_ADD,
+               .rx_sw_ring = {
+                       .max_mpdu_size = cpu_to_le16(RX_BUF_LEN),
+               },
+               .mid = 0, /* TODO - what is it? */
+               .decap_trans_type = WMI_DECAP_TYPE_802_3,
+       };
+       struct {
+               struct wil6210_mbox_hdr_wmi wmi;
+               struct wmi_cfg_rx_chain_done_event evt;
+       } __packed evt;
+
+       vring->size = WIL6210_RX_RING_SIZE;
+       rc = wil_vring_alloc(wil, vring);
+       if (rc)
+               return rc;
+
+       cmd.rx_sw_ring.ring_mem_base = cpu_to_le64(vring->pa);
+       cmd.rx_sw_ring.ring_size = cpu_to_le16(vring->size);
+       if (wdev->iftype == NL80211_IFTYPE_MONITOR) {
+               struct ieee80211_channel *ch = wdev->preset_chandef.chan;
+
+               cmd.sniffer_cfg.mode = cpu_to_le32(WMI_SNIFFER_ON);
+               if (ch)
+                       cmd.sniffer_cfg.channel = ch->hw_value - 1;
+               cmd.sniffer_cfg.phy_info_mode =
+                       cpu_to_le32(ndev->type == ARPHRD_IEEE80211_RADIOTAP);
+               cmd.sniffer_cfg.phy_support =
+                       cpu_to_le32((wil->monitor_flags & MONITOR_FLAG_CONTROL)
+                                   ? WMI_SNIFFER_CP : WMI_SNIFFER_DP);
+       }
+       /* typical time for secure PCP is 840ms */
+       rc = wmi_call(wil, WMI_CFG_RX_CHAIN_CMDID, &cmd, sizeof(cmd),
+                     WMI_CFG_RX_CHAIN_DONE_EVENTID, &evt, sizeof(evt), 2000);
+       if (rc)
+               goto err_free;
+
+       vring->hwtail = le32_to_cpu(evt.evt.rx_ring_tail_ptr);
+
+       wil_dbg(wil, "Rx init: status %d tail 0x%08x\n",
+               le32_to_cpu(evt.evt.status), vring->hwtail);
+
+       rc = wil_rx_refill(wil, vring->size);
+       if (rc)
+               goto err_free;
+
+       return 0;
+ err_free:
+       wil_vring_free(wil, vring, 0);
+
+       return rc;
+}
+
+void wil_rx_fini(struct wil6210_priv *wil)
+{
+       struct vring *vring = &wil->vring_rx;
+
+       if (vring->va) {
+               int rc;
+               struct wmi_cfg_rx_chain_cmd cmd = {
+                       .action = cpu_to_le32(WMI_RX_CHAIN_DEL),
+                       .rx_sw_ring = {
+                               .max_mpdu_size = cpu_to_le16(RX_BUF_LEN),
+                       },
+               };
+               struct {
+                       struct wil6210_mbox_hdr_wmi wmi;
+                       struct wmi_cfg_rx_chain_done_event cfg;
+               } __packed wmi_rx_cfg_reply;
+
+               rc = wmi_call(wil, WMI_CFG_RX_CHAIN_CMDID, &cmd, sizeof(cmd),
+                             WMI_CFG_RX_CHAIN_DONE_EVENTID,
+                             &wmi_rx_cfg_reply, sizeof(wmi_rx_cfg_reply),
+                             100);
+               wil_vring_free(wil, vring, 0);
+       }
+}
+
+int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size,
+                     int cid, int tid)
+{
+       int rc;
+       struct wmi_vring_cfg_cmd cmd = {
+               .action = cpu_to_le32(WMI_VRING_CMD_ADD),
+               .vring_cfg = {
+                       .tx_sw_ring = {
+                               .max_mpdu_size = cpu_to_le16(TX_BUF_LEN),
+                       },
+                       .ringid = id,
+                       .cidxtid = (cid & 0xf) | ((tid & 0xf) << 4),
+                       .encap_trans_type = WMI_VRING_ENC_TYPE_802_3,
+                       .mac_ctrl = 0,
+                       .to_resolution = 0,
+                       .agg_max_wsize = 16,
+                       .schd_params = {
+                               .priority = cpu_to_le16(0),
+                               .timeslot_us = cpu_to_le16(0xfff),
+                       },
+               },
+       };
+       struct {
+               struct wil6210_mbox_hdr_wmi wmi;
+               struct wmi_vring_cfg_done_event cmd;
+       } __packed reply;
+       struct vring *vring = &wil->vring_tx[id];
+
+       if (vring->va) {
+               wil_err(wil, "Tx ring [%d] already allocated\n", id);
+               rc = -EINVAL;
+               goto out;
+       }
+
+       vring->size = size;
+       rc = wil_vring_alloc(wil, vring);
+       if (rc)
+               goto out;
+
+       cmd.vring_cfg.tx_sw_ring.ring_mem_base = cpu_to_le64(vring->pa);
+       cmd.vring_cfg.tx_sw_ring.ring_size = cpu_to_le16(vring->size);
+
+       rc = wmi_call(wil, WMI_VRING_CFG_CMDID, &cmd, sizeof(cmd),
+                     WMI_VRING_CFG_DONE_EVENTID, &reply, sizeof(reply), 100);
+       if (rc)
+               goto out_free;
+
+       if (reply.cmd.status != WMI_VRING_CFG_SUCCESS) {
+               wil_err(wil, "Tx config failed, status 0x%02x\n",
+                       reply.cmd.status);
+               goto out_free;
+       }
+       vring->hwtail = le32_to_cpu(reply.cmd.tx_vring_tail_ptr);
+
+       return 0;
+ out_free:
+       wil_vring_free(wil, vring, 1);
+ out:
+
+       return rc;
+}
+
+void wil_vring_fini_tx(struct wil6210_priv *wil, int id)
+{
+       struct vring *vring = &wil->vring_tx[id];
+
+       if (!vring->va)
+               return;
+
+       wil_vring_free(wil, vring, 1);
+}
+
+static struct vring *wil_find_tx_vring(struct wil6210_priv *wil,
+                                      struct sk_buff *skb)
+{
+       struct vring *v = &wil->vring_tx[0];
+
+       if (v->va)
+               return v;
+
+       return NULL;
+}
+
+static int wil_tx_desc_map(volatile struct vring_tx_desc *d,
+                          dma_addr_t pa, u32 len)
+{
+       d->dma.addr_low = lower_32_bits(pa);
+       d->dma.addr_high = (u16)upper_32_bits(pa);
+       d->dma.ip_length = 0;
+       /* 0..6: mac_length; 7:ip_version 0-IP6 1-IP4*/
+       d->dma.b11 = 0/*14 | BIT(7)*/;
+       d->dma.error = 0;
+       d->dma.status = 0; /* BIT(0) should be 0 for HW_OWNED */
+       d->dma.length = len;
+       d->dma.d0 = 0;
+       d->mac.d[0] = 0;
+       d->mac.d[1] = 0;
+       d->mac.d[2] = 0;
+       d->mac.ucode_cmd = 0;
+       /* use dst index 0 */
+       d->mac.d[1] |= BIT(MAC_CFG_DESC_TX_1_DST_INDEX_EN_POS) |
+                      (0 << MAC_CFG_DESC_TX_1_DST_INDEX_POS);
+       /* translation type:  0 - bypass; 1 - 802.3; 2 - native wifi */
+       d->mac.d[2] = BIT(MAC_CFG_DESC_TX_2_SNAP_HDR_INSERTION_EN_POS) |
+                     (1 << MAC_CFG_DESC_TX_2_L2_TRANSLATION_TYPE_POS);
+
+       return 0;
+}
+
+static int wil_tx_vring(struct wil6210_priv *wil, struct vring *vring,
+                       struct sk_buff *skb)
+{
+       struct device *dev = wil_to_dev(wil);
+       volatile struct vring_tx_desc *d;
+       u32 swhead = vring->swhead;
+       int avail = wil_vring_avail_tx(vring);
+       int nr_frags = skb_shinfo(skb)->nr_frags;
+       uint f;
+       int vring_index = vring - wil->vring_tx;
+       uint i = swhead;
+       dma_addr_t pa;
+
+       wil_dbg_TXRX(wil, "%s()\n", __func__);
+
+       if (avail < vring->size/8)
+               netif_tx_stop_all_queues(wil_to_ndev(wil));
+       if (avail < 1 + nr_frags) {
+               wil_err(wil, "Tx ring full. No space for %d fragments\n",
+                       1 + nr_frags);
+               return -ENOMEM;
+       }
+       d = &(vring->va[i].tx);
+
+       /* FIXME FW can accept only unicast frames for the peer */
+       memcpy(skb->data, wil->dst_addr[vring_index], ETH_ALEN);
+
+       pa = dma_map_single(dev, skb->data,
+                       skb_headlen(skb), DMA_TO_DEVICE);
+
+       wil_dbg_TXRX(wil, "Tx skb %d bytes %p -> %#08llx\n", skb_headlen(skb),
+                    skb->data, (unsigned long long)pa);
+       wil_hex_dump_TXRX("Tx ", DUMP_PREFIX_OFFSET, 16, 1,
+                         skb->data, skb_headlen(skb), false);
+
+       if (unlikely(dma_mapping_error(dev, pa)))
+               return -EINVAL;
+       /* 1-st segment */
+       wil_tx_desc_map(d, pa, skb_headlen(skb));
+       d->mac.d[2] |= ((nr_frags + 1) <<
+                      MAC_CFG_DESC_TX_2_NUM_OF_DESCRIPTORS_POS);
+       /* middle segments */
+       for (f = 0; f < nr_frags; f++) {
+               const struct skb_frag_struct *frag =
+                               &skb_shinfo(skb)->frags[f];
+               int len = skb_frag_size(frag);
+               i = (swhead + f + 1) % vring->size;
+               d = &(vring->va[i].tx);
+               pa = skb_frag_dma_map(dev, frag, 0, skb_frag_size(frag),
+                               DMA_TO_DEVICE);
+               if (unlikely(dma_mapping_error(dev, pa)))
+                       goto dma_error;
+               wil_tx_desc_map(d, pa, len);
+               vring->ctx[i] = NULL;
+       }
+       /* for the last seg only */
+       d->dma.d0 |= BIT(DMA_CFG_DESC_TX_0_CMD_EOP_POS);
+       d->dma.d0 |= BIT(9); /* BUG: undocumented bit */
+       d->dma.d0 |= BIT(DMA_CFG_DESC_TX_0_CMD_DMA_IT_POS);
+       d->dma.d0 |= (vring_index << DMA_CFG_DESC_TX_0_QID_POS);
+
+       wil_hex_dump_TXRX("Tx ", DUMP_PREFIX_NONE, 32, 4,
+                         (const void *)d, sizeof(*d), false);
+
+       /* advance swhead */
+       wil_vring_advance_head(vring, nr_frags + 1);
+       wil_dbg_TXRX(wil, "Tx swhead %d -> %d\n", swhead, vring->swhead);
+       iowrite32(vring->swhead, wil->csr + HOSTADDR(vring->hwtail));
+       /* hold reference to skb
+        * to prevent skb release before accounting
+        * in case of immediate "tx done"
+        */
+       vring->ctx[i] = skb_get(skb);
+
+       return 0;
+ dma_error:
+       /* unmap what we have mapped */
+       /* Note: increment @f to operate with positive index */
+       for (f++; f > 0; f--) {
+               i = (swhead + f) % vring->size;
+               d = &(vring->va[i].tx);
+               d->dma.status = TX_DMA_STATUS_DU;
+               pa = d->dma.addr_low | ((u64)d->dma.addr_high << 32);
+               if (vring->ctx[i])
+                       dma_unmap_single(dev, pa, d->dma.length, DMA_TO_DEVICE);
+               else
+                       dma_unmap_page(dev, pa, d->dma.length, DMA_TO_DEVICE);
+       }
+
+       return -EINVAL;
+}
+
+
+netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev)
+{
+       struct wil6210_priv *wil = ndev_to_wil(ndev);
+       struct vring *vring;
+       int rc;
+
+       wil_dbg_TXRX(wil, "%s()\n", __func__);
+       if (!test_bit(wil_status_fwready, &wil->status)) {
+               wil_err(wil, "FW not ready\n");
+               goto drop;
+       }
+       if (!test_bit(wil_status_fwconnected, &wil->status)) {
+               wil_err(wil, "FW not connected\n");
+               goto drop;
+       }
+       if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) {
+               wil_err(wil, "Xmit in monitor mode not supported\n");
+               goto drop;
+       }
+       if (skb->protocol == cpu_to_be16(ETH_P_PAE)) {
+               rc = wmi_tx_eapol(wil, skb);
+       } else {
+               /* find vring */
+               vring = wil_find_tx_vring(wil, skb);
+               if (!vring) {
+                       wil_err(wil, "No Tx VRING available\n");
+                       goto drop;
+               }
+               /* set up vring entry */
+               rc = wil_tx_vring(wil, vring, skb);
+       }
+       switch (rc) {
+       case 0:
+               ndev->stats.tx_packets++;
+               ndev->stats.tx_bytes += skb->len;
+               dev_kfree_skb_any(skb);
+               return NETDEV_TX_OK;
+       case -ENOMEM:
+               return NETDEV_TX_BUSY;
+       default:
+               ; /* goto drop; */
+               break;
+       }
+ drop:
+       netif_tx_stop_all_queues(ndev);
+       ndev->stats.tx_dropped++;
+       dev_kfree_skb_any(skb);
+
+       return NET_XMIT_DROP;
+}
+
+/**
+ * Clean up transmitted skb's from the Tx VRING
+ *
+ * Safe to call from IRQ
+ */
+void wil_tx_complete(struct wil6210_priv *wil, int ringid)
+{
+       struct device *dev = wil_to_dev(wil);
+       struct vring *vring = &wil->vring_tx[ringid];
+
+       if (!vring->va) {
+               wil_err(wil, "Tx irq[%d]: vring not initialized\n", ringid);
+               return;
+       }
+
+       wil_dbg_TXRX(wil, "%s(%d)\n", __func__, ringid);
+
+       while (!wil_vring_is_empty(vring)) {
+               volatile struct vring_tx_desc *d = &vring->va[vring->swtail].tx;
+               dma_addr_t pa;
+               struct sk_buff *skb;
+               if (!(d->dma.status & TX_DMA_STATUS_DU))
+                       break;
+
+               wil_dbg_TXRX(wil,
+                            "Tx[%3d] : %d bytes, status 0x%02x err 0x%02x\n",
+                            vring->swtail, d->dma.length, d->dma.status,
+                            d->dma.error);
+               wil_hex_dump_TXRX("TxC ", DUMP_PREFIX_NONE, 32, 4,
+                                 (const void *)d, sizeof(*d), false);
+
+               pa = d->dma.addr_low | ((u64)d->dma.addr_high << 32);
+               skb = vring->ctx[vring->swtail];
+               if (skb) {
+                       dma_unmap_single(dev, pa, d->dma.length, DMA_TO_DEVICE);
+                       dev_kfree_skb_any(skb);
+                       vring->ctx[vring->swtail] = NULL;
+               } else {
+                       dma_unmap_page(dev, pa, d->dma.length, DMA_TO_DEVICE);
+               }
+               d->dma.addr_low = 0;
+               d->dma.addr_high = 0;
+               d->dma.length = 0;
+               d->dma.status = TX_DMA_STATUS_DU;
+               vring->swtail = wil_vring_next_tail(vring);
+       }
+       if (wil_vring_avail_tx(vring) > vring->size/4)
+               netif_tx_wake_all_queues(wil_to_ndev(wil));
+}
diff --git a/drivers/net/wireless/ath/wil6210/txrx.h b/drivers/net/wireless/ath/wil6210/txrx.h
new file mode 100644 (file)
index 0000000..45a61f5
--- /dev/null
@@ -0,0 +1,362 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef WIL6210_TXRX_H
+#define WIL6210_TXRX_H
+
+#define BUF_SW_OWNED    (1)
+#define BUF_HW_OWNED    (0)
+
+/* size of max. Rx packet */
+#define RX_BUF_LEN      (2048)
+#define TX_BUF_LEN      (2048)
+/* how many bytes to reserve for rtap header? */
+#define WIL6210_RTAP_SIZE (128)
+
+/* Tx/Rx path */
+/*
+ * Tx descriptor - MAC part
+ * [dword 0]
+ * bit  0.. 9 : lifetime_expiry_value:10
+ * bit     10 : interrup_en:1
+ * bit     11 : status_en:1
+ * bit 12..13 : txss_override:2
+ * bit     14 : timestamp_insertion:1
+ * bit     15 : duration_preserve:1
+ * bit 16..21 : reserved0:6
+ * bit 22..26 : mcs_index:5
+ * bit     27 : mcs_en:1
+ * bit 28..29 : reserved1:2
+ * bit     30 : reserved2:1
+ * bit     31 : sn_preserved:1
+ * [dword 1]
+ * bit  0.. 3 : pkt_mode:4
+ * bit      4 : pkt_mode_en:1
+ * bit  5.. 7 : reserved0:3
+ * bit  8..13 : reserved1:6
+ * bit     14 : reserved2:1
+ * bit     15 : ack_policy_en:1
+ * bit 16..19 : dst_index:4
+ * bit     20 : dst_index_en:1
+ * bit 21..22 : ack_policy:2
+ * bit     23 : lifetime_en:1
+ * bit 24..30 : max_retry:7
+ * bit     31 : max_retry_en:1
+ * [dword 2]
+ * bit  0.. 7 : num_of_descriptors:8
+ * bit  8..17 : reserved:10
+ * bit 18..19 : l2_translation_type:2
+ * bit     20 : snap_hdr_insertion_en:1
+ * bit     21 : vlan_removal_en:1
+ * bit 22..31 : reserved0:10
+ * [dword 3]
+ * bit  0.. 31: ucode_cmd:32
+ */
+struct vring_tx_mac {
+       u32 d[3];
+       u32 ucode_cmd;
+} __packed;
+
+/* TX MAC Dword 0 */
+#define MAC_CFG_DESC_TX_0_LIFETIME_EXPIRY_VALUE_POS 0
+#define MAC_CFG_DESC_TX_0_LIFETIME_EXPIRY_VALUE_LEN 10
+#define MAC_CFG_DESC_TX_0_LIFETIME_EXPIRY_VALUE_MSK 0x3FF
+
+#define MAC_CFG_DESC_TX_0_INTERRUP_EN_POS 10
+#define MAC_CFG_DESC_TX_0_INTERRUP_EN_LEN 1
+#define MAC_CFG_DESC_TX_0_INTERRUP_EN_MSK 0x400
+
+#define MAC_CFG_DESC_TX_0_STATUS_EN_POS 11
+#define MAC_CFG_DESC_TX_0_STATUS_EN_LEN 1
+#define MAC_CFG_DESC_TX_0_STATUS_EN_MSK 0x800
+
+#define MAC_CFG_DESC_TX_0_TXSS_OVERRIDE_POS 12
+#define MAC_CFG_DESC_TX_0_TXSS_OVERRIDE_LEN 2
+#define MAC_CFG_DESC_TX_0_TXSS_OVERRIDE_MSK 0x3000
+
+#define MAC_CFG_DESC_TX_0_TIMESTAMP_INSERTION_POS 14
+#define MAC_CFG_DESC_TX_0_TIMESTAMP_INSERTION_LEN 1
+#define MAC_CFG_DESC_TX_0_TIMESTAMP_INSERTION_MSK 0x4000
+
+#define MAC_CFG_DESC_TX_0_DURATION_PRESERVE_POS 15
+#define MAC_CFG_DESC_TX_0_DURATION_PRESERVE_LEN 1
+#define MAC_CFG_DESC_TX_0_DURATION_PRESERVE_MSK 0x8000
+
+#define MAC_CFG_DESC_TX_0_MCS_INDEX_POS 22
+#define MAC_CFG_DESC_TX_0_MCS_INDEX_LEN 5
+#define MAC_CFG_DESC_TX_0_MCS_INDEX_MSK 0x7C00000
+
+#define MAC_CFG_DESC_TX_0_MCS_EN_POS 27
+#define MAC_CFG_DESC_TX_0_MCS_EN_LEN 1
+#define MAC_CFG_DESC_TX_0_MCS_EN_MSK 0x8000000
+
+#define MAC_CFG_DESC_TX_0_SN_PRESERVED_POS 31
+#define MAC_CFG_DESC_TX_0_SN_PRESERVED_LEN 1
+#define MAC_CFG_DESC_TX_0_SN_PRESERVED_MSK 0x80000000
+
+/* TX MAC Dword 1 */
+#define MAC_CFG_DESC_TX_1_PKT_MODE_POS 0
+#define MAC_CFG_DESC_TX_1_PKT_MODE_LEN 4
+#define MAC_CFG_DESC_TX_1_PKT_MODE_MSK 0xF
+
+#define MAC_CFG_DESC_TX_1_PKT_MODE_EN_POS 4
+#define MAC_CFG_DESC_TX_1_PKT_MODE_EN_LEN 1
+#define MAC_CFG_DESC_TX_1_PKT_MODE_EN_MSK 0x10
+
+#define MAC_CFG_DESC_TX_1_ACK_POLICY_EN_POS 15
+#define MAC_CFG_DESC_TX_1_ACK_POLICY_EN_LEN 1
+#define MAC_CFG_DESC_TX_1_ACK_POLICY_EN_MSK 0x8000
+
+#define MAC_CFG_DESC_TX_1_DST_INDEX_POS 16
+#define MAC_CFG_DESC_TX_1_DST_INDEX_LEN 4
+#define MAC_CFG_DESC_TX_1_DST_INDEX_MSK 0xF0000
+
+#define MAC_CFG_DESC_TX_1_DST_INDEX_EN_POS 20
+#define MAC_CFG_DESC_TX_1_DST_INDEX_EN_LEN 1
+#define MAC_CFG_DESC_TX_1_DST_INDEX_EN_MSK 0x100000
+
+#define MAC_CFG_DESC_TX_1_ACK_POLICY_POS 21
+#define MAC_CFG_DESC_TX_1_ACK_POLICY_LEN 2
+#define MAC_CFG_DESC_TX_1_ACK_POLICY_MSK 0x600000
+
+#define MAC_CFG_DESC_TX_1_LIFETIME_EN_POS 23
+#define MAC_CFG_DESC_TX_1_LIFETIME_EN_LEN 1
+#define MAC_CFG_DESC_TX_1_LIFETIME_EN_MSK 0x800000
+
+#define MAC_CFG_DESC_TX_1_MAX_RETRY_POS 24
+#define MAC_CFG_DESC_TX_1_MAX_RETRY_LEN 7
+#define MAC_CFG_DESC_TX_1_MAX_RETRY_MSK 0x7F000000
+
+#define MAC_CFG_DESC_TX_1_MAX_RETRY_EN_POS 31
+#define MAC_CFG_DESC_TX_1_MAX_RETRY_EN_LEN 1
+#define MAC_CFG_DESC_TX_1_MAX_RETRY_EN_MSK 0x80000000
+
+/* TX MAC Dword 2 */
+#define MAC_CFG_DESC_TX_2_NUM_OF_DESCRIPTORS_POS 0
+#define MAC_CFG_DESC_TX_2_NUM_OF_DESCRIPTORS_LEN 8
+#define MAC_CFG_DESC_TX_2_NUM_OF_DESCRIPTORS_MSK 0xFF
+
+#define MAC_CFG_DESC_TX_2_RESERVED_POS 8
+#define MAC_CFG_DESC_TX_2_RESERVED_LEN 10
+#define MAC_CFG_DESC_TX_2_RESERVED_MSK 0x3FF00
+
+#define MAC_CFG_DESC_TX_2_L2_TRANSLATION_TYPE_POS 18
+#define MAC_CFG_DESC_TX_2_L2_TRANSLATION_TYPE_LEN 2
+#define MAC_CFG_DESC_TX_2_L2_TRANSLATION_TYPE_MSK 0xC0000
+
+#define MAC_CFG_DESC_TX_2_SNAP_HDR_INSERTION_EN_POS 20
+#define MAC_CFG_DESC_TX_2_SNAP_HDR_INSERTION_EN_LEN 1
+#define MAC_CFG_DESC_TX_2_SNAP_HDR_INSERTION_EN_MSK 0x100000
+
+#define MAC_CFG_DESC_TX_2_VLAN_REMOVAL_EN_POS 21
+#define MAC_CFG_DESC_TX_2_VLAN_REMOVAL_EN_LEN 1
+#define MAC_CFG_DESC_TX_2_VLAN_REMOVAL_EN_MSK 0x200000
+
+/* TX MAC Dword 3 */
+#define MAC_CFG_DESC_TX_3_UCODE_CMD_POS 0
+#define MAC_CFG_DESC_TX_3_UCODE_CMD_LEN 32
+#define MAC_CFG_DESC_TX_3_UCODE_CMD_MSK 0xFFFFFFFF
+
+/* TX DMA Dword 0 */
+#define DMA_CFG_DESC_TX_0_L4_LENGTH_POS 0
+#define DMA_CFG_DESC_TX_0_L4_LENGTH_LEN 8
+#define DMA_CFG_DESC_TX_0_L4_LENGTH_MSK 0xFF
+
+#define DMA_CFG_DESC_TX_0_CMD_EOP_POS 8
+#define DMA_CFG_DESC_TX_0_CMD_EOP_LEN 1
+#define DMA_CFG_DESC_TX_0_CMD_EOP_MSK 0x100
+
+#define DMA_CFG_DESC_TX_0_CMD_DMA_IT_POS 10
+#define DMA_CFG_DESC_TX_0_CMD_DMA_IT_LEN 1
+#define DMA_CFG_DESC_TX_0_CMD_DMA_IT_MSK 0x400
+
+#define DMA_CFG_DESC_TX_0_SEGMENT_BUF_DETAILS_POS 11
+#define DMA_CFG_DESC_TX_0_SEGMENT_BUF_DETAILS_LEN 2
+#define DMA_CFG_DESC_TX_0_SEGMENT_BUF_DETAILS_MSK 0x1800
+
+#define DMA_CFG_DESC_TX_0_TCP_SEG_EN_POS 13
+#define DMA_CFG_DESC_TX_0_TCP_SEG_EN_LEN 1
+#define DMA_CFG_DESC_TX_0_TCP_SEG_EN_MSK 0x2000
+
+#define DMA_CFG_DESC_TX_0_IPV4_CHECKSUM_EN_POS 14
+#define DMA_CFG_DESC_TX_0_IPV4_CHECKSUM_EN_LEN 1
+#define DMA_CFG_DESC_TX_0_IPV4_CHECKSUM_EN_MSK 0x4000
+
+#define DMA_CFG_DESC_TX_0_TCP_UDP_CHECKSUM_EN_POS 15
+#define DMA_CFG_DESC_TX_0_TCP_UDP_CHECKSUM_EN_LEN 1
+#define DMA_CFG_DESC_TX_0_TCP_UDP_CHECKSUM_EN_MSK 0x8000
+
+#define DMA_CFG_DESC_TX_0_QID_POS 16
+#define DMA_CFG_DESC_TX_0_QID_LEN 5
+#define DMA_CFG_DESC_TX_0_QID_MSK 0x1F0000
+
+#define DMA_CFG_DESC_TX_0_PSEUDO_HEADER_CALC_EN_POS 21
+#define DMA_CFG_DESC_TX_0_PSEUDO_HEADER_CALC_EN_LEN 1
+#define DMA_CFG_DESC_TX_0_PSEUDO_HEADER_CALC_EN_MSK 0x200000
+
+#define DMA_CFG_DESC_TX_0_L4_TYPE_POS 30
+#define DMA_CFG_DESC_TX_0_L4_TYPE_LEN 2
+#define DMA_CFG_DESC_TX_0_L4_TYPE_MSK 0xC0000000
+
+
+#define TX_DMA_STATUS_DU         BIT(0)
+
+struct vring_tx_dma {
+       u32 d0;
+       u32 addr_low;
+       u16 addr_high;
+       u8  ip_length;
+       u8  b11;       /* 0..6: mac_length; 7:ip_version */
+       u8  error;     /* 0..2: err; 3..7: reserved; */
+       u8  status;    /* 0: used; 1..7; reserved */
+       u16 length;
+} __packed;
+
+/*
+ * Rx descriptor - MAC part
+ * [dword 0]
+ * bit  0.. 3 : tid:4 The QoS (b3-0) TID Field
+ * bit  4.. 6 : connection_id:3 :The Source index that  was found during
+ *  Parsing the TA.  This field is used to  define the source of the packet
+ * bit      7 : reserved:1
+ * bit  8.. 9 : mac_id:2 : The MAC virtual  Ring number (always zero)
+ * bit 10..11 : frame_type:2 : The FC Control  (b3-2) -  MPDU Type
+ *              (management, data, control  and extension)
+ * bit 12..15 : frame_subtype:4 : The FC Control  (b7-4) -  Frame Subtype
+ * bit 16..27 : seq_number:12 The received Sequence number field
+ * bit 28..31 : extended:4 extended subtype
+ * [dword 1]
+ * bit  0.. 3 : reserved
+ * bit  4.. 5 : key_id:2
+ * bit      6 : decrypt_bypass:1
+ * bit      7 : security:1
+ * bit  8.. 9 : ds_bits:2
+ * bit     10 : a_msdu_present:1  from qos header
+ * bit     11 : a_msdu_type:1  from qos header
+ * bit     12 : a_mpdu:1  part of AMPDU aggregation
+ * bit     13 : broadcast:1
+ * bit     14 : mutlicast:1
+ * bit     15 : reserved:1
+ * bit 16..20 : rx_mac_qid:5   The Queue Identifier that the packet
+ *                             is received from
+ * bit 21..24 : mcs:4
+ * bit 25..28 : mic_icr:4
+ * bit 29..31 : reserved:3
+ * [dword 2]
+ * bit  0.. 2 : time_slot:3 The timeslot that the MPDU is received
+ * bit      3 : fc_protocol_ver:1 The FC Control  (b0) - Protocol  Version
+ * bit      4 : fc_order:1 The FC Control (b15) -Order
+ * bit  5.. 7 : qos_ack_policy:3  The QoS (b6-5) ack policy Field
+ * bit      8 : esop:1 The QoS (b4) ESOP field
+ * bit      9 : qos_rdg_more_ppdu:1 The QoS (b9) RDG  field
+ * bit 10..14 : qos_reserved:5 The QoS (b14-10) Reserved  field
+ * bit     15 : qos_ac_constraint:1
+ * bit 16..31 : pn_15_0:16 low 2 bytes of PN
+ * [dword 3]
+ * bit  0..31 : pn_47_16:32 high 4 bytes of PN
+ */
+struct vring_rx_mac {
+       u32 d0;
+       u32 d1;
+       u16 w4;
+       u16 pn_15_0;
+       u32 pn_47_16;
+} __packed;
+
+/*
+ * Rx descriptor - DMA part
+ * [dword 0]
+ * bit  0.. 7 : l4_length:8 layer 4 length
+ * bit  8.. 9 : reserved:2
+ * bit     10 : cmd_dma_it:1
+ * bit 11..15 : reserved:5
+ * bit 16..29 : phy_info_length:14
+ * bit 30..31 : l4_type:2 valid if the L4I bit is set in the status field
+ * [dword 1]
+ * bit  0..31 : addr_low:32 The payload buffer low address
+ * [dword 2]
+ * bit  0..15 : addr_high:16 The payload buffer high address
+ * bit 16..23 : ip_length:8
+ * bit 24..30 : mac_length:7
+ * bit     31 : ip_version:1
+ * [dword 3]
+ *  [byte 12] error
+ *  [byte 13] status
+ * bit      0 : du:1
+ * bit      1 : eop:1
+ * bit      2 : error:1
+ * bit      3 : mi:1
+ * bit      4 : l3_identified:1
+ * bit      5 : l4_identified:1
+ * bit      6 : phy_info_included:1
+ * bit      7 : reserved:1
+ *  [word 7] length
+ *
+ */
+
+#define RX_DMA_D0_CMD_DMA_IT     BIT(10)
+
+#define RX_DMA_STATUS_DU         BIT(0)
+#define RX_DMA_STATUS_ERROR      BIT(2)
+#define RX_DMA_STATUS_PHY_INFO   BIT(6)
+
+struct vring_rx_dma {
+       u32 d0;
+       u32 addr_low;
+       u16 addr_high;
+       u8  ip_length;
+       u8  b11;
+       u8  error;
+       u8  status;
+       u16 length;
+} __packed;
+
+struct vring_tx_desc {
+       struct vring_tx_mac mac;
+       struct vring_tx_dma dma;
+} __packed;
+
+struct vring_rx_desc {
+       struct vring_rx_mac mac;
+       struct vring_rx_dma dma;
+} __packed;
+
+union vring_desc {
+       struct vring_tx_desc tx;
+       struct vring_rx_desc rx;
+} __packed;
+
+static inline int wil_rxdesc_phy_length(volatile struct vring_rx_desc *d)
+{
+       return WIL_GET_BITS(d->dma.d0, 16, 29);
+}
+
+static inline int wil_rxdesc_mcs(volatile struct vring_rx_desc *d)
+{
+       return WIL_GET_BITS(d->mac.d1, 21, 24);
+}
+
+static inline int wil_rxdesc_ds_bits(volatile struct vring_rx_desc *d)
+{
+       return WIL_GET_BITS(d->mac.d1, 8, 9);
+}
+
+static inline int wil_rxdesc_ftype(volatile struct vring_rx_desc *d)
+{
+       return WIL_GET_BITS(d->mac.d0, 10, 11);
+}
+
+#endif /* WIL6210_TXRX_H */
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h
new file mode 100644 (file)
index 0000000..9bcfffa
--- /dev/null
@@ -0,0 +1,363 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __WIL6210_H__
+#define __WIL6210_H__
+
+#include <linux/netdevice.h>
+#include <linux/wireless.h>
+#include <net/cfg80211.h>
+
+#include "dbg_hexdump.h"
+
+#define WIL_NAME "wil6210"
+
+/**
+ * extract bits [@b0:@b1] (inclusive) from the value @x
+ * it should be @b0 <= @b1, or result is incorrect
+ */
+static inline u32 WIL_GET_BITS(u32 x, int b0, int b1)
+{
+       return (x >> b0) & ((1 << (b1 - b0 + 1)) - 1);
+}
+
+#define WIL6210_MEM_SIZE (2*1024*1024UL)
+
+#define WIL6210_TX_QUEUES (4)
+
+#define WIL6210_RX_RING_SIZE (128)
+#define WIL6210_TX_RING_SIZE (128)
+#define WIL6210_MAX_TX_RINGS (24)
+
+/* Hardware definitions begin */
+
+/*
+ * Mapping
+ * RGF File      | Host addr    |  FW addr
+ *               |              |
+ * user_rgf      | 0x000000     | 0x880000
+ *  dma_rgf      | 0x001000     | 0x881000
+ * pcie_rgf      | 0x002000     | 0x882000
+ *               |              |
+ */
+
+/* Where various structures placed in host address space */
+#define WIL6210_FW_HOST_OFF      (0x880000UL)
+
+#define HOSTADDR(fwaddr)        (fwaddr - WIL6210_FW_HOST_OFF)
+
+/*
+ * Interrupt control registers block
+ *
+ * each interrupt controlled by the same bit in all registers
+ */
+struct RGF_ICR {
+       u32 ICC; /* Cause Control, RW: 0 - W1C, 1 - COR */
+       u32 ICR; /* Cause, W1C/COR depending on ICC */
+       u32 ICM; /* Cause masked (ICR & ~IMV), W1C/COR depending on ICC */
+       u32 ICS; /* Cause Set, WO */
+       u32 IMV; /* Mask, RW+S/C */
+       u32 IMS; /* Mask Set, write 1 to set */
+       u32 IMC; /* Mask Clear, write 1 to clear */
+} __packed;
+
+/* registers - FW addresses */
+#define RGF_USER_USER_SCRATCH_PAD      (0x8802bc)
+#define RGF_USER_USER_ICR              (0x880b4c) /* struct RGF_ICR */
+       #define BIT_USER_USER_ICR_SW_INT_2      BIT(18)
+#define RGF_USER_CLKS_CTL_SW_RST_MASK_0        (0x880b14)
+#define RGF_USER_MAC_CPU_0             (0x8801fc)
+#define RGF_USER_USER_CPU_0            (0x8801e0)
+#define RGF_USER_CLKS_CTL_SW_RST_VEC_0 (0x880b04)
+#define RGF_USER_CLKS_CTL_SW_RST_VEC_1 (0x880b08)
+#define RGF_USER_CLKS_CTL_SW_RST_VEC_2 (0x880b0c)
+#define RGF_USER_CLKS_CTL_SW_RST_VEC_3 (0x880b10)
+
+#define RGF_DMA_PSEUDO_CAUSE           (0x881c68)
+#define RGF_DMA_PSEUDO_CAUSE_MASK_SW   (0x881c6c)
+#define RGF_DMA_PSEUDO_CAUSE_MASK_FW   (0x881c70)
+       #define BIT_DMA_PSEUDO_CAUSE_RX         BIT(0)
+       #define BIT_DMA_PSEUDO_CAUSE_TX         BIT(1)
+       #define BIT_DMA_PSEUDO_CAUSE_MISC       BIT(2)
+
+#define RGF_DMA_EP_TX_ICR              (0x881bb4) /* struct RGF_ICR */
+       #define BIT_DMA_EP_TX_ICR_TX_DONE       BIT(0)
+       #define BIT_DMA_EP_TX_ICR_TX_DONE_N(n)  BIT(n+1) /* n = [0..23] */
+#define RGF_DMA_EP_RX_ICR              (0x881bd0) /* struct RGF_ICR */
+       #define BIT_DMA_EP_RX_ICR_RX_DONE       BIT(0)
+#define RGF_DMA_EP_MISC_ICR            (0x881bec) /* struct RGF_ICR */
+       #define BIT_DMA_EP_MISC_ICR_RX_HTRSH    BIT(0)
+       #define BIT_DMA_EP_MISC_ICR_TX_NO_ACT   BIT(1)
+       #define BIT_DMA_EP_MISC_ICR_FW_INT0     BIT(28)
+       #define BIT_DMA_EP_MISC_ICR_FW_INT1     BIT(29)
+
+/* Interrupt moderation control */
+#define RGF_DMA_ITR_CNT_TRSH           (0x881c5c)
+#define RGF_DMA_ITR_CNT_DATA           (0x881c60)
+#define RGF_DMA_ITR_CNT_CRL            (0x881C64)
+       #define BIT_DMA_ITR_CNT_CRL_EN          BIT(0)
+       #define BIT_DMA_ITR_CNT_CRL_EXT_TICK    BIT(1)
+       #define BIT_DMA_ITR_CNT_CRL_FOREVER     BIT(2)
+       #define BIT_DMA_ITR_CNT_CRL_CLR         BIT(3)
+       #define BIT_DMA_ITR_CNT_CRL_REACH_TRSH  BIT(4)
+
+/* popular locations */
+#define HOST_MBOX   HOSTADDR(RGF_USER_USER_SCRATCH_PAD)
+#define HOST_SW_INT (HOSTADDR(RGF_USER_USER_ICR) + \
+       offsetof(struct RGF_ICR, ICS))
+#define SW_INT_MBOX BIT_USER_USER_ICR_SW_INT_2
+
+/* ISR register bits */
+#define ISR_MISC_FW_READY BIT_DMA_EP_MISC_ICR_FW_INT0
+#define ISR_MISC_MBOX_EVT BIT_DMA_EP_MISC_ICR_FW_INT1
+
+/* Hardware definitions end */
+
+struct wil6210_mbox_ring {
+       u32 base;
+       u16 entry_size; /* max. size of mbox entry, incl. all headers */
+       u16 size;
+       u32 tail;
+       u32 head;
+} __packed;
+
+struct wil6210_mbox_ring_desc {
+       __le32 sync;
+       __le32 addr;
+} __packed;
+
+/* at HOST_OFF_WIL6210_MBOX_CTL */
+struct wil6210_mbox_ctl {
+       struct wil6210_mbox_ring tx;
+       struct wil6210_mbox_ring rx;
+} __packed;
+
+struct wil6210_mbox_hdr {
+       __le16 seq;
+       __le16 len; /* payload, bytes after this header */
+       __le16 type;
+       u8 flags;
+       u8 reserved;
+} __packed;
+
+#define WIL_MBOX_HDR_TYPE_WMI (0)
+
+/* max. value for wil6210_mbox_hdr.len */
+#define MAX_MBOXITEM_SIZE   (240)
+
+struct wil6210_mbox_hdr_wmi {
+       u8 reserved0[2];
+       __le16 id;
+       __le16 info1; /* bits [0..3] - device_id, rest - unused */
+       u8 reserved1[2];
+} __packed;
+
+struct pending_wmi_event {
+       struct list_head list;
+       struct {
+               struct wil6210_mbox_hdr hdr;
+               struct wil6210_mbox_hdr_wmi wmi;
+               u8 data[0];
+       } __packed event;
+};
+
+union vring_desc;
+
+struct vring {
+       dma_addr_t pa;
+       volatile union vring_desc *va; /* vring_desc[size], WriteBack by DMA */
+       u16 size; /* number of vring_desc elements */
+       u32 swtail;
+       u32 swhead;
+       u32 hwtail; /* write here to inform hw */
+       void **ctx; /* void *ctx[size] - software context */
+};
+
+enum { /* for wil6210_priv.status */
+       wil_status_fwready = 0,
+       wil_status_fwconnected,
+       wil_status_dontscan,
+       wil_status_irqen, /* FIXME: interrupts enabled - for debug */
+};
+
+struct pci_dev;
+
+struct wil6210_stats {
+       u64 tsf;
+       u32 snr;
+       u16 last_mcs_rx;
+       u16 bf_mcs; /* last BF, used for Tx */
+       u16 my_rx_sector;
+       u16 my_tx_sector;
+       u16 peer_rx_sector;
+       u16 peer_tx_sector;
+};
+
+struct wil6210_priv {
+       struct pci_dev *pdev;
+       int n_msi;
+       struct wireless_dev *wdev;
+       void __iomem *csr;
+       ulong status;
+       /* profile */
+       u32 monitor_flags;
+       u32 secure_pcp; /* create secure PCP? */
+       int sinfo_gen;
+       /* cached ISR registers */
+       u32 isr_misc;
+       /* mailbox related */
+       struct mutex wmi_mutex;
+       struct wil6210_mbox_ctl mbox_ctl;
+       struct completion wmi_ready;
+       u16 wmi_seq;
+       u16 reply_id; /**< wait for this WMI event */
+       void *reply_buf;
+       u16 reply_size;
+       struct workqueue_struct *wmi_wq; /* for deferred calls */
+       struct work_struct wmi_event_worker;
+       struct workqueue_struct *wmi_wq_conn; /* for connect worker */
+       struct work_struct wmi_connect_worker;
+       struct work_struct disconnect_worker;
+       struct timer_list connect_timer;
+       int pending_connect_cid;
+       struct list_head pending_wmi_ev;
+       /*
+        * protect pending_wmi_ev
+        * - fill in IRQ from wil6210_irq_misc,
+        * - consumed in thread by wmi_event_worker
+        */
+       spinlock_t wmi_ev_lock;
+       /* DMA related */
+       struct vring vring_rx;
+       struct vring vring_tx[WIL6210_MAX_TX_RINGS];
+       u8 dst_addr[WIL6210_MAX_TX_RINGS][ETH_ALEN];
+       /* scan */
+       struct cfg80211_scan_request *scan_request;
+
+       struct mutex mutex; /* for wil6210_priv access in wil_{up|down} */
+       /* statistics */
+       struct wil6210_stats stats;
+       /* debugfs */
+       struct dentry *debug;
+       struct debugfs_blob_wrapper fw_code_blob;
+       struct debugfs_blob_wrapper fw_data_blob;
+       struct debugfs_blob_wrapper fw_peri_blob;
+       struct debugfs_blob_wrapper uc_code_blob;
+       struct debugfs_blob_wrapper uc_data_blob;
+       struct debugfs_blob_wrapper rgf_blob;
+};
+
+#define wil_to_wiphy(i) (i->wdev->wiphy)
+#define wil_to_dev(i) (wiphy_dev(wil_to_wiphy(i)))
+#define wiphy_to_wil(w) (struct wil6210_priv *)(wiphy_priv(w))
+#define wil_to_wdev(i) (i->wdev)
+#define wdev_to_wil(w) (struct wil6210_priv *)(wdev_priv(w))
+#define wil_to_ndev(i) (wil_to_wdev(i)->netdev)
+#define ndev_to_wil(n) (wdev_to_wil(n->ieee80211_ptr))
+
+#define wil_dbg(wil, fmt, arg...) netdev_dbg(wil_to_ndev(wil), fmt, ##arg)
+#define wil_info(wil, fmt, arg...) netdev_info(wil_to_ndev(wil), fmt, ##arg)
+#define wil_err(wil, fmt, arg...) netdev_err(wil_to_ndev(wil), fmt, ##arg)
+
+#define wil_dbg_IRQ(wil, fmt, arg...) wil_dbg(wil, "DBG[ IRQ]" fmt, ##arg)
+#define wil_dbg_TXRX(wil, fmt, arg...) wil_dbg(wil, "DBG[TXRX]" fmt, ##arg)
+#define wil_dbg_WMI(wil, fmt, arg...) wil_dbg(wil, "DBG[ WMI]" fmt, ##arg)
+
+#define wil_hex_dump_TXRX(prefix_str, prefix_type, rowsize,    \
+                         groupsize, buf, len, ascii)           \
+                         wil_print_hex_dump_debug("DBG[TXRX]" prefix_str,\
+                                        prefix_type, rowsize,  \
+                                        groupsize, buf, len, ascii)
+
+#define wil_hex_dump_WMI(prefix_str, prefix_type, rowsize,     \
+                        groupsize, buf, len, ascii)            \
+                        wil_print_hex_dump_debug("DBG[ WMI]" prefix_str,\
+                                       prefix_type, rowsize,   \
+                                       groupsize, buf, len, ascii)
+
+void wil_memcpy_fromio_32(void *dst, const volatile void __iomem *src,
+                         size_t count);
+void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
+                       size_t count);
+
+void *wil_if_alloc(struct device *dev, void __iomem *csr);
+void wil_if_free(struct wil6210_priv *wil);
+int wil_if_add(struct wil6210_priv *wil);
+void wil_if_remove(struct wil6210_priv *wil);
+int wil_priv_init(struct wil6210_priv *wil);
+void wil_priv_deinit(struct wil6210_priv *wil);
+int wil_reset(struct wil6210_priv *wil);
+void wil_link_on(struct wil6210_priv *wil);
+void wil_link_off(struct wil6210_priv *wil);
+int wil_up(struct wil6210_priv *wil);
+int wil_down(struct wil6210_priv *wil);
+void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r);
+
+void __iomem *wmi_buffer(struct wil6210_priv *wil, __le32 ptr);
+void __iomem *wmi_addr(struct wil6210_priv *wil, u32 ptr);
+int wmi_read_hdr(struct wil6210_priv *wil, __le32 ptr,
+                struct wil6210_mbox_hdr *hdr);
+int wmi_send(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len);
+void wmi_recv_cmd(struct wil6210_priv *wil);
+int wmi_call(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len,
+            u16 reply_id, void *reply, u8 reply_size, int to_msec);
+void wmi_connect_worker(struct work_struct *work);
+void wmi_event_worker(struct work_struct *work);
+void wmi_event_flush(struct wil6210_priv *wil);
+int wmi_set_ssid(struct wil6210_priv *wil, u8 ssid_len, const void *ssid);
+int wmi_get_ssid(struct wil6210_priv *wil, u8 *ssid_len, void *ssid);
+int wmi_set_channel(struct wil6210_priv *wil, int channel);
+int wmi_get_channel(struct wil6210_priv *wil, int *channel);
+int wmi_tx_eapol(struct wil6210_priv *wil, struct sk_buff *skb);
+int wmi_del_cipher_key(struct wil6210_priv *wil, u8 key_index,
+                      const void *mac_addr);
+int wmi_add_cipher_key(struct wil6210_priv *wil, u8 key_index,
+                      const void *mac_addr, int key_len, const void *key);
+int wmi_echo(struct wil6210_priv *wil);
+int wmi_set_ie(struct wil6210_priv *wil, u8 type, u16 ie_len, const void *ie);
+
+int wil6210_init_irq(struct wil6210_priv *wil, int irq);
+void wil6210_fini_irq(struct wil6210_priv *wil, int irq);
+void wil6210_disable_irq(struct wil6210_priv *wil);
+void wil6210_enable_irq(struct wil6210_priv *wil);
+
+int wil6210_debugfs_init(struct wil6210_priv *wil);
+void wil6210_debugfs_remove(struct wil6210_priv *wil);
+
+struct wireless_dev *wil_cfg80211_init(struct device *dev);
+void wil_wdev_free(struct wil6210_priv *wil);
+
+int wmi_set_mac_address(struct wil6210_priv *wil, void *addr);
+int wmi_set_bcon(struct wil6210_priv *wil, int bi, u8 wmi_nettype);
+void wil6210_disconnect(struct wil6210_priv *wil, void *bssid);
+
+int wil_rx_init(struct wil6210_priv *wil);
+void wil_rx_fini(struct wil6210_priv *wil);
+
+/* TX API */
+int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size,
+                     int cid, int tid);
+void wil_vring_fini_tx(struct wil6210_priv *wil, int id);
+
+netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev);
+void wil_tx_complete(struct wil6210_priv *wil, int ringid);
+
+/* RX API */
+void wil_rx_handle(struct wil6210_priv *wil);
+
+int wil_iftype_nl2wmi(enum nl80211_iftype type);
+
+#endif /* __WIL6210_H__ */
diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c
new file mode 100644 (file)
index 0000000..12915f6
--- /dev/null
@@ -0,0 +1,975 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/pci.h>
+#include <linux/io.h>
+#include <linux/list.h>
+#include <linux/etherdevice.h>
+
+#include "wil6210.h"
+#include "wmi.h"
+
+/**
+ * WMI event receiving - theory of operations
+ *
+ * When firmware about to report WMI event, it fills memory area
+ * in the mailbox and raises misc. IRQ. Thread interrupt handler invoked for
+ * the misc IRQ, function @wmi_recv_cmd called by thread IRQ handler.
+ *
+ * @wmi_recv_cmd reads event, allocates memory chunk  and attaches it to the
+ * event list @wil->pending_wmi_ev. Then, work queue @wil->wmi_wq wakes up
+ * and handles events within the @wmi_event_worker. Every event get detached
+ * from list, processed and deleted.
+ *
+ * Purpose for this mechanism is to release IRQ thread; otherwise,
+ * if WMI event handling involves another WMI command flow, this 2-nd flow
+ * won't be completed because of blocked IRQ thread.
+ */
+
+/**
+ * Addressing - theory of operations
+ *
+ * There are several buses present on the WIL6210 card.
+ * Same memory areas are visible at different address on
+ * the different busses. There are 3 main bus masters:
+ *  - MAC CPU (ucode)
+ *  - User CPU (firmware)
+ *  - AHB (host)
+ *
+ * On the PCI bus, there is one BAR (BAR0) of 2Mb size, exposing
+ * AHB addresses starting from 0x880000
+ *
+ * Internally, firmware uses addresses that allows faster access but
+ * are invisible from the host. To read from these addresses, alternative
+ * AHB address must be used.
+ *
+ * Memory mapping
+ * Linker address         PCI/Host address
+ *                        0x880000 .. 0xa80000  2Mb BAR0
+ * 0x800000 .. 0x807000   0x900000 .. 0x907000  28k DCCM
+ * 0x840000 .. 0x857000   0x908000 .. 0x91f000  92k PERIPH
+ */
+
+/**
+ * @fw_mapping provides memory remapping table
+ */
+static const struct {
+       u32 from; /* linker address - from, inclusive */
+       u32 to;   /* linker address - to, exclusive */
+       u32 host; /* PCI/Host address - BAR0 + 0x880000 */
+} fw_mapping[] = {
+       {0x000000, 0x040000, 0x8c0000}, /* FW code RAM 256k */
+       {0x800000, 0x808000, 0x900000}, /* FW data RAM 32k */
+       {0x840000, 0x860000, 0x908000}, /* peripheral data RAM 128k/96k used */
+       {0x880000, 0x88a000, 0x880000}, /* various RGF */
+       {0x8c0000, 0x932000, 0x8c0000}, /* trivial mapping for upper area */
+       /*
+        * 920000..930000 ucode code RAM
+        * 930000..932000 ucode data RAM
+        */
+};
+
+/**
+ * return AHB address for given firmware/ucode internal (linker) address
+ * @x - internal address
+ * If address have no valid AHB mapping, return 0
+ */
+static u32 wmi_addr_remap(u32 x)
+{
+       uint i;
+
+       for (i = 0; i < ARRAY_SIZE(fw_mapping); i++) {
+               if ((x >= fw_mapping[i].from) && (x < fw_mapping[i].to))
+                       return x + fw_mapping[i].host - fw_mapping[i].from;
+       }
+
+       return 0;
+}
+
+/**
+ * Check address validity for WMI buffer; remap if needed
+ * @ptr - internal (linker) fw/ucode address
+ *
+ * Valid buffer should be DWORD aligned
+ *
+ * return address for accessing buffer from the host;
+ * if buffer is not valid, return NULL.
+ */
+void __iomem *wmi_buffer(struct wil6210_priv *wil, __le32 ptr_)
+{
+       u32 off;
+       u32 ptr = le32_to_cpu(ptr_);
+
+       if (ptr % 4)
+               return NULL;
+
+       ptr = wmi_addr_remap(ptr);
+       if (ptr < WIL6210_FW_HOST_OFF)
+               return NULL;
+
+       off = HOSTADDR(ptr);
+       if (off > WIL6210_MEM_SIZE - 4)
+               return NULL;
+
+       return wil->csr + off;
+}
+
+/**
+ * Check address validity
+ */
+void __iomem *wmi_addr(struct wil6210_priv *wil, u32 ptr)
+{
+       u32 off;
+
+       if (ptr % 4)
+               return NULL;
+
+       if (ptr < WIL6210_FW_HOST_OFF)
+               return NULL;
+
+       off = HOSTADDR(ptr);
+       if (off > WIL6210_MEM_SIZE - 4)
+               return NULL;
+
+       return wil->csr + off;
+}
+
+int wmi_read_hdr(struct wil6210_priv *wil, __le32 ptr,
+                struct wil6210_mbox_hdr *hdr)
+{
+       void __iomem *src = wmi_buffer(wil, ptr);
+       if (!src)
+               return -EINVAL;
+
+       wil_memcpy_fromio_32(hdr, src, sizeof(*hdr));
+
+       return 0;
+}
+
+static int __wmi_send(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len)
+{
+       struct {
+               struct wil6210_mbox_hdr hdr;
+               struct wil6210_mbox_hdr_wmi wmi;
+       } __packed cmd = {
+               .hdr = {
+                       .type = WIL_MBOX_HDR_TYPE_WMI,
+                       .flags = 0,
+                       .len = cpu_to_le16(sizeof(cmd.wmi) + len),
+               },
+               .wmi = {
+                       .id = cpu_to_le16(cmdid),
+                       .info1 = 0,
+               },
+       };
+       struct wil6210_mbox_ring *r = &wil->mbox_ctl.tx;
+       struct wil6210_mbox_ring_desc d_head;
+       u32 next_head;
+       void __iomem *dst;
+       void __iomem *head = wmi_addr(wil, r->head);
+       uint retry;
+
+       if (sizeof(cmd) + len > r->entry_size) {
+               wil_err(wil, "WMI size too large: %d bytes, max is %d\n",
+                       (int)(sizeof(cmd) + len), r->entry_size);
+               return -ERANGE;
+
+       }
+
+       might_sleep();
+
+       if (!test_bit(wil_status_fwready, &wil->status)) {
+               wil_err(wil, "FW not ready\n");
+               return -EAGAIN;
+       }
+
+       if (!head) {
+               wil_err(wil, "WMI head is garbage: 0x%08x\n", r->head);
+               return -EINVAL;
+       }
+       /* read Tx head till it is not busy */
+       for (retry = 5; retry > 0; retry--) {
+               wil_memcpy_fromio_32(&d_head, head, sizeof(d_head));
+               if (d_head.sync == 0)
+                       break;
+               msleep(20);
+       }
+       if (d_head.sync != 0) {
+               wil_err(wil, "WMI head busy\n");
+               return -EBUSY;
+       }
+       /* next head */
+       next_head = r->base + ((r->head - r->base + sizeof(d_head)) % r->size);
+       wil_dbg_WMI(wil, "Head 0x%08x -> 0x%08x\n", r->head, next_head);
+       /* wait till FW finish with previous command */
+       for (retry = 5; retry > 0; retry--) {
+               r->tail = ioread32(wil->csr + HOST_MBOX +
+                                  offsetof(struct wil6210_mbox_ctl, tx.tail));
+               if (next_head != r->tail)
+                       break;
+               msleep(20);
+       }
+       if (next_head == r->tail) {
+               wil_err(wil, "WMI ring full\n");
+               return -EBUSY;
+       }
+       dst = wmi_buffer(wil, d_head.addr);
+       if (!dst) {
+               wil_err(wil, "invalid WMI buffer: 0x%08x\n",
+                       le32_to_cpu(d_head.addr));
+               return -EINVAL;
+       }
+       cmd.hdr.seq = cpu_to_le16(++wil->wmi_seq);
+       /* set command */
+       wil_dbg_WMI(wil, "WMI command 0x%04x [%d]\n", cmdid, len);
+       wil_hex_dump_WMI("Cmd ", DUMP_PREFIX_OFFSET, 16, 1, &cmd,
+                        sizeof(cmd), true);
+       wil_hex_dump_WMI("cmd ", DUMP_PREFIX_OFFSET, 16, 1, buf,
+                        len, true);
+       wil_memcpy_toio_32(dst, &cmd, sizeof(cmd));
+       wil_memcpy_toio_32(dst + sizeof(cmd), buf, len);
+       /* mark entry as full */
+       iowrite32(1, wil->csr + HOSTADDR(r->head) +
+                 offsetof(struct wil6210_mbox_ring_desc, sync));
+       /* advance next ptr */
+       iowrite32(r->head = next_head, wil->csr + HOST_MBOX +
+                 offsetof(struct wil6210_mbox_ctl, tx.head));
+
+       /* interrupt to FW */
+       iowrite32(SW_INT_MBOX, wil->csr + HOST_SW_INT);
+
+       return 0;
+}
+
+int wmi_send(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len)
+{
+       int rc;
+
+       mutex_lock(&wil->wmi_mutex);
+       rc = __wmi_send(wil, cmdid, buf, len);
+       mutex_unlock(&wil->wmi_mutex);
+
+       return rc;
+}
+
+/*=== Event handlers ===*/
+static void wmi_evt_ready(struct wil6210_priv *wil, int id, void *d, int len)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct wireless_dev *wdev = wil->wdev;
+       struct wmi_ready_event *evt = d;
+       u32 ver = le32_to_cpu(evt->sw_version);
+
+       wil_dbg_WMI(wil, "FW ver. %d; MAC %pM\n", ver, evt->mac);
+
+       if (!is_valid_ether_addr(ndev->dev_addr)) {
+               memcpy(ndev->dev_addr, evt->mac, ETH_ALEN);
+               memcpy(ndev->perm_addr, evt->mac, ETH_ALEN);
+       }
+       snprintf(wdev->wiphy->fw_version, sizeof(wdev->wiphy->fw_version),
+                "%d", ver);
+}
+
+static void wmi_evt_fw_ready(struct wil6210_priv *wil, int id, void *d,
+                            int len)
+{
+       wil_dbg_WMI(wil, "WMI: FW ready\n");
+
+       set_bit(wil_status_fwready, &wil->status);
+       /* reuse wmi_ready for the firmware ready indication */
+       complete(&wil->wmi_ready);
+}
+
+static void wmi_evt_rx_mgmt(struct wil6210_priv *wil, int id, void *d, int len)
+{
+       struct wmi_rx_mgmt_packet_event *data = d;
+       struct wiphy *wiphy = wil_to_wiphy(wil);
+       struct ieee80211_mgmt *rx_mgmt_frame =
+                       (struct ieee80211_mgmt *)data->payload;
+       int ch_no = data->info.channel+1;
+       u32 freq = ieee80211_channel_to_frequency(ch_no,
+                       IEEE80211_BAND_60GHZ);
+       struct ieee80211_channel *channel = ieee80211_get_channel(wiphy, freq);
+       /* TODO convert LE to CPU */
+       s32 signal = 0; /* TODO */
+       __le16 fc = rx_mgmt_frame->frame_control;
+       u32 d_len = le32_to_cpu(data->info.len);
+       u16 d_status = le16_to_cpu(data->info.status);
+
+       wil_dbg_WMI(wil, "MGMT: channel %d MCS %d SNR %d\n",
+                   data->info.channel, data->info.mcs, data->info.snr);
+       wil_dbg_WMI(wil, "status 0x%04x len %d stype %04x\n", d_status, d_len,
+                   le16_to_cpu(data->info.stype));
+       wil_dbg_WMI(wil, "qid %d mid %d cid %d\n",
+                   data->info.qid, data->info.mid, data->info.cid);
+
+       if (!channel) {
+               wil_err(wil, "Frame on unsupported channel\n");
+               return;
+       }
+
+       if (ieee80211_is_beacon(fc) || ieee80211_is_probe_resp(fc)) {
+               struct cfg80211_bss *bss;
+               u64 tsf = le64_to_cpu(rx_mgmt_frame->u.beacon.timestamp);
+               u16 cap = le16_to_cpu(rx_mgmt_frame->u.beacon.capab_info);
+               u16 bi = le16_to_cpu(rx_mgmt_frame->u.beacon.beacon_int);
+               const u8 *ie_buf = rx_mgmt_frame->u.beacon.variable;
+               size_t ie_len = d_len - offsetof(struct ieee80211_mgmt,
+                                                u.beacon.variable);
+               wil_dbg_WMI(wil, "Capability info : 0x%04x\n", cap);
+
+               bss = cfg80211_inform_bss(wiphy, channel, rx_mgmt_frame->bssid,
+                                         tsf, cap, bi, ie_buf, ie_len,
+                                         signal, GFP_KERNEL);
+               if (bss) {
+                       wil_dbg_WMI(wil, "Added BSS %pM\n",
+                                   rx_mgmt_frame->bssid);
+                       cfg80211_put_bss(bss);
+               } else {
+                       wil_err(wil, "cfg80211_inform_bss() failed\n");
+               }
+       }
+}
+
+static void wmi_evt_scan_complete(struct wil6210_priv *wil, int id,
+                                 void *d, int len)
+{
+       if (wil->scan_request) {
+               struct wmi_scan_complete_event *data = d;
+               bool aborted = (data->status != 0);
+
+               wil_dbg_WMI(wil, "SCAN_COMPLETE(0x%08x)\n", data->status);
+               cfg80211_scan_done(wil->scan_request, aborted);
+               wil->scan_request = NULL;
+       } else {
+               wil_err(wil, "SCAN_COMPLETE while not scanning\n");
+       }
+}
+
+static void wmi_evt_connect(struct wil6210_priv *wil, int id, void *d, int len)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct wireless_dev *wdev = wil->wdev;
+       struct wmi_connect_event *evt = d;
+       int ch; /* channel number */
+       struct station_info sinfo;
+       u8 *assoc_req_ie, *assoc_resp_ie;
+       size_t assoc_req_ielen, assoc_resp_ielen;
+       /* capinfo(u16) + listen_interval(u16) + IEs */
+       const size_t assoc_req_ie_offset = sizeof(u16) * 2;
+       /* capinfo(u16) + status_code(u16) + associd(u16) + IEs */
+       const size_t assoc_resp_ie_offset = sizeof(u16) * 3;
+
+       if (len < sizeof(*evt)) {
+               wil_err(wil, "Connect event too short : %d bytes\n", len);
+               return;
+       }
+       if (len != sizeof(*evt) + evt->beacon_ie_len + evt->assoc_req_len +
+                  evt->assoc_resp_len) {
+               wil_err(wil,
+                       "Connect event corrupted : %d != %d + %d + %d + %d\n",
+                       len, (int)sizeof(*evt), evt->beacon_ie_len,
+                       evt->assoc_req_len, evt->assoc_resp_len);
+               return;
+       }
+       ch = evt->channel + 1;
+       wil_dbg_WMI(wil, "Connect %pM channel [%d] cid %d\n",
+                   evt->bssid, ch, evt->cid);
+       wil_hex_dump_WMI("connect AI : ", DUMP_PREFIX_OFFSET, 16, 1,
+                        evt->assoc_info, len - sizeof(*evt), true);
+
+       /* figure out IE's */
+       assoc_req_ie = &evt->assoc_info[evt->beacon_ie_len +
+                                       assoc_req_ie_offset];
+       assoc_req_ielen = evt->assoc_req_len - assoc_req_ie_offset;
+       if (evt->assoc_req_len <= assoc_req_ie_offset) {
+               assoc_req_ie = NULL;
+               assoc_req_ielen = 0;
+       }
+
+       assoc_resp_ie = &evt->assoc_info[evt->beacon_ie_len +
+                                        evt->assoc_req_len +
+                                        assoc_resp_ie_offset];
+       assoc_resp_ielen = evt->assoc_resp_len - assoc_resp_ie_offset;
+       if (evt->assoc_resp_len <= assoc_resp_ie_offset) {
+               assoc_resp_ie = NULL;
+               assoc_resp_ielen = 0;
+       }
+
+       if ((wdev->iftype == NL80211_IFTYPE_STATION) ||
+           (wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) {
+               if (wdev->sme_state != CFG80211_SME_CONNECTING) {
+                       wil_err(wil, "Not in connecting state\n");
+                       return;
+               }
+               del_timer_sync(&wil->connect_timer);
+               cfg80211_connect_result(ndev, evt->bssid,
+                                       assoc_req_ie, assoc_req_ielen,
+                                       assoc_resp_ie, assoc_resp_ielen,
+                                       WLAN_STATUS_SUCCESS, GFP_KERNEL);
+
+       } else if ((wdev->iftype == NL80211_IFTYPE_AP) ||
+                  (wdev->iftype == NL80211_IFTYPE_P2P_GO)) {
+               memset(&sinfo, 0, sizeof(sinfo));
+
+               sinfo.generation = wil->sinfo_gen++;
+
+               if (assoc_req_ie) {
+                       sinfo.assoc_req_ies = assoc_req_ie;
+                       sinfo.assoc_req_ies_len = assoc_req_ielen;
+                       sinfo.filled |= STATION_INFO_ASSOC_REQ_IES;
+               }
+
+               cfg80211_new_sta(ndev, evt->bssid, &sinfo, GFP_KERNEL);
+       }
+       set_bit(wil_status_fwconnected, &wil->status);
+
+       /* FIXME FW can transmit only ucast frames to peer */
+       /* FIXME real ring_id instead of hard coded 0 */
+       memcpy(wil->dst_addr[0], evt->bssid, ETH_ALEN);
+
+       wil->pending_connect_cid = evt->cid;
+       queue_work(wil->wmi_wq_conn, &wil->wmi_connect_worker);
+}
+
+static void wmi_evt_disconnect(struct wil6210_priv *wil, int id,
+                              void *d, int len)
+{
+       struct wmi_disconnect_event *evt = d;
+
+       wil_dbg_WMI(wil, "Disconnect %pM reason %d proto %d wmi\n",
+                   evt->bssid,
+                   evt->protocol_reason_status, evt->disconnect_reason);
+
+       wil->sinfo_gen++;
+
+       wil6210_disconnect(wil, evt->bssid);
+       clear_bit(wil_status_dontscan, &wil->status);
+}
+
+static void wmi_evt_notify(struct wil6210_priv *wil, int id, void *d, int len)
+{
+       struct wmi_notify_req_done_event *evt = d;
+
+       if (len < sizeof(*evt)) {
+               wil_err(wil, "Short NOTIFY event\n");
+               return;
+       }
+
+       wil->stats.tsf = le64_to_cpu(evt->tsf);
+       wil->stats.snr = le32_to_cpu(evt->snr_val);
+       wil->stats.bf_mcs = le16_to_cpu(evt->bf_mcs);
+       wil->stats.my_rx_sector = le16_to_cpu(evt->my_rx_sector);
+       wil->stats.my_tx_sector = le16_to_cpu(evt->my_tx_sector);
+       wil->stats.peer_rx_sector = le16_to_cpu(evt->other_rx_sector);
+       wil->stats.peer_tx_sector = le16_to_cpu(evt->other_tx_sector);
+       wil_dbg_WMI(wil, "Link status, MCS %d TSF 0x%016llx\n"
+                   "BF status 0x%08x SNR 0x%08x\n"
+                   "Tx Tpt %d goodput %d Rx goodput %d\n"
+                   "Sectors(rx:tx) my %d:%d peer %d:%d\n",
+                   wil->stats.bf_mcs, wil->stats.tsf, evt->status,
+                   wil->stats.snr, le32_to_cpu(evt->tx_tpt),
+                   le32_to_cpu(evt->tx_goodput), le32_to_cpu(evt->rx_goodput),
+                   wil->stats.my_rx_sector, wil->stats.my_tx_sector,
+                   wil->stats.peer_rx_sector, wil->stats.peer_tx_sector);
+}
+
+/*
+ * Firmware reports EAPOL frame using WME event.
+ * Reconstruct Ethernet frame and deliver it via normal Rx
+ */
+static void wmi_evt_eapol_rx(struct wil6210_priv *wil, int id,
+                            void *d, int len)
+{
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct wmi_eapol_rx_event *evt = d;
+       u16 eapol_len = le16_to_cpu(evt->eapol_len);
+       int sz = eapol_len + ETH_HLEN;
+       struct sk_buff *skb;
+       struct ethhdr *eth;
+
+       wil_dbg_WMI(wil, "EAPOL len %d from %pM\n", eapol_len,
+                   evt->src_mac);
+
+       if (eapol_len > 196) { /* TODO: revisit size limit */
+               wil_err(wil, "EAPOL too large\n");
+               return;
+       }
+
+       skb = alloc_skb(sz, GFP_KERNEL);
+       if (!skb) {
+               wil_err(wil, "Failed to allocate skb\n");
+               return;
+       }
+       eth = (struct ethhdr *)skb_put(skb, ETH_HLEN);
+       memcpy(eth->h_dest, ndev->dev_addr, ETH_ALEN);
+       memcpy(eth->h_source, evt->src_mac, ETH_ALEN);
+       eth->h_proto = cpu_to_be16(ETH_P_PAE);
+       memcpy(skb_put(skb, eapol_len), evt->eapol, eapol_len);
+       skb->protocol = eth_type_trans(skb, ndev);
+       if (likely(netif_rx_ni(skb) == NET_RX_SUCCESS)) {
+               ndev->stats.rx_packets++;
+               ndev->stats.rx_bytes += skb->len;
+       } else {
+               ndev->stats.rx_dropped++;
+       }
+}
+
+static const struct {
+       int eventid;
+       void (*handler)(struct wil6210_priv *wil, int eventid,
+                       void *data, int data_len);
+} wmi_evt_handlers[] = {
+       {WMI_READY_EVENTID,             wmi_evt_ready},
+       {WMI_FW_READY_EVENTID,          wmi_evt_fw_ready},
+       {WMI_RX_MGMT_PACKET_EVENTID,    wmi_evt_rx_mgmt},
+       {WMI_SCAN_COMPLETE_EVENTID,     wmi_evt_scan_complete},
+       {WMI_CONNECT_EVENTID,           wmi_evt_connect},
+       {WMI_DISCONNECT_EVENTID,        wmi_evt_disconnect},
+       {WMI_NOTIFY_REQ_DONE_EVENTID,   wmi_evt_notify},
+       {WMI_EAPOL_RX_EVENTID,          wmi_evt_eapol_rx},
+};
+
+/*
+ * Run in IRQ context
+ * Extract WMI command from mailbox. Queue it to the @wil->pending_wmi_ev
+ * that will be eventually handled by the @wmi_event_worker in the thread
+ * context of thread "wil6210_wmi"
+ */
+void wmi_recv_cmd(struct wil6210_priv *wil)
+{
+       struct wil6210_mbox_ring_desc d_tail;
+       struct wil6210_mbox_hdr hdr;
+       struct wil6210_mbox_ring *r = &wil->mbox_ctl.rx;
+       struct pending_wmi_event *evt;
+       u8 *cmd;
+       void __iomem *src;
+       ulong flags;
+
+       for (;;) {
+               u16 len;
+
+               r->head = ioread32(wil->csr + HOST_MBOX +
+                                  offsetof(struct wil6210_mbox_ctl, rx.head));
+               if (r->tail == r->head)
+                       return;
+
+               /* read cmd from tail */
+               wil_memcpy_fromio_32(&d_tail, wil->csr + HOSTADDR(r->tail),
+                                    sizeof(struct wil6210_mbox_ring_desc));
+               if (d_tail.sync == 0) {
+                       wil_err(wil, "Mbox evt not owned by FW?\n");
+                       return;
+               }
+
+               if (0 != wmi_read_hdr(wil, d_tail.addr, &hdr)) {
+                       wil_err(wil, "Mbox evt at 0x%08x?\n",
+                               le32_to_cpu(d_tail.addr));
+                       return;
+               }
+
+               len = le16_to_cpu(hdr.len);
+               src = wmi_buffer(wil, d_tail.addr) +
+                     sizeof(struct wil6210_mbox_hdr);
+               evt = kmalloc(ALIGN(offsetof(struct pending_wmi_event,
+                                            event.wmi) + len, 4),
+                             GFP_KERNEL);
+               if (!evt) {
+                       wil_err(wil, "kmalloc for WMI event (%d) failed\n",
+                               len);
+                       return;
+               }
+               evt->event.hdr = hdr;
+               cmd = (void *)&evt->event.wmi;
+               wil_memcpy_fromio_32(cmd, src, len);
+               /* mark entry as empty */
+               iowrite32(0, wil->csr + HOSTADDR(r->tail) +
+                         offsetof(struct wil6210_mbox_ring_desc, sync));
+               /* indicate */
+               wil_dbg_WMI(wil, "Mbox evt %04x %04x %04x %02x\n",
+                           le16_to_cpu(hdr.seq), len, le16_to_cpu(hdr.type),
+                           hdr.flags);
+               if ((hdr.type == WIL_MBOX_HDR_TYPE_WMI) &&
+                   (len >= sizeof(struct wil6210_mbox_hdr_wmi))) {
+                       wil_dbg_WMI(wil, "WMI event 0x%04x\n",
+                                   evt->event.wmi.id);
+               }
+               wil_hex_dump_WMI("evt ", DUMP_PREFIX_OFFSET, 16, 1,
+                                &evt->event.hdr, sizeof(hdr) + len, true);
+
+               /* advance tail */
+               r->tail = r->base + ((r->tail - r->base +
+                         sizeof(struct wil6210_mbox_ring_desc)) % r->size);
+               iowrite32(r->tail, wil->csr + HOST_MBOX +
+                         offsetof(struct wil6210_mbox_ctl, rx.tail));
+
+               /* add to the pending list */
+               spin_lock_irqsave(&wil->wmi_ev_lock, flags);
+               list_add_tail(&evt->list, &wil->pending_wmi_ev);
+               spin_unlock_irqrestore(&wil->wmi_ev_lock, flags);
+               {
+                       int q = queue_work(wil->wmi_wq,
+                                          &wil->wmi_event_worker);
+                       wil_dbg_WMI(wil, "queue_work -> %d\n", q);
+               }
+       }
+}
+
+int wmi_call(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len,
+            u16 reply_id, void *reply, u8 reply_size, int to_msec)
+{
+       int rc;
+       int remain;
+
+       mutex_lock(&wil->wmi_mutex);
+
+       rc = __wmi_send(wil, cmdid, buf, len);
+       if (rc)
+               goto out;
+
+       wil->reply_id = reply_id;
+       wil->reply_buf = reply;
+       wil->reply_size = reply_size;
+       remain = wait_for_completion_timeout(&wil->wmi_ready,
+                       msecs_to_jiffies(to_msec));
+       if (0 == remain) {
+               wil_err(wil, "wmi_call(0x%04x->0x%04x) timeout %d msec\n",
+                       cmdid, reply_id, to_msec);
+               rc = -ETIME;
+       } else {
+               wil_dbg_WMI(wil,
+                           "wmi_call(0x%04x->0x%04x) completed in %d msec\n",
+                           cmdid, reply_id,
+                           to_msec - jiffies_to_msecs(remain));
+       }
+       wil->reply_id = 0;
+       wil->reply_buf = NULL;
+       wil->reply_size = 0;
+ out:
+       mutex_unlock(&wil->wmi_mutex);
+
+       return rc;
+}
+
+int wmi_echo(struct wil6210_priv *wil)
+{
+       struct wmi_echo_cmd cmd = {
+               .value = cpu_to_le32(0x12345678),
+       };
+
+       return wmi_call(wil, WMI_ECHO_CMDID, &cmd, sizeof(cmd),
+                        WMI_ECHO_RSP_EVENTID, NULL, 0, 20);
+}
+
+int wmi_set_mac_address(struct wil6210_priv *wil, void *addr)
+{
+       struct wmi_set_mac_address_cmd cmd;
+
+       memcpy(cmd.mac, addr, ETH_ALEN);
+
+       wil_dbg_WMI(wil, "Set MAC %pM\n", addr);
+
+       return wmi_send(wil, WMI_SET_MAC_ADDRESS_CMDID, &cmd, sizeof(cmd));
+}
+
+int wmi_set_bcon(struct wil6210_priv *wil, int bi, u8 wmi_nettype)
+{
+       struct wmi_bcon_ctrl_cmd cmd = {
+               .bcon_interval = cpu_to_le16(bi),
+               .network_type = wmi_nettype,
+               .disable_sec_offload = 1,
+       };
+
+       if (!wil->secure_pcp)
+               cmd.disable_sec = 1;
+
+       return wmi_send(wil, WMI_BCON_CTRL_CMDID, &cmd, sizeof(cmd));
+}
+
+int wmi_set_ssid(struct wil6210_priv *wil, u8 ssid_len, const void *ssid)
+{
+       struct wmi_set_ssid_cmd cmd = {
+               .ssid_len = cpu_to_le32(ssid_len),
+       };
+
+       if (ssid_len > sizeof(cmd.ssid))
+               return -EINVAL;
+
+       memcpy(cmd.ssid, ssid, ssid_len);
+
+       return wmi_send(wil, WMI_SET_SSID_CMDID, &cmd, sizeof(cmd));
+}
+
+int wmi_get_ssid(struct wil6210_priv *wil, u8 *ssid_len, void *ssid)
+{
+       int rc;
+       struct {
+               struct wil6210_mbox_hdr_wmi wmi;
+               struct wmi_set_ssid_cmd cmd;
+       } __packed reply;
+       int len; /* reply.cmd.ssid_len in CPU order */
+
+       rc = wmi_call(wil, WMI_GET_SSID_CMDID, NULL, 0, WMI_GET_SSID_EVENTID,
+                     &reply, sizeof(reply), 20);
+       if (rc)
+               return rc;
+
+       len = le32_to_cpu(reply.cmd.ssid_len);
+       if (len > sizeof(reply.cmd.ssid))
+               return -EINVAL;
+
+       *ssid_len = len;
+       memcpy(ssid, reply.cmd.ssid, len);
+
+       return 0;
+}
+
+int wmi_set_channel(struct wil6210_priv *wil, int channel)
+{
+       struct wmi_set_pcp_channel_cmd cmd = {
+               .channel = channel - 1,
+       };
+
+       return wmi_send(wil, WMI_SET_PCP_CHANNEL_CMDID, &cmd, sizeof(cmd));
+}
+
+int wmi_get_channel(struct wil6210_priv *wil, int *channel)
+{
+       int rc;
+       struct {
+               struct wil6210_mbox_hdr_wmi wmi;
+               struct wmi_set_pcp_channel_cmd cmd;
+       } __packed reply;
+
+       rc = wmi_call(wil, WMI_GET_PCP_CHANNEL_CMDID, NULL, 0,
+                     WMI_GET_PCP_CHANNEL_EVENTID, &reply, sizeof(reply), 20);
+       if (rc)
+               return rc;
+
+       if (reply.cmd.channel > 3)
+               return -EINVAL;
+
+       *channel = reply.cmd.channel + 1;
+
+       return 0;
+}
+
+int wmi_tx_eapol(struct wil6210_priv *wil, struct sk_buff *skb)
+{
+       struct wmi_eapol_tx_cmd *cmd;
+       struct ethhdr *eth;
+       u16 eapol_len = skb->len - ETH_HLEN;
+       void *eapol = skb->data + ETH_HLEN;
+       uint i;
+       int rc;
+
+       skb_set_mac_header(skb, 0);
+       eth = eth_hdr(skb);
+       wil_dbg_WMI(wil, "EAPOL %d bytes to %pM\n", eapol_len, eth->h_dest);
+       for (i = 0; i < ARRAY_SIZE(wil->vring_tx); i++) {
+               if (memcmp(wil->dst_addr[i], eth->h_dest, ETH_ALEN) == 0)
+                       goto found_dest;
+       }
+
+       return -EINVAL;
+
+ found_dest:
+       /* find out eapol data & len */
+       cmd = kzalloc(sizeof(*cmd) + eapol_len, GFP_KERNEL);
+       if (!cmd)
+               return -EINVAL;
+
+       memcpy(cmd->dst_mac, eth->h_dest, ETH_ALEN);
+       cmd->eapol_len = cpu_to_le16(eapol_len);
+       memcpy(cmd->eapol, eapol, eapol_len);
+       rc = wmi_send(wil, WMI_EAPOL_TX_CMDID, cmd, sizeof(*cmd) + eapol_len);
+       kfree(cmd);
+
+       return rc;
+}
+
+int wmi_del_cipher_key(struct wil6210_priv *wil, u8 key_index,
+                      const void *mac_addr)
+{
+       struct wmi_delete_cipher_key_cmd cmd = {
+               .key_index = key_index,
+       };
+
+       if (mac_addr)
+               memcpy(cmd.mac, mac_addr, WMI_MAC_LEN);
+
+       return wmi_send(wil, WMI_DELETE_CIPHER_KEY_CMDID, &cmd, sizeof(cmd));
+}
+
+int wmi_add_cipher_key(struct wil6210_priv *wil, u8 key_index,
+                      const void *mac_addr, int key_len, const void *key)
+{
+       struct wmi_add_cipher_key_cmd cmd = {
+               .key_index = key_index,
+               .key_usage = WMI_KEY_USE_PAIRWISE,
+               .key_len = key_len,
+       };
+
+       if (!key || (key_len > sizeof(cmd.key)))
+               return -EINVAL;
+
+       memcpy(cmd.key, key, key_len);
+       if (mac_addr)
+               memcpy(cmd.mac, mac_addr, WMI_MAC_LEN);
+
+       return wmi_send(wil, WMI_ADD_CIPHER_KEY_CMDID, &cmd, sizeof(cmd));
+}
+
+int wmi_set_ie(struct wil6210_priv *wil, u8 type, u16 ie_len, const void *ie)
+{
+       int rc;
+       u16 len = sizeof(struct wmi_set_appie_cmd) + ie_len;
+       struct wmi_set_appie_cmd *cmd = kzalloc(len, GFP_KERNEL);
+       if (!cmd) {
+               wil_err(wil, "kmalloc(%d) failed\n", len);
+               return -ENOMEM;
+       }
+
+       cmd->mgmt_frm_type = type;
+       /* BUG: FW API define ieLen as u8. Will fix FW */
+       cmd->ie_len = cpu_to_le16(ie_len);
+       memcpy(cmd->ie_info, ie, ie_len);
+       rc = wmi_send(wil, WMI_SET_APPIE_CMDID, &cmd, len);
+       kfree(cmd);
+
+       return rc;
+}
+
+void wmi_event_flush(struct wil6210_priv *wil)
+{
+       struct pending_wmi_event *evt, *t;
+
+       wil_dbg_WMI(wil, "%s()\n", __func__);
+
+       list_for_each_entry_safe(evt, t, &wil->pending_wmi_ev, list) {
+               list_del(&evt->list);
+               kfree(evt);
+       }
+}
+
+static bool wmi_evt_call_handler(struct wil6210_priv *wil, int id,
+                                void *d, int len)
+{
+       uint i;
+
+       for (i = 0; i < ARRAY_SIZE(wmi_evt_handlers); i++) {
+               if (wmi_evt_handlers[i].eventid == id) {
+                       wmi_evt_handlers[i].handler(wil, id, d, len);
+                       return true;
+               }
+       }
+
+       return false;
+}
+
+static void wmi_event_handle(struct wil6210_priv *wil,
+                            struct wil6210_mbox_hdr *hdr)
+{
+       u16 len = le16_to_cpu(hdr->len);
+
+       if ((hdr->type == WIL_MBOX_HDR_TYPE_WMI) &&
+           (len >= sizeof(struct wil6210_mbox_hdr_wmi))) {
+               struct wil6210_mbox_hdr_wmi *wmi = (void *)(&hdr[1]);
+               void *evt_data = (void *)(&wmi[1]);
+               u16 id = le16_to_cpu(wmi->id);
+               /* check if someone waits for this event */
+               if (wil->reply_id && wil->reply_id == id) {
+                       if (wil->reply_buf) {
+                               memcpy(wil->reply_buf, wmi,
+                                      min(len, wil->reply_size));
+                       } else {
+                               wmi_evt_call_handler(wil, id, evt_data,
+                                                    len - sizeof(*wmi));
+                       }
+                       wil_dbg_WMI(wil, "Complete WMI 0x%04x\n", id);
+                       complete(&wil->wmi_ready);
+                       return;
+               }
+               /* unsolicited event */
+               /* search for handler */
+               if (!wmi_evt_call_handler(wil, id, evt_data,
+                                         len - sizeof(*wmi))) {
+                       wil_err(wil, "Unhandled event 0x%04x\n", id);
+               }
+       } else {
+               wil_err(wil, "Unknown event type\n");
+               print_hex_dump(KERN_ERR, "evt?? ", DUMP_PREFIX_OFFSET, 16, 1,
+                              hdr, sizeof(*hdr) + len, true);
+       }
+}
+
+/*
+ * Retrieve next WMI event from the pending list
+ */
+static struct list_head *next_wmi_ev(struct wil6210_priv *wil)
+{
+       ulong flags;
+       struct list_head *ret = NULL;
+
+       spin_lock_irqsave(&wil->wmi_ev_lock, flags);
+
+       if (!list_empty(&wil->pending_wmi_ev)) {
+               ret = wil->pending_wmi_ev.next;
+               list_del(ret);
+       }
+
+       spin_unlock_irqrestore(&wil->wmi_ev_lock, flags);
+
+       return ret;
+}
+
+/*
+ * Handler for the WMI events
+ */
+void wmi_event_worker(struct work_struct *work)
+{
+       struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
+                                                wmi_event_worker);
+       struct pending_wmi_event *evt;
+       struct list_head *lh;
+
+       while ((lh = next_wmi_ev(wil)) != NULL) {
+               evt = list_entry(lh, struct pending_wmi_event, list);
+               wmi_event_handle(wil, &evt->event.hdr);
+               kfree(evt);
+       }
+}
+
+void wmi_connect_worker(struct work_struct *work)
+{
+       int rc;
+       struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
+                                               wmi_connect_worker);
+
+       if (wil->pending_connect_cid < 0) {
+               wil_err(wil, "No connection pending\n");
+               return;
+       }
+
+       wil_dbg_WMI(wil, "Configure for connection CID %d\n",
+                   wil->pending_connect_cid);
+
+       rc = wil_vring_init_tx(wil, 0, WIL6210_TX_RING_SIZE,
+                              wil->pending_connect_cid, 0);
+       wil->pending_connect_cid = -1;
+       if (rc == 0)
+               wil_link_on(wil);
+}
diff --git a/drivers/net/wireless/ath/wil6210/wmi.h b/drivers/net/wireless/ath/wil6210/wmi.h
new file mode 100644 (file)
index 0000000..3bbf875
--- /dev/null
@@ -0,0 +1,1116 @@
+/*
+ * Copyright (c) 2012 Qualcomm Atheros, Inc.
+ * Copyright (c) 2006-2012 Wilocity .
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This file contains the definitions of the WMI protocol specified in the
+ * Wireless Module Interface (WMI) for the Wilocity
+ * MARLON 60 Gigabit wireless solution.
+ * It includes definitions of all the commands and events.
+ * Commands are messages from the host to the WM.
+ * Events are messages from the WM to the host.
+ */
+
+#ifndef __WILOCITY_WMI_H__
+#define __WILOCITY_WMI_H__
+
+/* General */
+
+#define WMI_MAC_LEN            (6)
+#define WMI_PROX_RANGE_NUM     (3)
+
+/* List of Commands */
+enum wmi_command_id {
+       WMI_CONNECT_CMDID               = 0x0001,
+       WMI_DISCONNECT_CMDID            = 0x0003,
+       WMI_START_SCAN_CMDID            = 0x0007,
+       WMI_SET_BSS_FILTER_CMDID        = 0x0009,
+       WMI_SET_PROBED_SSID_CMDID       = 0x000a,
+       WMI_SET_LISTEN_INT_CMDID        = 0x000b,
+       WMI_BCON_CTRL_CMDID             = 0x000f,
+       WMI_ADD_CIPHER_KEY_CMDID        = 0x0016,
+       WMI_DELETE_CIPHER_KEY_CMDID     = 0x0017,
+       WMI_SET_APPIE_CMDID             = 0x003f,
+       WMI_GET_APPIE_CMDID             = 0x0040,
+       WMI_SET_WSC_STATUS_CMDID        = 0x0041,
+       WMI_PXMT_RANGE_CFG_CMDID        = 0x0042,
+       WMI_PXMT_SNR2_RANGE_CFG_CMDID   = 0x0043,
+       WMI_FAST_MEM_ACC_MODE_CMDID     = 0x0300,
+       WMI_MEM_READ_CMDID              = 0x0800,
+       WMI_MEM_WR_CMDID                = 0x0801,
+       WMI_ECHO_CMDID                  = 0x0803,
+       WMI_DEEP_ECHO_CMDID             = 0x0804,
+       WMI_CONFIG_MAC_CMDID            = 0x0805,
+       WMI_CONFIG_PHY_DEBUG_CMDID      = 0x0806,
+       WMI_ADD_STATION_CMDID           = 0x0807,
+       WMI_ADD_DEBUG_TX_PCKT_CMDID     = 0x0808,
+       WMI_PHY_GET_STATISTICS_CMDID    = 0x0809,
+       WMI_FS_TUNE_CMDID               = 0x080a,
+       WMI_CORR_MEASURE_CMDID          = 0x080b,
+       WMI_TEMP_SENSE_CMDID            = 0x080e,
+       WMI_DC_CALIB_CMDID              = 0x080f,
+       WMI_SEND_TONE_CMDID             = 0x0810,
+       WMI_IQ_TX_CALIB_CMDID           = 0x0811,
+       WMI_IQ_RX_CALIB_CMDID           = 0x0812,
+       WMI_SET_UCODE_IDLE_CMDID        = 0x0813,
+       WMI_SET_WORK_MODE_CMDID         = 0x0815,
+       WMI_LO_LEAKAGE_CALIB_CMDID      = 0x0816,
+       WMI_MARLON_R_ACTIVATE_CMDID     = 0x0817,
+       WMI_MARLON_R_READ_CMDID         = 0x0818,
+       WMI_MARLON_R_WRITE_CMDID        = 0x0819,
+       WMI_MARLON_R_TXRX_SEL_CMDID     = 0x081a,
+       MAC_IO_STATIC_PARAMS_CMDID      = 0x081b,
+       MAC_IO_DYNAMIC_PARAMS_CMDID     = 0x081c,
+       WMI_SILENT_RSSI_CALIB_CMDID     = 0x081d,
+       WMI_CFG_RX_CHAIN_CMDID          = 0x0820,
+       WMI_VRING_CFG_CMDID             = 0x0821,
+       WMI_RX_ON_CMDID                 = 0x0822,
+       WMI_VRING_BA_EN_CMDID           = 0x0823,
+       WMI_VRING_BA_DIS_CMDID          = 0x0824,
+       WMI_RCP_ADDBA_RESP_CMDID        = 0x0825,
+       WMI_RCP_DELBA_CMDID             = 0x0826,
+       WMI_SET_SSID_CMDID              = 0x0827,
+       WMI_GET_SSID_CMDID              = 0x0828,
+       WMI_SET_PCP_CHANNEL_CMDID       = 0x0829,
+       WMI_GET_PCP_CHANNEL_CMDID       = 0x082a,
+       WMI_SW_TX_REQ_CMDID             = 0x082b,
+       WMI_RX_OFF_CMDID                = 0x082c,
+       WMI_READ_MAC_RXQ_CMDID          = 0x0830,
+       WMI_READ_MAC_TXQ_CMDID          = 0x0831,
+       WMI_WRITE_MAC_RXQ_CMDID         = 0x0832,
+       WMI_WRITE_MAC_TXQ_CMDID         = 0x0833,
+       WMI_WRITE_MAC_XQ_FIELD_CMDID    = 0x0834,
+       WMI_MLME_PUSH_CMDID             = 0x0835,
+       WMI_BEAMFORMING_MGMT_CMDID      = 0x0836,
+       WMI_BF_TXSS_MGMT_CMDID          = 0x0837,
+       WMI_BF_SM_MGMT_CMDID            = 0x0838,
+       WMI_BF_RXSS_MGMT_CMDID          = 0x0839,
+       WMI_SET_SECTORS_CMDID           = 0x0849,
+       WMI_MAINTAIN_PAUSE_CMDID        = 0x0850,
+       WMI_MAINTAIN_RESUME_CMDID       = 0x0851,
+       WMI_RS_MGMT_CMDID               = 0x0852,
+       WMI_RF_MGMT_CMDID               = 0x0853,
+       /* Performance monitoring commands */
+       WMI_BF_CTRL_CMDID               = 0x0862,
+       WMI_NOTIFY_REQ_CMDID            = 0x0863,
+       WMI_GET_STATUS_CMDID            = 0x0864,
+       WMI_UNIT_TEST_CMDID             = 0x0900,
+       WMI_HICCUP_CMDID                = 0x0901,
+       WMI_FLASH_READ_CMDID            = 0x0902,
+       WMI_FLASH_WRITE_CMDID           = 0x0903,
+       WMI_SECURITY_UNIT_TEST_CMDID    = 0x0904,
+
+       WMI_SET_MAC_ADDRESS_CMDID       = 0xf003,
+       WMI_ABORT_SCAN_CMDID            = 0xf007,
+       WMI_SET_PMK_CMDID               = 0xf028,
+
+       WMI_SET_PROMISCUOUS_MODE_CMDID  = 0xf041,
+       WMI_GET_PMK_CMDID               = 0xf048,
+       WMI_SET_PASSPHRASE_CMDID        = 0xf049,
+       WMI_SEND_ASSOC_RES_CMDID        = 0xf04a,
+       WMI_SET_ASSOC_REQ_RELAY_CMDID   = 0xf04b,
+       WMI_EAPOL_TX_CMDID              = 0xf04c,
+       WMI_MAC_ADDR_REQ_CMDID          = 0xf04d,
+       WMI_FW_VER_CMDID                = 0xf04e,
+};
+
+/*
+ * Commands data structures
+ */
+
+/*
+ * Frame Types
+ */
+enum wmi_mgmt_frame_type {
+       WMI_FRAME_BEACON        = 0,
+       WMI_FRAME_PROBE_REQ     = 1,
+       WMI_FRAME_PROBE_RESP    = 2,
+       WMI_FRAME_ASSOC_REQ     = 3,
+       WMI_FRAME_ASSOC_RESP    = 4,
+       WMI_NUM_MGMT_FRAME,
+};
+
+/*
+ * WMI_CONNECT_CMDID
+ */
+enum wmi_network_type {
+       WMI_NETTYPE_INFRA               = 0x01,
+       WMI_NETTYPE_ADHOC               = 0x02,
+       WMI_NETTYPE_ADHOC_CREATOR       = 0x04,
+       WMI_NETTYPE_AP                  = 0x10,
+       WMI_NETTYPE_P2P                 = 0x20,
+       WMI_NETTYPE_WBE                 = 0x40, /* PCIE over 60g */
+};
+
+enum wmi_dot11_auth_mode {
+       WMI_AUTH11_OPEN                 = 0x01,
+       WMI_AUTH11_SHARED               = 0x02,
+       WMI_AUTH11_LEAP                 = 0x04,
+       WMI_AUTH11_WSC                  = 0x08,
+};
+
+enum wmi_auth_mode {
+       WMI_AUTH_NONE                   = 0x01,
+       WMI_AUTH_WPA                    = 0x02,
+       WMI_AUTH_WPA2                   = 0x04,
+       WMI_AUTH_WPA_PSK                = 0x08,
+       WMI_AUTH_WPA2_PSK               = 0x10,
+       WMI_AUTH_WPA_CCKM               = 0x20,
+       WMI_AUTH_WPA2_CCKM              = 0x40,
+};
+
+enum wmi_crypto_type {
+       WMI_CRYPT_NONE                  = 0x01,
+       WMI_CRYPT_WEP                   = 0x02,
+       WMI_CRYPT_TKIP                  = 0x04,
+       WMI_CRYPT_AES                   = 0x08,
+       WMI_CRYPT_AES_GCMP              = 0x20,
+};
+
+
+enum wmi_connect_ctrl_flag_bits {
+       WMI_CONNECT_ASSOC_POLICY_USER           = 0x0001,
+       WMI_CONNECT_SEND_REASSOC                = 0x0002,
+       WMI_CONNECT_IGNORE_WPAx_GROUP_CIPHER    = 0x0004,
+       WMI_CONNECT_PROFILE_MATCH_DONE          = 0x0008,
+       WMI_CONNECT_IGNORE_AAC_BEACON           = 0x0010,
+       WMI_CONNECT_CSA_FOLLOW_BSS              = 0x0020,
+       WMI_CONNECT_DO_WPA_OFFLOAD              = 0x0040,
+       WMI_CONNECT_DO_NOT_DEAUTH               = 0x0080,
+};
+
+#define WMI_MAX_SSID_LEN    (32)
+
+struct wmi_connect_cmd {
+       u8 network_type;
+       u8 dot11_auth_mode;
+       u8 auth_mode;
+       u8 pairwise_crypto_type;
+       u8 pairwise_crypto_len;
+       u8 group_crypto_type;
+       u8 group_crypto_len;
+       u8 ssid_len;
+       u8 ssid[WMI_MAX_SSID_LEN];
+       u8 channel;
+       u8 reserved0;
+       u8 bssid[WMI_MAC_LEN];
+       __le32 ctrl_flags;
+       u8 dst_mac[WMI_MAC_LEN];
+       u8 reserved1[2];
+} __packed;
+
+
+/*
+ * WMI_RECONNECT_CMDID
+ */
+struct wmi_reconnect_cmd {
+       u8 channel;                     /* hint */
+       u8 reserved;
+       u8 bssid[WMI_MAC_LEN];          /* mandatory if set */
+} __packed;
+
+
+/*
+ * WMI_SET_PMK_CMDID
+ */
+
+#define WMI_MIN_KEY_INDEX      (0)
+#define WMI_MAX_KEY_INDEX      (3)
+#define WMI_MAX_KEY_LEN                (32)
+#define WMI_PASSPHRASE_LEN     (64)
+#define WMI_PMK_LEN            (32)
+
+struct  wmi_set_pmk_cmd {
+       u8 pmk[WMI_PMK_LEN];
+} __packed;
+
+
+/*
+ * WMI_SET_PASSPHRASE_CMDID
+ */
+struct wmi_set_passphrase_cmd {
+       u8 ssid[WMI_MAX_SSID_LEN];
+       u8 passphrase[WMI_PASSPHRASE_LEN];
+       u8 ssid_len;
+       u8 passphrase_len;
+} __packed;
+
+/*
+ * WMI_ADD_CIPHER_KEY_CMDID
+ */
+enum wmi_key_usage {
+       WMI_KEY_USE_PAIRWISE    = 0,
+       WMI_KEY_USE_GROUP       = 1,
+       WMI_KEY_USE_TX          = 2,  /* default Tx Key - Static WEP only */
+};
+
+struct wmi_add_cipher_key_cmd {
+       u8 key_index;
+       u8 key_type;
+       u8 key_usage;           /* enum wmi_key_usage */
+       u8 key_len;
+       u8 key_rsc[8];          /* key replay sequence counter */
+       u8 key[WMI_MAX_KEY_LEN];
+       u8 key_op_ctrl;         /* Additional Key Control information */
+       u8 mac[WMI_MAC_LEN];
+} __packed;
+
+/*
+ * WMI_DELETE_CIPHER_KEY_CMDID
+ */
+struct wmi_delete_cipher_key_cmd {
+       u8 key_index;
+       u8 mac[WMI_MAC_LEN];
+} __packed;
+
+
+/*
+ * WMI_START_SCAN_CMDID
+ *
+ * Start L1 scan operation
+ *
+ * Returned events:
+ * - WMI_RX_MGMT_PACKET_EVENTID - for every probe resp.
+ * - WMI_SCAN_COMPLETE_EVENTID
+ */
+enum wmi_scan_type {
+       WMI_LONG_SCAN           = 0,
+       WMI_SHORT_SCAN          = 1,
+};
+
+struct wmi_start_scan_cmd {
+       u8 reserved[8];
+       __le32 home_dwell_time; /* Max duration in the home channel(ms) */
+       __le32 force_scan_interval;     /* Time interval between scans (ms)*/
+       u8 scan_type;           /* wmi_scan_type */
+       u8 num_channels;                /* how many channels follow */
+       struct {
+               u8 channel;
+               u8 reserved;
+       } channel_list[0];      /* channels ID's */
+                               /* 0 - 58320 MHz */
+                               /* 1 - 60480 MHz */
+                               /* 2 - 62640 MHz */
+} __packed;
+
+/*
+ * WMI_SET_PROBED_SSID_CMDID
+ */
+#define MAX_PROBED_SSID_INDEX   (15)
+
+enum wmi_ssid_flag {
+       WMI_SSID_FLAG_DISABLE   = 0,    /* disables entry */
+       WMI_SSID_FLAG_SPECIFIC  = 1,    /* probes specified ssid */
+       WMI_SSID_FLAG_ANY       = 2,    /* probes for any ssid */
+};
+
+struct wmi_probed_ssid_cmd {
+       u8 entry_index;                 /* 0 to MAX_PROBED_SSID_INDEX */
+       u8 flag;                        /* enum wmi_ssid_flag */
+       u8 ssid_len;
+       u8 ssid[WMI_MAX_SSID_LEN];
+} __packed;
+
+/*
+ * WMI_SET_APPIE_CMDID
+ * Add Application specified IE to a management frame
+ */
+struct wmi_set_appie_cmd {
+       u8 mgmt_frm_type;       /* enum wmi_mgmt_frame_type */
+       u8 reserved;
+       __le16 ie_len;  /* Length of the IE to be added to MGMT frame */
+       u8 ie_info[0];
+} __packed;
+
+#define WMI_MAX_IE_LEN (1024)
+
+struct wmi_pxmt_range_cfg_cmd {
+       u8 dst_mac[WMI_MAC_LEN];
+       __le16 range;
+} __packed;
+
+struct wmi_pxmt_snr2_range_cfg_cmd {
+       s8 snr2range_arr[WMI_PROX_RANGE_NUM-1];
+} __packed;
+
+/*
+ * WMI_RF_MGMT_CMDID
+ */
+enum wmi_rf_mgmt_type {
+       WMI_RF_MGMT_W_DISABLE   = 0,
+       WMI_RF_MGMT_W_ENABLE    = 1,
+       WMI_RF_MGMT_GET_STATUS  = 2,
+};
+
+struct wmi_rf_mgmt_cmd {
+       __le32 rf_mgmt_type;
+} __packed;
+
+/*
+ * WMI_SET_SSID_CMDID
+ */
+struct wmi_set_ssid_cmd {
+       __le32 ssid_len;
+       u8 ssid[WMI_MAX_SSID_LEN];
+} __packed;
+
+/*
+ * WMI_SET_PCP_CHANNEL_CMDID
+ */
+struct wmi_set_pcp_channel_cmd {
+       u8 channel;
+       u8 reserved[3];
+} __packed;
+
+/*
+ * WMI_BCON_CTRL_CMDID
+ */
+struct wmi_bcon_ctrl_cmd {
+       __le16 bcon_interval;
+       __le16 frag_num;
+       __le64 ss_mask;
+       u8 network_type;
+       u8 reserved;
+       u8 disable_sec_offload;
+       u8 disable_sec;
+} __packed;
+
+/*
+ * WMI_SW_TX_REQ_CMDID
+ */
+struct wmi_sw_tx_req_cmd {
+       u8 dst_mac[WMI_MAC_LEN];
+       __le16 len;
+       u8 payload[0];
+} __packed;
+
+/*
+ * WMI_VRING_CFG_CMDID
+ */
+
+struct wmi_sw_ring_cfg {
+       __le64 ring_mem_base;
+       __le16 ring_size;
+       __le16 max_mpdu_size;
+} __packed;
+
+struct wmi_vring_cfg_schd {
+       __le16 priority;
+       __le16 timeslot_us;
+} __packed;
+
+enum wmi_vring_cfg_encap_trans_type {
+       WMI_VRING_ENC_TYPE_802_3                = 0,
+       WMI_VRING_ENC_TYPE_NATIVE_WIFI          = 1,
+};
+
+enum wmi_vring_cfg_ds_cfg {
+       WMI_VRING_DS_PBSS                       = 0,
+       WMI_VRING_DS_STATION                    = 1,
+       WMI_VRING_DS_AP                         = 2,
+       WMI_VRING_DS_ADDR4                      = 3,
+};
+
+enum wmi_vring_cfg_nwifi_ds_trans_type {
+       WMI_NWIFI_TX_TRANS_MODE_NO              = 0,
+       WMI_NWIFI_TX_TRANS_MODE_AP2PBSS         = 1,
+       WMI_NWIFI_TX_TRANS_MODE_STA2PBSS        = 2,
+};
+
+enum wmi_vring_cfg_schd_params_priority {
+       WMI_SCH_PRIO_REGULAR                    = 0,
+       WMI_SCH_PRIO_HIGH                       = 1,
+};
+
+struct wmi_vring_cfg {
+       struct wmi_sw_ring_cfg tx_sw_ring;
+       u8 ringid;                              /* 0-23 vrings */
+
+       #define CIDXTID_CID_POS (0)
+       #define CIDXTID_CID_LEN (4)
+       #define CIDXTID_CID_MSK (0xF)
+       #define CIDXTID_TID_POS (4)
+       #define CIDXTID_TID_LEN (4)
+       #define CIDXTID_TID_MSK (0xF0)
+       u8 cidxtid;
+
+       u8 encap_trans_type;
+       u8 ds_cfg;                              /* 802.3 DS cfg */
+       u8 nwifi_ds_trans_type;
+
+       #define VRING_CFG_MAC_CTRL_LIFETIME_EN_POS (0)
+       #define VRING_CFG_MAC_CTRL_LIFETIME_EN_LEN (1)
+       #define VRING_CFG_MAC_CTRL_LIFETIME_EN_MSK (0x1)
+       #define VRING_CFG_MAC_CTRL_AGGR_EN_POS (1)
+       #define VRING_CFG_MAC_CTRL_AGGR_EN_LEN (1)
+       #define VRING_CFG_MAC_CTRL_AGGR_EN_MSK (0x2)
+       u8 mac_ctrl;
+
+       #define VRING_CFG_TO_RESOLUTION_VALUE_POS (0)
+       #define VRING_CFG_TO_RESOLUTION_VALUE_LEN (6)
+       #define VRING_CFG_TO_RESOLUTION_VALUE_MSK (0x3F)
+       u8 to_resolution;
+       u8 agg_max_wsize;
+       struct wmi_vring_cfg_schd schd_params;
+} __packed;
+
+enum wmi_vring_cfg_cmd_action {
+       WMI_VRING_CMD_ADD                       = 0,
+       WMI_VRING_CMD_MODIFY                    = 1,
+       WMI_VRING_CMD_DELETE                    = 2,
+};
+
+struct wmi_vring_cfg_cmd {
+       __le32 action;
+       struct wmi_vring_cfg vring_cfg;
+} __packed;
+
+/*
+ * WMI_VRING_BA_EN_CMDID
+ */
+struct wmi_vring_ba_en_cmd {
+       u8 ringid;
+       u8 agg_max_wsize;
+       __le16 ba_timeout;
+} __packed;
+
+/*
+ * WMI_VRING_BA_DIS_CMDID
+ */
+struct wmi_vring_ba_dis_cmd {
+       u8 ringid;
+       u8 reserved;
+       __le16 reason;
+} __packed;
+
+/*
+ * WMI_NOTIFY_REQ_CMDID
+ */
+struct wmi_notify_req_cmd {
+       u8 cid;
+       u8 reserved[3];
+       __le32 interval_usec;
+} __packed;
+
+/*
+ * WMI_CFG_RX_CHAIN_CMDID
+ */
+enum wmi_sniffer_cfg_mode {
+       WMI_SNIFFER_OFF                         = 0,
+       WMI_SNIFFER_ON                          = 1,
+};
+
+enum wmi_sniffer_cfg_phy_info_mode {
+       WMI_SNIFFER_PHY_INFO_DISABLED           = 0,
+       WMI_SNIFFER_PHY_INFO_ENABLED            = 1,
+};
+
+enum wmi_sniffer_cfg_phy_support {
+       WMI_SNIFFER_CP                          = 0,
+       WMI_SNIFFER_DP                          = 1,
+       WMI_SNIFFER_BOTH_PHYS                   = 2,
+};
+
+struct wmi_sniffer_cfg {
+       __le32 mode;            /* enum wmi_sniffer_cfg_mode */
+       __le32 phy_info_mode;   /* enum wmi_sniffer_cfg_phy_info_mode */
+       __le32 phy_support;     /* enum wmi_sniffer_cfg_phy_support */
+       u8 channel;
+       u8 reserved[3];
+} __packed;
+
+enum wmi_cfg_rx_chain_cmd_action {
+       WMI_RX_CHAIN_ADD                        = 0,
+       WMI_RX_CHAIN_DEL                        = 1,
+};
+
+enum wmi_cfg_rx_chain_cmd_decap_trans_type {
+       WMI_DECAP_TYPE_802_3                    = 0,
+       WMI_DECAP_TYPE_NATIVE_WIFI              = 1,
+};
+
+enum wmi_cfg_rx_chain_cmd_nwifi_ds_trans_type {
+       WMI_NWIFI_RX_TRANS_MODE_NO              = 0,
+       WMI_NWIFI_RX_TRANS_MODE_PBSS2AP         = 1,
+       WMI_NWIFI_RX_TRANS_MODE_PBSS2STA        = 2,
+};
+
+struct wmi_cfg_rx_chain_cmd {
+       __le32 action;
+       struct wmi_sw_ring_cfg rx_sw_ring;
+       u8 mid;
+       u8 decap_trans_type;
+
+       #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_POS (0)
+       #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_LEN (1)
+       #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_MSK (0x1)
+       u8 l2_802_3_offload_ctrl;
+
+       #define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_POS (0)
+       #define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_LEN (1)
+       #define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_MSK (0x1)
+       #define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_POS (1)
+       #define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_LEN (1)
+       #define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_MSK (0x2)
+       u8 l2_nwifi_offload_ctrl;
+
+       u8 vlan_id;
+       u8 nwifi_ds_trans_type;
+
+       #define L3_L4_CTRL_IPV4_CHECKSUM_EN_POS (0)
+       #define L3_L4_CTRL_IPV4_CHECKSUM_EN_LEN (1)
+       #define L3_L4_CTRL_IPV4_CHECKSUM_EN_MSK (0x1)
+       #define L3_L4_CTRL_TCPIP_CHECKSUM_EN_POS (1)
+       #define L3_L4_CTRL_TCPIP_CHECKSUM_EN_LEN (1)
+       #define L3_L4_CTRL_TCPIP_CHECKSUM_EN_MSK (0x2)
+       u8 l3_l4_ctrl;
+
+       #define RING_CTRL_OVERRIDE_PREFETCH_THRSH_POS (0)
+       #define RING_CTRL_OVERRIDE_PREFETCH_THRSH_LEN (1)
+       #define RING_CTRL_OVERRIDE_PREFETCH_THRSH_MSK (0x1)
+       #define RING_CTRL_OVERRIDE_WB_THRSH_POS (1)
+       #define RING_CTRL_OVERRIDE_WB_THRSH_LEN (1)
+       #define RING_CTRL_OVERRIDE_WB_THRSH_MSK (0x2)
+       #define RING_CTRL_OVERRIDE_ITR_THRSH_POS (2)
+       #define RING_CTRL_OVERRIDE_ITR_THRSH_LEN (1)
+       #define RING_CTRL_OVERRIDE_ITR_THRSH_MSK (0x4)
+       #define RING_CTRL_OVERRIDE_HOST_THRSH_POS (3)
+       #define RING_CTRL_OVERRIDE_HOST_THRSH_LEN (1)
+       #define RING_CTRL_OVERRIDE_HOST_THRSH_MSK (0x8)
+       u8 ring_ctrl;
+
+       __le16 prefetch_thrsh;
+       __le16 wb_thrsh;
+       __le32 itr_value;
+       __le16 host_thrsh;
+       u8 reserved[2];
+       struct wmi_sniffer_cfg sniffer_cfg;
+} __packed;
+
+/*
+ * WMI_RCP_ADDBA_RESP_CMDID
+ */
+struct wmi_rcp_addba_resp_cmd {
+
+       #define CIDXTID_CID_POS (0)
+       #define CIDXTID_CID_LEN (4)
+       #define CIDXTID_CID_MSK (0xF)
+       #define CIDXTID_TID_POS (4)
+       #define CIDXTID_TID_LEN (4)
+       #define CIDXTID_TID_MSK (0xF0)
+       u8 cidxtid;
+
+       u8 dialog_token;
+       __le16 status_code;
+       __le16 ba_param_set;    /* ieee80211_ba_parameterset field to send */
+       __le16 ba_timeout;
+} __packed;
+
+/*
+ * WMI_RCP_DELBA_CMDID
+ */
+struct wmi_rcp_delba_cmd {
+
+       #define CIDXTID_CID_POS (0)
+       #define CIDXTID_CID_LEN (4)
+       #define CIDXTID_CID_MSK (0xF)
+       #define CIDXTID_TID_POS (4)
+       #define CIDXTID_TID_LEN (4)
+       #define CIDXTID_TID_MSK (0xF0)
+       u8 cidxtid;
+
+       u8 reserved;
+       __le16 reason;
+} __packed;
+
+/*
+ * WMI_RCP_ADDBA_REQ_CMDID
+ */
+struct wmi_rcp_addba_req_cmd {
+
+       #define CIDXTID_CID_POS (0)
+       #define CIDXTID_CID_LEN (4)
+       #define CIDXTID_CID_MSK (0xF)
+       #define CIDXTID_TID_POS (4)
+       #define CIDXTID_TID_LEN (4)
+       #define CIDXTID_TID_MSK (0xF0)
+       u8 cidxtid;
+
+       u8 dialog_token;
+       /* ieee80211_ba_parameterset field as it received */
+       __le16 ba_param_set;
+       __le16 ba_timeout;
+       /* ieee80211_ba_seqstrl field as it received */
+       __le16 ba_seq_ctrl;
+} __packed;
+
+/*
+ * WMI_SET_MAC_ADDRESS_CMDID
+ */
+struct wmi_set_mac_address_cmd {
+       u8 mac[WMI_MAC_LEN];
+       u8 reserved[2];
+} __packed;
+
+
+/*
+* WMI_EAPOL_TX_CMDID
+*/
+struct wmi_eapol_tx_cmd {
+       u8 dst_mac[WMI_MAC_LEN];
+       __le16 eapol_len;
+       u8 eapol[0];
+} __packed;
+
+/*
+ * WMI_ECHO_CMDID
+ *
+ * Check FW is alive
+ *
+ * WMI_DEEP_ECHO_CMDID
+ *
+ * Check FW and ucode are alive
+ *
+ * Returned event: WMI_ECHO_RSP_EVENTID
+ * same event for both commands
+ */
+struct wmi_echo_cmd {
+       __le32 value;
+} __packed;
+
+/*
+ * WMI Events
+ */
+
+/*
+ * List of Events (target to host)
+ */
+enum wmi_event_id {
+       WMI_IMM_RSP_EVENTID                     = 0x0000,
+       WMI_READY_EVENTID                       = 0x1001,
+       WMI_CONNECT_EVENTID                     = 0x1002,
+       WMI_DISCONNECT_EVENTID                  = 0x1003,
+       WMI_SCAN_COMPLETE_EVENTID               = 0x100a,
+       WMI_REPORT_STATISTICS_EVENTID           = 0x100b,
+       WMI_RD_MEM_RSP_EVENTID                  = 0x1800,
+       WMI_FW_READY_EVENTID                    = 0x1801,
+       WMI_EXIT_FAST_MEM_ACC_MODE_EVENTID      = 0x0200,
+       WMI_ECHO_RSP_EVENTID                    = 0x1803,
+       WMI_CONFIG_MAC_DONE_EVENTID             = 0x1805,
+       WMI_CONFIG_PHY_DEBUG_DONE_EVENTID       = 0x1806,
+       WMI_ADD_STATION_DONE_EVENTID            = 0x1807,
+       WMI_ADD_DEBUG_TX_PCKT_DONE_EVENTID      = 0x1808,
+       WMI_PHY_GET_STATISTICS_EVENTID          = 0x1809,
+       WMI_FS_TUNE_DONE_EVENTID                = 0x180a,
+       WMI_CORR_MEASURE_DONE_EVENTID           = 0x180b,
+       WMI_TEMP_SENSE_DONE_EVENTID             = 0x180e,
+       WMI_DC_CALIB_DONE_EVENTID               = 0x180f,
+       WMI_IQ_TX_CALIB_DONE_EVENTID            = 0x1811,
+       WMI_IQ_RX_CALIB_DONE_EVENTID            = 0x1812,
+       WMI_SET_WORK_MODE_DONE_EVENTID          = 0x1815,
+       WMI_LO_LEAKAGE_CALIB_DONE_EVENTID       = 0x1816,
+       WMI_MARLON_R_ACTIVATE_DONE_EVENTID      = 0x1817,
+       WMI_MARLON_R_READ_DONE_EVENTID          = 0x1818,
+       WMI_MARLON_R_WRITE_DONE_EVENTID         = 0x1819,
+       WMI_MARLON_R_TXRX_SEL_DONE_EVENTID      = 0x181a,
+       WMI_SILENT_RSSI_CALIB_DONE_EVENTID      = 0x181d,
+
+       WMI_CFG_RX_CHAIN_DONE_EVENTID           = 0x1820,
+       WMI_VRING_CFG_DONE_EVENTID              = 0x1821,
+       WMI_RX_ON_DONE_EVENTID                  = 0x1822,
+       WMI_BA_STATUS_EVENTID                   = 0x1823,
+       WMI_RCP_ADDBA_REQ_EVENTID               = 0x1824,
+       WMI_ADDBA_RESP_SENT_EVENTID             = 0x1825,
+       WMI_DELBA_EVENTID                       = 0x1826,
+       WMI_GET_SSID_EVENTID                    = 0x1828,
+       WMI_GET_PCP_CHANNEL_EVENTID             = 0x182a,
+       WMI_SW_TX_COMPLETE_EVENTID              = 0x182b,
+       WMI_RX_OFF_DONE_EVENTID                 = 0x182c,
+
+       WMI_READ_MAC_RXQ_EVENTID                = 0x1830,
+       WMI_READ_MAC_TXQ_EVENTID                = 0x1831,
+       WMI_WRITE_MAC_RXQ_EVENTID               = 0x1832,
+       WMI_WRITE_MAC_TXQ_EVENTID               = 0x1833,
+       WMI_WRITE_MAC_XQ_FIELD_EVENTID          = 0x1834,
+
+       WMI_BEAFORMING_MGMT_DONE_EVENTID        = 0x1836,
+       WMI_BF_TXSS_MGMT_DONE_EVENTID           = 0x1837,
+       WMI_BF_RXSS_MGMT_DONE_EVENTID           = 0x1839,
+       WMI_RS_MGMT_DONE_EVENTID                = 0x1852,
+       WMI_RF_MGMT_STATUS_EVENTID              = 0x1853,
+       WMI_BF_SM_MGMT_DONE_EVENTID             = 0x1838,
+       WMI_RX_MGMT_PACKET_EVENTID              = 0x1840,
+
+       /* Performance monitoring events */
+       WMI_DATA_PORT_OPEN_EVENTID              = 0x1860,
+       WMI_WBE_LINKDOWN_EVENTID                = 0x1861,
+
+       WMI_BF_CTRL_DONE_EVENTID                = 0x1862,
+       WMI_NOTIFY_REQ_DONE_EVENTID             = 0x1863,
+       WMI_GET_STATUS_DONE_EVENTID             = 0x1864,
+
+       WMI_UNIT_TEST_EVENTID                   = 0x1900,
+       WMI_FLASH_READ_DONE_EVENTID             = 0x1902,
+       WMI_FLASH_WRITE_DONE_EVENTID            = 0x1903,
+
+       WMI_SET_CHANNEL_EVENTID                 = 0x9000,
+       WMI_ASSOC_REQ_EVENTID                   = 0x9001,
+       WMI_EAPOL_RX_EVENTID                    = 0x9002,
+       WMI_MAC_ADDR_RESP_EVENTID               = 0x9003,
+       WMI_FW_VER_EVENTID                      = 0x9004,
+};
+
+/*
+ * Events data structures
+ */
+
+/*
+ * WMI_RF_MGMT_STATUS_EVENTID
+ */
+enum wmi_rf_status {
+       WMI_RF_ENABLED                  = 0,
+       WMI_RF_DISABLED_HW              = 1,
+       WMI_RF_DISABLED_SW              = 2,
+       WMI_RF_DISABLED_HW_SW           = 3,
+};
+
+struct wmi_rf_mgmt_status_event {
+       __le32 rf_status;
+} __packed;
+
+/*
+ * WMI_GET_STATUS_DONE_EVENTID
+ */
+struct wmi_get_status_done_event {
+       __le32 is_associated;
+       u8 cid;
+       u8 reserved0[3];
+       u8 bssid[WMI_MAC_LEN];
+       u8 channel;
+       u8 reserved1;
+       u8 network_type;
+       u8 reserved2[3];
+       __le32 ssid_len;
+       u8 ssid[WMI_MAX_SSID_LEN];
+       __le32 rf_status;
+       __le32 is_secured;
+} __packed;
+
+/*
+ * WMI_FW_VER_EVENTID
+ */
+struct wmi_fw_ver_event {
+       u8 major;
+       u8 minor;
+       __le16 subminor;
+       __le16 build;
+} __packed;
+
+/*
+* WMI_MAC_ADDR_RESP_EVENTID
+*/
+struct wmi_mac_addr_resp_event {
+       u8 mac[WMI_MAC_LEN];
+       u8 auth_mode;
+       u8 crypt_mode;
+       __le32 offload_mode;
+} __packed;
+
+/*
+* WMI_EAPOL_RX_EVENTID
+*/
+struct wmi_eapol_rx_event {
+       u8 src_mac[WMI_MAC_LEN];
+       __le16 eapol_len;
+       u8 eapol[0];
+} __packed;
+
+/*
+* WMI_READY_EVENTID
+*/
+enum wmi_phy_capability {
+       WMI_11A_CAPABILITY              = 1,
+       WMI_11G_CAPABILITY              = 2,
+       WMI_11AG_CAPABILITY             = 3,
+       WMI_11NA_CAPABILITY             = 4,
+       WMI_11NG_CAPABILITY             = 5,
+       WMI_11NAG_CAPABILITY            = 6,
+       WMI_11AD_CAPABILITY             = 7,
+       WMI_11N_CAPABILITY_OFFSET = WMI_11NA_CAPABILITY - WMI_11A_CAPABILITY,
+};
+
+struct wmi_ready_event {
+       __le32 sw_version;
+       __le32 abi_version;
+       u8 mac[WMI_MAC_LEN];
+       u8 phy_capability;              /* enum wmi_phy_capability */
+       u8 reserved;
+} __packed;
+
+/*
+ * WMI_NOTIFY_REQ_DONE_EVENTID
+ */
+struct wmi_notify_req_done_event {
+       __le32 status;
+       __le64 tsf;
+       __le32 snr_val;
+       __le32 tx_tpt;
+       __le32 tx_goodput;
+       __le32 rx_goodput;
+       __le16 bf_mcs;
+       __le16 my_rx_sector;
+       __le16 my_tx_sector;
+       __le16 other_rx_sector;
+       __le16 other_tx_sector;
+       __le16 range;
+} __packed;
+
+/*
+ * WMI_CONNECT_EVENTID
+ */
+struct wmi_connect_event {
+       u8 channel;
+       u8 reserved0;
+       u8 bssid[WMI_MAC_LEN];
+       __le16 listen_interval;
+       __le16 beacon_interval;
+       u8 network_type;
+       u8 reserved1[3];
+       u8 beacon_ie_len;
+       u8 assoc_req_len;
+       u8 assoc_resp_len;
+       u8 cid;
+       u8 reserved2[3];
+       u8 assoc_info[0];
+} __packed;
+
+/*
+ * WMI_DISCONNECT_EVENTID
+ */
+enum wmi_disconnect_reason {
+       WMI_DIS_REASON_NO_NETWORK_AVAIL         = 1,
+       WMI_DIS_REASON_LOST_LINK                = 2, /* bmiss */
+       WMI_DIS_REASON_DISCONNECT_CMD           = 3,
+       WMI_DIS_REASON_BSS_DISCONNECTED         = 4,
+       WMI_DIS_REASON_AUTH_FAILED              = 5,
+       WMI_DIS_REASON_ASSOC_FAILED             = 6,
+       WMI_DIS_REASON_NO_RESOURCES_AVAIL       = 7,
+       WMI_DIS_REASON_CSERV_DISCONNECT         = 8,
+       WMI_DIS_REASON_INVALID_PROFILE          = 10,
+       WMI_DIS_REASON_DOT11H_CHANNEL_SWITCH    = 11,
+       WMI_DIS_REASON_PROFILE_MISMATCH         = 12,
+       WMI_DIS_REASON_CONNECTION_EVICTED       = 13,
+       WMI_DIS_REASON_IBSS_MERGE               = 14,
+};
+
+struct wmi_disconnect_event {
+       __le16 protocol_reason_status;  /* reason code, see 802.11 spec. */
+       u8 bssid[WMI_MAC_LEN];          /* set if known */
+       u8 disconnect_reason;           /* see wmi_disconnect_reason_e */
+       u8 assoc_resp_len;
+       u8 assoc_info[0];
+} __packed;
+
+/*
+ * WMI_SCAN_COMPLETE_EVENTID
+ */
+struct wmi_scan_complete_event {
+       __le32 status;
+} __packed;
+
+/*
+ * WMI_BA_STATUS_EVENTID
+ */
+enum wmi_vring_ba_status {
+       WMI_BA_AGREED                   = 0,
+       WMI_BA_NON_AGREED               = 1,
+};
+
+struct wmi_vring_ba_status_event {
+       __le16 status;
+       u8 reserved[2];
+       u8 ringid;
+       u8 agg_wsize;
+       __le16 ba_timeout;
+} __packed;
+
+/*
+ * WMI_DELBA_EVENTID
+ */
+struct wmi_delba_event {
+
+       #define CIDXTID_CID_POS (0)
+       #define CIDXTID_CID_LEN (4)
+       #define CIDXTID_CID_MSK (0xF)
+       #define CIDXTID_TID_POS (4)
+       #define CIDXTID_TID_LEN (4)
+       #define CIDXTID_TID_MSK (0xF0)
+       u8 cidxtid;
+
+       u8 from_initiator;
+       __le16 reason;
+} __packed;
+
+/*
+ * WMI_VRING_CFG_DONE_EVENTID
+ */
+enum wmi_vring_cfg_done_event_status {
+       WMI_VRING_CFG_SUCCESS           = 0,
+       WMI_VRING_CFG_FAILURE           = 1,
+};
+
+struct wmi_vring_cfg_done_event {
+       u8 ringid;
+       u8 status;
+       u8 reserved[2];
+       __le32 tx_vring_tail_ptr;
+} __packed;
+
+/*
+ * WMI_ADDBA_RESP_SENT_EVENTID
+ */
+enum wmi_rcp_addba_resp_sent_event_status {
+       WMI_ADDBA_SUCCESS               = 0,
+       WMI_ADDBA_FAIL                  = 1,
+};
+
+struct wmi_rcp_addba_resp_sent_event {
+
+       #define CIDXTID_CID_POS (0)
+       #define CIDXTID_CID_LEN (4)
+       #define CIDXTID_CID_MSK (0xF)
+       #define CIDXTID_TID_POS (4)
+       #define CIDXTID_TID_LEN (4)
+       #define CIDXTID_TID_MSK (0xF0)
+       u8 cidxtid;
+
+       u8 reserved;
+       __le16 status;
+} __packed;
+
+/*
+ * WMI_RCP_ADDBA_REQ_EVENTID
+ */
+struct wmi_rcp_addba_req_event {
+
+       #define CIDXTID_CID_POS (0)
+       #define CIDXTID_CID_LEN (4)
+       #define CIDXTID_CID_MSK (0xF)
+       #define CIDXTID_TID_POS (4)
+       #define CIDXTID_TID_LEN (4)
+       #define CIDXTID_TID_MSK (0xF0)
+       u8 cidxtid;
+
+       u8 dialog_token;
+       __le16 ba_param_set;    /* ieee80211_ba_parameterset as it received */
+       __le16 ba_timeout;
+       __le16 ba_seq_ctrl;     /* ieee80211_ba_seqstrl field as it received */
+} __packed;
+
+/*
+ * WMI_CFG_RX_CHAIN_DONE_EVENTID
+ */
+enum wmi_cfg_rx_chain_done_event_status {
+       WMI_CFG_RX_CHAIN_SUCCESS        = 1,
+};
+
+struct wmi_cfg_rx_chain_done_event {
+       __le32 rx_ring_tail_ptr;        /* Rx V-Ring Tail pointer */
+       __le32 status;
+} __packed;
+
+/*
+ * WMI_WBE_LINKDOWN_EVENTID
+ */
+enum wmi_wbe_link_down_event_reason {
+       WMI_WBE_REASON_USER_REQUEST     = 0,
+       WMI_WBE_REASON_RX_DISASSOC      = 1,
+       WMI_WBE_REASON_BAD_PHY_LINK     = 2,
+};
+
+struct wmi_wbe_link_down_event {
+       u8 cid;
+       u8 reserved[3];
+       __le32 reason;
+} __packed;
+
+/*
+ * WMI_DATA_PORT_OPEN_EVENTID
+ */
+struct wmi_data_port_open_event {
+       u8 cid;
+       u8 reserved[3];
+} __packed;
+
+/*
+ * WMI_GET_PCP_CHANNEL_EVENTID
+ */
+struct wmi_get_pcp_channel_event {
+       u8 channel;
+       u8 reserved[3];
+} __packed;
+
+/*
+ * WMI_SW_TX_COMPLETE_EVENTID
+ */
+enum wmi_sw_tx_status {
+       WMI_TX_SW_STATUS_SUCCESS                = 0,
+       WMI_TX_SW_STATUS_FAILED_NO_RESOURCES    = 1,
+       WMI_TX_SW_STATUS_FAILED_TX              = 2,
+};
+
+struct wmi_sw_tx_complete_event {
+       u8 status;      /* enum wmi_sw_tx_status */
+       u8 reserved[3];
+} __packed;
+
+/*
+ * WMI_GET_SSID_EVENTID
+ */
+struct wmi_get_ssid_event {
+       __le32 ssid_len;
+       u8 ssid[WMI_MAX_SSID_LEN];
+} __packed;
+
+/*
+ * WMI_RX_MGMT_PACKET_EVENTID
+ */
+struct wmi_rx_mgmt_info {
+       u8 mcs;
+       s8 snr;
+       __le16 range;
+       __le16 stype;
+       __le16 status;
+       __le32 len;
+       u8 qid;
+       u8 mid;
+       u8 cid;
+       u8 channel;     /* From Radio MNGR */
+} __packed;
+
+struct wmi_rx_mgmt_packet_event {
+       struct wmi_rx_mgmt_info info;
+       u8 payload[0];
+} __packed;
+
+/*
+ * WMI_ECHO_RSP_EVENTID
+ */
+struct wmi_echo_event {
+       __le32 echoed_value;
+} __packed;
+
+#endif /* __WILOCITY_WMI_H__ */
index b298e5d68be2f0a58cf02d45d2ccd9a1e1e464bd..10e288d470e75be03ef936048fe70574ac3ea2c2 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/hw_random.h>
 #include <linux/bcma/bcma.h>
 #include <linux/ssb/ssb.h>
+#include <linux/completion.h>
 #include <net/mac80211.h>
 
 #include "debugfs.h"
@@ -722,6 +723,10 @@ enum b43_firmware_file_type {
 struct b43_request_fw_context {
        /* The device we are requesting the fw for. */
        struct b43_wldev *dev;
+       /* a completion event structure needed if this call is asynchronous */
+       struct completion fw_load_complete;
+       /* a pointer to the firmware object */
+       const struct firmware *blob;
        /* The type of firmware to request. */
        enum b43_firmware_file_type req_type;
        /* Error messages for each firmware type. */
index 16ab280359bd9ffbb9ee68770606d949b3060e6a..806e34c19281792b4444ad1e6b8ea03724c9c773 100644 (file)
@@ -2088,11 +2088,18 @@ static void b43_print_fw_helptext(struct b43_wl *wl, bool error)
                b43warn(wl, text);
 }
 
+static void b43_fw_cb(const struct firmware *firmware, void *context)
+{
+       struct b43_request_fw_context *ctx = context;
+
+       ctx->blob = firmware;
+       complete(&ctx->fw_load_complete);
+}
+
 int b43_do_request_fw(struct b43_request_fw_context *ctx,
                      const char *name,
-                     struct b43_firmware_file *fw)
+                     struct b43_firmware_file *fw, bool async)
 {
-       const struct firmware *blob;
        struct b43_fw_header *hdr;
        u32 size;
        int err;
@@ -2131,11 +2138,31 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx,
                B43_WARN_ON(1);
                return -ENOSYS;
        }
-       err = request_firmware(&blob, ctx->fwname, ctx->dev->dev->dev);
+       if (async) {
+               /* do this part asynchronously */
+               init_completion(&ctx->fw_load_complete);
+               err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname,
+                                             ctx->dev->dev->dev, GFP_KERNEL,
+                                             ctx, b43_fw_cb);
+               if (err < 0) {
+                       pr_err("Unable to load firmware\n");
+                       return err;
+               }
+               /* stall here until fw ready */
+               wait_for_completion(&ctx->fw_load_complete);
+               if (ctx->blob)
+                       goto fw_ready;
+       /* On some ARM systems, the async request will fail, but the next sync
+        * request works. For this reason, we dall through here
+        */
+       }
+       err = request_firmware(&ctx->blob, ctx->fwname,
+                              ctx->dev->dev->dev);
        if (err == -ENOENT) {
                snprintf(ctx->errors[ctx->req_type],
                         sizeof(ctx->errors[ctx->req_type]),
-                        "Firmware file \"%s\" not found\n", ctx->fwname);
+                        "Firmware file \"%s\" not found\n",
+                        ctx->fwname);
                return err;
        } else if (err) {
                snprintf(ctx->errors[ctx->req_type],
@@ -2144,14 +2171,15 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx,
                         ctx->fwname, err);
                return err;
        }
-       if (blob->size < sizeof(struct b43_fw_header))
+fw_ready:
+       if (ctx->blob->size < sizeof(struct b43_fw_header))
                goto err_format;
-       hdr = (struct b43_fw_header *)(blob->data);
+       hdr = (struct b43_fw_header *)(ctx->blob->data);
        switch (hdr->type) {
        case B43_FW_TYPE_UCODE:
        case B43_FW_TYPE_PCM:
                size = be32_to_cpu(hdr->size);
-               if (size != blob->size - sizeof(struct b43_fw_header))
+               if (size != ctx->blob->size - sizeof(struct b43_fw_header))
                        goto err_format;
                /* fallthrough */
        case B43_FW_TYPE_IV:
@@ -2162,7 +2190,7 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx,
                goto err_format;
        }
 
-       fw->data = blob;
+       fw->data = ctx->blob;
        fw->filename = name;
        fw->type = ctx->req_type;
 
@@ -2172,7 +2200,7 @@ err_format:
        snprintf(ctx->errors[ctx->req_type],
                 sizeof(ctx->errors[ctx->req_type]),
                 "Firmware file \"%s\" format error.\n", ctx->fwname);
-       release_firmware(blob);
+       release_firmware(ctx->blob);
 
        return -EPROTO;
 }
@@ -2223,7 +2251,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx)
                        goto err_no_ucode;
                }
        }
-       err = b43_do_request_fw(ctx, filename, &fw->ucode);
+       err = b43_do_request_fw(ctx, filename, &fw->ucode, true);
        if (err)
                goto err_load;
 
@@ -2235,7 +2263,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx)
        else
                goto err_no_pcm;
        fw->pcm_request_failed = false;
-       err = b43_do_request_fw(ctx, filename, &fw->pcm);
+       err = b43_do_request_fw(ctx, filename, &fw->pcm, false);
        if (err == -ENOENT) {
                /* We did not find a PCM file? Not fatal, but
                 * core rev <= 10 must do without hwcrypto then. */
@@ -2296,7 +2324,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx)
        default:
                goto err_no_initvals;
        }
-       err = b43_do_request_fw(ctx, filename, &fw->initvals);
+       err = b43_do_request_fw(ctx, filename, &fw->initvals, false);
        if (err)
                goto err_load;
 
@@ -2355,7 +2383,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx)
        default:
                goto err_no_initvals;
        }
-       err = b43_do_request_fw(ctx, filename, &fw->initvals_band);
+       err = b43_do_request_fw(ctx, filename, &fw->initvals_band, false);
        if (err)
                goto err_load;
 
index 8c684cd3352942ccaadcf843290d014cbb8599bd..abac25ee958dad54f140c550ef62ba05bf2bc3ae 100644 (file)
@@ -137,9 +137,8 @@ void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on);
 
 
 struct b43_request_fw_context;
-int b43_do_request_fw(struct b43_request_fw_context *ctx,
-                     const char *name,
-                     struct b43_firmware_file *fw);
+int b43_do_request_fw(struct b43_request_fw_context *ctx, const char *name,
+                     struct b43_firmware_file *fw, bool async);
 void b43_do_release_fw(struct b43_firmware_file *fw);
 
 #endif /* B43_MAIN_H_ */
index 1261a9b84e04aaf348df15e8bb2ad0e00a213255..75464ad4fbd188ce1fb135302539dfa02caa3fbb 100644 (file)
@@ -3091,10 +3091,11 @@ brcmf_configure_wpaie(struct net_device *ndev, struct brcmf_vs_tlv *wpa_ie,
 
        len = wpa_ie->len + TLV_HDR_LEN;
        data = (u8 *)wpa_ie;
-       offset = 0;
+       offset = TLV_HDR_LEN;
        if (!is_rsn_ie)
                offset += VS_IE_FIXED_HDR_LEN;
-       offset += WPA_IE_VERSION_LEN;
+       else
+               offset += WPA_IE_VERSION_LEN;
 
        /* check for multicast cipher suite */
        if (offset + WPA_IE_MIN_OUI_LEN > len) {
index 796836b0f4699ccf07cdb73bc1acdd6122b60e33..822781cf15d41900aabd941fe79956191e1328ed 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2012 Broadcom Corporation
+ * Copyright (c) 2012 Canonical Ltd.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
index 606b534347bc93984cb9aefb38acd6981f3af8de..21a824232478f2ac02d593495ac5fe82ff94df77 100644 (file)
@@ -1343,13 +1343,13 @@ static bool wlc_lcnphy_rx_iq_cal_gain(struct brcms_phy *pi, u16 biq1_gain,
 
        wlc_lcnphy_rx_gain_override_enable(pi, true);
        wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0);
-       usleep_range(500, 500);
+       udelay(500);
        write_radio_reg(pi, RADIO_2064_REG112, 0);
        if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l))
                return false;
 
        wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0);
-       usleep_range(500, 500);
+       udelay(500);
        write_radio_reg(pi, RADIO_2064_REG112, 0);
        if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h))
                return false;
index 844f201b7b70080b19c4e7ae70bc31f375214a7c..3e824b8fa83dcef94f59695110a72ffd2dfe7533 100644 (file)
@@ -11327,7 +11327,6 @@ static int ipw_up(struct ipw_priv *priv)
                if (!(priv->config & CFG_CUSTOM_MAC))
                        eeprom_parse_mac(priv, priv->mac_addr);
                memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
-               memcpy(priv->net_dev->perm_addr, priv->mac_addr, ETH_ALEN);
 
                ipw_set_geo(priv);
 
index d604b4036a764358e52bd2c2ca9d02bd24f14ce9..3726cd6fcd754812d65cb38d89782e96aace0de8 100644 (file)
@@ -3273,7 +3273,7 @@ il3945_store_measurement(struct device *d, struct device_attribute *attr,
 
        if (count) {
                char *p = buffer;
-               strncpy(buffer, buf, min(sizeof(buffer), count));
+               strlcpy(buffer, buf, sizeof(buffer));
                channel = simple_strtoul(p, NULL, 0);
                if (channel)
                        params.channel = channel;
index da21328ca8ed84e9e06e3aebde44fade0973e870..a790599fe2c219b63526a833c3db63ac09d84e84 100644 (file)
@@ -1151,13 +1151,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
                        next_reclaimed = ssn;
                }
 
-               if (tid != IWL_TID_NON_QOS) {
-                       priv->tid_data[sta_id][tid].next_reclaimed =
-                               next_reclaimed;
-                       IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d\n",
-                                                 next_reclaimed);
-               }
-
                iwl_trans_reclaim(priv->trans, txq_id, ssn, &skbs);
 
                iwlagn_check_ratid_empty(priv, sta_id, tid);
@@ -1208,11 +1201,28 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
                        if (!is_agg)
                                iwlagn_non_agg_tx_status(priv, ctx, hdr->addr1);
 
+                       /*
+                        * W/A for FW bug - the seq_ctl isn't updated when the
+                        * queues are flushed. Fetch it from the packet itself
+                        */
+                       if (!is_agg && status == TX_STATUS_FAIL_FIFO_FLUSHED) {
+                               next_reclaimed = le16_to_cpu(hdr->seq_ctrl);
+                               next_reclaimed =
+                                       SEQ_TO_SN(next_reclaimed + 0x10);
+                       }
+
                        is_offchannel_skb =
                                (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN);
                        freed++;
                }
 
+               if (tid != IWL_TID_NON_QOS) {
+                       priv->tid_data[sta_id][tid].next_reclaimed =
+                               next_reclaimed;
+                       IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d\n",
+                                          next_reclaimed);
+               }
+
                WARN_ON(!is_agg && freed != 1);
 
                /*
index dad4c4aad91f2a461cdebfc9ac879b51a36db827..8389cd38338ba70766561d13c35591e1073faca6 100644 (file)
@@ -1166,6 +1166,7 @@ static irqreturn_t iwl_pcie_isr(int irq, void *data)
        else if (test_bit(STATUS_INT_ENABLED, &trans_pcie->status) &&
                 !trans_pcie->inta)
                iwl_enable_interrupts(trans);
+       return IRQ_HANDLED;
 
 none:
        /* re-enable interrupts here since we don't have anything to service. */
index a875499f89452d7ab4a4307b72c0475d5829f470..ad3baa7e79827efe05a5e9b024e34955eed8f443 100644 (file)
@@ -1709,7 +1709,7 @@ static int mwifiex_set_ibss_params(struct mwifiex_private *priv,
                                                NL80211_CHAN_NO_HT)
                        config_bands |= BAND_GN;
        } else {
-               if (cfg80211_get_chandef_type(&params->chandef) !=
+               if (cfg80211_get_chandef_type(&params->chandef) ==
                                                NL80211_CHAN_NO_HT)
                        config_bands = BAND_A;
                else
@@ -2117,7 +2117,6 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
        dev->ieee80211_ptr = priv->wdev;
        dev->ieee80211_ptr->iftype = priv->bss_mode;
        memcpy(dev->dev_addr, wiphy->perm_addr, ETH_ALEN);
-       memcpy(dev->perm_addr, wiphy->perm_addr, ETH_ALEN);
        SET_NETDEV_DEV(dev, wiphy_dev(wiphy));
 
        dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
index cb682561c43898fd6f27c03ab3aba38adbf269d8..60e88b58039de129f060160f9e18baa49fde0a3d 100644 (file)
@@ -56,7 +56,6 @@ int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist,
  */
 int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
 {
-       bool cancel_flag = false;
        int status;
        struct cmd_ctrl_node *cmd_queued;
 
@@ -70,14 +69,11 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
        atomic_inc(&adapter->cmd_pending);
 
        /* Wait for completion */
-       wait_event_interruptible(adapter->cmd_wait_q.wait,
-                                *(cmd_queued->condition));
-       if (!*(cmd_queued->condition))
-               cancel_flag = true;
-
-       if (cancel_flag) {
-               mwifiex_cancel_pending_ioctl(adapter);
-               dev_dbg(adapter->dev, "cmd cancel\n");
+       status = wait_event_interruptible(adapter->cmd_wait_q.wait,
+                                         *(cmd_queued->condition));
+       if (status) {
+               dev_err(adapter->dev, "cmd_wait_q terminated: %d\n", status);
+               return status;
        }
 
        status = adapter->cmd_wait_q.status;
@@ -496,8 +492,11 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter)
                return false;
        }
 
-       wait_event_interruptible(adapter->hs_activate_wait_q,
-                                adapter->hs_activate_wait_q_woken);
+       if (wait_event_interruptible(adapter->hs_activate_wait_q,
+                                    adapter->hs_activate_wait_q_woken)) {
+               dev_err(adapter->dev, "hs_activate_wait_q terminated\n");
+               return false;
+       }
 
        return true;
 }
index f221b95b90b3c2935c67e9c272d5f1c2a89000d4..83564d36e801884bfb6d9c566653542dbe60cee4 100644 (file)
@@ -4250,9 +4250,11 @@ static int mwl8k_cmd_update_stadb_add(struct ieee80211_hw *hw,
        p->amsdu_enabled = 0;
 
        rc = mwl8k_post_cmd(hw, &cmd->header);
+       if (!rc)
+               rc = p->station_id;
        kfree(cmd);
 
-       return rc ? rc : p->station_id;
+       return rc;
 }
 
 static int mwl8k_cmd_update_stadb_del(struct ieee80211_hw *hw,
index 88e3ad2d1db8dea4d5e2fcdee52285e399644bcd..1e802f82ae49ab746ee670d05f4ed56143f1d43b 100644 (file)
@@ -2290,7 +2290,6 @@ int orinoco_if_add(struct orinoco_private *priv,
        netif_carrier_off(dev);
 
        memcpy(dev->dev_addr, wiphy->perm_addr, ETH_ALEN);
-       memcpy(dev->perm_addr, wiphy->perm_addr, ETH_ALEN);
 
        dev->base_addr = base_addr;
        dev->irq = irq;
index e71c702e2eb18e30640cd193307bb54569410b48..800a16526c8ea548b17d67ab0f7d30a50b0cc327 100644 (file)
@@ -47,6 +47,7 @@ static struct usb_device_id p54u_table[] = {
        {USB_DEVICE(0x0411, 0x0050)},   /* Buffalo WLI2-USB2-G54 */
        {USB_DEVICE(0x045e, 0x00c2)},   /* Microsoft MN-710 */
        {USB_DEVICE(0x0506, 0x0a11)},   /* 3COM 3CRWE254G72 */
+       {USB_DEVICE(0x0675, 0x0530)},   /* DrayTek Vigor 530 */
        {USB_DEVICE(0x06b9, 0x0120)},   /* Thomson SpeedTouch 120g */
        {USB_DEVICE(0x0707, 0xee06)},   /* SMC 2862W-G */
        {USB_DEVICE(0x07aa, 0x001c)},   /* Corega CG-WLUSB2GT */
@@ -82,6 +83,8 @@ static struct usb_device_id p54u_table[] = {
        {USB_DEVICE(0x06a9, 0x000e)},   /* Westell 802.11g USB (A90-211WG-01) */
        {USB_DEVICE(0x06b9, 0x0121)},   /* Thomson SpeedTouch 121g */
        {USB_DEVICE(0x0707, 0xee13)},   /* SMC 2862W-G version 2 */
+       {USB_DEVICE(0x0803, 0x4310)},   /* Zoom 4410a */
+       {USB_DEVICE(0x083a, 0x4503)},   /* T-Com Sinus 154 data II */
        {USB_DEVICE(0x083a, 0x4521)},   /* Siemens Gigaset USB Adapter 54 version 2 */
        {USB_DEVICE(0x083a, 0xc501)},   /* Zoom Wireless-G 4410 */
        {USB_DEVICE(0x083a, 0xf503)},   /* Accton FD7050E ver 1010ec  */
@@ -101,6 +104,7 @@ static struct usb_device_id p54u_table[] = {
        {USB_DEVICE(0x13B1, 0x000C)},   /* Linksys WUSB54AG */
        {USB_DEVICE(0x1413, 0x5400)},   /* Telsey 802.11g USB2.0 Adapter */
        {USB_DEVICE(0x1435, 0x0427)},   /* Inventel UR054G */
+       /* {USB_DEVICE(0x15a9, 0x0002)}, * Also SparkLAN WL-682 with 3887 */
        {USB_DEVICE(0x1668, 0x1050)},   /* Actiontec 802UIG-1 */
        {USB_DEVICE(0x1740, 0x1000)},   /* Senao NUB-350 */
        {USB_DEVICE(0x2001, 0x3704)},   /* DLink DWL-G122 rev A2 */
index 3deacafdcd5ed3c33c1384a9f5e84e4cd08517e8..4261e8ecc4c382d84a9b19c40d8fed2b463d5a5a 100644 (file)
@@ -743,6 +743,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
 
 done:
                bufferaddress = (*((dma_addr_t *)skb->cb));
+               if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
+                       return;
                tmp_one = 1;
                rtlpriv->cfg->ops->set_desc((u8 *) pdesc, false,
                                            HW_DESC_RXBUFF_ADDR,
@@ -1115,6 +1117,10 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw)
                                           PCI_DMA_FROMDEVICE);
 
                        bufferaddress = (*((dma_addr_t *)skb->cb));
+                       if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) {
+                               dev_kfree_skb_any(skb);
+                               return 1;
+                       }
                        rtlpriv->cfg->ops->set_desc((u8 *)entry, false,
                                                    HW_DESC_RXBUFF_ADDR,
                                                    (u8 *)&bufferaddress);
index 1d5d3604e3e03875f5e9ec4453ad2291c5de3c33..246e5352f2e15a850dbc7971c08bdbbcffbc7172 100644 (file)
@@ -692,7 +692,7 @@ u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
        if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
                rtl92c_phy_sw_chnl_callback(hw);
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
-                        "sw_chnl_inprogress false schdule workitem\n");
+                        "sw_chnl_inprogress false schedule workitem\n");
                rtlphy->sw_chnl_inprogress = false;
        } else {
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
index 173424756149b95d7d1bc9ea6eb9981fa6603130..c31795e379f7e16a1a5a208f10af3d994eff3b66 100644 (file)
@@ -611,8 +611,14 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
        dma_addr_t mapping = pci_map_single(rtlpci->pdev,
                                            skb->data, skb->len,
                                            PCI_DMA_TODEVICE);
+
        u8 bw_40 = 0;
 
+       if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+                        "DMA mapping error");
+               return;
+       }
        rcu_read_lock();
        sta = get_sta(hw, mac->vif, mac->bssid);
        if (mac->opmode == NL80211_IFTYPE_STATION) {
@@ -774,6 +780,11 @@ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
        __le16 fc = hdr->frame_control;
 
+       if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+                        "DMA mapping error");
+               return;
+       }
        CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
 
        if (firstseg)
index f9f3861046c1f6c4deb0a9454b872ca260618f16..a0fbf284420ec78b2570756dc4c1edd2638be057 100644 (file)
@@ -587,6 +587,11 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
        buf_len = skb->len;
        mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
                                 PCI_DMA_TODEVICE);
+       if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+                        "DMA mapping error");
+               return;
+       }
        CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_92d));
        if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
                firstseg = true;
@@ -740,6 +745,11 @@ void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw,
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
        __le16 fc = hdr->frame_control;
 
+       if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+                        "DMA mapping error");
+               return;
+       }
        CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
        if (firstseg)
                SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
index 0e9f6ebf078add38ded9595f6a454b8182148335..206561d7282f906a6662ce43610f87666362dbe3 100644 (file)
@@ -611,6 +611,11 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
                    PCI_DMA_TODEVICE);
        u8 bw_40 = 0;
 
+       if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+                        "DMA mapping error");
+               return;
+       }
        if (mac->opmode == NL80211_IFTYPE_STATION) {
                bw_40 = mac->bw_40;
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
@@ -763,6 +768,7 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
 void rtl92se_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
        bool firstseg, bool lastseg, struct sk_buff *skb)
 {
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        struct rtl_tcb_desc *tcb_desc = (struct rtl_tcb_desc *)(skb->cb);
@@ -770,7 +776,12 @@ void rtl92se_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
        dma_addr_t mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
                        PCI_DMA_TODEVICE);
 
-    /* Clear all status        */
+       if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+                        "DMA mapping error");
+               return;
+       }
+       /* Clear all status     */
        CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_CMDDESC_SIZE_RTL8192S);
 
        /* This bit indicate this packet is used for FW download. */
index 39cc7938eedfe44da35ea7a37134a705cfc4db5e..3d8536bb0d2bf5055c181d5d8f4b67d25153488b 100644 (file)
@@ -1106,7 +1106,7 @@ u8 rtl8723ae_phy_sw_chnl(struct ieee80211_hw *hw)
        if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
                rtl8723ae_phy_sw_chnl_callback(hw);
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
-                        "sw_chnl_inprogress false schdule workitem\n");
+                        "sw_chnl_inprogress false schedule workitem\n");
                rtlphy->sw_chnl_inprogress = false;
        } else {
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
index 87331d826d73aa6bda0b4ee4a1f9a7da16dc7639..a313be8c21d28d5708fdbc34e49f0db3fa7836a2 100644 (file)
@@ -387,6 +387,11 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
                                            PCI_DMA_TODEVICE);
        u8 bw_40 = 0;
 
+       if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+                        "DMA mapping error");
+               return;
+       }
        if (mac->opmode == NL80211_IFTYPE_STATION) {
                bw_40 = mac->bw_40;
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
@@ -542,6 +547,11 @@ void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
                                            PCI_DMA_TODEVICE);
        __le16 fc = hdr->frame_control;
 
+       if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+               RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+                        "DMA mapping error");
+               return;
+       }
        CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
 
        if (firstseg)
index 29f0969e4ba00cd3dd299c209ac09f594346b168..f2ecdeb3a90d441ee809af029a1db1c8dab80f48 100644 (file)
@@ -210,17 +210,16 @@ static void _usb_writeN_sync(struct rtl_priv *rtlpriv, u32 addr, void *data,
        u16 index = REALTEK_USB_VENQT_CMD_IDX;
        int pipe = usb_sndctrlpipe(udev, 0); /* write_out */
        u8 *buffer;
-       dma_addr_t dma_addr;
 
-       wvalue = (u16)(addr&0x0000ffff);
-       buffer = usb_alloc_coherent(udev, (size_t)len, GFP_ATOMIC, &dma_addr);
+       wvalue = (u16)(addr & 0x0000ffff);
+       buffer = kmalloc(len, GFP_ATOMIC);
        if (!buffer)
                return;
        memcpy(buffer, data, len);
        usb_control_msg(udev, pipe, request, reqtype, wvalue,
                        index, buffer, len, 50);
 
-       usb_free_coherent(udev, (size_t)len, buffer, dma_addr);
+       kfree(buffer);
 }
 
 static void _rtl_usb_io_handler_init(struct device *dev,
@@ -640,6 +639,7 @@ static int _rtl_usb_receive(struct ieee80211_hw *hw)
                        RT_TRACE(rtlpriv, COMP_USB, DBG_EMERG,
                                 "Failed to prep_rx_urb!!\n");
                        err = PTR_ERR(skb);
+                       usb_free_urb(urb);
                        goto err_out;
                }
 
index b7d41f8c338a8372cea8bfe6649386c6a0d8b090..f733cae3d4b643618cec69f4aeadd84044eff7bd 100644 (file)
@@ -238,6 +238,8 @@ static const struct net_device_ops xenvif_netdev_ops = {
        .ndo_stop       = xenvif_close,
        .ndo_change_mtu = xenvif_change_mtu,
        .ndo_fix_features = xenvif_fix_features,
+       .ndo_set_mac_address = eth_mac_addr,
+       .ndo_validate_addr   = eth_validate_addr,
 };
 
 struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
index c26e28b4bd9f985a4d7c6d3307d969bb671bf6f7..7ffa43bd7cf9e9f3b1fc43f83d0ec4c53b355765 100644 (file)
@@ -1015,29 +1015,10 @@ err:
                i = xennet_fill_frags(np, skb, &tmpq);
 
                /*
-                * Truesize approximates the size of true data plus
-                * any supervisor overheads. Adding hypervisor
-                * overheads has been shown to significantly reduce
-                * achievable bandwidth with the default receive
-                * buffer size. It is therefore not wise to account
-                * for it here.
-                *
-                * After alloc_skb(RX_COPY_THRESHOLD), truesize is set
-                * to RX_COPY_THRESHOLD + the supervisor
-                * overheads. Here, we add the size of the data pulled
-                * in xennet_fill_frags().
-                *
-                * We also adjust for any unused space in the main
-                * data area by subtracting (RX_COPY_THRESHOLD -
-                * len). This is especially important with drivers
-                * which split incoming packets into header and data,
-                * using only 66 bytes of the main data area (see the
-                * e1000 driver for example.)  On such systems,
-                * without this last adjustement, our achievable
-                * receive throughout using the standard receive
-                * buffer size was cut by 25%(!!!).
-                */
-               skb->truesize += skb->data_len - RX_COPY_THRESHOLD;
+                 * Truesize is the actual allocation size, even if the
+                 * allocation is only partially used.
+                 */
+               skb->truesize += PAGE_SIZE * skb_shinfo(skb)->nr_frags;
                skb->len += skb->data_len;
 
                if (rx->flags & XEN_NETRXF_csum_blank)
index 7da9071b68b60669c7d24441dee721b1c82c87fd..2a9c8d93d2e8a302e8db87b91160e7fdd301a77d 100644 (file)
@@ -361,8 +361,8 @@ static struct nfc_phy_ops i2c_phy_ops = {
        .disable = pn544_hci_i2c_disable,
 };
 
-static int __devinit pn544_hci_i2c_probe(struct i2c_client *client,
-                                    const struct i2c_device_id *id)
+static int pn544_hci_i2c_probe(struct i2c_client *client,
+                              const struct i2c_device_id *id)
 {
        struct pn544_i2c_phy *phy;
        struct pn544_nfc_platform_data *pdata;
@@ -442,7 +442,7 @@ err_phy_alloc:
        return r;
 }
 
-static __devexit int pn544_hci_i2c_remove(struct i2c_client *client)
+static int pn544_hci_i2c_remove(struct i2c_client *client)
 {
        struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
        struct pn544_nfc_platform_data *pdata = client->dev.platform_data;
@@ -469,7 +469,7 @@ static struct i2c_driver pn544_hci_i2c_driver = {
                  },
        .probe = pn544_hci_i2c_probe,
        .id_table = pn544_hci_i2c_id_table,
-       .remove = __devexit_p(pn544_hci_i2c_remove),
+       .remove = pn544_hci_i2c_remove,
 };
 
 static int __init pn544_hci_i2c_init(void)
index 83ca06f4312b8214e721dd21065f47b79032ab26..e3a8b22ef9dd04fcdefb80e34b4cfb1a92fb1382 100644 (file)
@@ -157,7 +157,7 @@ struct phy_device *of_phy_connect(struct net_device *dev,
        if (!phy)
                return NULL;
 
-       return phy_connect_direct(dev, phy, hndlr, flags, iface) ? NULL : phy;
+       return phy_connect_direct(dev, phy, hndlr, iface) ? NULL : phy;
 }
 EXPORT_SYMBOL(of_phy_connect);
 
@@ -194,7 +194,7 @@ struct phy_device *of_phy_connect_fixed_link(struct net_device *dev,
 
        sprintf(bus_id, PHY_ID_FMT, "fixed-0", be32_to_cpu(phy_id[0]));
 
-       phy = phy_connect(dev, bus_id, hndlr, 0, iface);
+       phy = phy_connect(dev, bus_id, hndlr, iface);
        return IS_ERR(phy) ? NULL : phy;
 }
 EXPORT_SYMBOL(of_phy_connect_fixed_link);
index fb6a1fe21b931c861424a3829dedef4ee083cef2..8e4e86b78428da19302e02d36203deac21a909e8 100644 (file)
@@ -430,7 +430,7 @@ static void dino_choose_irq(struct parisc_device *dev, void *ctrl)
  * Cirrus 6832 Cardbus reports wrong irq on RDI Tadpole PARISC Laptop (deller@gmx.de)
  * (the irqs are off-by-one, not sure yet if this is a cirrus, dino-hardware or dino-driver problem...)
  */
-static void __devinit quirk_cirrus_cardbus(struct pci_dev *dev)
+static void quirk_cirrus_cardbus(struct pci_dev *dev)
 {
        u8 new_irq = dev->irq - 1;
        printk(KERN_INFO "PCI: Cirrus Cardbus IRQ fixup for %s, from %d to %d\n",
index fdd63a6a62d6b4532da27a1a7ed7cd0ab7857c0c..2ef7103270bb7eb250ae15e16650c17a46a643d7 100644 (file)
@@ -34,7 +34,7 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/spinlock.h>
-#include <linux/init.h>                /* for __init and __devinit */
+#include <linux/init.h>                /* for __init */
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/slab.h>
index 352f96180bc71f848464b6f9a9a5ad914d92004d..050773c368238d0d6fe7ffdd53db1e3ecc5ebc62 100644 (file)
@@ -137,7 +137,7 @@ struct parport_operations parport_gsc_ops =
 /*
  * Checks for port existence, all ports support SPP MODE
  */
-static int __devinit parport_SPP_supported(struct parport *pb)
+static int parport_SPP_supported(struct parport *pb)
 {
        unsigned char r, w;
 
@@ -201,7 +201,7 @@ static int __devinit parport_SPP_supported(struct parport *pb)
  * be misdetected here is rather academic. 
  */
 
-static int __devinit parport_PS2_supported(struct parport *pb)
+static int parport_PS2_supported(struct parport *pb)
 {
        int ok = 0;
   
@@ -232,10 +232,9 @@ static int __devinit parport_PS2_supported(struct parport *pb)
 
 /* --- Initialisation code -------------------------------- */
 
-struct parport *__devinit parport_gsc_probe_port (unsigned long base,
-                                                unsigned long base_hi,
-                                                int irq, int dma,
-                                                struct pci_dev *dev)
+struct parport *parport_gsc_probe_port(unsigned long base,
+                                      unsigned long base_hi, int irq,
+                                      int dma, struct pci_dev *dev)
 {
        struct parport_gsc_private *priv;
        struct parport_operations *ops;
@@ -345,9 +344,9 @@ struct parport *__devinit parport_gsc_probe_port (unsigned long base,
 
 #define PARPORT_GSC_OFFSET 0x800
 
-static int __devinitdata parport_count;
+static int parport_count;
 
-static int __devinit parport_init_chip(struct parisc_device *dev)
+static int parport_init_chip(struct parisc_device *dev)
 {
        struct parport *p;
        unsigned long port;
@@ -382,7 +381,7 @@ static int __devinit parport_init_chip(struct parisc_device *dev)
        return 0;
 }
 
-static int __devexit parport_remove_chip(struct parisc_device *dev)
+static int parport_remove_chip(struct parisc_device *dev)
 {
        struct parport *p = dev_get_drvdata(&dev->dev);
        if (p) {
@@ -415,15 +414,15 @@ static struct parisc_driver parport_driver = {
        .name           = "Parallel",
        .id_table       = parport_tbl,
        .probe          = parport_init_chip,
-       .remove         = __devexit_p(parport_remove_chip),
+       .remove         = parport_remove_chip,
 };
 
-int __devinit parport_gsc_init(void)
+int parport_gsc_init(void)
 {
        return register_parisc_driver(&parport_driver);
 }
 
-static void __devexit parport_gsc_exit(void)
+static void parport_gsc_exit(void)
 {
        unregister_parisc_driver(&parport_driver);
 }
index 5abffe58a9d2108c2e4fc8aa66ef39fc7bcfee33..903e1285fda06ce30c84bf79b44078e733048c38 100644 (file)
@@ -953,7 +953,7 @@ static struct superio_struct *find_free_superio(void)
 
 
 /* Super-IO chipset detection, Winbond, SMSC */
-static void __devinit show_parconfig_smsc37c669(int io, int key)
+static void show_parconfig_smsc37c669(int io, int key)
 {
        int cr1, cr4, cra, cr23, cr26, cr27;
        struct superio_struct *s;
@@ -1038,7 +1038,7 @@ static void __devinit show_parconfig_smsc37c669(int io, int key)
 }
 
 
-static void __devinit show_parconfig_winbond(int io, int key)
+static void show_parconfig_winbond(int io, int key)
 {
        int cr30, cr60, cr61, cr70, cr74, crf0;
        struct superio_struct *s;
@@ -1106,8 +1106,7 @@ static void __devinit show_parconfig_winbond(int io, int key)
        }
 }
 
-static void __devinit decode_winbond(int efer, int key, int devid,
-                                                       int devrev, int oldid)
+static void decode_winbond(int efer, int key, int devid, int devrev, int oldid)
 {
        const char *type = "unknown";
        int id, progif = 2;
@@ -1159,7 +1158,7 @@ static void __devinit decode_winbond(int efer, int key, int devid,
                show_parconfig_winbond(efer, key);
 }
 
-static void __devinit decode_smsc(int efer, int key, int devid, int devrev)
+static void decode_smsc(int efer, int key, int devid, int devrev)
 {
        const char *type = "unknown";
        void (*func)(int io, int key);
@@ -1193,7 +1192,7 @@ static void __devinit decode_smsc(int efer, int key, int devid, int devrev)
 }
 
 
-static void __devinit winbond_check(int io, int key)
+static void winbond_check(int io, int key)
 {
        int origval, devid, devrev, oldid, x_devid, x_devrev, x_oldid;
 
@@ -1231,7 +1230,7 @@ out:
        release_region(io, 3);
 }
 
-static void __devinit winbond_check2(int io, int key)
+static void winbond_check2(int io, int key)
 {
        int origval[3], devid, devrev, oldid, x_devid, x_devrev, x_oldid;
 
@@ -1272,7 +1271,7 @@ out:
        release_region(io, 3);
 }
 
-static void __devinit smsc_check(int io, int key)
+static void smsc_check(int io, int key)
 {
        int origval, id, rev, oldid, oldrev, x_id, x_rev, x_oldid, x_oldrev;
 
@@ -1316,7 +1315,7 @@ out:
 }
 
 
-static void __devinit detect_and_report_winbond(void)
+static void detect_and_report_winbond(void)
 {
        if (verbose_probing)
                printk(KERN_DEBUG "Winbond Super-IO detection, now testing ports 3F0,370,250,4E,2E ...\n");
@@ -1329,7 +1328,7 @@ static void __devinit detect_and_report_winbond(void)
        winbond_check2(0x250, 0x89);
 }
 
-static void __devinit detect_and_report_smsc(void)
+static void detect_and_report_smsc(void)
 {
        if (verbose_probing)
                printk(KERN_DEBUG "SMSC Super-IO detection, now testing Ports 2F0, 370 ...\n");
@@ -1339,7 +1338,7 @@ static void __devinit detect_and_report_smsc(void)
        smsc_check(0x370, 0x44);
 }
 
-static void __devinit detect_and_report_it87(void)
+static void detect_and_report_it87(void)
 {
        u16 dev;
        u8 origval, r;
@@ -1796,24 +1795,24 @@ static int parport_ECPEPP_supported(struct parport *pb)
 #else /* No IEEE 1284 support */
 
 /* Don't bother probing for modes we know we won't use. */
-static int __devinit parport_PS2_supported(struct parport *pb) { return 0; }
+static int parport_PS2_supported(struct parport *pb) { return 0; }
 #ifdef CONFIG_PARPORT_PC_FIFO
 static int parport_ECP_supported(struct parport *pb)
 {
        return 0;
 }
 #endif
-static int __devinit parport_EPP_supported(struct parport *pb)
+static int parport_EPP_supported(struct parport *pb)
 {
        return 0;
 }
 
-static int __devinit parport_ECPEPP_supported(struct parport *pb)
+static int parport_ECPEPP_supported(struct parport *pb)
 {
        return 0;
 }
 
-static int __devinit parport_ECPPS2_supported(struct parport *pb)
+static int parport_ECPPS2_supported(struct parport *pb)
 {
        return 0;
 }
@@ -2269,9 +2268,8 @@ EXPORT_SYMBOL(parport_pc_unregister_port);
 #ifdef CONFIG_PCI
 
 /* ITE support maintained by Rich Liu <richliu@poorman.org> */
-static int __devinit sio_ite_8872_probe(struct pci_dev *pdev, int autoirq,
-                                        int autodma,
-                                        const struct parport_pc_via_data *via)
+static int sio_ite_8872_probe(struct pci_dev *pdev, int autoirq, int autodma,
+                             const struct parport_pc_via_data *via)
 {
        short inta_addr[6] = { 0x2A0, 0x2C0, 0x220, 0x240, 0x1E0 };
        u32 ite8872set;
@@ -2377,10 +2375,10 @@ static int __devinit sio_ite_8872_probe(struct pci_dev *pdev, int autoirq,
 
 /* VIA 8231 support by Pavel Fedin <sonic_amiga@rambler.ru>
    based on VIA 686a support code by Jeff Garzik <jgarzik@pobox.com> */
-static int __devinitdata parport_init_mode;
+static int parport_init_mode;
 
 /* Data for two known VIA chips */
-static struct parport_pc_via_data via_686a_data __devinitdata = {
+static struct parport_pc_via_data via_686a_data = {
        0x51,
        0x50,
        0x85,
@@ -2389,7 +2387,7 @@ static struct parport_pc_via_data via_686a_data __devinitdata = {
        0xF0,
        0xE6
 };
-static struct parport_pc_via_data via_8231_data __devinitdata = {
+static struct parport_pc_via_data via_8231_data = {
        0x45,
        0x44,
        0x50,
@@ -2399,9 +2397,8 @@ static struct parport_pc_via_data via_8231_data __devinitdata = {
        0xF6
 };
 
-static int __devinit sio_via_probe(struct pci_dev *pdev, int autoirq,
-                                   int autodma,
-                                   const struct parport_pc_via_data *via)
+static int sio_via_probe(struct pci_dev *pdev, int autoirq, int autodma,
+                        const struct parport_pc_via_data *via)
 {
        u8 tmp, tmp2, siofunc;
        u8 ppcontrol = 0;
@@ -2575,7 +2572,7 @@ static struct parport_pc_superio {
        int (*probe) (struct pci_dev *pdev, int autoirq, int autodma,
                      const struct parport_pc_via_data *via);
        const struct parport_pc_via_data *via;
-} parport_pc_superio_info[] __devinitdata = {
+} parport_pc_superio_info[] = {
        { sio_via_probe, &via_686a_data, },
        { sio_via_probe, &via_8231_data, },
        { sio_ite_8872_probe, NULL, },
@@ -2860,7 +2857,7 @@ static int parport_pc_pci_probe(struct pci_dev *dev,
        return -ENODEV;
 }
 
-static void __devexit parport_pc_pci_remove(struct pci_dev *dev)
+static void parport_pc_pci_remove(struct pci_dev *dev)
 {
        struct pci_parport_data *data = pci_get_drvdata(dev);
        int i;
@@ -2879,7 +2876,7 @@ static struct pci_driver parport_pc_pci_driver = {
        .name           = "parport_pc",
        .id_table       = parport_pc_pci_tbl,
        .probe          = parport_pc_pci_probe,
-       .remove         = __devexit_p(parport_pc_pci_remove),
+       .remove         = parport_pc_pci_remove,
 };
 
 static int __init parport_pc_init_superio(int autoirq, int autodma)
@@ -2983,7 +2980,7 @@ static struct pnp_driver parport_pc_pnp_driver = {
 static struct pnp_driver parport_pc_pnp_driver;
 #endif /* CONFIG_PNP */
 
-static int __devinit parport_pc_platform_probe(struct platform_device *pdev)
+static int parport_pc_platform_probe(struct platform_device *pdev)
 {
        /* Always succeed, the actual probing is done in
         * parport_pc_probe_port(). */
@@ -2999,7 +2996,7 @@ static struct platform_driver parport_pc_platform_driver = {
 };
 
 /* This is called by parport_pc_find_nonpci_ports (in asm/parport.h) */
-static int __devinit __attribute__((unused))
+static int __attribute__((unused))
 parport_pc_find_isa_ports(int autoirq, int autodma)
 {
        int count = 0;
index 1631eeaf440e5bf29b33463ba5c65cb2d6da49de..ef6169adb845072fc73396a4d49a2ac45c472bfc 100644 (file)
@@ -87,7 +87,8 @@ struct parport_pc_pci {
                                struct parport_pc_pci *card, int failed);
 };
 
-static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *par, int autoirq, int autodma)
+static int netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *par,
+                               int autoirq, int autodma)
 {
        /* the rule described below doesn't hold for this device */
        if (dev->device == PCI_DEVICE_ID_NETMOS_9835 &&
@@ -111,7 +112,7 @@ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc
        return 0;
 }
 
-static struct parport_pc_pci cards[] __devinitdata = {
+static struct parport_pc_pci cards[] = {
        /* titan_110l */                { 1, { { 3, -1 }, } },
        /* titan_210l */                { 1, { { 3, -1 }, } },
        /* netmos_9xx5_combo */         { 1, { { 2, -1 }, }, netmos_parallel_init },
@@ -258,7 +259,7 @@ MODULE_DEVICE_TABLE(pci,parport_serial_pci_tbl);
  * Cards not tested are marked n/t
  * If you have one of these cards and it works for you, please tell me..
  */
-static struct pciserial_board pci_parport_serial_boards[] __devinitdata = {
+static struct pciserial_board pci_parport_serial_boards[] = {
        [titan_110l] = {
                .flags          = FL_BASE1 | FL_BASE_BARS,
                .num_ports      = 1,
@@ -479,8 +480,7 @@ struct parport_serial_private {
 };
 
 /* Register the serial port(s) of a PCI card. */
-static int __devinit serial_register (struct pci_dev *dev,
-                                     const struct pci_device_id *id)
+static int serial_register(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct parport_serial_private *priv = pci_get_drvdata (dev);
        struct pciserial_board *board;
@@ -501,8 +501,7 @@ static int __devinit serial_register (struct pci_dev *dev,
 }
 
 /* Register the parallel port(s) of a PCI card. */
-static int __devinit parport_register (struct pci_dev *dev,
-                                      const struct pci_device_id *id)
+static int parport_register(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct parport_pc_pci *card;
        struct parport_serial_private *priv = pci_get_drvdata (dev);
@@ -563,8 +562,8 @@ static int __devinit parport_register (struct pci_dev *dev,
        return 0;
 }
 
-static int __devinit parport_serial_pci_probe (struct pci_dev *dev,
-                                              const struct pci_device_id *id)
+static int parport_serial_pci_probe(struct pci_dev *dev,
+                                   const struct pci_device_id *id)
 {
        struct parport_serial_private *priv;
        int err;
@@ -599,7 +598,7 @@ static int __devinit parport_serial_pci_probe (struct pci_dev *dev,
        return 0;
 }
 
-static void __devexit parport_serial_pci_remove (struct pci_dev *dev)
+static void parport_serial_pci_remove(struct pci_dev *dev)
 {
        struct parport_serial_private *priv = pci_get_drvdata (dev);
        int i;
@@ -664,7 +663,7 @@ static struct pci_driver parport_serial_pci_driver = {
        .name           = "parport_serial",
        .id_table       = parport_serial_pci_tbl,
        .probe          = parport_serial_pci_probe,
-       .remove         = __devexit_p(parport_serial_pci_remove),
+       .remove         = parport_serial_pci_remove,
 #ifdef CONFIG_PM
        .suspend        = parport_serial_pci_suspend,
        .resume         = parport_serial_pci_resume,
index 983a2d2df6595d908c371460fc5b0ca57ca07786..5c4b6a1db6cad94e078d0a60489832b265fc5fea 100644 (file)
@@ -265,7 +265,7 @@ static struct parport_operations parport_sunbpp_ops =
        .owner          = THIS_MODULE,
 };
 
-static int __devinit bpp_probe(struct platform_device *op)
+static int bpp_probe(struct platform_device *op)
 {
        struct parport_operations *ops;
        struct bpp_regs __iomem *regs;
@@ -330,7 +330,7 @@ out_unmap:
        return err;
 }
 
-static int __devexit bpp_remove(struct platform_device *op)
+static int bpp_remove(struct platform_device *op)
 {
        struct parport *p = dev_get_drvdata(&op->dev);
        struct parport_operations *ops = p->ops;
@@ -367,7 +367,7 @@ static struct platform_driver bpp_sbus_driver = {
                .of_match_table = bpp_match,
        },
        .probe          = bpp_probe,
-       .remove         = __devexit_p(bpp_remove),
+       .remove         = bpp_remove,
 };
 
 module_platform_driver(bpp_sbus_driver);
index bafd2bbcaf6541d1983fababa4563ae174837e15..c18e5bf444faa693d41c6a9103ef7ab8982b07da 100644 (file)
@@ -739,7 +739,7 @@ EXPORT_SYMBOL_GPL(pci_num_vf);
 /**
  * pci_sriov_set_totalvfs -- reduce the TotalVFs available
  * @dev: the PCI PF device
- * numvfs: number that should be used for TotalVFs supported
+ * @numvfs: number that should be used for TotalVFs supported
  *
  * Should be called from PF driver's probe routine with
  * device's mutex held.
index 05b78b16d20bdca1acb822e7654360102fb09072..9c6e9bb674ec54835d40e09b6c77d0683cd9265d 100644 (file)
@@ -422,77 +422,60 @@ static ssize_t sriov_numvfs_show(struct device *dev,
 }
 
 /*
- * num_vfs > 0; number of vfs to enable
- * num_vfs = 0; disable all vfs
+ * num_vfs > 0; number of VFs to enable
+ * num_vfs = 0; disable all VFs
  *
  * Note: SRIOV spec doesn't allow partial VF
- *       disable, so its all or none.
+ *       disable, so it's all or none.
  */
 static ssize_t sriov_numvfs_store(struct device *dev,
                                  struct device_attribute *attr,
                                  const char *buf, size_t count)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
-       int num_vfs_enabled = 0;
-       int num_vfs;
-       int ret = 0;
-       u16 total;
+       int ret;
+       u16 num_vfs;
 
-       if (kstrtoint(buf, 0, &num_vfs) < 0)
-               return -EINVAL;
+       ret = kstrtou16(buf, 0, &num_vfs);
+       if (ret < 0)
+               return ret;
+
+       if (num_vfs > pci_sriov_get_totalvfs(pdev))
+               return -ERANGE;
+
+       if (num_vfs == pdev->sriov->num_VFs)
+               return count;           /* no change */
 
        /* is PF driver loaded w/callback */
        if (!pdev->driver || !pdev->driver->sriov_configure) {
-               dev_info(&pdev->dev,
-                        "Driver doesn't support SRIOV configuration via sysfs\n");
+               dev_info(&pdev->dev, "Driver doesn't support SRIOV configuration via sysfs\n");
                return -ENOSYS;
        }
 
-       /* if enabling vf's ... */
-       total = pci_sriov_get_totalvfs(pdev);
-       /* Requested VFs to enable < totalvfs and none enabled already */
-       if ((num_vfs > 0) && (num_vfs <= total)) {
-               if (pdev->sriov->num_VFs == 0) {
-                       num_vfs_enabled =
-                               pdev->driver->sriov_configure(pdev, num_vfs);
-                       if ((num_vfs_enabled >= 0) &&
-                           (num_vfs_enabled != num_vfs)) {
-                               dev_warn(&pdev->dev,
-                                        "Only %d VFs enabled\n",
-                                        num_vfs_enabled);
-                               return count;
-                       } else if (num_vfs_enabled < 0)
-                               /* error code from driver callback */
-                               return num_vfs_enabled;
-               } else if (num_vfs == pdev->sriov->num_VFs) {
-                       dev_warn(&pdev->dev,
-                                "%d VFs already enabled; no enable action taken\n",
-                                num_vfs);
-                       return count;
-               } else {
-                       dev_warn(&pdev->dev,
-                                "%d VFs already enabled. Disable before enabling %d VFs\n",
-                                pdev->sriov->num_VFs, num_vfs);
-                       return -EINVAL;
-               }
+       if (num_vfs == 0) {
+               /* disable VFs */
+               ret = pdev->driver->sriov_configure(pdev, 0);
+               if (ret < 0)
+                       return ret;
+               return count;
        }
 
-       /* disable vfs */
-       if (num_vfs == 0) {
-               if (pdev->sriov->num_VFs != 0) {
-                       ret = pdev->driver->sriov_configure(pdev, 0);
-                       return ret ? ret : count;
-               } else {
-                       dev_warn(&pdev->dev,
-                                "All VFs disabled; no disable action taken\n");
-                       return count;
-               }
+       /* enable VFs */
+       if (pdev->sriov->num_VFs) {
+               dev_warn(&pdev->dev, "%d VFs already enabled. Disable before enabling %d VFs\n",
+                        pdev->sriov->num_VFs, num_vfs);
+               return -EBUSY;
        }
 
-       dev_err(&pdev->dev,
-               "Invalid value for number of VFs to enable: %d\n", num_vfs);
+       ret = pdev->driver->sriov_configure(pdev, num_vfs);
+       if (ret < 0)
+               return ret;
 
-       return -EINVAL;
+       if (ret != num_vfs)
+               dev_warn(&pdev->dev, "%d VFs requested; only %d enabled\n",
+                        num_vfs, ret);
+
+       return count;
 }
 
 static struct device_attribute sriov_totalvfs_attr = __ATTR_RO(sriov_totalvfs);
index d4824cb78b499c950c6f3f27aace03ff7a5fa53d..08c243ab034e9bc9172dfd593f4cb0ceabbe2f60 100644 (file)
@@ -134,10 +134,28 @@ static int pcie_port_runtime_resume(struct device *dev)
        return 0;
 }
 
+static int pci_dev_pme_poll(struct pci_dev *pdev, void *data)
+{
+       bool *pme_poll = data;
+
+       if (pdev->pme_poll)
+               *pme_poll = true;
+       return 0;
+}
+
 static int pcie_port_runtime_idle(struct device *dev)
 {
+       struct pci_dev *pdev = to_pci_dev(dev);
+       bool pme_poll = false;
+
+       /*
+        * If any subordinate device needs pme poll, we should keep
+        * the port in D0, because we need port in D0 to poll it.
+        */
+       pci_walk_bus(pdev->subordinate, pci_dev_pme_poll, &pme_poll);
        /* Delay for a short while to prevent too frequent suspend/resume */
-       pm_schedule_suspend(dev, 10);
+       if (!pme_poll)
+               pm_schedule_suspend(dev, 10);
        return -EBUSY;
 }
 #else
index 8f7a6344e79e4ca31f7db08ac63a2d4f168649e1..0369fb6fc1da412d2f55d8346d2dca0a9424b158 100644 (file)
@@ -2725,7 +2725,7 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
        if (PCI_FUNC(dev->devfn))
                return;
        /*
-        * RICOH 0xe823 SD/MMC card reader fails to recognize
+        * RICOH 0xe822 and 0xe823 SD/MMC card readers fail to recognize
         * certain types of SD/MMC cards. Lowering the SD base
         * clock frequency from 200Mhz to 50Mhz fixes this issue.
         *
@@ -2736,7 +2736,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
         * 0xf9  - Key register for 0x150
         * 0xfc  - key register for 0xe1
         */
-       if (dev->device == PCI_DEVICE_ID_RICOH_R5CE823) {
+       if (dev->device == PCI_DEVICE_ID_RICOH_R5CE822 ||
+           dev->device == PCI_DEVICE_ID_RICOH_R5CE823) {
                pci_write_config_byte(dev, 0xf9, 0xfc);
                pci_write_config_byte(dev, 0x150, 0x10);
                pci_write_config_byte(dev, 0xf9, 0x00);
@@ -2763,6 +2764,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
 DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE822, ricoh_mmc_fixup_r5c832);
+DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE822, ricoh_mmc_fixup_r5c832);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
 DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
 #endif /*CONFIG_MMC_RICOH_MMC*/
index 5cdee8669ea35a8221e17c364e50df0d4c90c781..59f5a965bdc40ad47e566bc1969f236ba06d8689 100644 (file)
@@ -700,7 +700,7 @@ static struct pinctrl *create_pinctrl(struct device *dev)
                }
        }
 
-       /* Add the pinmux to the global list */
+       /* Add the pinctrl handle to the global list */
        list_add_tail(&p->node, &pinctrl_list);
 
        return p;
index c907647de6addcb79b00c6cb20679bcd2d686df5..48e21a2294830f4ad3379ae3f6973bb944e82962 100644 (file)
@@ -367,7 +367,7 @@ static struct mvebu_mpp_mode mv88f6710_mpp_modes[] = {
 
 static struct mvebu_pinctrl_soc_info armada_370_pinctrl_info;
 
-static struct of_device_id armada_370_pinctrl_of_match[] __devinitdata = {
+static struct of_device_id armada_370_pinctrl_of_match[] = {
        { .compatible = "marvell,mv88f6710-pinctrl" },
        { },
 };
@@ -382,7 +382,7 @@ static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = {
        MPP_GPIO_RANGE(2,  64, 64,  2),
 };
 
-static int __devinit armada_370_pinctrl_probe(struct platform_device *pdev)
+static int armada_370_pinctrl_probe(struct platform_device *pdev)
 {
        struct mvebu_pinctrl_soc_info *soc = &armada_370_pinctrl_info;
 
@@ -399,7 +399,7 @@ static int __devinit armada_370_pinctrl_probe(struct platform_device *pdev)
        return mvebu_pinctrl_probe(pdev);
 }
 
-static int __devexit armada_370_pinctrl_remove(struct platform_device *pdev)
+static int armada_370_pinctrl_remove(struct platform_device *pdev)
 {
        return mvebu_pinctrl_remove(pdev);
 }
@@ -411,7 +411,7 @@ static struct platform_driver armada_370_pinctrl_driver = {
                .of_match_table = of_match_ptr(armada_370_pinctrl_of_match),
        },
        .probe = armada_370_pinctrl_probe,
-       .remove = __devexit_p(armada_370_pinctrl_remove),
+       .remove = armada_370_pinctrl_remove,
 };
 
 module_platform_driver(armada_370_pinctrl_driver);
index 40bd52a46b4edc4e4b74a51100c432781ca9ff3a..ab5dc04b3e8a1fc961a1766461f06c67e002cb2f 100644 (file)
@@ -349,7 +349,7 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = {
 
 static struct mvebu_pinctrl_soc_info armada_xp_pinctrl_info;
 
-static struct of_device_id armada_xp_pinctrl_of_match[] __devinitdata = {
+static struct of_device_id armada_xp_pinctrl_of_match[] = {
        {
                .compatible = "marvell,mv78230-pinctrl",
                .data       = (void *) V_MV78230,
@@ -394,7 +394,7 @@ static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = {
        MPP_GPIO_RANGE(2,  64, 64,  3),
 };
 
-static int __devinit armada_xp_pinctrl_probe(struct platform_device *pdev)
+static int armada_xp_pinctrl_probe(struct platform_device *pdev)
 {
        struct mvebu_pinctrl_soc_info *soc = &armada_xp_pinctrl_info;
        const struct of_device_id *match =
@@ -446,7 +446,7 @@ static int __devinit armada_xp_pinctrl_probe(struct platform_device *pdev)
        return mvebu_pinctrl_probe(pdev);
 }
 
-static int __devexit armada_xp_pinctrl_remove(struct platform_device *pdev)
+static int armada_xp_pinctrl_remove(struct platform_device *pdev)
 {
        return mvebu_pinctrl_remove(pdev);
 }
@@ -458,7 +458,7 @@ static struct platform_driver armada_xp_pinctrl_driver = {
                .of_match_table = of_match_ptr(armada_xp_pinctrl_of_match),
        },
        .probe = armada_xp_pinctrl_probe,
-       .remove = __devexit_p(armada_xp_pinctrl_remove),
+       .remove = armada_xp_pinctrl_remove,
 };
 
 module_platform_driver(armada_xp_pinctrl_driver);
index 40c9c3eecd94560e4cc816dc1d1a2461d36616ef..69aba3697287d02e749fc5c27155c026518601b7 100644 (file)
@@ -579,12 +579,12 @@ static struct mvebu_pinctrl_soc_info dove_pinctrl_info = {
 
 static struct clk *clk;
 
-static struct of_device_id dove_pinctrl_of_match[] __devinitdata = {
+static struct of_device_id dove_pinctrl_of_match[] = {
        { .compatible = "marvell,dove-pinctrl", .data = &dove_pinctrl_info },
        { }
 };
 
-static int __devinit dove_pinctrl_probe(struct platform_device *pdev)
+static int dove_pinctrl_probe(struct platform_device *pdev)
 {
        const struct of_device_id *match =
                of_match_device(dove_pinctrl_of_match, &pdev->dev);
@@ -595,13 +595,16 @@ static int __devinit dove_pinctrl_probe(struct platform_device *pdev)
         * grab clk to make sure it is ticking.
         */
        clk = devm_clk_get(&pdev->dev, NULL);
-       if (!IS_ERR(clk))
-               clk_prepare_enable(clk);
+       if (IS_ERR(clk)) {
+               dev_err(&pdev->dev, "Unable to get pdma clock");
+               return PTR_RET(clk);
+       }
+       clk_prepare_enable(clk);
 
        return mvebu_pinctrl_probe(pdev);
 }
 
-static int __devexit dove_pinctrl_remove(struct platform_device *pdev)
+static int dove_pinctrl_remove(struct platform_device *pdev)
 {
        int ret;
 
@@ -618,7 +621,7 @@ static struct platform_driver dove_pinctrl_driver = {
                .of_match_table = of_match_ptr(dove_pinctrl_of_match),
        },
        .probe = dove_pinctrl_probe,
-       .remove = __devexit_p(dove_pinctrl_remove),
+       .remove = dove_pinctrl_remove,
 };
 
 module_platform_driver(dove_pinctrl_driver);
index fa6ce31c94d9c3f74eab91de2b16db361370c283..f12084e180579afe19cb3914ff8d4e4db7573eed 100644 (file)
@@ -444,7 +444,7 @@ static struct mvebu_pinctrl_soc_info mv98dx4122_info = {
        .ngpioranges = ARRAY_SIZE(mv88f628x_gpio_ranges),
 };
 
-static struct of_device_id kirkwood_pinctrl_of_match[] __devinitdata = {
+static struct of_device_id kirkwood_pinctrl_of_match[] = {
        { .compatible = "marvell,88f6180-pinctrl", .data = &mv88f6180_info },
        { .compatible = "marvell,88f6190-pinctrl", .data = &mv88f6190_info },
        { .compatible = "marvell,88f6192-pinctrl", .data = &mv88f6192_info },
@@ -454,7 +454,7 @@ static struct of_device_id kirkwood_pinctrl_of_match[] __devinitdata = {
        { }
 };
 
-static int __devinit kirkwood_pinctrl_probe(struct platform_device *pdev)
+static int kirkwood_pinctrl_probe(struct platform_device *pdev)
 {
        const struct of_device_id *match =
                of_match_device(kirkwood_pinctrl_of_match, &pdev->dev);
@@ -462,7 +462,7 @@ static int __devinit kirkwood_pinctrl_probe(struct platform_device *pdev)
        return mvebu_pinctrl_probe(pdev);
 }
 
-static int __devexit kirkwood_pinctrl_remove(struct platform_device *pdev)
+static int kirkwood_pinctrl_remove(struct platform_device *pdev)
 {
        return mvebu_pinctrl_remove(pdev);
 }
@@ -474,7 +474,7 @@ static struct platform_driver kirkwood_pinctrl_driver = {
                .of_match_table = of_match_ptr(kirkwood_pinctrl_of_match),
        },
        .probe = kirkwood_pinctrl_probe,
-       .remove = __devexit_p(kirkwood_pinctrl_remove),
+       .remove = kirkwood_pinctrl_remove,
 };
 
 module_platform_driver(kirkwood_pinctrl_driver);
index 6c44b7e8964c48678d806f59a784da5c025ac993..c689c04a4f523248e9b2712e77d7e041f5b074d7 100644 (file)
@@ -478,8 +478,7 @@ static struct pinctrl_ops mvebu_pinctrl_ops = {
        .dt_free_map = mvebu_pinctrl_dt_free_map,
 };
 
-static int __devinit _add_function(struct mvebu_pinctrl_function *funcs,
-                                  const char *name)
+static int _add_function(struct mvebu_pinctrl_function *funcs, const char *name)
 {
        while (funcs->num_groups) {
                /* function already there */
@@ -494,8 +493,8 @@ static int __devinit _add_function(struct mvebu_pinctrl_function *funcs,
        return 0;
 }
 
-static int __devinit mvebu_pinctrl_build_functions(struct platform_device *pdev,
-                                                  struct mvebu_pinctrl *pctl)
+static int mvebu_pinctrl_build_functions(struct platform_device *pdev,
+                                        struct mvebu_pinctrl *pctl)
 {
        struct mvebu_pinctrl_function *funcs;
        int num = 0;
@@ -568,7 +567,7 @@ static int __devinit mvebu_pinctrl_build_functions(struct platform_device *pdev,
        return 0;
 }
 
-int __devinit mvebu_pinctrl_probe(struct platform_device *pdev)
+int mvebu_pinctrl_probe(struct platform_device *pdev)
 {
        struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
        struct device_node *np = pdev->dev.of_node;
@@ -745,7 +744,7 @@ int __devinit mvebu_pinctrl_probe(struct platform_device *pdev)
        return 0;
 }
 
-int __devexit mvebu_pinctrl_remove(struct platform_device *pdev)
+int mvebu_pinctrl_remove(struct platform_device *pdev)
 {
        struct mvebu_pinctrl *pctl = platform_get_drvdata(pdev);
        pinctrl_unregister(pctl->pctldev);
index c5e757157183de6ae7e084c46d82baec8fd7db4b..471c71f7f8b611fb87e0d2330627801b5124288d 100644 (file)
@@ -265,7 +265,7 @@ static int at91_dt_node_to_map(struct pinctrl_dev *pctldev,
        /* create mux map */
        parent = of_get_parent(np);
        if (!parent) {
-               kfree(new_map);
+               devm_kfree(pctldev->dev, new_map);
                return -EINVAL;
        }
        new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
@@ -792,8 +792,8 @@ static struct pinctrl_desc at91_pinctrl_desc = {
 
 static const char *gpio_compat = "atmel,at91rm9200-gpio";
 
-static void __devinit at91_pinctrl_child_count(struct at91_pinctrl *info,
-                                             struct device_node *np)
+static void at91_pinctrl_child_count(struct at91_pinctrl *info,
+                                    struct device_node *np)
 {
        struct device_node *child;
 
@@ -807,8 +807,8 @@ static void __devinit at91_pinctrl_child_count(struct at91_pinctrl *info,
        }
 }
 
-static int __devinit at91_pinctrl_mux_mask(struct at91_pinctrl *info,
-                                         struct device_node *np)
+static int at91_pinctrl_mux_mask(struct at91_pinctrl *info,
+                                struct device_node *np)
 {
        int ret = 0;
        int size;
@@ -840,10 +840,9 @@ static int __devinit at91_pinctrl_mux_mask(struct at91_pinctrl *info,
        return ret;
 }
 
-static int __devinit at91_pinctrl_parse_groups(struct device_node *np,
-                               struct at91_pin_group *grp,
-                               struct at91_pinctrl *info,
-                               u32 index)
+static int at91_pinctrl_parse_groups(struct device_node *np,
+                                    struct at91_pin_group *grp,
+                                    struct at91_pinctrl *info, u32 index)
 {
        struct at91_pmx_pin *pin;
        int size;
@@ -889,8 +888,8 @@ static int __devinit at91_pinctrl_parse_groups(struct device_node *np,
        return 0;
 }
 
-static int __devinit at91_pinctrl_parse_functions(struct device_node *np,
-                       struct at91_pinctrl *info, u32 index)
+static int at91_pinctrl_parse_functions(struct device_node *np,
+                                       struct at91_pinctrl *info, u32 index)
 {
        struct device_node *child;
        struct at91_pmx_func *func;
@@ -926,14 +925,14 @@ static int __devinit at91_pinctrl_parse_functions(struct device_node *np,
        return 0;
 }
 
-static struct of_device_id at91_pinctrl_of_match[] __devinitdata = {
+static struct of_device_id at91_pinctrl_of_match[] = {
        { .compatible = "atmel,at91sam9x5-pinctrl", .data = &at91sam9x5_ops },
        { .compatible = "atmel,at91rm9200-pinctrl", .data = &at91rm9200_ops },
        { /* sentinel */ }
 };
 
-static int __devinit at91_pinctrl_probe_dt(struct platform_device *pdev,
-                                          struct at91_pinctrl *info)
+static int at91_pinctrl_probe_dt(struct platform_device *pdev,
+                                struct at91_pinctrl *info)
 {
        int ret = 0;
        int i, j;
@@ -999,7 +998,7 @@ static int __devinit at91_pinctrl_probe_dt(struct platform_device *pdev,
        return 0;
 }
 
-static int __devinit at91_pinctrl_probe(struct platform_device *pdev)
+static int at91_pinctrl_probe(struct platform_device *pdev)
 {
        struct at91_pinctrl *info;
        struct pinctrl_pin_desc *pdesc;
@@ -1063,7 +1062,7 @@ err:
        return ret;
 }
 
-static int __devexit at91_pinctrl_remove(struct platform_device *pdev)
+static int at91_pinctrl_remove(struct platform_device *pdev)
 {
        struct at91_pinctrl *info = platform_get_drvdata(pdev);
 
@@ -1443,7 +1442,7 @@ static struct gpio_chip at91_gpio_template = {
        .ngpio                  = MAX_NB_GPIO_PER_BANK,
 };
 
-static void __devinit at91_gpio_probe_fixup(void)
+static void at91_gpio_probe_fixup(void)
 {
        unsigned i;
        struct at91_gpio_chip *at91_gpio, *last = NULL;
@@ -1461,13 +1460,13 @@ static void __devinit at91_gpio_probe_fixup(void)
        }
 }
 
-static struct of_device_id at91_gpio_of_match[] __devinitdata = {
+static struct of_device_id at91_gpio_of_match[] = {
        { .compatible = "atmel,at91sam9x5-gpio", .data = &at91sam9x5_ops, },
        { .compatible = "atmel,at91rm9200-gpio", .data = &at91rm9200_ops },
        { /* sentinel */ }
 };
 
-static int __devinit at91_gpio_probe(struct platform_device *pdev)
+static int at91_gpio_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct resource *res;
@@ -1609,7 +1608,7 @@ static struct platform_driver at91_pinctrl_driver = {
                .of_match_table = of_match_ptr(at91_pinctrl_of_match),
        },
        .probe = at91_pinctrl_probe,
-       .remove = __devexit_p(at91_pinctrl_remove),
+       .remove = at91_pinctrl_remove,
 };
 
 static int __init at91_pinctrl_init(void)
index 0b0e9b49a1b5c168d745f54ec901d7a5e2ae657e..d347b9f2eae305f810b4232cd16f274ac4231ada 100644 (file)
@@ -936,7 +936,7 @@ static struct pinctrl_gpio_range bcm2835_pinctrl_gpio_range = {
        .npins = BCM2835_NUM_GPIOS,
 };
 
-static int __devinit bcm2835_pinctrl_probe(struct platform_device *pdev)
+static int bcm2835_pinctrl_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
index 07db89528dc3601a13c1b54b02463cb95a12a202..de05b64f0da695708f2c5ef201c5438c96946d88 100644 (file)
@@ -842,7 +842,7 @@ static int __init exynos5440_gpiolib_unregister(struct platform_device *pdev,
        return 0;
 }
 
-static int __devinit exynos5440_pinctrl_probe(struct platform_device *pdev)
+static int exynos5440_pinctrl_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct exynos5440_pinctrl_priv_data *priv;
index 131d86d7c2a5ec0229f8c3d34acfffdbaaaf44f1..43a6f1ffc786eee9c01580b60dd986739a8d4d57 100644 (file)
@@ -425,10 +425,10 @@ static int imx_pinctrl_get_pin_id_and_mux(const struct imx_pinctrl_soc_info *inf
        return 0;
 }
 
-static int __devinit imx_pinctrl_parse_groups(struct device_node *np,
-                               struct imx_pin_group *grp,
-                               struct imx_pinctrl_soc_info *info,
-                               u32 index)
+static int imx_pinctrl_parse_groups(struct device_node *np,
+                                   struct imx_pin_group *grp,
+                                   struct imx_pinctrl_soc_info *info,
+                                   u32 index)
 {
        unsigned int pin_func_id;
        int ret, size;
@@ -482,8 +482,9 @@ static int __devinit imx_pinctrl_parse_groups(struct device_node *np,
        return 0;
 }
 
-static int __devinit imx_pinctrl_parse_functions(struct device_node *np,
-                       struct imx_pinctrl_soc_info *info, u32 index)
+static int imx_pinctrl_parse_functions(struct device_node *np,
+                                      struct imx_pinctrl_soc_info *info,
+                                      u32 index)
 {
        struct device_node *child;
        struct imx_pmx_func *func;
@@ -517,7 +518,7 @@ static int __devinit imx_pinctrl_parse_functions(struct device_node *np,
        return 0;
 }
 
-static int __devinit imx_pinctrl_probe_dt(struct platform_device *pdev,
+static int imx_pinctrl_probe_dt(struct platform_device *pdev,
                                struct imx_pinctrl_soc_info *info)
 {
        struct device_node *np = pdev->dev.of_node;
@@ -560,8 +561,8 @@ static int __devinit imx_pinctrl_probe_dt(struct platform_device *pdev,
        return 0;
 }
 
-int __devinit imx_pinctrl_probe(struct platform_device *pdev,
-                               struct imx_pinctrl_soc_info *info)
+int imx_pinctrl_probe(struct platform_device *pdev,
+                     struct imx_pinctrl_soc_info *info)
 {
        struct imx_pinctrl *ipctl;
        struct resource *res;
index 04364f7822b78a6c9589808f733bb10c2e0f0691..e76d75c9d1ba5635dbbddf70fc6c53a0c9898afa 100644 (file)
@@ -267,7 +267,7 @@ static struct mxs_pinctrl_soc_data imx23_pinctrl_data = {
        .npins = ARRAY_SIZE(imx23_pins),
 };
 
-static int __devinit imx23_pinctrl_probe(struct platform_device *pdev)
+static int imx23_pinctrl_probe(struct platform_device *pdev)
 {
        return mxs_pinctrl_probe(pdev, &imx23_pinctrl_data);
 }
index e1af2ba89004700e3ef27b3d24d72a9d673df542..79c9c8d296af8b1e67e5c05c2e7963b4307c8c24 100644 (file)
@@ -383,7 +383,7 @@ static struct mxs_pinctrl_soc_data imx28_pinctrl_data = {
        .npins = ARRAY_SIZE(imx28_pins),
 };
 
-static int __devinit imx28_pinctrl_probe(struct platform_device *pdev)
+static int imx28_pinctrl_probe(struct platform_device *pdev)
 {
        return mxs_pinctrl_probe(pdev, &imx28_pinctrl_data);
 }
index 1dbf5278acecf9d8979f1e425b5aa1470c262ab9..6e214110e3d5253833c57f0be8489e464a85f8cb 100644 (file)
@@ -1564,7 +1564,7 @@ static struct of_device_id imx35_pinctrl_of_match[] = {
        { /* sentinel */ }
 };
 
-static int __devinit imx35_pinctrl_probe(struct platform_device *pdev)
+static int imx35_pinctrl_probe(struct platform_device *pdev)
 {
        return imx_pinctrl_probe(pdev, &imx35_pinctrl_info);
 }
index 131216558a7b32b4d871b8aa4d5cfc83e98d86d4..9a92aaad150fd2db544a9053c182d75bc4ced7f0 100644 (file)
@@ -1291,7 +1291,7 @@ static struct of_device_id imx51_pinctrl_of_match[] = {
        { /* sentinel */ }
 };
 
-static int __devinit imx51_pinctrl_probe(struct platform_device *pdev)
+static int imx51_pinctrl_probe(struct platform_device *pdev)
 {
        return imx_pinctrl_probe(pdev, &imx51_pinctrl_info);
 }
index ec404869177573e86ce8be7798526ef724d8c284..2c9c8e2334da2524f9d9127375cbc7456cda6aae 100644 (file)
@@ -1371,7 +1371,7 @@ static struct imx_pin_reg imx53_pin_regs[] = {
        IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 0, 0x7F8, 1), /* MX53_PAD_GPIO_8__ESAI1_TX5_RX0 */
        IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 1, 0x000, 0), /* MX53_PAD_GPIO_8__GPIO1_8 */
        IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 2, 0x000, 0), /* MX53_PAD_GPIO_8__EPIT2_EPITO */
-       IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 3, 0x760, 3), /* MX53_PAD_GPIO_8__CAN1_RXCAN */
+       IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 3, 0x760, 2), /* MX53_PAD_GPIO_8__CAN1_RXCAN */
        IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 4, 0x880, 5), /* MX53_PAD_GPIO_8__UART2_RXD_MUX */
        IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 5, 0x000, 0), /* MX53_PAD_GPIO_8__FIRI_TXD */
        IMX_PIN_REG(MX53_PAD_GPIO_8, 0x6C8, 0x338, 6, 0x000, 0), /* MX53_PAD_GPIO_8__SPDIF_SRCLK */
@@ -1618,7 +1618,7 @@ static struct of_device_id imx53_pinctrl_of_match[] = {
        { /* sentinel */ }
 };
 
-static int __devinit imx53_pinctrl_probe(struct platform_device *pdev)
+static int imx53_pinctrl_probe(struct platform_device *pdev)
 {
        return imx_pinctrl_probe(pdev, &imx53_pinctrl_info);
 }
index 844ab13c93a3254c5048e2aa60ec0f3cc0c0af06..663346bb765e756bd96189dfd189bb5e2f620d09 100644 (file)
@@ -2302,7 +2302,7 @@ static struct of_device_id imx6q_pinctrl_of_match[] = {
        { /* sentinel */ }
 };
 
-static int __devinit imx6q_pinctrl_probe(struct platform_device *pdev)
+static int imx6q_pinctrl_probe(struct platform_device *pdev)
 {
        return imx_pinctrl_probe(pdev, &imx6q_pinctrl_info);
 }
index 4fbb3db3f1c1688b146e2a91e657926a426c1e37..4afa56a3a51dd140965e68d88a0161d70c1de378 100644 (file)
@@ -686,7 +686,7 @@ static struct pxa3xx_pinmux_info mmp2_info = {
        .ds_shift       = MMP2_DS_SHIFT,
 };
 
-static int __devinit mmp2_pinmux_probe(struct platform_device *pdev)
+static int mmp2_pinmux_probe(struct platform_device *pdev)
 {
        return pxa3xx_pinctrl_register(pdev, &mmp2_info);
 }
index 180f16379ec1430af6a3a431ea8588d21290a881..dd227d21dcf28563c1d0902d51fa8a3b8140aeed 100644 (file)
@@ -335,9 +335,9 @@ static struct pinctrl_desc mxs_pinctrl_desc = {
        .owner = THIS_MODULE,
 };
 
-static int __devinit mxs_pinctrl_parse_group(struct platform_device *pdev,
-                                            struct device_node *np, int idx,
-                                            const char **out_name)
+static int mxs_pinctrl_parse_group(struct platform_device *pdev,
+                                  struct device_node *np, int idx,
+                                  const char **out_name)
 {
        struct mxs_pinctrl_data *d = platform_get_drvdata(pdev);
        struct mxs_group *g = &d->soc->groups[idx];
@@ -384,8 +384,8 @@ static int __devinit mxs_pinctrl_parse_group(struct platform_device *pdev,
        return 0;
 }
 
-static int __devinit mxs_pinctrl_probe_dt(struct platform_device *pdev,
-                                         struct mxs_pinctrl_data *d)
+static int mxs_pinctrl_probe_dt(struct platform_device *pdev,
+                               struct mxs_pinctrl_data *d)
 {
        struct mxs_pinctrl_soc_data *soc = d->soc;
        struct device_node *np = pdev->dev.of_node;
@@ -476,8 +476,8 @@ static int __devinit mxs_pinctrl_probe_dt(struct platform_device *pdev,
        return 0;
 }
 
-int __devinit mxs_pinctrl_probe(struct platform_device *pdev,
-                               struct mxs_pinctrl_soc_data *soc)
+int mxs_pinctrl_probe(struct platform_device *pdev,
+                     struct mxs_pinctrl_soc_data *soc)
 {
        struct device_node *np = pdev->dev.of_node;
        struct mxs_pinctrl_data *d;
index 7d88ae35211976f2db4372aa6d377822651524d4..30b4da91ef7ee8d4679513efe39ce6bd7e572700 100644 (file)
@@ -1251,8 +1251,7 @@ static const struct nmk_pinctrl_soc_data nmk_db8500_soc = {
        .prcm_gpiocr_registers = db8500_prcm_gpiocr_regs,
 };
 
-void __devinit
-nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc)
+void nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc)
 {
        *soc = &nmk_db8500_soc;
 }
index bb6a4016322aa7daa1ee7063127557cb5eb52a1d..d7ba5443bae05593fe71dc5f54e2b9dbc9369c0a 100644 (file)
@@ -1260,8 +1260,7 @@ static const struct nmk_pinctrl_soc_data nmk_db8540_soc = {
        .prcm_gpiocr_registers = db8540_prcm_gpiocr_regs,
 };
 
-void __devinit
-nmk_pinctrl_db8540_init(const struct nmk_pinctrl_soc_data **soc)
+void nmk_pinctrl_db8540_init(const struct nmk_pinctrl_soc_data **soc)
 {
        *soc = &nmk_db8540_soc;
 }
index 7d432c3bc3590f2f85f803584a6f0d93d4496eb3..924a3393fa82b4dce3799e62bebbc9748b98fdde 100644 (file)
@@ -350,8 +350,7 @@ static const struct nmk_pinctrl_soc_data nmk_stn8815_soc = {
        .ngroups = ARRAY_SIZE(nmk_stn8815_groups),
 };
 
-void __devinit
-nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc)
+void nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc)
 {
        *soc = &nmk_stn8815_soc;
 }
index ef66f98e9202c28b2b13ede8fac9bd5d7d3e55bc..1bb16ffb4e41a9d0f252fc8a563188f97f343642 100644 (file)
@@ -259,6 +259,9 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
        const struct prcm_gpiocr_altcx_pin_desc *pin_desc;
        const u16 *gpiocr_regs;
 
+       if (!npct->prcm_base)
+               return;
+
        if (alt_num > PRCM_IDX_GPIOCR_ALTC_MAX) {
                dev_err(npct->dev, "PRCM GPIOCR: alternate-C%i is invalid\n",
                        alt_num);
@@ -682,6 +685,9 @@ static int nmk_prcm_gpiocr_get_mode(struct pinctrl_dev *pctldev, int gpio)
        const struct prcm_gpiocr_altcx_pin_desc *pin_desc;
        const u16 *gpiocr_regs;
 
+       if (!npct->prcm_base)
+               return NMK_GPIO_ALT_C;
+
        for (i = 0; i < npct->soc->npins_altcx; i++) {
                if (npct->soc->altcx_pins[i].pin == gpio)
                        break;
@@ -1306,7 +1312,7 @@ const struct irq_domain_ops nmk_gpio_irq_simple_ops = {
        .xlate = irq_domain_xlate_twocell,
 };
 
-static int __devinit nmk_gpio_probe(struct platform_device *dev)
+static int nmk_gpio_probe(struct platform_device *dev)
 {
        struct nmk_gpio_platform_data *pdata = dev->dev.platform_data;
        struct device_node *np = dev->dev.of_node;
@@ -1846,7 +1852,7 @@ static const struct of_device_id nmk_pinctrl_match[] = {
        {},
 };
 
-static int __devinit nmk_pinctrl_probe(struct platform_device *pdev)
+static int nmk_pinctrl_probe(struct platform_device *pdev)
 {
        const struct platform_device_id *platid = platform_get_device_id(pdev);
        struct device_node *np = pdev->dev.of_node;
@@ -1887,9 +1893,12 @@ static int __devinit nmk_pinctrl_probe(struct platform_device *pdev)
                                "failed to ioremap PRCM registers\n");
                        return -ENOMEM;
                }
-       } else {
+       } else if (version == PINCTRL_NMK_STN8815) {
                dev_info(&pdev->dev,
                         "No PRCM base, assume no ALT-Cx control is available\n");
+       } else {
+               dev_err(&pdev->dev, "missing PRCM base address\n");
+               return -EINVAL;
        }
 
        /*
index cb771e4a63550cca944104d81179829d68c47f50..d9cd2b457484d53159b09c88c669663211e627e1 100644 (file)
@@ -615,7 +615,7 @@ static struct pxa3xx_pinmux_info pxa168_info = {
        .ds_shift       = PXA168_DS_SHIFT,
 };
 
-static int __devinit pxa168_pinmux_probe(struct platform_device *pdev)
+static int pxa168_pinmux_probe(struct platform_device *pdev)
 {
        return pxa3xx_pinctrl_register(pdev, &pxa168_info);
 }
index 5fecd221b830ae21841ba9dd162248e2cf36aa7c..a2f917b847fba7d1d84e746ffff2d5fc19906515 100644 (file)
@@ -971,7 +971,7 @@ static struct pxa3xx_pinmux_info pxa910_info = {
        .ds_shift       = PXA910_DS_SHIFT,
 };
 
-static int __devinit pxa910_pinmux_probe(struct platform_device *pdev)
+static int pxa910_pinmux_probe(struct platform_device *pdev)
 {
        return pxa3xx_pinctrl_register(pdev, &pxa910_info);
 }
index 864fed822f9dc1f5839cb359f0475022510e3efc..fd7b24cd89084d923dd2cc1cc2a581695a040deb 100644 (file)
@@ -549,9 +549,11 @@ static int samsung_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
  * Parse the pin names listed in the 'samsung,pins' property and convert it
  * into a list of gpio numbers are create a pin group from it.
  */
-static int __devinit samsung_pinctrl_parse_dt_pins(struct platform_device *pdev,
-                       struct device_node *cfg_np, struct pinctrl_desc *pctl,
-                       unsigned int **pin_list, unsigned int *npins)
+static int samsung_pinctrl_parse_dt_pins(struct platform_device *pdev,
+                                        struct device_node *cfg_np,
+                                        struct pinctrl_desc *pctl,
+                                        unsigned int **pin_list,
+                                        unsigned int *npins)
 {
        struct device *dev = &pdev->dev;
        struct property *prop;
@@ -596,8 +598,8 @@ static int __devinit samsung_pinctrl_parse_dt_pins(struct platform_device *pdev,
  * from device node of the pin-controller. A pin group is formed with all
  * the pins listed in the "samsung,pins" property.
  */
-static int __devinit samsung_pinctrl_parse_dt(struct platform_device *pdev,
-                               struct samsung_pinctrl_drv_data *drvdata)
+static int samsung_pinctrl_parse_dt(struct platform_device *pdev,
+                                   struct samsung_pinctrl_drv_data *drvdata)
 {
        struct device *dev = &pdev->dev;
        struct device_node *dev_np = dev->of_node;
@@ -691,8 +693,8 @@ static int __devinit samsung_pinctrl_parse_dt(struct platform_device *pdev,
 }
 
 /* register the pinctrl interface with the pinctrl subsystem */
-static int __devinit samsung_pinctrl_register(struct platform_device *pdev,
-                               struct samsung_pinctrl_drv_data *drvdata)
+static int samsung_pinctrl_register(struct platform_device *pdev,
+                                   struct samsung_pinctrl_drv_data *drvdata)
 {
        struct pinctrl_desc *ctrldesc = &drvdata->pctl;
        struct pinctrl_pin_desc *pindesc, *pdesc;
@@ -778,8 +780,8 @@ static const struct gpio_chip samsung_gpiolib_chip = {
 };
 
 /* register the gpiolib interface with the gpiolib subsystem */
-static int __devinit samsung_gpiolib_register(struct platform_device *pdev,
-                               struct samsung_pinctrl_drv_data *drvdata)
+static int samsung_gpiolib_register(struct platform_device *pdev,
+                                   struct samsung_pinctrl_drv_data *drvdata)
 {
        struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
        struct samsung_pin_bank *bank = ctrl->pin_banks;
@@ -816,8 +818,8 @@ fail:
 }
 
 /* unregister the gpiolib interface with the gpiolib subsystem */
-static int __devinit samsung_gpiolib_unregister(struct platform_device *pdev,
-                               struct samsung_pinctrl_drv_data *drvdata)
+static int samsung_gpiolib_unregister(struct platform_device *pdev,
+                                     struct samsung_pinctrl_drv_data *drvdata)
 {
        struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
        struct samsung_pin_bank *bank = ctrl->pin_banks;
@@ -881,7 +883,7 @@ static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
        return ctrl;
 }
 
-static int __devinit samsung_pinctrl_probe(struct platform_device *pdev)
+static int samsung_pinctrl_probe(struct platform_device *pdev)
 {
        struct samsung_pinctrl_drv_data *drvdata;
        struct device *dev = &pdev->dev;
index 79642831bba2ecc1524f0b884dde808170ca9e16..f6a360b86eb6465fef029e777147ccbd3bc95b66 100644 (file)
@@ -493,7 +493,7 @@ static struct pinconf_ops pcs_pinconf_ops = {
  * @pcs: pcs driver instance
  * @offset: register offset from base
  */
-static int __devinit pcs_add_pin(struct pcs_device *pcs, unsigned offset)
+static int pcs_add_pin(struct pcs_device *pcs, unsigned offset)
 {
        struct pinctrl_pin_desc *pin;
        struct pcs_name *pn;
@@ -526,7 +526,7 @@ static int __devinit pcs_add_pin(struct pcs_device *pcs, unsigned offset)
  * If your hardware needs holes in the address space, then just set
  * up multiple driver instances.
  */
-static int __devinit pcs_allocate_pin_table(struct pcs_device *pcs)
+static int pcs_allocate_pin_table(struct pcs_device *pcs)
 {
        int mux_bytes, nr_pins, i;
 
@@ -907,8 +907,7 @@ static void pcs_free_resources(struct pcs_device *pcs)
 
 static struct of_device_id pcs_of_match[];
 
-static int __devinit pcs_add_gpio_range(struct device_node *node,
-                                       struct pcs_device *pcs)
+static int pcs_add_gpio_range(struct device_node *node, struct pcs_device *pcs)
 {
        struct pcs_gpio_range *gpio;
        struct device_node *child;
@@ -951,7 +950,7 @@ static int __devinit pcs_add_gpio_range(struct device_node *node,
        return 0;
 }
 
-static int __devinit pcs_probe(struct platform_device *pdev)
+static int pcs_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        const struct of_device_id *match;
index a4f0c5e487d5eae6c2b1f29c5aebf596df2f40d2..498b2ba905deb897791e032baf992e4459b88b7e 100644 (file)
@@ -1246,7 +1246,7 @@ static void __iomem *sirfsoc_rsc_of_iomap(void)
        return of_iomap(np, 0);
 }
 
-static int __devinit sirfsoc_pinmux_probe(struct platform_device *pdev)
+static int sirfsoc_pinmux_probe(struct platform_device *pdev)
 {
        int ret;
        struct sirfsoc_pmx *spmx;
@@ -1663,7 +1663,45 @@ const struct irq_domain_ops sirfsoc_gpio_irq_simple_ops = {
        .xlate = irq_domain_xlate_twocell,
 };
 
-static int __devinit sirfsoc_gpio_probe(struct device_node *np)
+static void sirfsoc_gpio_set_pullup(const u32 *pullups)
+{
+       int i, n;
+       const unsigned long *p = (const unsigned long *)pullups;
+
+       for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) {
+               n = find_first_bit(p + i, BITS_PER_LONG);
+               while (n < BITS_PER_LONG) {
+                       u32 offset = SIRFSOC_GPIO_CTRL(i, n);
+                       u32 val = readl(sgpio_bank[i].chip.regs + offset);
+                       val |= SIRFSOC_GPIO_CTL_PULL_MASK;
+                       val |= SIRFSOC_GPIO_CTL_PULL_HIGH;
+                       writel(val, sgpio_bank[i].chip.regs + offset);
+
+                       n = find_next_bit(p + i, BITS_PER_LONG, n + 1);
+               }
+       }
+}
+
+static void sirfsoc_gpio_set_pulldown(const u32 *pulldowns)
+{
+       int i, n;
+       const unsigned long *p = (const unsigned long *)pulldowns;
+
+       for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) {
+               n = find_first_bit(p + i, BITS_PER_LONG);
+               while (n < BITS_PER_LONG) {
+                       u32 offset = SIRFSOC_GPIO_CTRL(i, n);
+                       u32 val = readl(sgpio_bank[i].chip.regs + offset);
+                       val |= SIRFSOC_GPIO_CTL_PULL_MASK;
+                       val &= ~SIRFSOC_GPIO_CTL_PULL_HIGH;
+                       writel(val, sgpio_bank[i].chip.regs + offset);
+
+                       n = find_next_bit(p + i, BITS_PER_LONG, n + 1);
+               }
+       }
+}
+
+static int sirfsoc_gpio_probe(struct device_node *np)
 {
        int i, err = 0;
        struct sirfsoc_gpio_bank *bank;
@@ -1671,6 +1709,8 @@ static int __devinit sirfsoc_gpio_probe(struct device_node *np)
        struct platform_device *pdev;
        bool is_marco = false;
 
+       u32 pullups[SIRFSOC_GPIO_NO_OF_BANKS], pulldowns[SIRFSOC_GPIO_NO_OF_BANKS];
+
        pdev = of_find_device_by_node(np);
        if (!pdev)
                return -ENODEV;
@@ -1726,6 +1766,14 @@ static int __devinit sirfsoc_gpio_probe(struct device_node *np)
                irq_set_handler_data(bank->parent_irq, bank);
        }
 
+       if (!of_property_read_u32_array(np, "sirf,pullups", pullups,
+               SIRFSOC_GPIO_NO_OF_BANKS))
+               sirfsoc_gpio_set_pullup(pullups);
+
+       if (!of_property_read_u32_array(np, "sirf,pulldowns", pulldowns,
+               SIRFSOC_GPIO_NO_OF_BANKS))
+               sirfsoc_gpio_set_pulldown(pulldowns);
+
        return 0;
 
 out:
index e356b0380fa74985d1f2bc311c6cc476d4bfb187..ae1e4bb3259da953b448df78d31df92b79fa8a9b 100644 (file)
@@ -687,7 +687,7 @@ static struct pinctrl_desc tegra_pinctrl_desc = {
        .owner = THIS_MODULE,
 };
 
-int __devinit tegra_pinctrl_probe(struct platform_device *pdev,
+int tegra_pinctrl_probe(struct platform_device *pdev,
                        const struct tegra_pinctrl_soc_data *soc_data)
 {
        struct tegra_pmx *pmx;
index 1524bfd666028d9d638bb09d747f4c065c24f4d9..e848189038f0654dce86ed020075ff3ddddbc107 100644 (file)
@@ -2856,7 +2856,7 @@ static const struct tegra_pinctrl_soc_data tegra20_pinctrl = {
        .ngroups = ARRAY_SIZE(tegra20_groups),
 };
 
-static int __devinit tegra20_pinctrl_probe(struct platform_device *pdev)
+static int tegra20_pinctrl_probe(struct platform_device *pdev)
 {
        return tegra_pinctrl_probe(pdev, &tegra20_pinctrl);
 }
index cf579ebf346f9c1b6a5ffebefbe576e16f304f4a..9ad87ea735d4b6240c9702e67bede26f78dacce3 100644 (file)
@@ -3722,7 +3722,7 @@ static const struct tegra_pinctrl_soc_data tegra30_pinctrl = {
        .ngroups = ARRAY_SIZE(tegra30_groups),
 };
 
-static int __devinit tegra30_pinctrl_probe(struct platform_device *pdev)
+static int tegra30_pinctrl_probe(struct platform_device *pdev)
 {
        return tegra_pinctrl_probe(pdev, &tegra30_pinctrl);
 }
index 8c039ad22baf0eb44e78f2ceca9af5e3747b7644..718ec576268332ec76a5ab30a75e2865e53ed403 100644 (file)
@@ -1062,7 +1062,7 @@ static struct pinctrl_desc u300_pmx_desc = {
        .owner = THIS_MODULE,
 };
 
-static int __devinit u300_pmx_probe(struct platform_device *pdev)
+static int u300_pmx_probe(struct platform_device *pdev)
 {
        struct u300_pmx *upmx;
        struct resource *res;
index ad90984ec5008a7f39f64e6a498102af13cba583..5f0eb04c23364de9ff8a427e4ee4af9e9cd7b155 100644 (file)
@@ -674,7 +674,7 @@ static const struct of_device_id xway_match[] = {
 };
 MODULE_DEVICE_TABLE(of, xway_match);
 
-static int __devinit pinmux_xway_probe(struct platform_device *pdev)
+static int pinmux_xway_probe(struct platform_device *pdev)
 {
        const struct of_device_id *match;
        const struct pinctrl_xway_soc *xway_soc;
index 4c045053bbddd1e8a557861f7a73eb51ec64a97e..3cf4ecd9302cf6279b87928579c9c39ae28d4316 100644 (file)
@@ -451,8 +451,7 @@ int spear310_o2p(int offset)
                return offset + 2;
 }
 
-static int __devinit plgpio_probe_dt(struct platform_device *pdev,
-               struct plgpio *plgpio)
+static int plgpio_probe_dt(struct platform_device *pdev, struct plgpio *plgpio)
 {
        struct device_node *np = pdev->dev.of_node;
        int ret = -EINVAL;
@@ -522,7 +521,7 @@ static int __devinit plgpio_probe_dt(struct platform_device *pdev,
 end:
        return ret;
 }
-static int __devinit plgpio_probe(struct platform_device *pdev)
+static int plgpio_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct plgpio *plgpio;
index 922c057521a16f69abdb95af3c52d0600942d790..6a7dae70db081b04255c588dd45fd07e0fa2458c 100644 (file)
@@ -82,9 +82,8 @@ static int set_mode(struct spear_pmx *pmx, int mode)
        return 0;
 }
 
-void __devinit
-pmx_init_gpio_pingroup_addr(struct spear_gpio_pingroup *gpio_pingroup,
-               unsigned count, u16 reg)
+void pmx_init_gpio_pingroup_addr(struct spear_gpio_pingroup *gpio_pingroup,
+                                unsigned count, u16 reg)
 {
        int i, j;
 
@@ -93,7 +92,7 @@ pmx_init_gpio_pingroup_addr(struct spear_gpio_pingroup *gpio_pingroup,
                        gpio_pingroup[i].muxregs[j].reg = reg;
 }
 
-void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg)
+void pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg)
 {
        struct spear_pingroup *pgroup;
        struct spear_modemux *modemux;
@@ -358,8 +357,8 @@ static struct pinctrl_desc spear_pinctrl_desc = {
        .owner = THIS_MODULE,
 };
 
-int __devinit spear_pinctrl_probe(struct platform_device *pdev,
-               struct spear_pinctrl_machdata *machdata)
+int spear_pinctrl_probe(struct platform_device *pdev,
+                       struct spear_pinctrl_machdata *machdata)
 {
        struct device_node *np = pdev->dev.of_node;
        struct resource *res;
index 1be46ecc6d917176857fd2da7f2248dae4c8c657..dc8bf85ecb2aa5ae33f8de6dc6057dfd526fcbbd 100644 (file)
@@ -192,12 +192,11 @@ static inline void pmx_writel(struct spear_pmx *pmx, u32 val, u32 reg)
        writel_relaxed(val, pmx->vbase + reg);
 }
 
-void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg);
-void __devinit
-pmx_init_gpio_pingroup_addr(struct spear_gpio_pingroup *gpio_pingroup,
-               unsigned count, u16 reg);
-int __devinit spear_pinctrl_probe(struct platform_device *pdev,
-               struct spear_pinctrl_machdata *machdata);
+void pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg);
+void pmx_init_gpio_pingroup_addr(struct spear_gpio_pingroup *gpio_pingroup,
+                                unsigned count, u16 reg);
+int spear_pinctrl_probe(struct platform_device *pdev,
+                       struct spear_pinctrl_machdata *machdata);
 int spear_pinctrl_remove(struct platform_device *pdev);
 
 #define SPEAR_PIN_0_TO_101             \
index e40d785a3fc29229161bbf92a5ae9d044e99ef69..1a8bbfec60ca7748242701c687b22b8d93b43b99 100644 (file)
@@ -2699,7 +2699,7 @@ static struct of_device_id spear1310_pinctrl_of_match[] = {
        {},
 };
 
-static int __devinit spear1310_pinctrl_probe(struct platform_device *pdev)
+static int spear1310_pinctrl_probe(struct platform_device *pdev)
 {
        return spear_pinctrl_probe(pdev, &spear1310_machdata);
 }
index 8deaaff3156ca00cd92a5d3fc950d8919a57894a..873966e2b99f2ebbe64c6a9921fe7a5fa9a497a2 100644 (file)
@@ -2015,7 +2015,7 @@ static struct of_device_id spear1340_pinctrl_of_match[] = {
        {},
 };
 
-static int __devinit spear1340_pinctrl_probe(struct platform_device *pdev)
+static int spear1340_pinctrl_probe(struct platform_device *pdev)
 {
        return spear_pinctrl_probe(pdev, &spear1340_machdata);
 }
index f48e466e605a1494caecd5cd3c4828dbc88503cc..4777c0d0e730928e0f04c6f7e8e48cb240f0244e 100644 (file)
@@ -653,7 +653,7 @@ static struct of_device_id spear300_pinctrl_of_match[] = {
        {},
 };
 
-static int __devinit spear300_pinctrl_probe(struct platform_device *pdev)
+static int spear300_pinctrl_probe(struct platform_device *pdev)
 {
        int ret;
 
index 5b954c19a6d2c536026e976b695a991ff6fbff74..06c7e6f1c7f2817cf8d5b446472a37c05d046e80 100644 (file)
@@ -378,7 +378,7 @@ static struct of_device_id spear310_pinctrl_of_match[] = {
        {},
 };
 
-static int __devinit spear310_pinctrl_probe(struct platform_device *pdev)
+static int spear310_pinctrl_probe(struct platform_device *pdev)
 {
        int ret;
 
index e9a5e6d39242f0f9ddc2de04240f23b2534eb501..b8e290a8c8c994fe8394ce21b593ab4199d03017 100644 (file)
@@ -3417,7 +3417,7 @@ static struct of_device_id spear320_pinctrl_of_match[] = {
        {},
 };
 
-static int __devinit spear320_pinctrl_probe(struct platform_device *pdev)
+static int spear320_pinctrl_probe(struct platform_device *pdev)
 {
        int ret;
 
index 934d861a32359bb553ce17966d152f089b31c04d..afed7018a2b5fe9b006de12716814a2dc00502d0 100644 (file)
@@ -125,8 +125,11 @@ static const struct key_entry acer_wmi_keymap[] = {
        {KE_IGNORE, 0x63, {KEY_BRIGHTNESSDOWN} },
        {KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} }, /* Display Switch */
        {KE_IGNORE, 0x81, {KEY_SLEEP} },
-       {KE_KEY, 0x82, {KEY_TOUCHPAD_TOGGLE} }, /* Touch Pad On/Off */
+       {KE_KEY, 0x82, {KEY_TOUCHPAD_TOGGLE} }, /* Touch Pad Toggle */
+       {KE_KEY, KEY_TOUCHPAD_ON, {KEY_TOUCHPAD_ON} },
+       {KE_KEY, KEY_TOUCHPAD_OFF, {KEY_TOUCHPAD_OFF} },
        {KE_IGNORE, 0x83, {KEY_TOUCHPAD_TOGGLE} },
+       {KE_KEY, 0x85, {KEY_TOUCHPAD_TOGGLE} },
        {KE_END, 0}
 };
 
@@ -147,6 +150,7 @@ struct event_return_value {
 #define ACER_WMID3_GDS_THREEG          (1<<6)  /* 3G */
 #define ACER_WMID3_GDS_WIMAX           (1<<7)  /* WiMAX */
 #define ACER_WMID3_GDS_BLUETOOTH       (1<<11) /* BT */
+#define ACER_WMID3_GDS_TOUCHPAD                (1<<1)  /* Touchpad */
 
 struct lm_input_params {
        u8 function_num;        /* Function Number */
@@ -335,7 +339,7 @@ static struct quirk_entry quirk_lenovo_ideapad_s205 = {
 };
 
 /* The Aspire One has a dummy ACPI-WMI interface - disable it */
-static struct dmi_system_id __devinitdata acer_blacklist[] = {
+static struct dmi_system_id acer_blacklist[] = {
        {
                .ident = "Acer Aspire One (SSD)",
                .matches = {
@@ -875,7 +879,7 @@ WMI_execute_u32(u32 method_id, u32 in, u32 *out)
        struct acpi_buffer input = { (acpi_size) sizeof(u32), (void *)(&in) };
        struct acpi_buffer result = { ACPI_ALLOCATE_BUFFER, NULL };
        union acpi_object *obj;
-       u32 tmp;
+       u32 tmp = 0;
        acpi_status status;
 
        status = wmi_evaluate_method(WMID_GUID1, 1, method_id, &input, &result);
@@ -884,14 +888,14 @@ WMI_execute_u32(u32 method_id, u32 in, u32 *out)
                return status;
 
        obj = (union acpi_object *) result.pointer;
-       if (obj && obj->type == ACPI_TYPE_BUFFER &&
-               (obj->buffer.length == sizeof(u32) ||
-               obj->buffer.length == sizeof(u64))) {
-               tmp = *((u32 *) obj->buffer.pointer);
-       } else if (obj->type == ACPI_TYPE_INTEGER) {
-               tmp = (u32) obj->integer.value;
-       } else {
-               tmp = 0;
+       if (obj) {
+               if (obj->type == ACPI_TYPE_BUFFER &&
+                       (obj->buffer.length == sizeof(u32) ||
+                       obj->buffer.length == sizeof(u64))) {
+                       tmp = *((u32 *) obj->buffer.pointer);
+               } else if (obj->type == ACPI_TYPE_INTEGER) {
+                       tmp = (u32) obj->integer.value;
+               }
        }
 
        if (out)
@@ -1193,12 +1197,14 @@ static acpi_status WMID_set_capabilities(void)
                return status;
 
        obj = (union acpi_object *) out.pointer;
-       if (obj && obj->type == ACPI_TYPE_BUFFER &&
-               (obj->buffer.length == sizeof(u32) ||
-               obj->buffer.length == sizeof(u64))) {
-               devices = *((u32 *) obj->buffer.pointer);
-       } else if (obj->type == ACPI_TYPE_INTEGER) {
-               devices = (u32) obj->integer.value;
+       if (obj) {
+               if (obj->type == ACPI_TYPE_BUFFER &&
+                       (obj->buffer.length == sizeof(u32) ||
+                       obj->buffer.length == sizeof(u64))) {
+                       devices = *((u32 *) obj->buffer.pointer);
+               } else if (obj->type == ACPI_TYPE_INTEGER) {
+                       devices = (u32) obj->integer.value;
+               }
        } else {
                kfree(out.pointer);
                return AE_ERROR;
@@ -1330,7 +1336,7 @@ static struct led_classdev mail_led = {
        .brightness_set = mail_led_set,
 };
 
-static int __devinit acer_led_init(struct device *dev)
+static int acer_led_init(struct device *dev)
 {
        return led_classdev_register(dev, &mail_led);
 }
@@ -1372,7 +1378,7 @@ static const struct backlight_ops acer_bl_ops = {
        .update_status = update_bl_status,
 };
 
-static int __devinit acer_backlight_init(struct device *dev)
+static int acer_backlight_init(struct device *dev)
 {
        struct backlight_properties props;
        struct backlight_device *bd;
@@ -1676,6 +1682,7 @@ static void acer_wmi_notify(u32 value, void *context)
        acpi_status status;
        u16 device_state;
        const struct key_entry *key;
+       u32 scancode;
 
        status = wmi_get_event_data(value, &response);
        if (status != AE_OK) {
@@ -1712,6 +1719,7 @@ static void acer_wmi_notify(u32 value, void *context)
                        pr_warn("Unknown key number - 0x%x\n",
                                return_value.key_num);
                } else {
+                       scancode = return_value.key_num;
                        switch (key->keycode) {
                        case KEY_WLAN:
                        case KEY_BLUETOOTH:
@@ -1725,9 +1733,11 @@ static void acer_wmi_notify(u32 value, void *context)
                                        rfkill_set_sw_state(bluetooth_rfkill,
                                                !(device_state & ACER_WMID3_GDS_BLUETOOTH));
                                break;
+                       case KEY_TOUCHPAD_TOGGLE:
+                               scancode = (device_state & ACER_WMID3_GDS_TOUCHPAD) ?
+                                               KEY_TOUCHPAD_ON : KEY_TOUCHPAD_OFF;
                        }
-                       sparse_keymap_report_entry(acer_wmi_input_dev, key,
-                                                  1, true);
+                       sparse_keymap_report_event(acer_wmi_input_dev, scancode, 1, true);
                }
                break;
        case WMID_ACCEL_EVENT:
@@ -1946,12 +1956,14 @@ static u32 get_wmid_devices(void)
                return 0;
 
        obj = (union acpi_object *) out.pointer;
-       if (obj && obj->type == ACPI_TYPE_BUFFER &&
-               (obj->buffer.length == sizeof(u32) ||
-               obj->buffer.length == sizeof(u64))) {
-               devices = *((u32 *) obj->buffer.pointer);
-       } else if (obj->type == ACPI_TYPE_INTEGER) {
-               devices = (u32) obj->integer.value;
+       if (obj) {
+               if (obj->type == ACPI_TYPE_BUFFER &&
+                       (obj->buffer.length == sizeof(u32) ||
+                       obj->buffer.length == sizeof(u64))) {
+                       devices = *((u32 *) obj->buffer.pointer);
+               } else if (obj->type == ACPI_TYPE_INTEGER) {
+                       devices = (u32) obj->integer.value;
+               }
        }
 
        kfree(out.pointer);
@@ -1961,7 +1973,7 @@ static u32 get_wmid_devices(void)
 /*
  * Platform device
  */
-static int __devinit acer_platform_probe(struct platform_device *device)
+static int acer_platform_probe(struct platform_device *device)
 {
        int err;
 
index c2e3e63d2c157880efe22ab44ae1ba049427aa8a..f94467c0522506b51247c028cd79fee2767cbcaf 100644 (file)
@@ -515,7 +515,7 @@ static int acerhdf_suspend(struct device *dev)
        return 0;
 }
 
-static int __devinit acerhdf_probe(struct platform_device *device)
+static int acerhdf_probe(struct platform_device *device)
 {
        return 0;
 }
index 1deca7f6c4eace047cd2c871105aab77da43d08b..6296f078b7bc78eb57e89314e869f10c93a90eef 100644 (file)
@@ -74,7 +74,7 @@ static const struct rfkill_ops amilo_m7440_rfkill_ops = {
        .set_block = amilo_m7440_rfkill_set_block
 };
 
-static const struct dmi_system_id __devinitconst amilo_rfkill_id_table[] = {
+static const struct dmi_system_id amilo_rfkill_id_table[] = {
        {
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
@@ -95,7 +95,7 @@ static const struct dmi_system_id __devinitconst amilo_rfkill_id_table[] = {
 static struct platform_device *amilo_rfkill_pdev;
 static struct rfkill *amilo_rfkill_dev;
 
-static int __devinit amilo_rfkill_probe(struct platform_device *device)
+static int amilo_rfkill_probe(struct platform_device *device)
 {
        int rc;
        const struct dmi_system_id *system_id =
index db8f63841b4265922b5a630c020e00cb4f490ad3..f74bfcbb7bad8ce0e329ee9b0fe099451da1486e 100644 (file)
@@ -411,8 +411,7 @@ static int gmux_resume(struct pnp_dev *pnp)
        return 0;
 }
 
-static int __devinit gmux_probe(struct pnp_dev *pnp,
-                               const struct pnp_device_id *id)
+static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
 {
        struct apple_gmux_data *gmux_data;
        struct resource *res;
@@ -577,7 +576,7 @@ err_free:
        return ret;
 }
 
-static void __devexit gmux_remove(struct pnp_dev *pnp)
+static void gmux_remove(struct pnp_dev *pnp)
 {
        struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp);
 
@@ -609,7 +608,7 @@ static const struct pnp_device_id gmux_device_ids[] = {
 static struct pnp_driver gmux_pnp_driver = {
        .name           = "apple-gmux",
        .probe          = gmux_probe,
-       .remove         = __devexit_p(gmux_remove),
+       .remove         = gmux_remove,
        .id_table       = gmux_device_ids,
        .suspend        = gmux_suspend,
        .resume         = gmux_resume
index 4b568df56643f846de78a3228582342fb3a89c67..fcde4e528819c04daf4b919ba00d70a20f7456c3 100644 (file)
@@ -860,8 +860,10 @@ static ssize_t show_infos(struct device *dev,
        /*
         * The HWRS method return informations about the hardware.
         * 0x80 bit is for WLAN, 0x100 for Bluetooth.
+        * 0x40 for WWAN, 0x10 for WIMAX.
         * The significance of others is yet to be found.
-        * If we don't find the method, we assume the device are present.
+        * We don't currently use this for device detection, and it
+        * takes several seconds to run on some systems.
         */
        rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp);
        if (!ACPI_FAILURE(rv))
@@ -1682,7 +1684,7 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
 {
        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
        union acpi_object *model = NULL;
-       unsigned long long bsts_result, hwrs_result;
+       unsigned long long bsts_result;
        char *string = NULL;
        acpi_status status;
 
@@ -1741,20 +1743,9 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
                return -ENOMEM;
        }
 
-       if (*string)
+       if (string)
                pr_notice("  %s model detected\n", string);
 
-       /*
-        * The HWRS method return informations about the hardware.
-        * 0x80 bit is for WLAN, 0x100 for Bluetooth,
-        * 0x40 for WWAN, 0x10 for WIMAX.
-        * The significance of others is yet to be found.
-        */
-       status =
-           acpi_evaluate_integer(asus->handle, "HWRS", NULL, &hwrs_result);
-       if (!ACPI_FAILURE(status))
-               pr_notice("  HWRS returned %x", (int)hwrs_result);
-
        if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL))
                asus->have_rsts = true;
 
@@ -1763,7 +1754,7 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
        return AE_OK;
 }
 
-static int __devinit asus_acpi_init(struct asus_laptop *asus)
+static int asus_acpi_init(struct asus_laptop *asus)
 {
        int result = 0;
 
@@ -1823,7 +1814,7 @@ static int __devinit asus_acpi_init(struct asus_laptop *asus)
        return result;
 }
 
-static void __devinit asus_dmi_check(void)
+static void asus_dmi_check(void)
 {
        const char *model;
 
@@ -1839,7 +1830,7 @@ static void __devinit asus_dmi_check(void)
 
 static bool asus_device_present;
 
-static int __devinit asus_acpi_add(struct acpi_device *device)
+static int asus_acpi_add(struct acpi_device *device)
 {
        struct asus_laptop *asus;
        int result;
index 1887e2f166a43edeb449ae2851c8f77a8a63bcfc..475cc52425119a1a874347218d2a6cd5de1e4990 100644 (file)
@@ -713,15 +713,15 @@ static struct attribute_group compal_attribute_group = {
        .attrs = compal_attributes
 };
 
-static int __devinit compal_probe(struct platform_device *);
-static int __devexit compal_remove(struct platform_device *);
+static int compal_probe(struct platform_device *);
+static int compal_remove(struct platform_device *);
 static struct platform_driver compal_driver = {
        .driver = {
                .name = DRIVER_NAME,
                .owner = THIS_MODULE,
        },
        .probe  = compal_probe,
-       .remove = __devexit_p(compal_remove)
+       .remove = compal_remove,
 };
 
 static enum power_supply_property compal_bat_properties[] = {
@@ -1015,7 +1015,7 @@ err_backlight:
        return ret;
 }
 
-static int __devinit compal_probe(struct platform_device *pdev)
+static int compal_probe(struct platform_device *pdev)
 {
        int err;
        struct compal_data *data;
@@ -1067,7 +1067,7 @@ static void __exit compal_cleanup(void)
        pr_info("Driver unloaded\n");
 }
 
-static int __devexit compal_remove(struct platform_device *pdev)
+static int compal_remove(struct platform_device *pdev)
 {
        struct compal_data *data;
 
index 927c33af67ecc994b46ae2802a25f1cd5bfac5ed..fa3ee6209572976b71d623585ecfb026842d5645 100644 (file)
@@ -115,7 +115,7 @@ static const struct dmi_system_id dell_device_table[] __initconst = {
 };
 MODULE_DEVICE_TABLE(dmi, dell_device_table);
 
-static struct dmi_system_id __devinitdata dell_quirks[] = {
+static struct dmi_system_id dell_quirks[] = {
        {
                .callback = dmi_matched,
                .ident = "Dell Vostro V130",
@@ -503,7 +503,7 @@ static struct led_classdev touchpad_led = {
        .flags = LED_CORE_SUSPENDRESUME,
 };
 
-static int __devinit touchpad_led_init(struct device *dev)
+static int touchpad_led_init(struct device *dev)
 {
        return led_classdev_register(dev, &touchpad_led);
 }
index 5ca264179f4e32a758102b0a05f865164250534b..528e9495458d35f3396efeb6a3ce6e78e201bcd9 100644 (file)
@@ -1375,7 +1375,7 @@ static void cmsg_quirks(struct eeepc_laptop *eeepc)
        cmsg_quirk(eeepc, CM_ASL_TPD, "TPD");
 }
 
-static int __devinit eeepc_acpi_init(struct eeepc_laptop *eeepc)
+static int eeepc_acpi_init(struct eeepc_laptop *eeepc)
 {
        unsigned int init_flags;
        int result;
@@ -1407,7 +1407,7 @@ static int __devinit eeepc_acpi_init(struct eeepc_laptop *eeepc)
        return 0;
 }
 
-static void __devinit eeepc_enable_camera(struct eeepc_laptop *eeepc)
+static void eeepc_enable_camera(struct eeepc_laptop *eeepc)
 {
        /*
         * If the following call to set_acpi() fails, it's because there's no
@@ -1419,7 +1419,7 @@ static void __devinit eeepc_enable_camera(struct eeepc_laptop *eeepc)
 
 static bool eeepc_device_present;
 
-static int __devinit eeepc_acpi_add(struct acpi_device *device)
+static int eeepc_acpi_add(struct acpi_device *device)
 {
        struct eeepc_laptop *eeepc;
        int result;
index f77484528b1b2a74c1d0c483b637e810623cc585..174ca01c4aa71fda16dac075bc3171860c70c06e 100644 (file)
@@ -192,8 +192,8 @@ static void fujitsu_reset(void)
        fujitsu_send_state();
 }
 
-static int __devinit input_fujitsu_setup(struct device *parent,
-                                        const char *name, const char *phys)
+static int input_fujitsu_setup(struct device *parent, const char *name,
+                              const char *phys)
 {
        struct input_dev *idev;
        int error;
@@ -277,21 +277,21 @@ static irqreturn_t fujitsu_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static void __devinit fujitsu_dmi_common(const struct dmi_system_id *dmi)
+static void fujitsu_dmi_common(const struct dmi_system_id *dmi)
 {
        pr_info("%s\n", dmi->ident);
        memcpy(fujitsu.config.keymap, dmi->driver_data,
                        sizeof(fujitsu.config.keymap));
 }
 
-static int __devinit fujitsu_dmi_lifebook(const struct dmi_system_id *dmi)
+static int fujitsu_dmi_lifebook(const struct dmi_system_id *dmi)
 {
        fujitsu_dmi_common(dmi);
        fujitsu.config.quirks |= INVERT_TABLET_MODE_BIT;
        return 1;
 }
 
-static int __devinit fujitsu_dmi_stylistic(const struct dmi_system_id *dmi)
+static int fujitsu_dmi_stylistic(const struct dmi_system_id *dmi)
 {
        fujitsu_dmi_common(dmi);
        fujitsu.config.quirks |= FORCE_TABLET_MODE_IF_UNDOCK;
@@ -366,8 +366,7 @@ static const struct dmi_system_id dmi_ids[] __initconst = {
        { NULL }
 };
 
-static acpi_status __devinit
-fujitsu_walk_resources(struct acpi_resource *res, void *data)
+static acpi_status fujitsu_walk_resources(struct acpi_resource *res, void *data)
 {
        switch (res->type) {
        case ACPI_RESOURCE_TYPE_IRQ:
@@ -390,7 +389,7 @@ fujitsu_walk_resources(struct acpi_resource *res, void *data)
        }
 }
 
-static int __devinit acpi_fujitsu_add(struct acpi_device *adev)
+static int acpi_fujitsu_add(struct acpi_device *adev)
 {
        acpi_status status;
        int error;
@@ -432,7 +431,7 @@ static int __devinit acpi_fujitsu_add(struct acpi_device *adev)
        return 0;
 }
 
-static int __devexit acpi_fujitsu_remove(struct acpi_device *adev, int type)
+static int acpi_fujitsu_remove(struct acpi_device *adev, int type)
 {
        free_irq(fujitsu.irq, fujitsu_interrupt);
        release_region(fujitsu.io_base, fujitsu.io_length);
index 387183a2d6ddd4405c8430137e8da3c4595b5407..1dde7accf27ccb9f4b9150a3927e7c9e8b0a3189 100644 (file)
@@ -72,7 +72,7 @@ enum hp_wmi_event_ids {
        HPWMI_LOCK_SWITCH = 7,
 };
 
-static int __devinit hp_wmi_bios_setup(struct platform_device *device);
+static int hp_wmi_bios_setup(struct platform_device *device);
 static int __exit hp_wmi_bios_remove(struct platform_device *device);
 static int hp_wmi_resume_handler(struct device *device);
 
@@ -619,7 +619,7 @@ static void cleanup_sysfs(struct platform_device *device)
        device_remove_file(&device->dev, &dev_attr_tablet);
 }
 
-static int __devinit hp_wmi_rfkill_setup(struct platform_device *device)
+static int hp_wmi_rfkill_setup(struct platform_device *device)
 {
        int err;
        int wireless = 0;
@@ -698,7 +698,7 @@ register_wifi_error:
        return err;
 }
 
-static int __devinit hp_wmi_rfkill2_setup(struct platform_device *device)
+static int hp_wmi_rfkill2_setup(struct platform_device *device)
 {
        int err, i;
        struct bios_rfkill2_state state;
@@ -778,7 +778,7 @@ fail:
        return err;
 }
 
-static int __devinit hp_wmi_bios_setup(struct platform_device *device)
+static int hp_wmi_bios_setup(struct platform_device *device)
 {
        int err;
 
index 5ff4f2e314d2857656de31f127823dc8d20556af..64bfb30a52e9a022c3a1c08be8f4f59c0a8a5ee6 100644 (file)
@@ -298,7 +298,7 @@ static const struct file_operations debugfs_cfg_fops = {
        .release = single_release,
 };
 
-static int __devinit ideapad_debugfs_init(struct ideapad_private *priv)
+static int ideapad_debugfs_init(struct ideapad_private *priv)
 {
        struct dentry *node;
 
@@ -468,8 +468,7 @@ static void ideapad_sync_rfk_state(struct ideapad_private *priv)
                        rfkill_set_hw_state(priv->rfk[i], hw_blocked);
 }
 
-static int __devinit ideapad_register_rfkill(struct acpi_device *adevice,
-                                            int dev)
+static int ideapad_register_rfkill(struct acpi_device *adevice, int dev)
 {
        struct ideapad_private *priv = dev_get_drvdata(&adevice->dev);
        int ret;
@@ -519,7 +518,7 @@ static void ideapad_unregister_rfkill(struct acpi_device *adevice, int dev)
 /*
  * Platform device
  */
-static int __devinit ideapad_platform_init(struct ideapad_private *priv)
+static int ideapad_platform_init(struct ideapad_private *priv)
 {
        int result;
 
@@ -569,7 +568,7 @@ static const struct key_entry ideapad_keymap[] = {
        { KE_END, 0 },
 };
 
-static int __devinit ideapad_input_init(struct ideapad_private *priv)
+static int ideapad_input_init(struct ideapad_private *priv)
 {
        struct input_dev *inputdev;
        int error;
@@ -776,7 +775,7 @@ static void ideapad_sync_touchpad_state(struct acpi_device *adevice)
        }
 }
 
-static int __devinit ideapad_acpi_add(struct acpi_device *adevice)
+static int ideapad_acpi_add(struct acpi_device *adevice)
 {
        int ret, i;
        int cfg;
@@ -835,7 +834,7 @@ platform_failed:
        return ret;
 }
 
-static int __devexit ideapad_acpi_remove(struct acpi_device *adevice, int type)
+static int ideapad_acpi_remove(struct acpi_device *adevice, int type)
 {
        struct ideapad_private *priv = dev_get_drvdata(&adevice->dev);
        int i;
index bcbad8452a6f0ca5bb818b684837e207ffef7b5f..f59683aa13d5d9ce522355ba98eeaa2898f56f01 100644 (file)
@@ -56,7 +56,7 @@ static irqreturn_t mfld_pb_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit mfld_pb_probe(struct platform_device *pdev)
+static int mfld_pb_probe(struct platform_device *pdev)
 {
        struct input_dev *input;
        int irq = platform_get_irq(pdev, 0);
@@ -121,7 +121,7 @@ err_free_input:
        return error;
 }
 
-static int __devexit mfld_pb_remove(struct platform_device *pdev)
+static int mfld_pb_remove(struct platform_device *pdev)
 {
        struct input_dev *input = platform_get_drvdata(pdev);
        int irq = platform_get_irq(pdev, 0);
@@ -139,7 +139,7 @@ static struct platform_driver mfld_pb_driver = {
                .owner = THIS_MODULE,
        },
        .probe  = mfld_pb_probe,
-       .remove = __devexit_p(mfld_pb_remove),
+       .remove = mfld_pb_remove,
 };
 
 module_platform_driver(mfld_pb_driver);
index 93de09019d1d53649621eda7e83529fcd75624fa..81c491e74b3471e5433a8024df690476489a4fdc 100644 (file)
@@ -563,7 +563,7 @@ static struct platform_driver mid_thermal_driver = {
                .pm = &mid_thermal_pm,
        },
        .probe = mid_thermal_probe,
-       .remove = __devexit_p(mid_thermal_remove),
+       .remove = mid_thermal_remove,
        .id_table = therm_id_table,
 };
 
index 79a0c2f6be53996c2771ffd532e517a6ac8bef4e..f6f18cde0f11c70f035e88c1da80f96506e0b3ab 100644 (file)
@@ -278,12 +278,12 @@ static void oaktrail_backlight_exit(void)
                backlight_device_unregister(oaktrail_bl_device);
 }
 
-static int __devinit oaktrail_probe(struct platform_device *pdev)
+static int oaktrail_probe(struct platform_device *pdev)
 {
        return 0;
 }
 
-static int __devexit oaktrail_remove(struct platform_device *pdev)
+static int oaktrail_remove(struct platform_device *pdev)
 {
        return 0;
 }
@@ -294,7 +294,7 @@ static struct platform_driver oaktrail_driver = {
                .owner = THIS_MODULE,
        },
        .probe  = oaktrail_probe,
-       .remove = __devexit_p(oaktrail_remove)
+       .remove = oaktrail_remove,
 };
 
 static int dmi_check_cb(const struct dmi_system_id *id)
index 1686c1e07d5d250c03d27fe24077f0c3f43b00d7..6f4b7289a0598d8fc514a1e2cbd5b3ed401532f0 100644 (file)
@@ -230,7 +230,7 @@ static irqreturn_t pmic_irq_handler(int irq, void *data)
        return ret;
 }
 
-static int __devinit platform_pmic_gpio_probe(struct platform_device *pdev)
+static int platform_pmic_gpio_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        int irq = platform_get_irq(pdev, 0);
index dd90d15f52101e24296b30523d68056e01bac7df..71623a2ff3e87b0cffe3d5e85ae96480600a7e59 100644 (file)
@@ -1523,6 +1523,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = {
                },
         .driver_data = &samsung_broken_acpi_video,
        },
+       {
+        .callback = samsung_dmi_matched,
+        .ident = "N250P",
+        .matches = {
+               DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+               DMI_MATCH(DMI_PRODUCT_NAME, "N250P"),
+               DMI_MATCH(DMI_BOARD_NAME, "N250P"),
+               },
+        .driver_data = &samsung_broken_acpi_video,
+       },
        { },
 };
 MODULE_DEVICE_TABLE(dmi, samsung_dmi_table);
index 1e54ae74274cddbb95323f827ecc11de0d228050..5f770059fd4d3aa3115140fd5afcc7a7832eca53 100644 (file)
@@ -77,7 +77,7 @@ static int samsungq10_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(samsungq10_pm_ops,
                          samsungq10_suspend, samsungq10_resume);
 
-static int __devinit samsungq10_probe(struct platform_device *pdev)
+static int samsungq10_probe(struct platform_device *pdev)
 {
 
        struct backlight_properties props;
@@ -99,7 +99,7 @@ static int __devinit samsungq10_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit samsungq10_remove(struct platform_device *pdev)
+static int samsungq10_remove(struct platform_device *pdev)
 {
 
        struct backlight_device *bd = platform_get_drvdata(pdev);
@@ -119,7 +119,7 @@ static struct platform_driver samsungq10_driver = {
                .pm     = &samsungq10_pm_ops,
        },
        .probe          = samsungq10_probe,
-       .remove         = __devexit_p(samsungq10_remove),
+       .remove         = samsungq10_remove,
 };
 
 static struct platform_device *samsungq10_device;
index daaddec68def7e1c7cb11e4fe6d54e4193943c55..b8ad71f7863fa2b0fa9c741e9605ffdfe5a92fcf 100644 (file)
@@ -786,28 +786,29 @@ static int sony_nc_int_call(acpi_handle handle, char *name, int *value,
 static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value,
                void *buffer, size_t buflen)
 {
+       int ret = 0;
        size_t len = len;
        union acpi_object *object = __call_snc_method(handle, name, value);
 
        if (!object)
                return -EINVAL;
 
-       if (object->type == ACPI_TYPE_BUFFER)
+       if (object->type == ACPI_TYPE_BUFFER) {
                len = MIN(buflen, object->buffer.length);
+               memcpy(buffer, object->buffer.pointer, len);
 
-       else if (object->type == ACPI_TYPE_INTEGER)
+       } else if (object->type == ACPI_TYPE_INTEGER) {
                len = MIN(buflen, sizeof(object->integer.value));
+               memcpy(buffer, &object->integer.value, len);
 
-       else {
+       else {
                pr_warn("Invalid acpi_object: expected 0x%x got 0x%x\n",
                                ACPI_TYPE_BUFFER, object->type);
-               kfree(object);
-               return -EINVAL;
+               ret = -EINVAL;
        }
 
-       memcpy(buffer, object->buffer.pointer, len);
        kfree(object);
-       return 0;
+       return ret;
 }
 
 struct sony_nc_handles {
index e24f5ae475af019815b10a07e2febaabd29135c6..9b93fdb61ed7c03733ead31aaa7f0ef632a6bd00 100644 (file)
@@ -187,7 +187,7 @@ static int __init tc1100_probe(struct platform_device *device)
 }
 
 
-static int __devexit tc1100_remove(struct platform_device *device)
+static int tc1100_remove(struct platform_device *device)
 {
        sysfs_remove_group(&device->dev.kobj, &tc1100_attribute_group);
 
@@ -241,7 +241,7 @@ static struct platform_driver tc1100_driver = {
                .pm = &tc1100_pm_ops,
 #endif
        },
-       .remove = __devexit_p(tc1100_remove),
+       .remove = tc1100_remove,
 };
 
 static int __init tc1100_init(void)
index 75dd651664ae6f14dbfc43ce42d2a9632368b513..f946ca7cb76271a321ce900f5c59b3a07538552b 100644 (file)
@@ -6732,7 +6732,7 @@ static int volume_alsa_mute_put(struct snd_kcontrol *kcontrol,
        return volume_alsa_set_mute(!ucontrol->value.integer.value[0]);
 }
 
-static struct snd_kcontrol_new volume_alsa_control_vol __devinitdata = {
+static struct snd_kcontrol_new volume_alsa_control_vol = {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
        .name = "Console Playback Volume",
        .index = 0,
@@ -6741,7 +6741,7 @@ static struct snd_kcontrol_new volume_alsa_control_vol __devinitdata = {
        .get = volume_alsa_vol_get,
 };
 
-static struct snd_kcontrol_new volume_alsa_control_mute __devinitdata = {
+static struct snd_kcontrol_new volume_alsa_control_mute = {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
        .name = "Console Playback Switch",
        .index = 0,
index 5f1256d5e9332cf45dbdd2031987ea41fe0212cf..c2727895794ca51d7623bc820c6aeadd422fa4c5 100644 (file)
@@ -150,7 +150,7 @@ static const struct acpi_device_id toshiba_device_ids[] = {
 };
 MODULE_DEVICE_TABLE(acpi, toshiba_device_ids);
 
-static const struct key_entry toshiba_acpi_keymap[] __devinitconst = {
+static const struct key_entry toshiba_acpi_keymap[] = {
        { KE_KEY, 0x101, { KEY_MUTE } },
        { KE_KEY, 0x102, { KEY_ZOOMOUT } },
        { KE_KEY, 0x103, { KEY_ZOOMIN } },
@@ -875,8 +875,7 @@ static const struct file_operations version_proc_fops = {
 
 #define PROC_TOSHIBA           "toshiba"
 
-static void __devinit
-create_toshiba_proc_entries(struct toshiba_acpi_dev *dev)
+static void create_toshiba_proc_entries(struct toshiba_acpi_dev *dev)
 {
        if (dev->backlight_dev)
                proc_create_data("lcd", S_IRUGO | S_IWUSR, toshiba_proc_dir,
@@ -979,7 +978,7 @@ static void toshiba_acpi_report_hotkey(struct toshiba_acpi_dev *dev,
                pr_info("Unknown key %x\n", scancode);
 }
 
-static int __devinit toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
+static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
 {
        acpi_status status;
        acpi_handle ec_handle, handle;
@@ -1069,7 +1068,7 @@ static int __devinit toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
        return error;
 }
 
-static int __devinit toshiba_acpi_setup_backlight(struct toshiba_acpi_dev *dev)
+static int toshiba_acpi_setup_backlight(struct toshiba_acpi_dev *dev)
 {
        struct backlight_properties props;
        int brightness;
@@ -1154,7 +1153,7 @@ static int toshiba_acpi_remove(struct acpi_device *acpi_dev, int type)
        return 0;
 }
 
-static const char * __devinit find_hci_method(acpi_handle handle)
+static const char *find_hci_method(acpi_handle handle)
 {
        acpi_status status;
        acpi_handle hci_handle;
@@ -1170,7 +1169,7 @@ static const char * __devinit find_hci_method(acpi_handle handle)
        return NULL;
 }
 
-static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev)
+static int toshiba_acpi_add(struct acpi_device *acpi_dev)
 {
        struct toshiba_acpi_dev *dev;
        const char *hci_method;
index 1da13ed34b04f9f944c7bb869f4dcafb5c036e46..4bd17248dfc612c627bede36e6a3ebc64fca43f7 100644 (file)
@@ -40,7 +40,7 @@ static const struct rfkill_ops rfkill_ops = {
        .set_block = rfkill_set_block,
 };
 
-static int __devinit xo1_rfkill_probe(struct platform_device *pdev)
+static int xo1_rfkill_probe(struct platform_device *pdev)
 {
        struct rfkill *rfk;
        int r;
@@ -60,7 +60,7 @@ static int __devinit xo1_rfkill_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit xo1_rfkill_remove(struct platform_device *pdev)
+static int xo1_rfkill_remove(struct platform_device *pdev)
 {
        struct rfkill *rfk = platform_get_drvdata(pdev);
        rfkill_unregister(rfk);
@@ -74,7 +74,7 @@ static struct platform_driver xo1_rfkill_driver = {
                .owner = THIS_MODULE,
        },
        .probe          = xo1_rfkill_probe,
-       .remove         = __devexit_p(xo1_rfkill_remove),
+       .remove         = xo1_rfkill_remove,
 };
 
 module_platform_driver(xo1_rfkill_driver);
index cfaf5b73540bbc6b958ad7e5f15ea4822ab7c8d6..0c201317284b40e93014d0a574b3ef0ab9d81b9b 100644 (file)
@@ -298,6 +298,39 @@ static ssize_t pnp_show_current_resources(struct device *dmdev,
        return ret;
 }
 
+static char *pnp_get_resource_value(char *buf,
+                                   unsigned long type,
+                                   resource_size_t *start,
+                                   resource_size_t *end,
+                                   unsigned long *flags)
+{
+       if (start)
+               *start = 0;
+       if (end)
+               *end = 0;
+       if (flags)
+               *flags = 0;
+
+       /* TBD: allow for disabled resources */
+
+       buf = skip_spaces(buf);
+       if (start) {
+               *start = simple_strtoull(buf, &buf, 0);
+               if (end) {
+                       buf = skip_spaces(buf);
+                       if (*buf == '-') {
+                               buf = skip_spaces(buf + 1);
+                               *end = simple_strtoull(buf, &buf, 0);
+                       } else
+                               *end = *start;
+               }
+       }
+
+       /* TBD: allow for additional flags, e.g., IORESOURCE_WINDOW */
+
+       return buf;
+}
+
 static ssize_t pnp_set_current_resources(struct device *dmdev,
                                         struct device_attribute *attr,
                                         const char *ubuf, size_t count)
@@ -305,7 +338,6 @@ static ssize_t pnp_set_current_resources(struct device *dmdev,
        struct pnp_dev *dev = to_pnp_dev(dmdev);
        char *buf = (void *)ubuf;
        int retval = 0;
-       resource_size_t start, end;
 
        if (dev->status & PNP_ATTACHED) {
                retval = -EBUSY;
@@ -349,6 +381,10 @@ static ssize_t pnp_set_current_resources(struct device *dmdev,
                goto done;
        }
        if (!strnicmp(buf, "set", 3)) {
+               resource_size_t start;
+               resource_size_t end;
+               unsigned long flags;
+
                if (dev->active)
                        goto done;
                buf += 3;
@@ -357,42 +393,37 @@ static ssize_t pnp_set_current_resources(struct device *dmdev,
                while (1) {
                        buf = skip_spaces(buf);
                        if (!strnicmp(buf, "io", 2)) {
-                               buf = skip_spaces(buf + 2);
-                               start = simple_strtoul(buf, &buf, 0);
-                               buf = skip_spaces(buf);
-                               if (*buf == '-') {
-                                       buf = skip_spaces(buf + 1);
-                                       end = simple_strtoul(buf, &buf, 0);
-                               } else
-                                       end = start;
-                               pnp_add_io_resource(dev, start, end, 0);
-                               continue;
-                       }
-                       if (!strnicmp(buf, "mem", 3)) {
-                               buf = skip_spaces(buf + 3);
-                               start = simple_strtoul(buf, &buf, 0);
-                               buf = skip_spaces(buf);
-                               if (*buf == '-') {
-                                       buf = skip_spaces(buf + 1);
-                                       end = simple_strtoul(buf, &buf, 0);
-                               } else
-                                       end = start;
-                               pnp_add_mem_resource(dev, start, end, 0);
-                               continue;
-                       }
-                       if (!strnicmp(buf, "irq", 3)) {
-                               buf = skip_spaces(buf + 3);
-                               start = simple_strtoul(buf, &buf, 0);
-                               pnp_add_irq_resource(dev, start, 0);
-                               continue;
-                       }
-                       if (!strnicmp(buf, "dma", 3)) {
-                               buf = skip_spaces(buf + 3);
-                               start = simple_strtoul(buf, &buf, 0);
-                               pnp_add_dma_resource(dev, start, 0);
-                               continue;
-                       }
-                       break;
+                               buf = pnp_get_resource_value(buf + 2,
+                                                            IORESOURCE_IO,
+                                                            &start, &end,
+                                                            &flags);
+                               pnp_add_io_resource(dev, start, end, flags);
+                       } else if (!strnicmp(buf, "mem", 3)) {
+                               buf = pnp_get_resource_value(buf + 3,
+                                                            IORESOURCE_MEM,
+                                                            &start, &end,
+                                                            &flags);
+                               pnp_add_mem_resource(dev, start, end, flags);
+                       } else if (!strnicmp(buf, "irq", 3)) {
+                               buf = pnp_get_resource_value(buf + 3,
+                                                            IORESOURCE_IRQ,
+                                                            &start, NULL,
+                                                            &flags);
+                               pnp_add_irq_resource(dev, start, flags);
+                       } else if (!strnicmp(buf, "dma", 3)) {
+                               buf = pnp_get_resource_value(buf + 3,
+                                                            IORESOURCE_DMA,
+                                                            &start, NULL,
+                                                            &flags);
+                               pnp_add_dma_resource(dev, start, flags);
+                       } else if (!strnicmp(buf, "bus", 3)) {
+                               buf = pnp_get_resource_value(buf + 3,
+                                                            IORESOURCE_BUS,
+                                                            &start, &end,
+                                                            NULL);
+                               pnp_add_bus_resource(dev, start, end);
+                       } else
+                               break;
                }
                mutex_unlock(&pnp_res_mutex);
                goto done;
index ed9ce507149ab87efe8692b24379a82ab728184c..95cebf0185decdd48134892b43f5d45928ab3515 100644 (file)
 
 DEFINE_MUTEX(pnp_res_mutex);
 
+static struct resource *pnp_find_resource(struct pnp_dev *dev,
+                                         unsigned char rule,
+                                         unsigned long type,
+                                         unsigned int bar)
+{
+       struct resource *res = pnp_get_resource(dev, type, bar);
+
+       /* when the resource already exists, set its resource bits from rule */
+       if (res) {
+               res->flags &= ~IORESOURCE_BITS;
+               res->flags |= rule & IORESOURCE_BITS;
+       }
+
+       return res;
+}
+
 static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx)
 {
        struct resource *res, local_res;
 
-       res = pnp_get_resource(dev, IORESOURCE_IO, idx);
+       res = pnp_find_resource(dev, rule->flags, IORESOURCE_IO, idx);
        if (res) {
                pnp_dbg(&dev->dev, "  io %d already set to %#llx-%#llx "
                        "flags %#lx\n", idx, (unsigned long long) res->start,
@@ -65,7 +81,7 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx)
 {
        struct resource *res, local_res;
 
-       res = pnp_get_resource(dev, IORESOURCE_MEM, idx);
+       res = pnp_find_resource(dev, rule->flags, IORESOURCE_MEM, idx);
        if (res) {
                pnp_dbg(&dev->dev, "  mem %d already set to %#llx-%#llx "
                        "flags %#lx\n", idx, (unsigned long long) res->start,
@@ -78,6 +94,7 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx)
        res->start = 0;
        res->end = 0;
 
+       /* ??? rule->flags restricted to 8 bits, all tests bogus ??? */
        if (!(rule->flags & IORESOURCE_MEM_WRITEABLE))
                res->flags |= IORESOURCE_READONLY;
        if (rule->flags & IORESOURCE_MEM_CACHEABLE)
@@ -123,7 +140,7 @@ static int pnp_assign_irq(struct pnp_dev *dev, struct pnp_irq *rule, int idx)
                5, 10, 11, 12, 9, 14, 15, 7, 3, 4, 13, 0, 1, 6, 8, 2
        };
 
-       res = pnp_get_resource(dev, IORESOURCE_IRQ, idx);
+       res = pnp_find_resource(dev, rule->flags, IORESOURCE_IRQ, idx);
        if (res) {
                pnp_dbg(&dev->dev, "  irq %d already set to %d flags %#lx\n",
                        idx, (int) res->start, res->flags);
@@ -182,7 +199,7 @@ static int pnp_assign_dma(struct pnp_dev *dev, struct pnp_dma *rule, int idx)
                1, 3, 5, 6, 7, 0, 2, 4
        };
 
-       res = pnp_get_resource(dev, IORESOURCE_DMA, idx);
+       res = pnp_find_resource(dev, rule->flags, IORESOURCE_DMA, idx);
        if (res) {
                pnp_dbg(&dev->dev, "  dma %d already set to %d flags %#lx\n",
                        idx, (int) res->start, res->flags);
index 03cc528425cb883ceb346eba27560edd20b3fda8..f034ae43e045ac03127adeca8f1db0f4cbe59b79 100644 (file)
@@ -452,10 +452,8 @@ struct abx500_bm_data ab8500_bm_data = {
        .fg_params              = &fg,
 };
 
-int __devinit
-bmdevs_of_probe(struct device *dev,
-               struct device_node *np,
-               struct abx500_bm_data **battery)
+int bmdevs_of_probe(struct device *dev, struct device_node *np,
+                   struct abx500_bm_data **battery)
 {
        struct  abx500_battery_type *btype;
        struct  device_node *np_bat_supply;
index a17d084117230071ad3d014e6225fd2e69f7c9f0..6b2238bb6a8111d1362ea00733f25787354efad6 100644 (file)
@@ -27,8 +27,6 @@
 #include <linux/pm_runtime.h>
 #include <linux/power/smartreflex.h>
 
-#include <plat/cpu.h>
-
 #define SMARTREFLEX_NAME_LEN   16
 #define NVALUE_NAME_LEN                40
 #define SR_DISABLE_TIMEOUT     200
index 298c47d111b4c53470ad08a5d6fb3db1064a5c7f..1ec810ada5edd4cf4c9299016ef5326a35c800f1 100644 (file)
@@ -668,7 +668,7 @@ static int olpc_battery_remove(struct platform_device *pdev)
        return 0;
 }
 
-static const struct of_device_id olpc_battery_ids[] __devinitconst = {
+static const struct of_device_id olpc_battery_ids[] = {
        { .compatible = "olpc,xo1-battery" },
        {}
 };
index 0491e5335d0214e5361bab275f6b40b26eec9bd6..e290d48ddd99cab71f1effff5ae87243a11e560a 100644 (file)
@@ -29,15 +29,16 @@ static int gpio_active_low;
 
 static void gpio_poweroff_do_poweroff(void)
 {
-       BUG_ON(gpio_num == -1);
+       BUG_ON(!gpio_is_valid(gpio_num));
 
-       /* drive it active */
+       /* drive it active, also inactive->active edge */
        gpio_direction_output(gpio_num, !gpio_active_low);
        mdelay(100);
-       /* rising edge or drive inactive */
+       /* drive inactive, also active->inactive edge */
        gpio_set_value(gpio_num, gpio_active_low);
        mdelay(100);
-       /* falling edge */
+
+       /* drive it active, also inactive->active edge */
        gpio_set_value(gpio_num, !gpio_active_low);
 
        /* give it some time */
@@ -46,7 +47,7 @@ static void gpio_poweroff_do_poweroff(void)
        WARN_ON(1);
 }
 
-static int __devinit gpio_poweroff_probe(struct platform_device *pdev)
+static int gpio_poweroff_probe(struct platform_device *pdev)
 {
        enum of_gpio_flags flags;
        bool input = false;
@@ -60,15 +61,12 @@ static int __devinit gpio_poweroff_probe(struct platform_device *pdev)
        }
 
        gpio_num = of_get_gpio_flags(pdev->dev.of_node, 0, &flags);
-       if (gpio_num < 0) {
-               pr_err("%s: Could not get GPIO configuration: %d",
-                      __func__, gpio_num);
-               return -ENODEV;
-       }
+       if (!gpio_is_valid(gpio_num))
+               return gpio_num;
+
        gpio_active_low = flags & OF_GPIO_ACTIVE_LOW;
 
-       if (of_get_property(pdev->dev.of_node, "input", NULL))
-               input = true;
+       input = of_property_read_bool(pdev->dev.of_node, "input");
 
        ret = gpio_request(gpio_num, "poweroff-gpio");
        if (ret) {
@@ -96,10 +94,9 @@ err:
        return -ENODEV;
 }
 
-static int __devexit gpio_poweroff_remove(struct platform_device *pdev)
+static int gpio_poweroff_remove(struct platform_device *pdev)
 {
-       if (gpio_num != -1)
-               gpio_free(gpio_num);
+       gpio_free(gpio_num);
        if (pm_power_off == &gpio_poweroff_do_poweroff)
                pm_power_off = NULL;
 
@@ -113,17 +110,17 @@ static const struct of_device_id of_gpio_poweroff_match[] = {
 
 static struct platform_driver gpio_poweroff_driver = {
        .probe = gpio_poweroff_probe,
-       .remove = __devexit_p(gpio_poweroff_remove),
+       .remove = gpio_poweroff_remove,
        .driver = {
-                  .name = "poweroff-gpio",
-                  .owner = THIS_MODULE,
-                  .of_match_table = of_gpio_poweroff_match,
-                  },
+               .name = "poweroff-gpio",
+               .owner = THIS_MODULE,
+               .of_match_table = of_gpio_poweroff_match,
+       },
 };
 
 module_platform_driver(gpio_poweroff_driver);
 
 MODULE_AUTHOR("Jamie Lentin <jm@lentin.co.uk>");
 MODULE_DESCRIPTION("GPIO poweroff driver");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");
 MODULE_ALIAS("platform:poweroff-gpio");
index ca49d6c0ee9d6e0c51ee922416b10b5e594d46b9..8208888b844e973004ba2a146cb40bf70c1458b5 100644 (file)
@@ -197,7 +197,7 @@ static enum power_supply_property rx51_battery_props[] = {
        POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
 };
 
-static int __devinit rx51_battery_probe(struct platform_device *pdev)
+static int rx51_battery_probe(struct platform_device *pdev)
 {
        struct rx51_device_info *di;
        int ret;
@@ -224,7 +224,7 @@ static int __devinit rx51_battery_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit rx51_battery_remove(struct platform_device *pdev)
+static int rx51_battery_remove(struct platform_device *pdev)
 {
        struct rx51_device_info *di = platform_get_drvdata(pdev);
 
@@ -237,7 +237,7 @@ static int __devexit rx51_battery_remove(struct platform_device *pdev)
 
 static struct platform_driver rx51_battery_driver = {
        .probe = rx51_battery_probe,
-       .remove = __devexit_p(rx51_battery_remove),
+       .remove = rx51_battery_remove,
        .driver = {
                .name = "rx51-battery",
                .owner = THIS_MODULE,
index 6550555454796c0dfe2b08e477f18de49b569729..2bf0c1b608ddc1124595a1a50352041e110a4382 100644 (file)
@@ -196,7 +196,7 @@ static int pps_gpio_remove(struct platform_device *pdev)
 
 static struct platform_driver pps_gpio_driver = {
        .probe          = pps_gpio_probe,
-       .remove         =  __devexit_p(pps_gpio_remove),
+       .remove         = pps_gpio_remove,
        .driver         = {
                .name   = PPS_GPIO_NAME,
                .owner  = THIS_MODULE
index 643697f7139070d61cd03015a6d8d6980aa889e2..b139b7792e9fcf6a3c266790fa2dbeea0cf06e27 100644 (file)
@@ -1185,7 +1185,7 @@ int ps3_lpm_close(void)
 }
 EXPORT_SYMBOL_GPL(ps3_lpm_close);
 
-static int __devinit ps3_lpm_probe(struct ps3_system_bus_device *dev)
+static int ps3_lpm_probe(struct ps3_system_bus_device *dev)
 {
        dev_dbg(&dev->core, " -> %s:%u\n", __func__, __LINE__);
 
index 1b98367110c49132ef1d98999fd795f1873a9aba..f2ab435954f6b98d67bbede2b8e4b854b92ff5e4 100644 (file)
@@ -706,7 +706,7 @@ static void ps3_sys_manager_work(struct ps3_system_bus_device *dev)
        ps3_vuart_read_async(dev, PS3_SM_RX_MSG_LEN_MIN);
 }
 
-static int __devinit ps3_sys_manager_probe(struct ps3_system_bus_device *dev)
+static int ps3_sys_manager_probe(struct ps3_system_bus_device *dev)
 {
        int result;
        struct ps3_sys_manager_ops ops;
index 93d0a8b7718aff44f5ccd8bb24c7fff94293d95f..437fc35beb7b706e130f115cfc433b5138002c43 100644 (file)
@@ -932,7 +932,7 @@ int ps3av_audio_mute(int mute)
 }
 EXPORT_SYMBOL_GPL(ps3av_audio_mute);
 
-static int __devinit ps3av_probe(struct ps3_system_bus_device *dev)
+static int ps3av_probe(struct ps3_system_bus_device *dev)
 {
        int res;
        int id;
index 0199eeea63b13f6d770b49897d14bb3da1173290..8f39cac661d26deb4025e2787add57f22dc50db2 100644 (file)
@@ -188,7 +188,7 @@ static int anatop_regulator_remove(struct platform_device *pdev)
        return 0;
 }
 
-static struct of_device_id __devinitdata of_anatop_regulator_match_tbl[] = {
+static struct of_device_id of_anatop_regulator_match_tbl[] = {
        { .compatible = "fsl,anatop-regulator", },
        { /* end */ }
 };
index a4b9cb8c43175343bdfaa2a04bc51038e4003c05..1a05ac66878f7933a71d926cf574c0ba65db51b4 100644 (file)
@@ -442,9 +442,9 @@ static struct da9055_regulator_info da9055_regulator_info[] = {
  * GPIO can control regulator state and/or select the regulator register
  * set A/B for voltage ramping.
  */
-static __devinit int da9055_gpio_init(struct da9055_regulator *regulator,
-                                     struct regulator_config *config,
-                                     struct da9055_pdata *pdata, int id)
+static int da9055_gpio_init(struct da9055_regulator *regulator,
+                           struct regulator_config *config,
+                           struct da9055_pdata *pdata, int id)
 {
        struct da9055_regulator_info *info = regulator->info;
        int ret = 0;
@@ -533,7 +533,7 @@ static inline struct da9055_regulator_info *find_regulator_info(int id)
        return NULL;
 }
 
-static int __devinit da9055_regulator_probe(struct platform_device *pdev)
+static int da9055_regulator_probe(struct platform_device *pdev)
 {
        struct regulator_config config = { };
        struct da9055_regulator *regulator;
@@ -605,7 +605,7 @@ err_regulator:
        return ret;
 }
 
-static int __devexit da9055_regulator_remove(struct platform_device *pdev)
+static int da9055_regulator_remove(struct platform_device *pdev)
 {
        struct da9055_regulator *regulator = platform_get_drvdata(pdev);
 
@@ -616,7 +616,7 @@ static int __devexit da9055_regulator_remove(struct platform_device *pdev)
 
 static struct platform_driver da9055_regulator_driver = {
        .probe = da9055_regulator_probe,
-       .remove = __devexit_p(da9055_regulator_remove),
+       .remove = da9055_regulator_remove,
        .driver = {
                .name = "da9055-regulator",
                .owner = THIS_MODULE,
index 48d5b7608b00bd519cbb4c2434721335c91fa4d4..e5c03b534faefce8d2e8f30a5ebecd48b1a995dc 100644 (file)
@@ -246,7 +246,7 @@ static int reg_fixed_voltage_remove(struct platform_device *pdev)
 }
 
 #if defined(CONFIG_OF)
-static const struct of_device_id fixed_of_match[] __devinitconst = {
+static const struct of_device_id fixed_of_match[] = {
        { .compatible = "regulator-fixed", },
        {},
 };
index 8ae288fc150b8682c9cb597b0b4c07cd8cdfda8f..bae681ccd3ea73a24c0c0d3f98a948d9a7fd06f1 100644 (file)
@@ -365,7 +365,7 @@ static int gpio_regulator_remove(struct platform_device *pdev)
 }
 
 #if defined(CONFIG_OF)
-static const struct of_device_id regulator_gpio_of_match[] __devinitconst = {
+static const struct of_device_id regulator_gpio_of_match[] = {
        { .compatible = "regulator-gpio", },
        {},
 };
index 3ee26387b1211e07ca8f3e9e567aa511aa82b7bd..9a8ea916300523025affd734cc2de88668e82c7f 100644 (file)
@@ -248,8 +248,8 @@ static struct regulator_ops max8973_dcdc_ops = {
        .get_mode               = max8973_dcdc_get_mode,
 };
 
-static int __devinit max8973_init_dcdc(struct max8973_chip *max,
-               struct max8973_regulator_platform_data *pdata)
+static int max8973_init_dcdc(struct max8973_chip *max,
+                            struct max8973_regulator_platform_data *pdata)
 {
        int ret;
        uint8_t control1 = 0;
@@ -359,8 +359,8 @@ static const struct regmap_config max8973_regmap_config = {
        .cache_type             = REGCACHE_RBTREE,
 };
 
-static int __devinit max8973_probe(struct i2c_client *client,
-                                    const struct i2c_device_id *id)
+static int max8973_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct max8973_regulator_platform_data *pdata;
        struct regulator_config config = { };
@@ -463,7 +463,7 @@ static int __devinit max8973_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit max8973_remove(struct i2c_client *client)
+static int max8973_remove(struct i2c_client *client)
 {
        struct max8973_chip *max = i2c_get_clientdata(client);
 
@@ -484,7 +484,7 @@ static struct i2c_driver max8973_i2c_driver = {
                .owner = THIS_MODULE,
        },
        .probe = max8973_probe,
-       .remove = __devexit_p(max8973_remove),
+       .remove = max8973_remove,
        .id_table = max8973_id,
 };
 
index e915629a25cf64ed660e9ac9f2b2112b1ea228e9..c9e912f583bc57485e09909bff01b58af315d2cb 100644 (file)
@@ -806,7 +806,7 @@ static int palmas_remove(struct platform_device *pdev)
        return 0;
 }
 
-static struct of_device_id __devinitdata of_palmas_match_tbl[] = {
+static struct of_device_id of_palmas_match_tbl[] = {
        { .compatible = "ti,palmas-pmic", },
        { /* end */ }
 };
index 493c8c6a241f41b1820786b993b342816002bc1c..74508cc62d67baafcc39fb3face73f1e7a810d90 100644 (file)
@@ -1064,7 +1064,7 @@ static u8 twl_get_smps_mult(void)
 #define TWLFIXED_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLFIXED, label)
 #define TWLSMPS_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLSMPS, label)
 
-static const struct of_device_id twl_of_match[] __devinitconst = {
+static const struct of_device_id twl_of_match[] = {
        TWL4030_OF_MATCH("ti,twl4030-vaux1", VAUX1),
        TWL4030_OF_MATCH("ti,twl4030-vaux2", VAUX2_4030),
        TWL4030_OF_MATCH("ti,twl5030-vaux2", VAUX2),
index 32c289c2ba136a732e1cb508f06360fa5ae28c48..0e396c155b3ba60d0d202af60f9aa34f84afd5bf 100644 (file)
@@ -179,7 +179,7 @@ static struct rproc_ops omap_rproc_ops = {
        .kick           = omap_rproc_kick,
 };
 
-static int __devinit omap_rproc_probe(struct platform_device *pdev)
+static int omap_rproc_probe(struct platform_device *pdev)
 {
        struct omap_rproc_pdata *pdata = pdev->dev.platform_data;
        struct omap_rproc *oproc;
@@ -213,7 +213,7 @@ free_rproc:
        return ret;
 }
 
-static int __devexit omap_rproc_remove(struct platform_device *pdev)
+static int omap_rproc_remove(struct platform_device *pdev)
 {
        struct rproc *rproc = platform_get_drvdata(pdev);
 
@@ -225,7 +225,7 @@ static int __devexit omap_rproc_remove(struct platform_device *pdev)
 
 static struct platform_driver omap_rproc_driver = {
        .probe = omap_rproc_probe,
-       .remove = __devexit_p(omap_rproc_remove),
+       .remove = omap_rproc_remove,
        .driver = {
                .name = "omap-rproc",
                .owner = THIS_MODULE,
index 027096fe6a124dc9edde55da90517c5daac38747..f1e323924f1272ca3eea8546bdefb26613837559 100644 (file)
@@ -1022,7 +1022,7 @@ static int rpmsg_remove_device(struct device *dev, void *data)
        return 0;
 }
 
-static void __devexit rpmsg_remove(struct virtio_device *vdev)
+static void rpmsg_remove(struct virtio_device *vdev)
 {
        struct virtproc_info *vrp = vdev->priv;
        int ret;
@@ -1063,7 +1063,7 @@ static struct virtio_driver virtio_ipc_driver = {
        .driver.owner   = THIS_MODULE,
        .id_table       = id_table,
        .probe          = rpmsg_probe,
-       .remove         = __devexit_p(rpmsg_remove),
+       .remove         = rpmsg_remove,
 };
 
 static int __init rpmsg_init(void)
index d0cea02b5dfc5b58ca4ee3751f1c5737b221739d..923a9da9c829d7be9a3fe95bac77b0b7e4431de6 100644 (file)
@@ -352,6 +352,14 @@ config RTC_DRV_TWL4030
          This driver can also be built as a module. If so, the module
          will be called rtc-twl.
 
+config RTC_DRV_TPS6586X
+       tristate "TI TPS6586X RTC driver"
+       depends on MFD_TPS6586X
+       help
+         TI Power Managment IC TPS6586X supports RTC functionality
+         along with alarm. This driver supports the RTC driver for
+         the TPS6586X RTC module.
+
 config RTC_DRV_TPS65910
        tristate "TI TPS65910 RTC driver"
        depends on RTC_CLASS && MFD_TPS65910
index c3f62c80dc062687b435f24cc3dcbf8d4fd89794..4418ef3f9ecc9278b53aae5dd5177cff522b24ba 100644 (file)
@@ -111,6 +111,7 @@ obj-$(CONFIG_RTC_DRV_TEGRA) += rtc-tegra.o
 obj-$(CONFIG_RTC_DRV_TEST)     += rtc-test.o
 obj-$(CONFIG_RTC_DRV_TILE)     += rtc-tile.o
 obj-$(CONFIG_RTC_DRV_TWL4030)  += rtc-twl.o
+obj-$(CONFIG_RTC_DRV_TPS6586X) += rtc-tps6586x.o
 obj-$(CONFIG_RTC_DRV_TPS65910) += rtc-tps65910.o
 obj-$(CONFIG_RTC_DRV_TX4939)   += rtc-tx4939.o
 obj-$(CONFIG_RTC_DRV_V3020)    += rtc-v3020.o
index 6367984e05653f8a3b6f7b24040123f31d7ade15..63b17ebe90e8c2c3f568160b95090343cfbb46d8 100644 (file)
@@ -248,7 +248,7 @@ static int pm80x_rtc_resume(struct device *dev)
 
 static SIMPLE_DEV_PM_OPS(pm80x_rtc_pm_ops, pm80x_rtc_suspend, pm80x_rtc_resume);
 
-static int __devinit pm80x_rtc_probe(struct platform_device *pdev)
+static int pm80x_rtc_probe(struct platform_device *pdev)
 {
        struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
        struct pm80x_platform_data *pm80x_pdata;
@@ -342,7 +342,7 @@ out:
        return ret;
 }
 
-static int __devexit pm80x_rtc_remove(struct platform_device *pdev)
+static int pm80x_rtc_remove(struct platform_device *pdev)
 {
        struct pm80x_rtc_info *info = platform_get_drvdata(pdev);
        platform_set_drvdata(pdev, NULL);
@@ -358,7 +358,7 @@ static struct platform_driver pm80x_rtc_driver = {
                   .pm = &pm80x_rtc_pm_ops,
                   },
        .probe = pm80x_rtc_probe,
-       .remove = __devexit_p(pm80x_rtc_remove),
+       .remove = pm80x_rtc_remove,
 };
 
 module_platform_driver(pm80x_rtc_driver);
index de9e854b326ac9a06b0c2f3fea0c19b9bf78980e..f663746f46039dba5dfde86f50ad9c31f11cca31 100644 (file)
@@ -286,8 +286,8 @@ out:
 #endif
 
 #ifdef CONFIG_OF
-static int __devinit pm860x_rtc_dt_init(struct platform_device *pdev,
-                                       struct pm860x_rtc_info *info)
+static int pm860x_rtc_dt_init(struct platform_device *pdev,
+                             struct pm860x_rtc_info *info)
 {
        struct device_node *np = pdev->dev.parent->of_node;
        int ret;
@@ -307,7 +307,7 @@ static int __devinit pm860x_rtc_dt_init(struct platform_device *pdev,
 #define pm860x_rtc_dt_init(x, y)       (-1)
 #endif
 
-static int __devinit pm860x_rtc_probe(struct platform_device *pdev)
+static int pm860x_rtc_probe(struct platform_device *pdev)
 {
        struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
        struct pm860x_rtc_pdata *pdata = NULL;
@@ -412,7 +412,7 @@ out:
        return ret;
 }
 
-static int __devexit pm860x_rtc_remove(struct platform_device *pdev)
+static int pm860x_rtc_remove(struct platform_device *pdev)
 {
        struct pm860x_rtc_info *info = platform_get_drvdata(pdev);
 
@@ -459,7 +459,7 @@ static struct platform_driver pm860x_rtc_driver = {
                .pm     = &pm860x_rtc_pm_ops,
        },
        .probe          = pm860x_rtc_probe,
-       .remove         = __devexit_p(pm860x_rtc_remove),
+       .remove         = pm860x_rtc_remove,
 };
 
 module_platform_driver(pm860x_rtc_driver);
index 2e5970fe9eebccc97fc385460d9e0c365f0515e0..57cde2b061e6b9878c5ccf8052719d5e801b02ab 100644 (file)
@@ -389,7 +389,7 @@ static const struct rtc_class_ops ab8500_rtc_ops = {
        .alarm_irq_enable       = ab8500_rtc_irq_enable,
 };
 
-static int __devinit ab8500_rtc_probe(struct platform_device *pdev)
+static int ab8500_rtc_probe(struct platform_device *pdev)
 {
        int err;
        struct rtc_device *rtc;
@@ -448,7 +448,7 @@ static int __devinit ab8500_rtc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit ab8500_rtc_remove(struct platform_device *pdev)
+static int ab8500_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_device *rtc = platform_get_drvdata(pdev);
        int irq = platform_get_irq_byname(pdev, "ALARM");
@@ -468,7 +468,7 @@ static struct platform_driver ab8500_rtc_driver = {
                .owner = THIS_MODULE,
        },
        .probe  = ab8500_rtc_probe,
-       .remove = __devexit_p(ab8500_rtc_remove),
+       .remove = ab8500_rtc_remove,
 };
 
 module_platform_driver(ab8500_rtc_driver);
index e981798e9a9b55707d5326b576abc6af5a207e55..39cfd2ee0042528b4efb34ef4aae5776178cbd16 100644 (file)
@@ -289,7 +289,7 @@ static const struct rtc_class_ops at91_rtc_ops = {
 /*
  * Initialize and install RTC driver
  */
-static int __devinit at91_rtc_probe(struct platform_device *pdev)
+static int at91_rtc_probe(struct platform_device *pdev)
 {
        struct resource *r, *r_gpbr;
        struct sam9_rtc *rtc;
@@ -387,7 +387,7 @@ fail:
 /*
  * Disable and remove the RTC driver
  */
-static int __devexit at91_rtc_remove(struct platform_device *pdev)
+static int at91_rtc_remove(struct platform_device *pdev)
 {
        struct sam9_rtc *rtc = platform_get_drvdata(pdev);
        u32             mr = rtt_readl(rtc, MR);
@@ -463,7 +463,7 @@ static int at91_rtc_resume(struct platform_device *pdev)
 
 static struct platform_driver at91_rtc_driver = {
        .probe          = at91_rtc_probe,
-       .remove         = __devexit_p(at91_rtc_remove),
+       .remove         = at91_rtc_remove,
        .shutdown       = at91_rtc_shutdown,
        .suspend        = at91_rtc_suspend,
        .resume         = at91_rtc_resume,
index 979ed0406ce9141557bb4eaba23daca9b1fb1f32..b309da4ec7455207af724a39dc1d38d3cec0ad30 100644 (file)
@@ -62,7 +62,7 @@ static struct rtc_class_ops au1xtoy_rtc_ops = {
        .set_time       = au1xtoy_rtc_set_time,
 };
 
-static int __devinit au1xtoy_rtc_probe(struct platform_device *pdev)
+static int au1xtoy_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtcdev;
        unsigned long t;
@@ -116,7 +116,7 @@ out_err:
        return ret;
 }
 
-static int __devexit au1xtoy_rtc_remove(struct platform_device *pdev)
+static int au1xtoy_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_device *rtcdev = platform_get_drvdata(pdev);
 
@@ -131,7 +131,7 @@ static struct platform_driver au1xrtc_driver = {
                .name   = "rtc-au1xxx",
                .owner  = THIS_MODULE,
        },
-       .remove         = __devexit_p(au1xtoy_rtc_remove),
+       .remove         = au1xtoy_rtc_remove,
 };
 
 static int __init au1xtoy_rtc_init(void)
index abfc1a0c07d9cfb0c6e6f7c46249c1283d10afca..4ec614b0954d8f8c9b67ee68626b91b299c55cb2 100644 (file)
@@ -342,7 +342,7 @@ static struct rtc_class_ops bfin_rtc_ops = {
        .alarm_irq_enable = bfin_rtc_alarm_irq_enable,
 };
 
-static int __devinit bfin_rtc_probe(struct platform_device *pdev)
+static int bfin_rtc_probe(struct platform_device *pdev)
 {
        struct bfin_rtc *rtc;
        struct device *dev = &pdev->dev;
@@ -388,7 +388,7 @@ err:
        return ret;
 }
 
-static int __devexit bfin_rtc_remove(struct platform_device *pdev)
+static int bfin_rtc_remove(struct platform_device *pdev)
 {
        struct bfin_rtc *rtc = platform_get_drvdata(pdev);
        struct device *dev = &pdev->dev;
@@ -451,7 +451,7 @@ static struct platform_driver bfin_rtc_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = bfin_rtc_probe,
-       .remove         = __devexit_p(bfin_rtc_remove),
+       .remove         = bfin_rtc_remove,
        .suspend        = bfin_rtc_suspend,
        .resume         = bfin_rtc_resume,
 };
index f090159dce4a77005d8fc6a314b7de106877c6cb..036cb89f81882c5864e5b0cf43b8e995d4d63d1a 100644 (file)
@@ -163,7 +163,7 @@ static int bq32k_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit bq32k_remove(struct i2c_client *client)
+static int bq32k_remove(struct i2c_client *client)
 {
        struct rtc_device *rtc = i2c_get_clientdata(client);
 
@@ -183,7 +183,7 @@ static struct i2c_driver bq32k_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = bq32k_probe,
-       .remove         = __devexit_p(bq32k_remove),
+       .remove         = bq32k_remove,
        .id_table       = bq32k_id,
 };
 
index bf612ef229417730a8146f62d3a9270daba67d28..693be71b5b188be04f64219d862c70b5d1b2a227 100644 (file)
@@ -140,7 +140,7 @@ static const struct rtc_class_ops bq4802_ops = {
        .set_time       = bq4802_set_time,
 };
 
-static int __devinit bq4802_probe(struct platform_device *pdev)
+static int bq4802_probe(struct platform_device *pdev)
 {
        struct bq4802 *p = kzalloc(sizeof(*p), GFP_KERNEL);
        int err = -ENOMEM;
@@ -191,7 +191,7 @@ out_free:
        goto out;
 }
 
-static int __devexit bq4802_remove(struct platform_device *pdev)
+static int bq4802_remove(struct platform_device *pdev)
 {
        struct bq4802 *p = platform_get_drvdata(pdev);
 
@@ -215,7 +215,7 @@ static struct platform_driver bq4802_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = bq4802_probe,
-       .remove         = __devexit_p(bq4802_remove),
+       .remove         = bq4802_remove,
 };
 
 module_platform_driver(bq4802_driver);
index 4267789ca9959413e90df5ea053154e07481d3ce..16630aa87f45d181d37576fa2e71576196f1da53 100644 (file)
@@ -947,8 +947,7 @@ static void rtc_wake_off(struct device *dev)
  */
 static struct cmos_rtc_board_info acpi_rtc_info;
 
-static void __devinit
-cmos_wake_setup(struct device *dev)
+static void cmos_wake_setup(struct device *dev)
 {
        if (acpi_disabled)
                return;
@@ -980,8 +979,7 @@ cmos_wake_setup(struct device *dev)
 
 #else
 
-static void __devinit
-cmos_wake_setup(struct device *dev)
+static void cmos_wake_setup(struct device *dev)
 {
 }
 
@@ -991,8 +989,7 @@ cmos_wake_setup(struct device *dev)
 
 #include <linux/pnp.h>
 
-static int __devinit
-cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
+static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
 {
        cmos_wake_setup(&pnp->dev);
 
index 78070255bd3f834d7aa8efa937e5ca552c07f4d1..60b826e520e2e2c2c04a8d18328853a27d5c81b0 100644 (file)
@@ -228,7 +228,7 @@ static const struct rtc_class_ops da9052_rtc_ops = {
        .alarm_irq_enable = da9052_rtc_alarm_irq_enable,
 };
 
-static int __devinit da9052_rtc_probe(struct platform_device *pdev)
+static int da9052_rtc_probe(struct platform_device *pdev)
 {
        struct da9052_rtc *rtc;
        int ret;
@@ -262,7 +262,7 @@ err_free_irq:
        return ret;
 }
 
-static int __devexit da9052_rtc_remove(struct platform_device *pdev)
+static int da9052_rtc_remove(struct platform_device *pdev)
 {
        struct da9052_rtc *rtc = pdev->dev.platform_data;
 
@@ -275,7 +275,7 @@ static int __devexit da9052_rtc_remove(struct platform_device *pdev)
 
 static struct platform_driver da9052_rtc_driver = {
        .probe  = da9052_rtc_probe,
-       .remove = __devexit_p(da9052_rtc_remove),
+       .remove = da9052_rtc_remove,
        .driver = {
                .name   = "da9052-rtc",
                .owner  = THIS_MODULE,
index 96bafc5c3bf87c2426892cdc0ffa46756e7baf36..8f0dcfedb83cdfb9c613083574e8e591826beaf5 100644 (file)
@@ -227,7 +227,7 @@ static const struct rtc_class_ops da9055_rtc_ops = {
        .alarm_irq_enable = da9055_rtc_alarm_irq_enable,
 };
 
-static int __init da9055_rtc_device_init(struct da9055 *da9055,
+static int da9055_rtc_device_init(struct da9055 *da9055,
                                        struct da9055_pdata *pdata)
 {
        int ret;
index 07cd03eae60605f1c993ce585182ad0dd5f33c96..5f7982f7c1b5ab6ff589f8ce535c2cb10bf65afa 100644 (file)
@@ -567,7 +567,7 @@ fail2:
        return ret;
 }
 
-static int __devexit davinci_rtc_remove(struct platform_device *pdev)
+static int davinci_rtc_remove(struct platform_device *pdev)
 {
        struct davinci_rtc *davinci_rtc = platform_get_drvdata(pdev);
 
@@ -589,7 +589,7 @@ static int __devexit davinci_rtc_remove(struct platform_device *pdev)
 
 static struct platform_driver davinci_rtc_driver = {
        .probe          = davinci_rtc_probe,
-       .remove         = __devexit_p(davinci_rtc_remove),
+       .remove         = davinci_rtc_remove,
        .driver         = {
                .name = "rtc_davinci",
                .owner = THIS_MODULE,
index d4457afcba8910892f85e90fa72309104fd73db5..b2ed2c94b081b12f88a2e7f43e3541103a3c72ca 100644 (file)
@@ -123,7 +123,7 @@ static struct rtc_class_ops dm355evm_rtc_ops = {
 
 /*----------------------------------------------------------------------*/
 
-static int __devinit dm355evm_rtc_probe(struct platform_device *pdev)
+static int dm355evm_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
 
@@ -139,7 +139,7 @@ static int __devinit dm355evm_rtc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit dm355evm_rtc_remove(struct platform_device *pdev)
+static int dm355evm_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_device *rtc = platform_get_drvdata(pdev);
 
@@ -154,7 +154,7 @@ static int __devexit dm355evm_rtc_remove(struct platform_device *pdev)
  */
 static struct platform_driver rtc_dm355evm_driver = {
        .probe          = dm355evm_rtc_probe,
-       .remove         = __devexit_p(dm355evm_rtc_remove),
+       .remove         = dm355evm_rtc_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "rtc-dm355evm",
index 990c3ff489bf1fff947c854d747121b16c0de36c..d989412a348ab99911dbc0bd6889e5ae27ffc923 100644 (file)
@@ -329,7 +329,7 @@ static const struct rtc_class_ops ds1286_ops = {
        .alarm_irq_enable = ds1286_alarm_irq_enable,
 };
 
-static int __devinit ds1286_probe(struct platform_device *pdev)
+static int ds1286_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        struct resource *res;
@@ -376,7 +376,7 @@ out:
        return ret;
 }
 
-static int __devexit ds1286_remove(struct platform_device *pdev)
+static int ds1286_remove(struct platform_device *pdev)
 {
        struct ds1286_priv *priv = platform_get_drvdata(pdev);
 
@@ -393,7 +393,7 @@ static struct platform_driver ds1286_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ds1286_probe,
-       .remove         = __devexit_p(ds1286_remove),
+       .remove         = ds1286_remove,
 };
 
 module_platform_driver(ds1286_platform_driver);
index f0d63892264410b23e19753885868cca81071eda..fdbcdb289d605d21e26f7bb0006db8bd7709bbf4 100644 (file)
@@ -234,7 +234,7 @@ static int __init ds1302_rtc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit ds1302_rtc_remove(struct platform_device *pdev)
+static int ds1302_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_device *rtc = platform_get_drvdata(pdev);
 
@@ -249,7 +249,7 @@ static struct platform_driver ds1302_platform_driver = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
        },
-       .remove         = __devexit_p(ds1302_rtc_remove),
+       .remove         = ds1302_rtc_remove,
 };
 
 static int __init ds1302_rtc_init(void)
index 686a865913e19c9f1bbc896074aa253e6da5b3f0..d578773f5ce21c18f0660114ad72fe5afd646f9b 100644 (file)
@@ -601,7 +601,7 @@ static struct bin_attribute nvram = {
  * Interface to SPI stack
  */
 
-static int __devinit ds1305_probe(struct spi_device *spi)
+static int ds1305_probe(struct spi_device *spi)
 {
        struct ds1305                   *ds1305;
        int                             status;
@@ -787,7 +787,7 @@ fail0:
        return status;
 }
 
-static int __devexit ds1305_remove(struct spi_device *spi)
+static int ds1305_remove(struct spi_device *spi)
 {
        struct ds1305 *ds1305 = spi_get_drvdata(spi);
 
@@ -810,7 +810,7 @@ static struct spi_driver ds1305_driver = {
        .driver.name    = "rtc-ds1305",
        .driver.owner   = THIS_MODULE,
        .probe          = ds1305_probe,
-       .remove         = __devexit_p(ds1305_remove),
+       .remove         = ds1305_remove,
        /* REVISIT add suspend/resume */
 };
 
index 836710ce750e703ae06f8761aca9d00b64bd84f9..e0d0ba4de03f34d84b7454b7201050ee66e0317a 100644 (file)
@@ -617,8 +617,8 @@ ds1307_nvram_write(struct file *filp, struct kobject *kobj,
 
 /*----------------------------------------------------------------------*/
 
-static int __devinit ds1307_probe(struct i2c_client *client,
-                                 const struct i2c_device_id *id)
+static int ds1307_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
 {
        struct ds1307           *ds1307;
        int                     err = -ENODEV;
@@ -938,7 +938,7 @@ exit_free:
        return err;
 }
 
-static int __devexit ds1307_remove(struct i2c_client *client)
+static int ds1307_remove(struct i2c_client *client)
 {
        struct ds1307 *ds1307 = i2c_get_clientdata(client);
 
@@ -963,7 +963,7 @@ static struct i2c_driver ds1307_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ds1307_probe,
-       .remove         = __devexit_p(ds1307_remove),
+       .remove         = ds1307_remove,
        .id_table       = ds1307_id,
 };
 
index 966316088b7f8979e9b7e2cd3eff7f52c703c080..fef76868aae069e1112c16619c502dd30fdc967a 100644 (file)
@@ -391,7 +391,7 @@ out_free:
        return ret;
 }
 
-static int __devexit ds1374_remove(struct i2c_client *client)
+static int ds1374_remove(struct i2c_client *client)
 {
        struct ds1374 *ds1374 = i2c_get_clientdata(client);
 
@@ -442,7 +442,7 @@ static struct i2c_driver ds1374_driver = {
                .pm = DS1374_PM,
        },
        .probe = ds1374_probe,
-       .remove = __devexit_p(ds1374_remove),
+       .remove = ds1374_remove,
        .id_table = ds1374_id,
 };
 
index b0a99e1b25be96684d821351312da7aa0e025c8b..f994257981a043569cbb8ac88a0a090d7c597458 100644 (file)
@@ -121,7 +121,7 @@ static const struct rtc_class_ops ds1390_rtc_ops = {
        .set_time       = ds1390_set_time,
 };
 
-static int __devinit ds1390_probe(struct spi_device *spi)
+static int ds1390_probe(struct spi_device *spi)
 {
        unsigned char tmp;
        struct ds1390 *chip;
@@ -156,7 +156,7 @@ static int __devinit ds1390_probe(struct spi_device *spi)
        return res;
 }
 
-static int __devexit ds1390_remove(struct spi_device *spi)
+static int ds1390_remove(struct spi_device *spi)
 {
        struct ds1390 *chip = spi_get_drvdata(spi);
 
@@ -172,7 +172,7 @@ static struct spi_driver ds1390_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = ds1390_probe,
-       .remove = __devexit_p(ds1390_remove),
+       .remove = ds1390_remove,
 };
 
 module_spi_driver(ds1390_driver);
index 1f675f5294f5844c6ef04ee33bc594c754a821c8..6a3fcfe3b0e7379f88d8901a4d68b9c38c9261f9 100644 (file)
@@ -476,8 +476,7 @@ static struct bin_attribute ds1511_nvram_attr = {
        .write = ds1511_nvram_write,
 };
 
- static int __devinit
-ds1511_rtc_probe(struct platform_device *pdev)
+static int ds1511_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        struct resource *res;
@@ -551,8 +550,7 @@ ds1511_rtc_probe(struct platform_device *pdev)
        return ret;
 }
 
- static int __devexit
-ds1511_rtc_remove(struct platform_device *pdev)
+static int ds1511_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
@@ -573,7 +571,7 @@ MODULE_ALIAS("platform:ds1511");
 
 static struct platform_driver ds1511_rtc_driver = {
        .probe          = ds1511_rtc_probe,
-       .remove         = __devexit_p(ds1511_rtc_remove),
+       .remove         = ds1511_rtc_remove,
        .driver         = {
                .name   = "ds1511",
                .owner  = THIS_MODULE,
index 6ccedbbf923c5ce0cb183504bf64968f06869609..25ce0621ade994bd5a070ad16ac30c50291d2a6f 100644 (file)
@@ -276,7 +276,7 @@ static struct bin_attribute ds1553_nvram_attr = {
        .write = ds1553_nvram_write,
 };
 
-static int __devinit ds1553_rtc_probe(struct platform_device *pdev)
+static int ds1553_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        struct resource *res;
@@ -338,7 +338,7 @@ static int __devinit ds1553_rtc_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int __devexit ds1553_rtc_remove(struct platform_device *pdev)
+static int ds1553_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
@@ -354,7 +354,7 @@ MODULE_ALIAS("platform:rtc-ds1553");
 
 static struct platform_driver ds1553_rtc_driver = {
        .probe          = ds1553_rtc_probe,
-       .remove         = __devexit_p(ds1553_rtc_remove),
+       .remove         = ds1553_rtc_remove,
        .driver         = {
                .name   = "rtc-ds1553",
                .owner  = THIS_MODULE,
index 76112667c5078103c8bc4f64dd1b30201a5f1fde..609c870e2cc5b88cb243255e651aed4ec6d1b253 100644 (file)
@@ -159,7 +159,7 @@ static ssize_t ds1742_nvram_write(struct file *filp, struct kobject *kobj,
        return count;
 }
 
-static int __devinit ds1742_rtc_probe(struct platform_device *pdev)
+static int ds1742_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        struct resource *res;
@@ -222,7 +222,7 @@ static int __devinit ds1742_rtc_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int __devexit ds1742_rtc_remove(struct platform_device *pdev)
+static int ds1742_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
@@ -233,7 +233,7 @@ static int __devexit ds1742_rtc_remove(struct platform_device *pdev)
 
 static struct platform_driver ds1742_rtc_driver = {
        .probe          = ds1742_rtc_probe,
-       .remove         = __devexit_p(ds1742_rtc_remove),
+       .remove         = ds1742_rtc_remove,
        .driver         = {
                .name   = "rtc-ds1742",
                .owner  = THIS_MODULE,
index e1945095814e9acd9d920f0d7fd31f242de58f97..db0ca08db315e155089003e7043268bce63fba02 100644 (file)
@@ -391,8 +391,8 @@ static const struct rtc_class_ops ds3232_rtc_ops = {
        .alarm_irq_enable = ds3232_alarm_irq_enable,
 };
 
-static int __devinit ds3232_probe(struct i2c_client *client,
-               const struct i2c_device_id *id)
+static int ds3232_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
 {
        struct ds3232 *ds3232;
        int ret;
@@ -439,7 +439,7 @@ out_free:
        return ret;
 }
 
-static int __devexit ds3232_remove(struct i2c_client *client)
+static int ds3232_remove(struct i2c_client *client)
 {
        struct ds3232 *ds3232 = i2c_get_clientdata(client);
 
@@ -469,7 +469,7 @@ static struct i2c_driver ds3232_driver = {
                .owner = THIS_MODULE,
        },
        .probe = ds3232_probe,
-       .remove = __devexit_p(ds3232_remove),
+       .remove = ds3232_remove,
        .id_table = ds3232_id,
 };
 
index fda707926f022b26646342369db135d04e32e9ec..7a4495ef1c39846eb2615cb6cb48d0377c3becc0 100644 (file)
@@ -105,7 +105,7 @@ static const struct rtc_class_ops ds3234_rtc_ops = {
        .set_time       = ds3234_set_time,
 };
 
-static int __devinit ds3234_probe(struct spi_device *spi)
+static int ds3234_probe(struct spi_device *spi)
 {
        struct rtc_device *rtc;
        unsigned char tmp;
@@ -156,7 +156,7 @@ static int __devinit ds3234_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit ds3234_remove(struct spi_device *spi)
+static int ds3234_remove(struct spi_device *spi)
 {
        struct rtc_device *rtc = spi_get_drvdata(spi);
 
@@ -170,7 +170,7 @@ static struct spi_driver ds3234_driver = {
                .owner  = THIS_MODULE,
        },
        .probe   = ds3234_probe,
-       .remove = __devexit_p(ds3234_remove),
+       .remove = ds3234_remove,
 };
 
 module_spi_driver(ds3234_driver);
index 9602278ff988df3affbb58b03d88dd7908508447..1a4e5e4a70cddcd4eba6fa9f304184a25532374a 100644 (file)
@@ -127,7 +127,7 @@ static const struct attribute_group ep93xx_rtc_sysfs_files = {
        .attrs  = ep93xx_rtc_attrs,
 };
 
-static int __devinit ep93xx_rtc_probe(struct platform_device *pdev)
+static int ep93xx_rtc_probe(struct platform_device *pdev)
 {
        struct ep93xx_rtc *ep93xx_rtc;
        struct resource *res;
@@ -174,7 +174,7 @@ exit:
        return err;
 }
 
-static int __devexit ep93xx_rtc_remove(struct platform_device *pdev)
+static int ep93xx_rtc_remove(struct platform_device *pdev)
 {
        struct ep93xx_rtc *ep93xx_rtc = platform_get_drvdata(pdev);
 
@@ -192,7 +192,7 @@ static struct platform_driver ep93xx_rtc_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = ep93xx_rtc_probe,
-       .remove         = __devexit_p(ep93xx_rtc_remove),
+       .remove         = ep93xx_rtc_remove,
 };
 
 module_platform_driver(ep93xx_rtc_driver);
index 86b6ecce99f00c58b26d08987778fb63eb149755..04e93c6597f8905b5cfeae366fc0e874f697973a 100644 (file)
@@ -361,8 +361,8 @@ static const struct rtc_class_ops fm3130_rtc_ops = {
 
 static struct i2c_driver fm3130_driver;
 
-static int __devinit fm3130_probe(struct i2c_client *client,
-                                 const struct i2c_device_id *id)
+static int fm3130_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
 {
        struct fm3130           *fm3130;
        int                     err = -ENODEV;
@@ -546,7 +546,7 @@ exit_free:
        return err;
 }
 
-static int __devexit fm3130_remove(struct i2c_client *client)
+static int fm3130_remove(struct i2c_client *client)
 {
        struct fm3130 *fm3130 = i2c_get_clientdata(client);
 
@@ -561,7 +561,7 @@ static struct i2c_driver fm3130_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = fm3130_probe,
-       .remove         = __devexit_p(fm3130_remove),
+       .remove         = fm3130_remove,
        .id_table       = fm3130_id,
 };
 
index 8da7a5cf83c67cf66dd26dc9459b63cc884a54c4..75d307ab37f47ee67c1d8f3815ceced1a9ac4d20 100644 (file)
@@ -480,7 +480,7 @@ err:
        return rc;
 }
 
-static int __devexit dryice_rtc_remove(struct platform_device *pdev)
+static int dryice_rtc_remove(struct platform_device *pdev)
 {
        struct imxdi_dev *imxdi = platform_get_drvdata(pdev);
 
@@ -512,7 +512,7 @@ static struct platform_driver dryice_rtc_driver = {
                   .owner = THIS_MODULE,
                   .of_match_table = of_match_ptr(dryice_dt_ids),
                   },
-       .remove = __devexit_p(dryice_rtc_remove),
+       .remove = dryice_rtc_remove,
 };
 
 static int __init dryice_rtc_init(void)
index 1224182d3eabb165892aeb3350c1914bf590c9a1..1e48686ca6d22c9b54de8394cd9dced5c80b9c20 100644 (file)
@@ -210,7 +210,7 @@ void jz4740_rtc_poweroff(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(jz4740_rtc_poweroff);
 
-static int __devinit jz4740_rtc_probe(struct platform_device *pdev)
+static int jz4740_rtc_probe(struct platform_device *pdev)
 {
        int ret;
        struct jz4740_rtc *rtc;
@@ -297,7 +297,7 @@ err_free:
        return ret;
 }
 
-static int __devexit jz4740_rtc_remove(struct platform_device *pdev)
+static int jz4740_rtc_remove(struct platform_device *pdev)
 {
        struct jz4740_rtc *rtc = platform_get_drvdata(pdev);
 
@@ -347,7 +347,7 @@ static const struct dev_pm_ops jz4740_pm_ops = {
 
 static struct platform_driver jz4740_rtc_driver = {
        .probe   = jz4740_rtc_probe,
-       .remove  = __devexit_p(jz4740_rtc_remove),
+       .remove  = jz4740_rtc_remove,
        .driver  = {
                .name  = "jz4740-rtc",
                .owner = THIS_MODULE,
index d5218553741ff54f871799f51b5969d74eabe85c..40a598332bacc83fa1371a385fb178a5b1b78d24 100644 (file)
@@ -197,7 +197,7 @@ static const struct rtc_class_ops lpc32xx_rtc_ops = {
        .alarm_irq_enable       = lpc32xx_rtc_alarm_irq_enable,
 };
 
-static int __devinit lpc32xx_rtc_probe(struct platform_device *pdev)
+static int lpc32xx_rtc_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct lpc32xx_rtc *rtc;
@@ -299,7 +299,7 @@ static int __devinit lpc32xx_rtc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit lpc32xx_rtc_remove(struct platform_device *pdev)
+static int lpc32xx_rtc_remove(struct platform_device *pdev)
 {
        struct lpc32xx_rtc *rtc = platform_get_drvdata(pdev);
 
@@ -397,7 +397,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_rtc_match);
 
 static struct platform_driver lpc32xx_rtc_driver = {
        .probe          = lpc32xx_rtc_probe,
-       .remove         = __devexit_p(lpc32xx_rtc_remove),
+       .remove         = lpc32xx_rtc_remove,
        .driver = {
                .name   = RTC_NAME,
                .owner  = THIS_MODULE,
index 07e81c5f8247246d9ffade03a94d92adf47c1b7d..f59b6349551affbc0c235c4366420f8070fb5f05 100644 (file)
@@ -143,7 +143,7 @@ static struct rtc_class_ops  ls1x_rtc_ops = {
        .set_time       = ls1x_rtc_set_time,
 };
 
-static int __devinit ls1x_rtc_probe(struct platform_device *pdev)
+static int ls1x_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtcdev;
        unsigned long v;
@@ -185,7 +185,7 @@ err:
        return ret;
 }
 
-static int __devexit ls1x_rtc_remove(struct platform_device *pdev)
+static int ls1x_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_device *rtcdev = platform_get_drvdata(pdev);
 
@@ -200,7 +200,7 @@ static struct platform_driver  ls1x_rtc_driver = {
                .name   = "ls1x-rtc",
                .owner  = THIS_MODULE,
        },
-       .remove         = __devexit_p(ls1x_rtc_remove),
+       .remove         = ls1x_rtc_remove,
        .probe          = ls1x_rtc_probe,
 };
 
index efab3d48cb153314e8fdbf600da18eb6289dd5fe..49169680786e5005a4154befca38ba8dd2decdba 100644 (file)
@@ -170,7 +170,7 @@ static const struct rtc_class_ops m41t93_rtc_ops = {
 
 static struct spi_driver m41t93_driver;
 
-static int __devinit m41t93_probe(struct spi_device *spi)
+static int m41t93_probe(struct spi_device *spi)
 {
        struct rtc_device *rtc;
        int res;
@@ -195,7 +195,7 @@ static int __devinit m41t93_probe(struct spi_device *spi)
 }
 
 
-static int __devexit m41t93_remove(struct spi_device *spi)
+static int m41t93_remove(struct spi_device *spi)
 {
        struct rtc_device *rtc = spi_get_drvdata(spi);
 
@@ -211,7 +211,7 @@ static struct spi_driver m41t93_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = m41t93_probe,
-       .remove = __devexit_p(m41t93_remove),
+       .remove = m41t93_remove,
 };
 
 module_spi_driver(m41t93_driver);
index 6e78193e026b8b2c38599d62cde552a2ba7864b4..89266c6764bc0915bdf0d1b78cfa065fa699f20f 100644 (file)
@@ -110,7 +110,7 @@ static const struct rtc_class_ops m41t94_rtc_ops = {
 
 static struct spi_driver m41t94_driver;
 
-static int __devinit m41t94_probe(struct spi_device *spi)
+static int m41t94_probe(struct spi_device *spi)
 {
        struct rtc_device *rtc;
        int res;
@@ -134,7 +134,7 @@ static int __devinit m41t94_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit m41t94_remove(struct spi_device *spi)
+static int m41t94_remove(struct spi_device *spi)
 {
        struct rtc_device *rtc = spi_get_drvdata(spi);
 
@@ -150,7 +150,7 @@ static struct spi_driver m41t94_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = m41t94_probe,
-       .remove = __devexit_p(m41t94_remove),
+       .remove = m41t94_remove,
 };
 
 module_spi_driver(m41t94_driver);
index f9e3b3583733a21a296a0a2ec32bbfe8daf4f699..31c9190a1fcb7ee0331d8de58a2922501db85f35 100644 (file)
@@ -141,7 +141,7 @@ static const struct rtc_class_ops m48t35_ops = {
        .set_time       = m48t35_set_time,
 };
 
-static int __devinit m48t35_probe(struct platform_device *pdev)
+static int m48t35_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct m48t35_priv *priv;
@@ -194,7 +194,7 @@ out:
        return ret;
 }
 
-static int __devexit m48t35_remove(struct platform_device *pdev)
+static int m48t35_remove(struct platform_device *pdev)
 {
        struct m48t35_priv *priv = platform_get_drvdata(pdev);
 
@@ -213,7 +213,7 @@ static struct platform_driver m48t35_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = m48t35_probe,
-       .remove         = __devexit_p(m48t35_remove),
+       .remove         = m48t35_remove,
 };
 
 module_platform_driver(m48t35_platform_driver);
index 30ebfec9fd2b84a6bdd819bc3a736bdea86218c7..130f29af3869c974160c896d41ce890a6a64e217 100644 (file)
@@ -383,7 +383,7 @@ static struct bin_attribute m48t59_nvram_attr = {
        .write = m48t59_nvram_write,
 };
 
-static int __devinit m48t59_rtc_probe(struct platform_device *pdev)
+static int m48t59_rtc_probe(struct platform_device *pdev)
 {
        struct m48t59_plat_data *pdata = pdev->dev.platform_data;
        struct m48t59_private *m48t59 = NULL;
@@ -501,7 +501,7 @@ out:
        return ret;
 }
 
-static int __devexit m48t59_rtc_remove(struct platform_device *pdev)
+static int m48t59_rtc_remove(struct platform_device *pdev)
 {
        struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
        struct m48t59_plat_data *pdata = pdev->dev.platform_data;
@@ -527,7 +527,7 @@ static struct platform_driver m48t59_rtc_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = m48t59_rtc_probe,
-       .remove         = __devexit_p(m48t59_rtc_remove),
+       .remove         = m48t59_rtc_remove,
 };
 
 module_platform_driver(m48t59_rtc_driver);
index 863fb3363aa6da503a5e0d66f1b1e7e853a97dca..2ffbcacd243917c7f879cfa4c8555cef3892a77d 100644 (file)
@@ -144,7 +144,7 @@ static const struct rtc_class_ops m48t86_rtc_ops = {
        .proc           = m48t86_rtc_proc,
 };
 
-static int __devinit m48t86_rtc_probe(struct platform_device *dev)
+static int m48t86_rtc_probe(struct platform_device *dev)
 {
        unsigned char reg;
        struct m48t86_ops *ops = dev->dev.platform_data;
@@ -164,7 +164,7 @@ static int __devinit m48t86_rtc_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit m48t86_rtc_remove(struct platform_device *dev)
+static int m48t86_rtc_remove(struct platform_device *dev)
 {
        struct rtc_device *rtc = platform_get_drvdata(dev);
 
@@ -182,7 +182,7 @@ static struct platform_driver m48t86_rtc_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = m48t86_rtc_probe,
-       .remove         = __devexit_p(m48t86_rtc_remove),
+       .remove         = m48t86_rtc_remove,
 };
 
 module_platform_driver(m48t86_rtc_platform_driver);
index 36c74d22e8b50a490082745b435aa284e37a4eb7..7d0bf698b79ed1f5bd6a95f4fc0f4910d11a1639 100644 (file)
@@ -120,7 +120,7 @@ static const struct rtc_class_ops max6902_rtc_ops = {
        .set_time       = max6902_set_time,
 };
 
-static int __devinit max6902_probe(struct spi_device *spi)
+static int max6902_probe(struct spi_device *spi)
 {
        struct rtc_device *rtc;
        unsigned char tmp;
@@ -143,7 +143,7 @@ static int __devinit max6902_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit max6902_remove(struct spi_device *spi)
+static int max6902_remove(struct spi_device *spi)
 {
        struct rtc_device *rtc = dev_get_drvdata(&spi->dev);
 
@@ -157,7 +157,7 @@ static struct spi_driver max6902_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = max6902_probe,
-       .remove = __devexit_p(max6902_remove),
+       .remove = max6902_remove,
 };
 
 module_spi_driver(max6902_driver);
index e094ffa434f827eb3cce26aa470f3a5a9f11c300..1d049da16c8527e0e5a44dc03bd82c983c9d1e9a 100644 (file)
@@ -176,7 +176,7 @@ static const struct rtc_class_ops max8907_rtc_ops = {
        .set_alarm      = max8907_rtc_set_alarm,
 };
 
-static int __devinit max8907_rtc_probe(struct platform_device *pdev)
+static int max8907_rtc_probe(struct platform_device *pdev)
 {
        struct max8907 *max8907 = dev_get_drvdata(pdev->dev.parent);
        struct max8907_rtc *rtc;
@@ -220,7 +220,7 @@ err_unregister:
        return ret;
 }
 
-static int __devexit max8907_rtc_remove(struct platform_device *pdev)
+static int max8907_rtc_remove(struct platform_device *pdev)
 {
        struct max8907_rtc *rtc = platform_get_drvdata(pdev);
 
@@ -236,7 +236,7 @@ static struct platform_driver max8907_rtc_driver = {
                .owner = THIS_MODULE,
        },
        .probe = max8907_rtc_probe,
-       .remove = __devexit_p(max8907_rtc_remove),
+       .remove = max8907_rtc_remove,
 };
 module_platform_driver(max8907_rtc_driver);
 
index 34e4349611dbdd6302a33d7b2917f1144a7ef306..a0c8265646d246981d51e8779706e924b8ad344c 100644 (file)
@@ -247,7 +247,7 @@ static const struct rtc_class_ops max8925_rtc_ops = {
        .set_alarm      = max8925_rtc_set_alarm,
 };
 
-static int __devinit max8925_rtc_probe(struct platform_device *pdev)
+static int max8925_rtc_probe(struct platform_device *pdev)
 {
        struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent);
        struct max8925_rtc_info *info;
@@ -292,7 +292,7 @@ out_irq:
        return ret;
 }
 
-static int __devexit max8925_rtc_remove(struct platform_device *pdev)
+static int max8925_rtc_remove(struct platform_device *pdev)
 {
        struct max8925_rtc_info *info = platform_get_drvdata(pdev);
 
@@ -334,7 +334,7 @@ static struct platform_driver max8925_rtc_driver = {
                .pm     = &max8925_rtc_pm_ops,
        },
        .probe          = max8925_rtc_probe,
-       .remove         = __devexit_p(max8925_rtc_remove),
+       .remove         = max8925_rtc_remove,
 };
 
 module_platform_driver(max8925_rtc_driver);
index 7196f438c0895707233a4e9b0814c680e7821722..8f234a075e8fe38f5e76ebf5d463089f1e479ff5 100644 (file)
@@ -249,7 +249,7 @@ static const struct rtc_class_ops max8998_rtc_ops = {
        .alarm_irq_enable = max8998_rtc_alarm_irq_enable,
 };
 
-static int __devinit max8998_rtc_probe(struct platform_device *pdev)
+static int max8998_rtc_probe(struct platform_device *pdev)
 {
        struct max8998_dev *max8998 = dev_get_drvdata(pdev->dev.parent);
        struct max8998_platform_data *pdata = dev_get_platdata(max8998->dev);
@@ -298,7 +298,7 @@ out_rtc:
        return ret;
 }
 
-static int __devexit max8998_rtc_remove(struct platform_device *pdev)
+static int max8998_rtc_remove(struct platform_device *pdev)
 {
        struct max8998_rtc_info *info = platform_get_drvdata(pdev);
 
@@ -323,7 +323,7 @@ static struct platform_driver max8998_rtc_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = max8998_rtc_probe,
-       .remove         = __devexit_p(max8998_rtc_remove),
+       .remove         = max8998_rtc_remove,
        .id_table       = max8998_rtc_id,
 };
 
index 029e421baaed49b7f62c58c0ef89454d2fa2053b..bec10be96f84222a7d50d9742c8d84f920b37170 100644 (file)
@@ -306,7 +306,7 @@ static const struct rtc_class_ops mpc5200_rtc_ops = {
        .alarm_irq_enable = mpc5121_rtc_alarm_irq_enable,
 };
 
-static int __devinit mpc5121_rtc_probe(struct platform_device *op)
+static int mpc5121_rtc_probe(struct platform_device *op)
 {
        struct mpc5121_rtc_data *rtc;
        int err = 0;
@@ -382,7 +382,7 @@ out_free:
        return err;
 }
 
-static int __devexit mpc5121_rtc_remove(struct platform_device *op)
+static int mpc5121_rtc_remove(struct platform_device *op)
 {
        struct mpc5121_rtc_data *rtc = dev_get_drvdata(&op->dev);
        struct mpc5121_rtc_regs __iomem *regs = rtc->regs;
@@ -403,7 +403,7 @@ static int __devexit mpc5121_rtc_remove(struct platform_device *op)
        return 0;
 }
 
-static struct of_device_id mpc5121_rtc_match[] __devinitdata = {
+static struct of_device_id mpc5121_rtc_match[] = {
        { .compatible = "fsl,mpc5121-rtc", },
        { .compatible = "fsl,mpc5200-rtc", },
        {},
@@ -416,7 +416,7 @@ static struct platform_driver mpc5121_rtc_driver = {
                .of_match_table = mpc5121_rtc_match,
        },
        .probe = mpc5121_rtc_probe,
-       .remove = __devexit_p(mpc5121_rtc_remove),
+       .remove = mpc5121_rtc_remove,
 };
 
 module_platform_driver(mpc5121_rtc_driver);
index f51719bf4a758dd1576df26227f60c30c3bd6eb9..578baf9d9725cf3bbfdb91669af5cda56ff9d7ef 100644 (file)
@@ -322,8 +322,8 @@ static irqreturn_t mrst_rtc_irq(int irq, void *p)
        return IRQ_NONE;
 }
 
-static int __devinit
-vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, int rtc_irq)
+static int vrtc_mrst_do_probe(struct device *dev, struct resource *iomem,
+                             int rtc_irq)
 {
        int retval = 0;
        unsigned char rtc_control;
@@ -394,7 +394,7 @@ static void rtc_mrst_do_shutdown(void)
        spin_unlock_irq(&rtc_lock);
 }
 
-static void __devexit rtc_mrst_do_remove(struct device *dev)
+static void rtc_mrst_do_remove(struct device *dev)
 {
        struct mrst_rtc *mrst = dev_get_drvdata(dev);
        struct resource *iomem;
@@ -503,14 +503,14 @@ static inline int mrst_poweroff(struct device *dev)
 
 #endif
 
-static int __devinit vrtc_mrst_platform_probe(struct platform_device *pdev)
+static int vrtc_mrst_platform_probe(struct platform_device *pdev)
 {
        return vrtc_mrst_do_probe(&pdev->dev,
                        platform_get_resource(pdev, IORESOURCE_MEM, 0),
                        platform_get_irq(pdev, 0));
 }
 
-static int __devexit vrtc_mrst_platform_remove(struct platform_device *pdev)
+static int vrtc_mrst_platform_remove(struct platform_device *pdev)
 {
        rtc_mrst_do_remove(&pdev->dev);
        return 0;
@@ -528,7 +528,7 @@ MODULE_ALIAS("platform:vrtc_mrst");
 
 static struct platform_driver vrtc_mrst_platform_driver = {
        .probe          = vrtc_mrst_platform_probe,
-       .remove         = __devexit_p(vrtc_mrst_platform_remove),
+       .remove         = vrtc_mrst_platform_remove,
        .shutdown       = vrtc_mrst_platform_shutdown,
        .driver = {
                .name           = (char *) driver_name,
index ebc1649d45d61ef068792d479bdc7deb438ad5c8..57233c8859989d15a2a6ce5b041c1363d07374c2 100644 (file)
@@ -215,7 +215,7 @@ static const struct rtc_class_ops mv_rtc_alarm_ops = {
        .alarm_irq_enable = mv_rtc_alarm_irq_enable,
 };
 
-static int __devinit mv_rtc_probe(struct platform_device *pdev)
+static int mv_rtc_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct rtc_plat_data *pdata;
index 7304139934aaff357cde2f88b0b5db49d9095d43..1c3ef72895659c5142435e9cd87055f46e02ead1 100644 (file)
@@ -368,7 +368,7 @@ static struct rtc_class_ops mxc_rtc_ops = {
        .alarm_irq_enable       = mxc_rtc_alarm_irq_enable,
 };
 
-static int __devinit mxc_rtc_probe(struct platform_device *pdev)
+static int mxc_rtc_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct rtc_device *rtc;
@@ -460,7 +460,7 @@ exit_free_pdata:
        return ret;
 }
 
-static int __devexit mxc_rtc_remove(struct platform_device *pdev)
+static int mxc_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
@@ -509,7 +509,7 @@ static struct platform_driver mxc_rtc_driver = {
        },
        .id_table = imx_rtc_devtype,
        .probe = mxc_rtc_probe,
-       .remove = __devexit_p(mxc_rtc_remove),
+       .remove = mxc_rtc_remove,
 };
 
 module_platform_driver(mxc_rtc_driver)
index b79010987d1e6383d52b6cbd2792deadcda9c555..a63680850fef248f1015c44702d2c6eccd640610 100644 (file)
@@ -222,7 +222,7 @@ static struct rtc_class_ops nuc900_rtc_ops = {
        .alarm_irq_enable = nuc900_alarm_irq_enable,
 };
 
-static int __devinit nuc900_rtc_probe(struct platform_device *pdev)
+static int nuc900_rtc_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct nuc900_rtc *nuc900_rtc;
@@ -284,7 +284,7 @@ fail1:      kfree(nuc900_rtc);
        return err;
 }
 
-static int __devexit nuc900_rtc_remove(struct platform_device *pdev)
+static int nuc900_rtc_remove(struct platform_device *pdev)
 {
        struct nuc900_rtc *nuc900_rtc = platform_get_drvdata(pdev);
        struct resource *res;
@@ -304,7 +304,7 @@ static int __devexit nuc900_rtc_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver nuc900_rtc_driver = {
-       .remove         = __devexit_p(nuc900_rtc_remove),
+       .remove         = nuc900_rtc_remove,
        .driver         = {
                .name   = "nuc900-rtc",
                .owner  = THIS_MODULE,
index cd4f198cc2eff921b364eaa1d66ae8b97e7cf5a1..e0019cd0bf710a6cca6ed139471272c6cc1d1d24 100644 (file)
@@ -139,7 +139,7 @@ static const struct rtc_class_ops pcap_rtc_ops = {
        .alarm_irq_enable = pcap_rtc_alarm_irq_enable,
 };
 
-static int __devinit pcap_rtc_probe(struct platform_device *pdev)
+static int pcap_rtc_probe(struct platform_device *pdev)
 {
        struct pcap_rtc *pcap_rtc;
        int timer_irq, alarm_irq;
@@ -183,7 +183,7 @@ fail_rtc:
        return err;
 }
 
-static int __devexit pcap_rtc_remove(struct platform_device *pdev)
+static int pcap_rtc_remove(struct platform_device *pdev)
 {
        struct pcap_rtc *pcap_rtc = platform_get_drvdata(pdev);
 
@@ -196,7 +196,7 @@ static int __devexit pcap_rtc_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver pcap_rtc_driver = {
-       .remove = __devexit_p(pcap_rtc_remove),
+       .remove = pcap_rtc_remove,
        .driver = {
                .name  = "pcap-rtc",
                .owner = THIS_MODULE,
index 13e4df63974fa27e7d7acf97c7b94e57ff9722ac..02b742afa761649b0737ab00da9cf69b8526feb8 100644 (file)
@@ -219,7 +219,7 @@ static const struct rtc_class_ops pcf2123_rtc_ops = {
        .set_time       = pcf2123_rtc_set_time,
 };
 
-static int __devinit pcf2123_probe(struct spi_device *spi)
+static int pcf2123_probe(struct spi_device *spi)
 {
        struct rtc_device *rtc;
        struct pcf2123_plat_data *pdata;
@@ -319,7 +319,7 @@ kfree_exit:
        return ret;
 }
 
-static int __devexit pcf2123_remove(struct spi_device *spi)
+static int pcf2123_remove(struct spi_device *spi)
 {
        struct pcf2123_plat_data *pdata = spi->dev.platform_data;
        int i;
@@ -345,7 +345,7 @@ static struct spi_driver pcf2123_driver = {
                        .owner  = THIS_MODULE,
        },
        .probe  = pcf2123_probe,
-       .remove = __devexit_p(pcf2123_remove),
+       .remove = pcf2123_remove,
 };
 
 module_spi_driver(pcf2123_driver);
index a20202f9ee577d5ec477630c4a8073b7ed8abee0..e9f3135d305ff35eb4594dd6e35dfaee93a5c35a 100644 (file)
@@ -248,7 +248,7 @@ static void pcf50633_rtc_irq(int irq, void *data)
        rtc->alarm_pending = 1;
 }
 
-static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)
+static int pcf50633_rtc_probe(struct platform_device *pdev)
 {
        struct pcf50633_rtc *rtc;
 
@@ -272,7 +272,7 @@ static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit pcf50633_rtc_remove(struct platform_device *pdev)
+static int pcf50633_rtc_remove(struct platform_device *pdev)
 {
        struct pcf50633_rtc *rtc;
 
@@ -291,7 +291,7 @@ static struct platform_driver pcf50633_rtc_driver = {
                .name = "pcf50633-rtc",
        },
        .probe = pcf50633_rtc_probe,
-       .remove = __devexit_p(pcf50633_rtc_remove),
+       .remove = pcf50633_rtc_remove,
 };
 
 module_platform_driver(pcf50633_rtc_driver);
index 98e3a2b681e6f7957c830e5dca4292c4b5fe73b0..7098ee89bd29fcb5b6d9285e6047dd799d2dd5b9 100644 (file)
@@ -296,7 +296,7 @@ static const struct i2c_device_id pcf8563_id[] = {
 MODULE_DEVICE_TABLE(i2c, pcf8563_id);
 
 #ifdef CONFIG_OF
-static const struct of_device_id pcf8563_of_match[] __devinitconst = {
+static const struct of_device_id pcf8563_of_match[] = {
        { .compatible = "nxp,pcf8563" },
        {}
 };
index 019ff357116856ecf14ebbdbfb8af4834b7a5d0c..3415b8f185557d5da7a021a2a0535161feed9047 100644 (file)
@@ -294,7 +294,7 @@ exit_kfree:
        return err;
 }
 
-static int __devexit pcf8583_remove(struct i2c_client *client)
+static int pcf8583_remove(struct i2c_client *client)
 {
        struct pcf8583 *pcf8583 = i2c_get_clientdata(client);
 
@@ -316,7 +316,7 @@ static struct i2c_driver pcf8583_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = pcf8583_probe,
-       .remove         = __devexit_p(pcf8583_remove),
+       .remove         = pcf8583_remove,
        .id_table       = pcf8583_id,
 };
 
index d00bd24342a311555cb35f444296cddfb27bf408..f1a6557261f39c36a0dda30e68e5bd143e2a06e6 100644 (file)
@@ -382,7 +382,7 @@ rtc_alarm_handled:
        return IRQ_HANDLED;
 }
 
-static int __devinit pm8xxx_rtc_probe(struct platform_device *pdev)
+static int pm8xxx_rtc_probe(struct platform_device *pdev)
 {
        int rc;
        u8 ctrl_reg;
@@ -485,7 +485,7 @@ fail_rtc_enable:
        return rc;
 }
 
-static int __devexit pm8xxx_rtc_remove(struct platform_device *pdev)
+static int pm8xxx_rtc_remove(struct platform_device *pdev)
 {
        struct pm8xxx_rtc *rtc_dd = platform_get_drvdata(pdev);
 
@@ -524,7 +524,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_rtc_pm_ops, pm8xxx_rtc_suspend, pm8xxx_rtc_resum
 
 static struct platform_driver pm8xxx_rtc_driver = {
        .probe          = pm8xxx_rtc_probe,
-       .remove         = __devexit_p(pm8xxx_rtc_remove),
+       .remove         = pm8xxx_rtc_remove,
        .driver = {
                .name   = PM8XXX_RTC_DEV_NAME,
                .owner  = THIS_MODULE,
index ab0acaeb23719bfc055fe97cfb1efe7a051df756..0407e13d4de4771b6768e696ea88c04b6ddc3a90 100644 (file)
@@ -220,7 +220,7 @@ static void puv3_rtc_enable(struct platform_device *pdev, int en)
        }
 }
 
-static int __devexit puv3_rtc_remove(struct platform_device *dev)
+static int puv3_rtc_remove(struct platform_device *dev)
 {
        struct rtc_device *rtc = platform_get_drvdata(dev);
 
@@ -236,7 +236,7 @@ static int __devexit puv3_rtc_remove(struct platform_device *dev)
        return 0;
 }
 
-static int __devinit puv3_rtc_probe(struct platform_device *pdev)
+static int puv3_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        struct resource *res;
@@ -328,7 +328,7 @@ static int puv3_rtc_resume(struct platform_device *pdev)
 
 static struct platform_driver puv3_rtc_driver = {
        .probe          = puv3_rtc_probe,
-       .remove         = __devexit_p(puv3_rtc_remove),
+       .remove         = puv3_rtc_remove,
        .suspend        = puv3_rtc_suspend,
        .resume         = puv3_rtc_resume,
        .driver         = {
index 2c183ebff715f7acc277a82558544af53083ef4b..7726f4a4f2d051882f74a8a074834988cbad0a4c 100644 (file)
@@ -119,7 +119,7 @@ static const struct rtc_class_ops r9701_rtc_ops = {
        .set_time       = r9701_set_datetime,
 };
 
-static int __devinit r9701_probe(struct spi_device *spi)
+static int r9701_probe(struct spi_device *spi)
 {
        struct rtc_device *rtc;
        struct rtc_time dt;
@@ -164,7 +164,7 @@ static int __devinit r9701_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit r9701_remove(struct spi_device *spi)
+static int r9701_remove(struct spi_device *spi)
 {
        struct rtc_device *rtc = dev_get_drvdata(&spi->dev);
 
@@ -178,7 +178,7 @@ static struct spi_driver r9701_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = r9701_probe,
-       .remove = __devexit_p(r9701_remove),
+       .remove = r9701_remove,
 };
 
 module_spi_driver(r9701_driver);
index cdb140c29c56bdc43a2a8cf2ebc14a06d82815a5..eb3194d664a8b7c03b378701a9840e3024bc6ad8 100644 (file)
@@ -211,7 +211,7 @@ static const struct rtc_class_ops rc5t583_rtc_ops = {
        .alarm_irq_enable = rc5t583_rtc_alarm_irq_enable,
 };
 
-static int __devinit rc5t583_rtc_probe(struct platform_device *pdev)
+static int rc5t583_rtc_probe(struct platform_device *pdev)
 {
        struct rc5t583 *rc5t583 = dev_get_drvdata(pdev->dev.parent);
        struct rc5t583_rtc *ricoh_rtc;
@@ -271,7 +271,7 @@ static int __devinit rc5t583_rtc_probe(struct platform_device *pdev)
  * Disable rc5t583 RTC interrupts.
  * Sets status flag to free.
  */
-static int __devexit rc5t583_rtc_remove(struct platform_device *pdev)
+static int rc5t583_rtc_remove(struct platform_device *pdev)
 {
        struct rc5t583_rtc *rc5t583_rtc = dev_get_drvdata(&pdev->dev);
 
@@ -317,7 +317,7 @@ static const struct dev_pm_ops rc5t583_rtc_pm_ops = {
 
 static struct platform_driver rc5t583_rtc_driver = {
        .probe          = rc5t583_rtc_probe,
-       .remove         = __devexit_p(rc5t583_rtc_remove),
+       .remove         = rc5t583_rtc_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "rtc-rc5t583",
index e3ff179b99ca23da32527a0f13ca42d855564748..d1aee793ecc8a971e5130a2806b20fdfb48acc25 100644 (file)
@@ -377,7 +377,7 @@ static int rs5c313_rtc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit rs5c313_rtc_remove(struct platform_device *pdev)
+static int rs5c313_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_device *rtc = platform_get_drvdata( pdev );
 
@@ -392,7 +392,7 @@ static struct platform_driver rs5c313_rtc_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = rs5c313_rtc_probe,
-       .remove = __devexit_p( rs5c313_rtc_remove ),
+       .remove = rs5c313_rtc_remove,
 };
 
 static int __init rs5c313_rtc_init(void)
index fd5c7af04ae5a7d7c1ba30a5822396e6780adc5f..72ef10be86624948ac2adc8348134af32ec26811 100644 (file)
@@ -152,7 +152,7 @@ static const struct rtc_class_ops rs5c348_rtc_ops = {
 
 static struct spi_driver rs5c348_driver;
 
-static int __devinit rs5c348_probe(struct spi_device *spi)
+static int rs5c348_probe(struct spi_device *spi)
 {
        int ret;
        struct rtc_device *rtc;
@@ -218,7 +218,7 @@ static int __devinit rs5c348_probe(struct spi_device *spi)
        return ret;
 }
 
-static int __devexit rs5c348_remove(struct spi_device *spi)
+static int rs5c348_remove(struct spi_device *spi)
 {
        struct rs5c348_plat_data *pdata = spi->dev.platform_data;
        struct rtc_device *rtc = pdata->rtc;
@@ -235,7 +235,7 @@ static struct spi_driver rs5c348_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = rs5c348_probe,
-       .remove = __devexit_p(rs5c348_remove),
+       .remove = rs5c348_remove,
 };
 
 module_spi_driver(rs5c348_driver);
index 0fbe57b2f6d21313b162c5c13f3aadfe1c6a8068..f8ee8ad7825e25d0d69612d47fdaf928201f1d29 100644 (file)
@@ -385,8 +385,8 @@ static struct i2c_device_id rv3029c2_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, rv3029c2_id);
 
-static int __devinit
-rv3029c2_probe(struct i2c_client *client, const struct i2c_device_id *id)
+static int rv3029c2_probe(struct i2c_client *client,
+                         const struct i2c_device_id *id)
 {
        struct rtc_device *rtc;
        int rc = 0;
@@ -418,7 +418,7 @@ exit_unregister:
        return rc;
 }
 
-static int __devexit rv3029c2_remove(struct i2c_client *client)
+static int rv3029c2_remove(struct i2c_client *client)
 {
        struct rtc_device *rtc = i2c_get_clientdata(client);
 
@@ -432,7 +432,7 @@ static struct i2c_driver rv3029c2_driver = {
                .name = "rtc-rv3029c2",
        },
        .probe = rv3029c2_probe,
-       .remove = __devexit_p(rv3029c2_remove),
+       .remove = rv3029c2_remove,
        .id_table = rv3029c2_id,
 };
 
index 0de902dc1cd5c9cdd5bc40b4f0cb09e8ada1ff14..0722d36b9c9adcdb5e112105baa0eb77a95c1ac7 100644 (file)
@@ -534,8 +534,8 @@ static void rx8025_sysfs_unregister(struct device *dev)
        device_remove_file(dev, &dev_attr_clock_adjust_ppb);
 }
 
-static int __devinit rx8025_probe(struct i2c_client *client,
-                                 const struct i2c_device_id *id)
+static int rx8025_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
 {
        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
        struct rx8025_data *rx8025;
@@ -614,7 +614,7 @@ errout:
        return err;
 }
 
-static int __devexit rx8025_remove(struct i2c_client *client)
+static int rx8025_remove(struct i2c_client *client)
 {
        struct rx8025_data *rx8025 = i2c_get_clientdata(client);
        struct mutex *lock = &rx8025->rtc->ops_lock;
@@ -640,7 +640,7 @@ static struct i2c_driver rx8025_driver = {
                .owner = THIS_MODULE,
        },
        .probe          = rx8025_probe,
-       .remove         = __devexit_p(rx8025_remove),
+       .remove         = rx8025_remove,
        .id_table       = rx8025_id,
 };
 
index d84825124a7ae19428233b8871827c5d2f3052db..b0c272658fa27cd3effbf0de14abbfa691aa62c6 100644 (file)
@@ -228,8 +228,8 @@ static const struct rtc_class_ops rx8581_rtc_ops = {
        .set_time       = rx8581_rtc_set_time,
 };
 
-static int __devinit rx8581_probe(struct i2c_client *client,
-                               const struct i2c_device_id *id)
+static int rx8581_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
 {
        struct rtc_device *rtc;
 
@@ -251,7 +251,7 @@ static int __devinit rx8581_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit rx8581_remove(struct i2c_client *client)
+static int rx8581_remove(struct i2c_client *client)
 {
        struct rtc_device *rtc = i2c_get_clientdata(client);
 
@@ -272,7 +272,7 @@ static struct i2c_driver rx8581_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = rx8581_probe,
-       .remove         = __devexit_p(rx8581_remove),
+       .remove         = rx8581_remove,
        .id_table       = rx8581_id,
 };
 
index 4bd9414aee650e2b08449323a5840497a5b9c48c..404651464d4545f09800fa898d2638f70a17d460 100644 (file)
@@ -421,7 +421,7 @@ static void s3c_rtc_enable(struct platform_device *pdev, int en)
        clk_disable(rtc_clk);
 }
 
-static int __devexit s3c_rtc_remove(struct platform_device *dev)
+static int s3c_rtc_remove(struct platform_device *dev)
 {
        struct rtc_device *rtc = platform_get_drvdata(dev);
 
@@ -451,7 +451,7 @@ static inline int s3c_rtc_get_driver_data(struct platform_device *pdev)
        return platform_get_device_id(pdev)->driver_data;
 }
 
-static int __devinit s3c_rtc_probe(struct platform_device *pdev)
+static int s3c_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        struct rtc_time rtc_tm;
@@ -686,7 +686,7 @@ MODULE_DEVICE_TABLE(platform, s3c_rtc_driver_ids);
 
 static struct platform_driver s3c_rtc_driver = {
        .probe          = s3c_rtc_probe,
-       .remove         = __devexit_p(s3c_rtc_remove),
+       .remove         = s3c_rtc_remove,
        .suspend        = s3c_rtc_suspend,
        .resume         = s3c_rtc_resume,
        .id_table       = s3c_rtc_driver_ids,
index 3c0da333f4658265af23f96c1b5d12cdab71d634..d5ec7854a65123b1eb5ae49c5f55ccbdd0d2deee 100644 (file)
@@ -241,7 +241,7 @@ static irqreturn_t snvs_rtc_irq_handler(int irq, void *dev_id)
        return events ? IRQ_HANDLED : IRQ_NONE;
 }
 
-static int __devinit snvs_rtc_probe(struct platform_device *pdev)
+static int snvs_rtc_probe(struct platform_device *pdev)
 {
        struct snvs_rtc_data *data;
        struct resource *res;
@@ -294,7 +294,7 @@ static int __devinit snvs_rtc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit snvs_rtc_remove(struct platform_device *pdev)
+static int snvs_rtc_remove(struct platform_device *pdev)
 {
        struct snvs_rtc_data *data = platform_get_drvdata(pdev);
 
@@ -327,7 +327,7 @@ static int snvs_rtc_resume(struct device *dev)
 
 static SIMPLE_DEV_PM_OPS(snvs_rtc_pm_ops, snvs_rtc_suspend, snvs_rtc_resume);
 
-static const struct of_device_id __devinitconst snvs_dt_ids[] = {
+static const struct of_device_id snvs_dt_ids[] = {
        { .compatible = "fsl,sec-v4.0-mon-rtc-lp", },
        { /* sentinel */ }
 };
@@ -341,7 +341,7 @@ static struct platform_driver snvs_rtc_driver = {
                .of_match_table = snvs_dt_ids,
        },
        .probe          = snvs_rtc_probe,
-       .remove         = __devexit_p(snvs_rtc_remove),
+       .remove         = snvs_rtc_remove,
 };
 module_platform_driver(snvs_rtc_driver);
 
index 141fc945295f0796a46f2f4cb79d1535bbfe7bf7..c2121b5a01f21825f24d99120f76771a83e6b2fa 100644 (file)
@@ -351,7 +351,7 @@ static struct rtc_class_ops spear_rtc_ops = {
        .alarm_irq_enable = spear_alarm_irq_enable,
 };
 
-static int __devinit spear_rtc_probe(struct platform_device *pdev)
+static int spear_rtc_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct spear_rtc_config *config;
@@ -425,7 +425,7 @@ err_disable_clock:
        return status;
 }
 
-static int __devexit spear_rtc_remove(struct platform_device *pdev)
+static int spear_rtc_remove(struct platform_device *pdev)
 {
        struct spear_rtc_config *config = platform_get_drvdata(pdev);
 
@@ -499,7 +499,7 @@ MODULE_DEVICE_TABLE(of, spear_rtc_id_table);
 
 static struct platform_driver spear_rtc_driver = {
        .probe = spear_rtc_probe,
-       .remove = __devexit_p(spear_rtc_remove),
+       .remove = spear_rtc_remove,
        .suspend = spear_rtc_suspend,
        .resume = spear_rtc_resume,
        .shutdown = spear_rtc_shutdown,
index 279f5cfa691a7ff30ec4642c8599ffdbb063d684..7e4a6f65cb91433293d9b097a9323354fad1a263 100644 (file)
@@ -285,7 +285,7 @@ static struct bin_attribute stk17ta8_nvram_attr = {
        .write = stk17ta8_nvram_write,
 };
 
-static int __devinit stk17ta8_rtc_probe(struct platform_device *pdev)
+static int stk17ta8_rtc_probe(struct platform_device *pdev)
 {
        struct resource *res;
        unsigned int cal;
@@ -347,7 +347,7 @@ static int __devinit stk17ta8_rtc_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int __devexit stk17ta8_rtc_remove(struct platform_device *pdev)
+static int stk17ta8_rtc_remove(struct platform_device *pdev)
 {
        struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
 
@@ -363,7 +363,7 @@ MODULE_ALIAS("platform:stk17ta8");
 
 static struct platform_driver stk17ta8_rtc_driver = {
        .probe          = stk17ta8_rtc_probe,
-       .remove         = __devexit_p(stk17ta8_rtc_remove),
+       .remove         = stk17ta8_rtc_remove,
        .driver         = {
                .name   = "stk17ta8",
                .owner  = THIS_MODULE,
index c006025cecc809ac3b00d1abbe59a3f4e3527254..c84ea6659f497fb32d67a8ec02f70e38a57055ce 100644 (file)
@@ -303,7 +303,13 @@ static struct rtc_class_ops tegra_rtc_ops = {
        .alarm_irq_enable = tegra_rtc_alarm_irq_enable,
 };
 
-static int __devinit tegra_rtc_probe(struct platform_device *pdev)
+static const struct of_device_id tegra_rtc_dt_match[] = {
+       { .compatible = "nvidia,tegra20-rtc", },
+       {}
+};
+MODULE_DEVICE_TABLE(of, tegra_rtc_dt_match);
+
+static int tegra_rtc_probe(struct platform_device *pdev)
 {
        struct tegra_rtc_info *info;
        struct resource *res;
@@ -375,7 +381,7 @@ err_dev_unreg:
        return ret;
 }
 
-static int __devexit tegra_rtc_remove(struct platform_device *pdev)
+static int tegra_rtc_remove(struct platform_device *pdev)
 {
        struct tegra_rtc_info *info = platform_get_drvdata(pdev);
 
@@ -435,11 +441,12 @@ static void tegra_rtc_shutdown(struct platform_device *pdev)
 
 MODULE_ALIAS("platform:tegra_rtc");
 static struct platform_driver tegra_rtc_driver = {
-       .remove         = __devexit_p(tegra_rtc_remove),
+       .remove         = tegra_rtc_remove,
        .shutdown       = tegra_rtc_shutdown,
        .driver         = {
                .name   = "tegra_rtc",
                .owner  = THIS_MODULE,
+               .of_match_table = tegra_rtc_dt_match,
        },
 #ifdef CONFIG_PM
        .suspend        = tegra_rtc_suspend,
index 974b9ae252ab5f116d9fa6faa21d587029a3f18a..b92e0f6383e6bac3549e45310d1c78478216205e 100644 (file)
@@ -119,7 +119,7 @@ err:
        return err;
 }
 
-static int __devexit test_remove(struct platform_device *plat_dev)
+static int test_remove(struct platform_device *plat_dev)
 {
        struct rtc_device *rtc = platform_get_drvdata(plat_dev);
 
@@ -131,7 +131,7 @@ static int __devexit test_remove(struct platform_device *plat_dev)
 
 static struct platform_driver test_driver = {
        .probe  = test_probe,
-       .remove = __devexit_p(test_remove),
+       .remove = test_remove,
        .driver = {
                .name = "rtc-test",
                .owner = THIS_MODULE,
index eb65dafee66ed147654e2d6f4dc2780c6b300feb..62db4841078b93cbc5441990fb31410321aeb44e 100644 (file)
@@ -76,7 +76,7 @@ static const struct rtc_class_ops tile_rtc_ops = {
 /*
  * Device probe routine.
  */
-static int __devinit tile_rtc_probe(struct platform_device *dev)
+static int tile_rtc_probe(struct platform_device *dev)
 {
        struct rtc_device *rtc;
 
@@ -94,7 +94,7 @@ static int __devinit tile_rtc_probe(struct platform_device *dev)
 /*
  * Device cleanup routine.
  */
-static int __devexit tile_rtc_remove(struct platform_device *dev)
+static int tile_rtc_remove(struct platform_device *dev)
 {
        struct rtc_device *rtc = platform_get_drvdata(dev);
 
@@ -112,7 +112,7 @@ static struct platform_driver tile_rtc_platform_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = tile_rtc_probe,
-       .remove         = __devexit_p(tile_rtc_remove),
+       .remove         = tile_rtc_remove,
 };
 
 /*
diff --git a/drivers/rtc/rtc-tps6586x.c b/drivers/rtc/rtc-tps6586x.c
new file mode 100644 (file)
index 0000000..70f61b8
--- /dev/null
@@ -0,0 +1,356 @@
+/*
+ * rtc-tps6586x.c: RTC driver for TI PMIC TPS6586X
+ *
+ * Copyright (c) 2012, NVIDIA Corporation.
+ *
+ * Author: Laxman Dewangan <ldewangan@nvidia.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
+ * whether express or implied; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307, USA
+ */
+
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/mfd/tps6586x.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/rtc.h>
+#include <linux/slab.h>
+
+#define RTC_CTRL                       0xc0
+#define POR_RESET_N                    BIT(7)
+#define OSC_SRC_SEL                    BIT(6)
+#define RTC_ENABLE                     BIT(5)  /* enables alarm */
+#define RTC_BUF_ENABLE                 BIT(4)  /* 32 KHz buffer enable */
+#define PRE_BYPASS                     BIT(3)  /* 0=1KHz or 1=32KHz updates */
+#define CL_SEL_MASK                    (BIT(2)|BIT(1))
+#define CL_SEL_POS                     1
+#define RTC_ALARM1_HI                  0xc1
+#define RTC_COUNT4                     0xc6
+
+/* start a PMU RTC access by reading the register prior to the RTC_COUNT4 */
+#define RTC_COUNT4_DUMMYREAD           0xc5
+
+/*only 14-bits width in second*/
+#define ALM1_VALID_RANGE_IN_SEC                0x3FFF
+
+#define TPS6586X_RTC_CL_SEL_1_5PF      0x0
+#define TPS6586X_RTC_CL_SEL_6_5PF      0x1
+#define TPS6586X_RTC_CL_SEL_7_5PF      0x2
+#define TPS6586X_RTC_CL_SEL_12_5PF     0x3
+
+struct tps6586x_rtc {
+       struct device           *dev;
+       struct rtc_device       *rtc;
+       int                     irq;
+       bool                    irq_en;
+       unsigned long long      epoch_start;
+};
+
+static inline struct device *to_tps6586x_dev(struct device *dev)
+{
+       return dev->parent;
+}
+
+static int tps6586x_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+       struct tps6586x_rtc *rtc = dev_get_drvdata(dev);
+       struct device *tps_dev = to_tps6586x_dev(dev);
+       unsigned long long ticks = 0;
+       unsigned long seconds;
+       u8 buff[6];
+       int ret;
+       int i;
+
+       ret = tps6586x_reads(tps_dev, RTC_COUNT4_DUMMYREAD, sizeof(buff), buff);
+       if (ret < 0) {
+               dev_err(dev, "read counter failed with err %d\n", ret);
+               return ret;
+       }
+
+       for (i = 1; i < sizeof(buff); i++) {
+               ticks <<= 8;
+               ticks |= buff[i];
+       }
+
+       seconds = ticks >> 10;
+       seconds += rtc->epoch_start;
+       rtc_time_to_tm(seconds, tm);
+       return rtc_valid_tm(tm);
+}
+
+static int tps6586x_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+       struct tps6586x_rtc *rtc = dev_get_drvdata(dev);
+       struct device *tps_dev = to_tps6586x_dev(dev);
+       unsigned long long ticks;
+       unsigned long seconds;
+       u8 buff[5];
+       int ret;
+
+       rtc_tm_to_time(tm, &seconds);
+       if (seconds < rtc->epoch_start) {
+               dev_err(dev, "requested time unsupported\n");
+               return -EINVAL;
+       }
+       seconds -= rtc->epoch_start;
+
+       ticks = (unsigned long long)seconds << 10;
+       buff[0] = (ticks >> 32) & 0xff;
+       buff[1] = (ticks >> 24) & 0xff;
+       buff[2] = (ticks >> 16) & 0xff;
+       buff[3] = (ticks >> 8) & 0xff;
+       buff[4] = ticks & 0xff;
+
+       /* Disable RTC before changing time */
+       ret = tps6586x_clr_bits(tps_dev, RTC_CTRL, RTC_ENABLE);
+       if (ret < 0) {
+               dev_err(dev, "failed to clear RTC_ENABLE\n");
+               return ret;
+       }
+
+       ret = tps6586x_writes(tps_dev, RTC_COUNT4, sizeof(buff), buff);
+       if (ret < 0) {
+               dev_err(dev, "failed to program new time\n");
+               return ret;
+       }
+
+       /* Enable RTC */
+       ret = tps6586x_set_bits(tps_dev, RTC_CTRL, RTC_ENABLE);
+       if (ret < 0) {
+               dev_err(dev, "failed to set RTC_ENABLE\n");
+               return ret;
+       }
+       return 0;
+}
+
+static int tps6586x_rtc_alarm_irq_enable(struct device *dev,
+                        unsigned int enabled)
+{
+       struct tps6586x_rtc *rtc = dev_get_drvdata(dev);
+
+       if (enabled && !rtc->irq_en) {
+               enable_irq(rtc->irq);
+               rtc->irq_en = true;
+       } else if (!enabled && rtc->irq_en)  {
+               disable_irq(rtc->irq);
+               rtc->irq_en = false;
+       }
+       return 0;
+}
+
+static int tps6586x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+       struct tps6586x_rtc *rtc = dev_get_drvdata(dev);
+       struct device *tps_dev = to_tps6586x_dev(dev);
+       unsigned long seconds;
+       unsigned long ticks;
+       unsigned long rtc_current_time;
+       unsigned long long rticks = 0;
+       u8 buff[3];
+       u8 rbuff[6];
+       int ret;
+       int i;
+
+       rtc_tm_to_time(&alrm->time, &seconds);
+
+       if (alrm->enabled && (seconds < rtc->epoch_start)) {
+               dev_err(dev, "can't set alarm to requested time\n");
+               return -EINVAL;
+       }
+
+       ret = tps6586x_rtc_alarm_irq_enable(dev, alrm->enabled);
+       if (ret < 0) {
+               dev_err(dev, "can't set alarm irq, err %d\n", ret);
+               return ret;
+       }
+
+       seconds -= rtc->epoch_start;
+       ret = tps6586x_reads(tps_dev, RTC_COUNT4_DUMMYREAD,
+                       sizeof(rbuff), rbuff);
+       if (ret < 0) {
+               dev_err(dev, "read counter failed with err %d\n", ret);
+               return ret;
+       }
+
+       for (i = 1; i < sizeof(rbuff); i++) {
+               rticks <<= 8;
+               rticks |= rbuff[i];
+       }
+
+       rtc_current_time = rticks >> 10;
+       if ((seconds - rtc_current_time) > ALM1_VALID_RANGE_IN_SEC)
+               seconds = rtc_current_time - 1;
+
+       ticks = (unsigned long long)seconds << 10;
+       buff[0] = (ticks >> 16) & 0xff;
+       buff[1] = (ticks >> 8) & 0xff;
+       buff[2] = ticks & 0xff;
+
+       ret = tps6586x_writes(tps_dev, RTC_ALARM1_HI, sizeof(buff), buff);
+       if (ret)
+               dev_err(dev, "programming alarm failed with err %d\n", ret);
+
+       return ret;
+}
+
+static int tps6586x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+       struct tps6586x_rtc *rtc = dev_get_drvdata(dev);
+       struct device *tps_dev = to_tps6586x_dev(dev);
+       unsigned long ticks;
+       unsigned long seconds;
+       u8 buff[3];
+       int ret;
+
+       ret = tps6586x_reads(tps_dev, RTC_ALARM1_HI, sizeof(buff), buff);
+       if (ret) {
+               dev_err(dev, "read RTC_ALARM1_HI failed with err %d\n", ret);
+               return ret;
+       }
+
+       ticks = (buff[0] << 16) | (buff[1] << 8) | buff[2];
+       seconds = ticks >> 10;
+       seconds += rtc->epoch_start;
+
+       rtc_time_to_tm(seconds, &alrm->time);
+       return 0;
+}
+
+static const struct rtc_class_ops tps6586x_rtc_ops = {
+       .read_time      = tps6586x_rtc_read_time,
+       .set_time       = tps6586x_rtc_set_time,
+       .set_alarm      = tps6586x_rtc_set_alarm,
+       .read_alarm     = tps6586x_rtc_read_alarm,
+       .alarm_irq_enable = tps6586x_rtc_alarm_irq_enable,
+};
+
+static irqreturn_t tps6586x_rtc_irq(int irq, void *data)
+{
+       struct tps6586x_rtc *rtc = data;
+
+       rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF);
+       return IRQ_HANDLED;
+}
+
+static int tps6586x_rtc_probe(struct platform_device *pdev)
+{
+       struct device *tps_dev = to_tps6586x_dev(&pdev->dev);
+       struct tps6586x_rtc *rtc;
+       int ret;
+
+       rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
+       if (!rtc)
+               return -ENOMEM;
+
+       rtc->dev = &pdev->dev;
+       rtc->irq = platform_get_irq(pdev, 0);
+
+       /* Set epoch start as 00:00:00:01:01:2009 */
+       rtc->epoch_start = mktime(2009, 1, 1, 0, 0, 0);
+
+       /* 1 kHz tick mode, enable tick counting */
+       ret = tps6586x_update(tps_dev, RTC_CTRL,
+               RTC_ENABLE | OSC_SRC_SEL |
+               ((TPS6586X_RTC_CL_SEL_1_5PF << CL_SEL_POS) & CL_SEL_MASK),
+               RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "unable to start counter\n");
+               return ret;
+       }
+
+       platform_set_drvdata(pdev, rtc);
+       rtc->rtc = rtc_device_register(dev_name(&pdev->dev), &pdev->dev,
+                                      &tps6586x_rtc_ops, THIS_MODULE);
+       if (IS_ERR(rtc->rtc)) {
+               ret = PTR_ERR(rtc->rtc);
+               dev_err(&pdev->dev, "RTC device register: ret %d\n", ret);
+               goto fail_rtc_register;
+       }
+
+       ret = request_threaded_irq(rtc->irq, NULL, tps6586x_rtc_irq,
+                               IRQF_ONESHOT | IRQF_EARLY_RESUME,
+                               dev_name(&pdev->dev), rtc);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "request IRQ(%d) failed with ret %d\n",
+                               rtc->irq, ret);
+               goto fail_req_irq;
+       }
+       disable_irq(rtc->irq);
+       device_set_wakeup_capable(&pdev->dev, 1);
+       return 0;
+
+fail_req_irq:
+       rtc_device_unregister(rtc->rtc);
+
+fail_rtc_register:
+       tps6586x_update(tps_dev, RTC_CTRL, 0,
+               RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK);
+       return ret;
+};
+
+static int tps6586x_rtc_remove(struct platform_device *pdev)
+{
+       struct tps6586x_rtc *rtc = platform_get_drvdata(pdev);
+       struct device *tps_dev = to_tps6586x_dev(&pdev->dev);
+
+       tps6586x_update(tps_dev, RTC_CTRL, 0,
+               RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK);
+       rtc_device_unregister(rtc->rtc);
+       free_irq(rtc->irq, rtc);
+       return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int tps6586x_rtc_suspend(struct device *dev)
+{
+       struct tps6586x_rtc *rtc = dev_get_drvdata(dev);
+
+       if (device_may_wakeup(dev))
+               enable_irq_wake(rtc->irq);
+       return 0;
+}
+
+static int tps6586x_rtc_resume(struct device *dev)
+{
+       struct tps6586x_rtc *rtc = dev_get_drvdata(dev);
+
+       if (device_may_wakeup(dev))
+               disable_irq_wake(rtc->irq);
+       return 0;
+}
+#endif
+
+static const struct dev_pm_ops tps6586x_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(tps6586x_rtc_suspend, tps6586x_rtc_resume)
+};
+
+static struct platform_driver tps6586x_rtc_driver = {
+       .driver = {
+               .name   = "tps6586x-rtc",
+               .owner  = THIS_MODULE,
+               .pm     = &tps6586x_pm_ops,
+       },
+       .probe  = tps6586x_rtc_probe,
+       .remove = tps6586x_rtc_remove,
+};
+module_platform_driver(tps6586x_rtc_driver);
+
+MODULE_ALIAS("platform:rtc-tps6586x");
+MODULE_DESCRIPTION("TI TPS6586x RTC driver");
+MODULE_AUTHOR("Laxman dewangan <ldewangan@nvidia.com>");
+MODULE_LICENSE("GPL v2");
index 22eb4ebfa1a64cf295b80b02cb09339de15c56ab..e5fef141a0e21f4dfefa977596e05c5873b486c1 100644 (file)
@@ -222,7 +222,7 @@ static const struct rtc_class_ops tps65910_rtc_ops = {
        .alarm_irq_enable = tps65910_rtc_alarm_irq_enable,
 };
 
-static int __devinit tps65910_rtc_probe(struct platform_device *pdev)
+static int tps65910_rtc_probe(struct platform_device *pdev)
 {
        struct tps65910 *tps65910 = NULL;
        struct tps65910_rtc *tps_rtc = NULL;
@@ -292,7 +292,7 @@ static int __devinit tps65910_rtc_probe(struct platform_device *pdev)
  * Disable tps65910 RTC interrupts.
  * Sets status flag to free.
  */
-static int __devexit tps65910_rtc_remove(struct platform_device *pdev)
+static int tps65910_rtc_remove(struct platform_device *pdev)
 {
        /* leave rtc running, but disable irqs */
        struct tps65910_rtc *tps_rtc = platform_get_drvdata(pdev);
@@ -342,7 +342,7 @@ static const struct dev_pm_ops tps65910_rtc_pm_ops = {
 
 static struct platform_driver tps65910_rtc_driver = {
        .probe          = tps65910_rtc_probe,
-       .remove         = __devexit_p(tps65910_rtc_remove),
+       .remove         = tps65910_rtc_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "tps65910-rtc",
index 8b7464c8b5cf2beab97568bbc04cd3495db18b9e..ccd4ad370b32fc2a2685c4103ed9902f137ee50b 100644 (file)
@@ -458,7 +458,7 @@ static struct rtc_class_ops twl_rtc_ops = {
 
 /*----------------------------------------------------------------------*/
 
-static int __devinit twl_rtc_probe(struct platform_device *pdev)
+static int twl_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        int ret = -EINVAL;
@@ -535,7 +535,7 @@ out1:
  * Disable all TWL RTC module interrupts.
  * Sets status flag to free.
  */
-static int __devexit twl_rtc_remove(struct platform_device *pdev)
+static int twl_rtc_remove(struct platform_device *pdev)
 {
        /* leave rtc running, but disable irqs */
        struct rtc_device *rtc = platform_get_drvdata(pdev);
@@ -597,7 +597,7 @@ MODULE_ALIAS("platform:twl_rtc");
 
 static struct platform_driver twl4030rtc_driver = {
        .probe          = twl_rtc_probe,
-       .remove         = __devexit_p(twl_rtc_remove),
+       .remove         = twl_rtc_remove,
        .shutdown       = twl_rtc_shutdown,
        .suspend        = twl_rtc_suspend,
        .resume         = twl_rtc_resume,
index 5f60a7c6a15575d832b66c03a8c3ee72297514e1..6c3774cf5a2461fdfb7168885fbf55f783df79b2 100644 (file)
@@ -280,7 +280,7 @@ static const struct rtc_class_ops vr41xx_rtc_ops = {
        .set_alarm      = vr41xx_rtc_set_alarm,
 };
 
-static int __devinit rtc_probe(struct platform_device *pdev)
+static int rtc_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct rtc_device *rtc;
@@ -373,7 +373,7 @@ err_rtc1_iounmap:
        return retval;
 }
 
-static int __devexit rtc_remove(struct platform_device *pdev)
+static int rtc_remove(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
 
@@ -398,7 +398,7 @@ MODULE_ALIAS("platform:RTC");
 
 static struct platform_driver rtc_platform_driver = {
        .probe          = rtc_probe,
-       .remove         = __devexit_p(rtc_remove),
+       .remove         = rtc_remove,
        .driver         = {
                .name   = rtc_name,
                .owner  = THIS_MODULE,
index 14e2d8cfcc83de0e55ba39cc2630da0d12e30b1e..00c930f4b6f322fcfd42b37c8f2e6926f0bdbbfd 100644 (file)
@@ -70,7 +70,7 @@
                                | ALARM_SEC_BIT)
 
 #define VT8500_RTC_CR_ENABLE   (1 << 0)        /* Enable RTC */
-#define VT8500_RTC_CR_24H      (1 << 1)        /* 24h time format */
+#define VT8500_RTC_CR_12H      (1 << 1)        /* 12h time format */
 #define VT8500_RTC_CR_SM_ENABLE        (1 << 2)        /* Enable periodic irqs */
 #define VT8500_RTC_CR_SM_SEC   (1 << 3)        /* 0: 1Hz/60, 1: 1Hz */
 #define VT8500_RTC_CR_CALIB    (1 << 4)        /* Enable calibration */
@@ -119,7 +119,7 @@ static int vt8500_rtc_read_time(struct device *dev, struct rtc_time *tm)
        tm->tm_min = bcd2bin((time & TIME_MIN_MASK) >> TIME_MIN_S);
        tm->tm_hour = bcd2bin((time & TIME_HOUR_MASK) >> TIME_HOUR_S);
        tm->tm_mday = bcd2bin(date & DATE_DAY_MASK);
-       tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S);
+       tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S) - 1;
        tm->tm_year = bcd2bin((date & DATE_YEAR_MASK) >> DATE_YEAR_S)
                        + ((date >> DATE_CENTURY_S) & 1 ? 200 : 100);
        tm->tm_wday = (time & TIME_DOW_MASK) >> TIME_DOW_S;
@@ -138,8 +138,9 @@ static int vt8500_rtc_set_time(struct device *dev, struct rtc_time *tm)
        }
 
        writel((bin2bcd(tm->tm_year - 100) << DATE_YEAR_S)
-               | (bin2bcd(tm->tm_mon) << DATE_MONTH_S)
-               | (bin2bcd(tm->tm_mday)),
+               | (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S)
+               | (bin2bcd(tm->tm_mday))
+               | ((tm->tm_year >= 200) << DATE_CENTURY_S),
                vt8500_rtc->regbase + VT8500_RTC_DS);
        writel((bin2bcd(tm->tm_wday) << TIME_DOW_S)
                | (bin2bcd(tm->tm_hour) << TIME_HOUR_S)
@@ -205,7 +206,7 @@ static const struct rtc_class_ops vt8500_rtc_ops = {
        .alarm_irq_enable = vt8500_alarm_irq_enable,
 };
 
-static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
+static int vt8500_rtc_probe(struct platform_device *pdev)
 {
        struct vt8500_rtc *vt8500_rtc;
        int ret;
@@ -247,7 +248,7 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
        }
 
        /* Enable RTC and set it to 24-hour mode */
-       writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H,
+       writel(VT8500_RTC_CR_ENABLE,
               vt8500_rtc->regbase + VT8500_RTC_CR);
 
        vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev,
@@ -279,7 +280,7 @@ err_release:
        return ret;
 }
 
-static int __devexit vt8500_rtc_remove(struct platform_device *pdev)
+static int vt8500_rtc_remove(struct platform_device *pdev)
 {
        struct vt8500_rtc *vt8500_rtc = platform_get_drvdata(pdev);
 
@@ -305,7 +306,7 @@ static const struct of_device_id wmt_dt_ids[] = {
 
 static struct platform_driver vt8500_rtc_driver = {
        .probe          = vt8500_rtc_probe,
-       .remove         = __devexit_p(vt8500_rtc_remove),
+       .remove         = vt8500_rtc_remove,
        .driver         = {
                .name   = "vt8500-rtc",
                .owner  = THIS_MODULE,
index ea5c6f857ca5db35ebbfd3c581b0d5e7e32050d4..1b0affbe26591cd9ab9794266a2ade8bdd85db36 100644 (file)
@@ -459,7 +459,7 @@ err:
        return ret;
 }
 
-static int __devexit wm831x_rtc_remove(struct platform_device *pdev)
+static int wm831x_rtc_remove(struct platform_device *pdev)
 {
        struct wm831x_rtc *wm831x_rtc = platform_get_drvdata(pdev);
        int alm_irq = platform_get_irq_byname(pdev, "ALM");
@@ -483,7 +483,7 @@ static const struct dev_pm_ops wm831x_rtc_pm_ops = {
 
 static struct platform_driver wm831x_rtc_driver = {
        .probe = wm831x_rtc_probe,
-       .remove = __devexit_p(wm831x_rtc_remove),
+       .remove = wm831x_rtc_remove,
        .driver = {
                .name = "wm831x-rtc",
                .pm = &wm831x_rtc_pm_ops,
index c2e52d15abb295f0de5b0ae08afebf62c77ad009..8ad86ae0d30f8209cabb446eb35b5a2b84e5aa29 100644 (file)
@@ -459,7 +459,7 @@ static int wm8350_rtc_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit wm8350_rtc_remove(struct platform_device *pdev)
+static int wm8350_rtc_remove(struct platform_device *pdev)
 {
        struct wm8350 *wm8350 = platform_get_drvdata(pdev);
        struct wm8350_rtc *wm_rtc = &wm8350->rtc;
@@ -479,7 +479,7 @@ static struct dev_pm_ops wm8350_rtc_pm_ops = {
 
 static struct platform_driver wm8350_rtc_driver = {
        .probe = wm8350_rtc_probe,
-       .remove = __devexit_p(wm8350_rtc_remove),
+       .remove = wm8350_rtc_remove,
        .driver = {
                .name = "wm8350-rtc",
                .pm = &wm8350_rtc_pm_ops,
index 9bd5da36f99eb2d3a36642b05508d5578f473846..704488d0f819e70a762e7bda9eef25e9067bc2bc 100644 (file)
@@ -248,7 +248,7 @@ static void dasd_ext_handler(struct ext_code ext_code,
        default:
                return;
        }
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++;
+       inc_irq_stat(IRQEXT_DSD);
        if (!ip) {              /* no intparm: unsolicited interrupt */
                DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited "
                              "interrupt");
index 806fe912d6e779ad7456b35f175269352f56e8d6..e37bc1620d143dd12d390d489f76fb127aec059f 100644 (file)
@@ -4274,7 +4274,7 @@ static struct ccw_driver dasd_eckd_driver = {
        .thaw        = dasd_generic_restore_device,
        .restore     = dasd_generic_restore_device,
        .uc_handler  = dasd_generic_uc_handler,
-       .int_class   = IOINT_DAS,
+       .int_class   = IRQIO_DAS,
 };
 
 /*
index eb748507c7fac2b81f7d3d2028a2f11c47aaa854..4146985843444d46da0db635edc357e9076dede4 100644 (file)
@@ -78,7 +78,7 @@ static struct ccw_driver dasd_fba_driver = {
        .freeze      = dasd_generic_pm_freeze,
        .thaw        = dasd_generic_restore_device,
        .restore     = dasd_generic_restore_device,
-       .int_class   = IOINT_DAS,
+       .int_class   = IRQIO_DAS,
 };
 
 static void
index 40084501c31b7a28d2a436353a16e906c5d3640f..33b7141a182f6ef369ef9475f1a9f5293561cd2c 100644 (file)
@@ -44,6 +44,7 @@
 #define RAW3215_NR_CCWS            3
 #define RAW3215_TIMEOUT            HZ/10     /* time for delayed output */
 
+#define RAW3215_FIXED      1         /* 3215 console device is not be freed */
 #define RAW3215_WORKING            4         /* set if a request is being worked on */
 #define RAW3215_THROTTLED   8        /* set if reading is disabled */
 #define RAW3215_STOPPED            16        /* set if writing is disabled */
@@ -630,7 +631,8 @@ static void raw3215_shutdown(struct raw3215_info *raw)
        DECLARE_WAITQUEUE(wait, current);
        unsigned long flags;
 
-       if (!(raw->port.flags & ASYNC_INITIALIZED))
+       if (!(raw->port.flags & ASYNC_INITIALIZED) ||
+           (raw->flags & RAW3215_FIXED))
                return;
        /* Wait for outstanding requests, then free irq */
        spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
@@ -805,7 +807,7 @@ static struct ccw_driver raw3215_ccw_driver = {
        .freeze         = &raw3215_pm_stop,
        .thaw           = &raw3215_pm_start,
        .restore        = &raw3215_pm_start,
-       .int_class      = IOINT_C15,
+       .int_class      = IRQIO_C15,
 };
 
 #ifdef CONFIG_TN3215_CONSOLE
@@ -927,6 +929,8 @@ static int __init con3215_init(void)
        dev_set_drvdata(&cdev->dev, raw);
        cdev->handler = raw3215_irq;
 
+       raw->flags |= RAW3215_FIXED;
+
        /* Request the console irq */
        if (raw3215_startup(raw) != 0) {
                raw3215_free_info(raw);
index f3b8bb84faf295013c03c1d4e539ee967015fa2a..9a6c140c5f072133c7f70281387236428f506d7d 100644 (file)
@@ -1396,7 +1396,7 @@ static struct ccw_driver raw3270_ccw_driver = {
        .freeze         = &raw3270_pm_stop,
        .thaw           = &raw3270_pm_start,
        .restore        = &raw3270_pm_start,
-       .int_class      = IOINT_C70,
+       .int_class      = IRQIO_C70,
 };
 
 static int
index 4fa21f7e23085aafbdef58ce7d4805e07418118c..12c16a65dd25ee778e693a36d31d54f782e2ea3a 100644 (file)
@@ -400,7 +400,7 @@ static void sclp_interrupt_handler(struct ext_code ext_code,
        u32 finished_sccb;
        u32 evbuf_pending;
 
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_SCP]++;
+       inc_irq_stat(IRQEXT_SCP);
        spin_lock(&sclp_lock);
        finished_sccb = param32 & 0xfffffff8;
        evbuf_pending = param32 & 0x3;
@@ -813,7 +813,7 @@ static void sclp_check_handler(struct ext_code ext_code,
 {
        u32 finished_sccb;
 
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_SCP]++;
+       inc_irq_stat(IRQEXT_SCP);
        finished_sccb = param32 & 0xfffffff8;
        /* Is this the interrupt we are waiting for? */
        if (finished_sccb == 0)
index 6ae929c024ae3bf811ecabe4986301ac6b9a807b..9aa79702b3707a26ef0b4d370c54bf86b51251de 100644 (file)
@@ -1193,7 +1193,7 @@ static struct ccw_driver tape_34xx_driver = {
        .set_online = tape_34xx_online,
        .set_offline = tape_generic_offline,
        .freeze = tape_generic_pm_suspend,
-       .int_class = IOINT_TAP,
+       .int_class = IRQIO_TAP,
 };
 
 static int
index 1b0eb49f739c72413c5cdd43835c54141c2464e6..327cb19ad0b0c4df56dfe253a0eb0dd989c5a91c 100644 (file)
@@ -1656,7 +1656,7 @@ static struct ccw_driver tape_3590_driver = {
        .set_offline = tape_generic_offline,
        .set_online = tape_3590_online,
        .freeze = tape_generic_pm_suspend,
-       .int_class = IOINT_TAP,
+       .int_class = IRQIO_TAP,
 };
 
 /*
index 73bef0bd394cab2df006f64bf5e3c25ecce7bb3f..483f72ba030da670acb261774364f2cf0b896400 100644 (file)
@@ -74,7 +74,7 @@ static struct ccw_driver ur_driver = {
        .set_online     = ur_set_online,
        .set_offline    = ur_set_offline,
        .freeze         = ur_pm_suspend,
-       .int_class      = IOINT_VMR,
+       .int_class      = IRQIO_VMR,
 };
 
 static DEFINE_MUTEX(vmur_mutex);
index 8f9a1a384496eb396ce2b0cbcec28327ddb48d3f..facdf809113f22a6fe9e070b3f8938942bbaf480 100644 (file)
@@ -58,7 +58,7 @@ static void chsc_subchannel_irq(struct subchannel *sch)
 
        CHSC_LOG(4, "irb");
        CHSC_LOG_HEX(4, irb, sizeof(*irb));
-       kstat_cpu(smp_processor_id()).irqs[IOINT_CSC]++;
+       inc_irq_stat(IRQIO_CSC);
 
        /* Copy irb to provided request and set done. */
        if (!request) {
index 8e927b9f285f25de6ba520bf04f07661a02e51aa..c8faf6230b0f332010678f5c4aced898cb20b66d 100644 (file)
@@ -611,7 +611,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
        tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id;
        irb = (struct irb *)&S390_lowcore.irb;
        do {
-               kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++;
+               kstat_incr_irqs_this_cpu(IO_INTERRUPT, NULL);
                if (tpi_info->adapter_IO) {
                        do_adapter_IO(tpi_info->isc);
                        continue;
@@ -619,7 +619,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
                sch = (struct subchannel *)(unsigned long)tpi_info->intparm;
                if (!sch) {
                        /* Clear pending interrupt condition. */
-                       kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
+                       inc_irq_stat(IRQIO_CIO);
                        tsch(tpi_info->schid, irb);
                        continue;
                }
@@ -633,9 +633,9 @@ void __irq_entry do_IRQ(struct pt_regs *regs)
                        if (sch->driver && sch->driver->irq)
                                sch->driver->irq(sch);
                        else
-                               kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
+                               inc_irq_stat(IRQIO_CIO);
                } else
-                       kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
+                       inc_irq_stat(IRQIO_CIO);
                spin_unlock(sch->lock);
                /*
                 * Are more interrupts pending?
@@ -678,7 +678,7 @@ static void cio_tsch(struct subchannel *sch)
        if (sch->driver && sch->driver->irq)
                sch->driver->irq(sch);
        else
-               kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
+               inc_irq_stat(IRQIO_CIO);
        if (!irq_context) {
                irq_exit();
                _local_bh_enable();
index 6995cff44636a23dfe857098c2faca86670311fe..7cd5c6812ac7ce4d50f2068782f4426f546009df 100644 (file)
@@ -758,7 +758,7 @@ static int io_subchannel_initialize_dev(struct subchannel *sch,
                                        struct ccw_device *cdev)
 {
        cdev->private->cdev = cdev;
-       cdev->private->int_class = IOINT_CIO;
+       cdev->private->int_class = IRQIO_CIO;
        atomic_set(&cdev->private->onoff, 0);
        cdev->dev.parent = &sch->dev;
        cdev->dev.release = ccw_device_release;
@@ -1023,7 +1023,7 @@ static void io_subchannel_irq(struct subchannel *sch)
        if (cdev)
                dev_fsm_event(cdev, DEV_EVENT_INTERRUPT);
        else
-               kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
+               inc_irq_stat(IRQIO_CIO);
 }
 
 void io_subchannel_init_config(struct subchannel *sch)
@@ -1634,7 +1634,7 @@ ccw_device_probe_console(void)
        memset(&console_private, 0, sizeof(struct ccw_device_private));
        console_cdev.private = &console_private;
        console_private.cdev = &console_cdev;
-       console_private.int_class = IOINT_CIO;
+       console_private.int_class = IRQIO_CIO;
        ret = ccw_device_console_enable(&console_cdev, sch);
        if (ret) {
                cio_release_console();
@@ -1715,13 +1715,13 @@ ccw_device_probe (struct device *dev)
        if (cdrv->int_class != 0)
                cdev->private->int_class = cdrv->int_class;
        else
-               cdev->private->int_class = IOINT_CIO;
+               cdev->private->int_class = IRQIO_CIO;
 
        ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV;
 
        if (ret) {
                cdev->drv = NULL;
-               cdev->private->int_class = IOINT_CIO;
+               cdev->private->int_class = IRQIO_CIO;
                return ret;
        }
 
@@ -1755,7 +1755,7 @@ ccw_device_remove (struct device *dev)
        }
        ccw_device_set_timeout(cdev, 0);
        cdev->drv = NULL;
-       cdev->private->int_class = IOINT_CIO;
+       cdev->private->int_class = IRQIO_CIO;
        return 0;
 }
 
index 2e575cff984549bbc90478663d6fcf3a23b10410..7d4ecb65db00cfab037ff4e4d6684570fcdf54e7 100644 (file)
@@ -61,11 +61,10 @@ dev_fsm_event(struct ccw_device *cdev, enum dev_event dev_event)
 
        if (dev_event == DEV_EVENT_INTERRUPT) {
                if (state == DEV_STATE_ONLINE)
-                       kstat_cpu(smp_processor_id()).
-                               irqs[cdev->private->int_class]++;
+                       inc_irq_stat(cdev->private->int_class);
                else if (state != DEV_STATE_CMFCHANGE &&
                         state != DEV_STATE_CMFUPDATE)
-                       kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++;
+                       inc_irq_stat(IRQIO_CIO);
        }
        dev_jumptable[state][dev_event](cdev, dev_event);
 }
index 6c9673400464fdc89b3a462e21820961f1de049a..d9eddcba7e884d788a9d8c1f3dad14bc3d71cf77 100644 (file)
@@ -139,7 +139,7 @@ static void eadm_subchannel_irq(struct subchannel *sch)
        EADM_LOG(6, "irq");
        EADM_LOG_HEX(6, irb, sizeof(*irb));
 
-       kstat_cpu(smp_processor_id()).irqs[IOINT_ADM]++;
+       inc_irq_stat(IRQIO_ADM);
 
        if ((scsw->stctl & (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND))
            && scsw->eswf == 1 && irb->esw.eadm.erw.r)
index bdb394b066fcff56aac5588119c5ecc64efddf1f..bde5255200dc3864687fa955e69440503bd46b4b 100644 (file)
@@ -182,7 +182,7 @@ static void tiqdio_thinint_handler(void *alsi, void *data)
        struct qdio_q *q;
 
        last_ai_time = S390_lowcore.int_clock;
-       kstat_cpu(smp_processor_id()).irqs[IOINT_QAI]++;
+       inc_irq_stat(IRQIO_QAI);
 
        /* protect tiq_list entries, only changed in activate or shutdown */
        rcu_read_lock();
index 7b865a7300e6a7da366762bf7b3882986fc462b3..b8b340ac53321f1028366d1a0cd18446050ed034 100644 (file)
@@ -1272,7 +1272,7 @@ out:
 
 static void ap_interrupt_handler(void *unused1, void *unused2)
 {
-       kstat_cpu(smp_processor_id()).irqs[IOINT_APB]++;
+       inc_irq_stat(IRQIO_APB);
        tasklet_schedule(&ap_tasklet);
 }
 
index 7dabef624da394e6b90a2e04c787f74a4ffaa98d..8491111aec12d45b780243a907f71bb86adbfe17 100644 (file)
@@ -392,7 +392,7 @@ static void kvm_extint_handler(struct ext_code ext_code,
 
        if ((ext_code.subcode & 0xff00) != VIRTIO_SUBCODE_64)
                return;
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++;
+       inc_irq_stat(IRQEXT_VRT);
 
        /* The LSB might be overloaded, we have to mask it */
        vq = (struct virtqueue *)(param64 & ~1UL);
index dfda748c40004c368b02657de932dd5334241b5e..8b3f5599180595df9cd28422fe1dec2ddc2183aa 100644 (file)
@@ -74,8 +74,8 @@ config QETH
        depends on CCW && NETDEVICES && IP_MULTICAST && QDIO
        help
          This driver supports the IBM System z OSA Express adapters
-         in QDIO mode (all media types), HiperSockets interfaces and VM GuestLAN
-         interfaces in QDIO and HIPER mode.
+         in QDIO mode (all media types), HiperSockets interfaces and z/VM
+         virtual NICs for Guest LAN and VSWITCH.
        
          For details please refer to the documentation provided by IBM at
          <http://www.ibm.com/developerworks/linux/linux390>
index 5c70a6599578d6940faff2e1791e89ef4d4b769b..83bc9c5fa0c190885656955458b342d2265362f9 100644 (file)
@@ -282,7 +282,7 @@ static struct ccw_driver claw_ccw_driver = {
        .ids    = claw_ids,
        .probe  = ccwgroup_probe_ccwdev,
        .remove = ccwgroup_remove_ccwdev,
-       .int_class = IOINT_CLW,
+       .int_class = IRQIO_CLW,
 };
 
 static ssize_t claw_driver_group_store(struct device_driver *ddrv,
index 817b68925dddbd5c097129e6da6be7f41c77bdc8..676f12049a3693056d58ba216b0f1c3eeacdf92c 100644 (file)
@@ -1755,7 +1755,7 @@ static struct ccw_driver ctcm_ccw_driver = {
        .ids    = ctcm_ids,
        .probe  = ccwgroup_probe_ccwdev,
        .remove = ccwgroup_remove_ccwdev,
-       .int_class = IOINT_CTC,
+       .int_class = IRQIO_CTC,
 };
 
 static struct ccwgroup_driver ctcm_group_driver = {
index 2ca0f1dd7a00b857211348cf28d2c9e4a9df161a..c645dc9e98af83359d13b4975221a4d609ace853 100644 (file)
@@ -2384,7 +2384,7 @@ static struct ccw_driver lcs_ccw_driver = {
        .ids    = lcs_ids,
        .probe  = ccwgroup_probe_ccwdev,
        .remove = ccwgroup_remove_ccwdev,
-       .int_class = IOINT_LCS,
+       .int_class = IRQIO_LCS,
 };
 
 /**
index 480fbeab0256ab3406feffd0dd93a2b70dc666c8..d690b33846ccc211dfde01e950b65990a5082efa 100644 (file)
@@ -678,6 +678,7 @@ struct qeth_card_options {
        int performance_stats;
        int rx_sg_cb;
        enum qeth_ipa_isolation_modes isolation;
+       enum qeth_ipa_isolation_modes prev_isolation;
        int sniffer;
        enum qeth_cq cq;
        char hsuid[9];
@@ -789,6 +790,7 @@ struct qeth_card {
        struct qeth_rx rx;
        struct delayed_work buffer_reclaim_work;
        int reclaim_index;
+       struct work_struct close_dev_work;
 };
 
 struct qeth_card_list_struct {
@@ -909,9 +911,6 @@ struct qeth_cmd_buffer *qeth_wait_for_buffer(struct qeth_channel *);
 int qeth_mdio_read(struct net_device *, int, int);
 int qeth_snmp_command(struct qeth_card *, char __user *);
 int qeth_query_oat_command(struct qeth_card *, char __user *);
-struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *, __u32, __u32);
-int qeth_default_setadapterparms_cb(struct qeth_card *, struct qeth_reply *,
-                                       unsigned long);
 int qeth_send_control_data(struct qeth_card *, int, struct qeth_cmd_buffer *,
        int (*reply_cb)(struct qeth_card *, struct qeth_reply*, unsigned long),
        void *reply_param);
@@ -928,12 +927,13 @@ void qeth_core_get_strings(struct net_device *, u32, u8 *);
 void qeth_core_get_drvinfo(struct net_device *, struct ethtool_drvinfo *);
 void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...);
 int qeth_core_ethtool_get_settings(struct net_device *, struct ethtool_cmd *);
-int qeth_set_access_ctrl_online(struct qeth_card *card);
+int qeth_set_access_ctrl_online(struct qeth_card *card, int fallback);
 int qeth_hdr_chk_and_bounce(struct sk_buff *, int);
 int qeth_configure_cq(struct qeth_card *, enum qeth_cq);
 int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
 int qeth_query_ipassists(struct qeth_card *, enum qeth_prot_versions prot);
 void qeth_trace_features(struct qeth_card *);
+void qeth_close_dev(struct qeth_card *);
 
 /* exports for OSN */
 int qeth_osn_assist(struct net_device *, void *, int);
index 029a7acf7b7a9c5a010f7a2f728177ce53d9ad5c..0d8cdff818139e8ee267f57df08c78494c1592d0 100644 (file)
@@ -68,6 +68,27 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
                enum qeth_qdio_buffer_states newbufstate);
 static int qeth_init_qdio_out_buf(struct qeth_qdio_out_q *, int);
 
+static struct workqueue_struct *qeth_wq;
+
+static void qeth_close_dev_handler(struct work_struct *work)
+{
+       struct qeth_card *card;
+
+       card = container_of(work, struct qeth_card, close_dev_work);
+       QETH_CARD_TEXT(card, 2, "cldevhdl");
+       rtnl_lock();
+       dev_close(card->dev);
+       rtnl_unlock();
+       ccwgroup_set_offline(card->gdev);
+}
+
+void qeth_close_dev(struct qeth_card *card)
+{
+       QETH_CARD_TEXT(card, 2, "cldevsubm");
+       queue_work(qeth_wq, &card->close_dev_work);
+}
+EXPORT_SYMBOL_GPL(qeth_close_dev);
+
 static inline const char *qeth_get_cardname(struct qeth_card *card)
 {
        if (card->info.guestlan) {
@@ -542,11 +563,23 @@ static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
                } else {
                        switch (cmd->hdr.command) {
                        case IPA_CMD_STOPLAN:
-                               dev_warn(&card->gdev->dev,
+                               if (cmd->hdr.return_code ==
+                                               IPA_RC_VEPA_TO_VEB_TRANSITION) {
+                                       dev_err(&card->gdev->dev,
+                                          "Interface %s is down because the "
+                                          "adjacent port is no longer in "
+                                          "reflective relay mode\n",
+                                          QETH_CARD_IFNAME(card));
+                                       qeth_close_dev(card);
+                               } else {
+                                       dev_warn(&card->gdev->dev,
                                           "The link for interface %s on CHPID"
                                           " 0x%X failed\n",
                                           QETH_CARD_IFNAME(card),
                                           card->info.chpid);
+                                       qeth_issue_ipa_msg(cmd,
+                                               cmd->hdr.return_code, card);
+                               }
                                card->lan_online = 0;
                                if (card->dev && netif_carrier_ok(card->dev))
                                        netif_carrier_off(card->dev);
@@ -1416,6 +1449,7 @@ static int qeth_setup_card(struct qeth_card *card)
        /* init QDIO stuff */
        qeth_init_qdio_info(card);
        INIT_DELAYED_WORK(&card->buffer_reclaim_work, qeth_buffer_reclaim_work);
+       INIT_WORK(&card->close_dev_work, qeth_close_dev_handler);
        return 0;
 }
 
@@ -2868,7 +2902,7 @@ int qeth_send_startlan(struct qeth_card *card)
 }
 EXPORT_SYMBOL_GPL(qeth_send_startlan);
 
-int qeth_default_setadapterparms_cb(struct qeth_card *card,
+static int qeth_default_setadapterparms_cb(struct qeth_card *card,
                struct qeth_reply *reply, unsigned long data)
 {
        struct qeth_ipa_cmd *cmd;
@@ -2881,7 +2915,6 @@ int qeth_default_setadapterparms_cb(struct qeth_card *card,
                        cmd->data.setadapterparms.hdr.return_code;
        return 0;
 }
-EXPORT_SYMBOL_GPL(qeth_default_setadapterparms_cb);
 
 static int qeth_query_setadapterparms_cb(struct qeth_card *card,
                struct qeth_reply *reply, unsigned long data)
@@ -2901,7 +2934,7 @@ static int qeth_query_setadapterparms_cb(struct qeth_card *card,
        return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
 }
 
-struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
+static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
                __u32 command, __u32 cmdlen)
 {
        struct qeth_cmd_buffer *iob;
@@ -2917,7 +2950,6 @@ struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
 
        return iob;
 }
-EXPORT_SYMBOL_GPL(qeth_get_adapter_cmd);
 
 int qeth_query_setadapterparms(struct qeth_card *card)
 {
@@ -4059,6 +4091,7 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
 {
        struct qeth_ipa_cmd *cmd;
        struct qeth_set_access_ctrl *access_ctrl_req;
+       int fallback = *(int *)reply->param;
 
        QETH_CARD_TEXT(card, 4, "setaccb");
 
@@ -4068,12 +4101,14 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
        QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
        QETH_DBF_TEXT_(SETUP, 2, "rc=%d",
                cmd->data.setadapterparms.hdr.return_code);
+       if (cmd->data.setadapterparms.hdr.return_code !=
+                                               SET_ACCESS_CTRL_RC_SUCCESS)
+               QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_CTRL(%s,%d)==%d\n",
+                               card->gdev->dev.kobj.name,
+                               access_ctrl_req->subcmd_code,
+                               cmd->data.setadapterparms.hdr.return_code);
        switch (cmd->data.setadapterparms.hdr.return_code) {
        case SET_ACCESS_CTRL_RC_SUCCESS:
-       case SET_ACCESS_CTRL_RC_ALREADY_NOT_ISOLATED:
-       case SET_ACCESS_CTRL_RC_ALREADY_ISOLATED:
-       {
-               card->options.isolation = access_ctrl_req->subcmd_code;
                if (card->options.isolation == ISOLATION_MODE_NONE) {
                        dev_info(&card->gdev->dev,
                            "QDIO data connection isolation is deactivated\n");
@@ -4081,72 +4116,64 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
                        dev_info(&card->gdev->dev,
                            "QDIO data connection isolation is activated\n");
                }
-               QETH_DBF_MESSAGE(3, "OK:SET_ACCESS_CTRL(%s, %d)==%d\n",
-                       card->gdev->dev.kobj.name,
-                       access_ctrl_req->subcmd_code,
-                       cmd->data.setadapterparms.hdr.return_code);
                break;
-       }
+       case SET_ACCESS_CTRL_RC_ALREADY_NOT_ISOLATED:
+               QETH_DBF_MESSAGE(2, "%s QDIO data connection isolation already "
+                               "deactivated\n", dev_name(&card->gdev->dev));
+               if (fallback)
+                       card->options.isolation = card->options.prev_isolation;
+               break;
+       case SET_ACCESS_CTRL_RC_ALREADY_ISOLATED:
+               QETH_DBF_MESSAGE(2, "%s QDIO data connection isolation already"
+                               " activated\n", dev_name(&card->gdev->dev));
+               if (fallback)
+                       card->options.isolation = card->options.prev_isolation;
+               break;
        case SET_ACCESS_CTRL_RC_NOT_SUPPORTED:
-       {
-               QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_CTRL(%s,%d)==%d\n",
-                       card->gdev->dev.kobj.name,
-                       access_ctrl_req->subcmd_code,
-                       cmd->data.setadapterparms.hdr.return_code);
                dev_err(&card->gdev->dev, "Adapter does not "
                        "support QDIO data connection isolation\n");
-
-               /* ensure isolation mode is "none" */
-               card->options.isolation = ISOLATION_MODE_NONE;
                break;
-       }
        case SET_ACCESS_CTRL_RC_NONE_SHARED_ADAPTER:
-       {
-               QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_MODE(%s,%d)==%d\n",
-                       card->gdev->dev.kobj.name,
-                       access_ctrl_req->subcmd_code,
-                       cmd->data.setadapterparms.hdr.return_code);
                dev_err(&card->gdev->dev,
                        "Adapter is dedicated. "
                        "QDIO data connection isolation not supported\n");
-
-               /* ensure isolation mode is "none" */
-               card->options.isolation = ISOLATION_MODE_NONE;
+               if (fallback)
+                       card->options.isolation = card->options.prev_isolation;
                break;
-       }
        case SET_ACCESS_CTRL_RC_ACTIVE_CHECKSUM_OFF:
-       {
-               QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_MODE(%s,%d)==%d\n",
-                       card->gdev->dev.kobj.name,
-                       access_ctrl_req->subcmd_code,
-                       cmd->data.setadapterparms.hdr.return_code);
                dev_err(&card->gdev->dev,
                        "TSO does not permit QDIO data connection isolation\n");
-
-               /* ensure isolation mode is "none" */
-               card->options.isolation = ISOLATION_MODE_NONE;
+               if (fallback)
+                       card->options.isolation = card->options.prev_isolation;
+               break;
+       case SET_ACCESS_CTRL_RC_REFLREL_UNSUPPORTED:
+               dev_err(&card->gdev->dev, "The adjacent switch port does not "
+                       "support reflective relay mode\n");
+               if (fallback)
+                       card->options.isolation = card->options.prev_isolation;
+               break;
+       case SET_ACCESS_CTRL_RC_REFLREL_FAILED:
+               dev_err(&card->gdev->dev, "The reflective relay mode cannot be "
+                                       "enabled at the adjacent switch port");
+               if (fallback)
+                       card->options.isolation = card->options.prev_isolation;
+               break;
+       case SET_ACCESS_CTRL_RC_REFLREL_DEACT_FAILED:
+               dev_warn(&card->gdev->dev, "Turning off reflective relay mode "
+                                       "at the adjacent switch failed\n");
                break;
-       }
        default:
-       {
                /* this should never happen */
-               QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_MODE(%s,%d)==%d"
-                       "==UNKNOWN\n",
-                       card->gdev->dev.kobj.name,
-                       access_ctrl_req->subcmd_code,
-                       cmd->data.setadapterparms.hdr.return_code);
-
-               /* ensure isolation mode is "none" */
-               card->options.isolation = ISOLATION_MODE_NONE;
+               if (fallback)
+                       card->options.isolation = card->options.prev_isolation;
                break;
        }
-       }
        qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
        return 0;
 }
 
 static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
-               enum qeth_ipa_isolation_modes isolation)
+               enum qeth_ipa_isolation_modes isolation, int fallback)
 {
        int rc;
        struct qeth_cmd_buffer *iob;
@@ -4166,12 +4193,12 @@ static int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
        access_ctrl_req->subcmd_code = isolation;
 
        rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_set_access_ctrl_cb,
-                              NULL);
+                              &fallback);
        QETH_DBF_TEXT_(SETUP, 2, "rc=%d", rc);
        return rc;
 }
 
-int qeth_set_access_ctrl_online(struct qeth_card *card)
+int qeth_set_access_ctrl_online(struct qeth_card *card, int fallback)
 {
        int rc = 0;
 
@@ -4181,12 +4208,13 @@ int qeth_set_access_ctrl_online(struct qeth_card *card)
             card->info.type == QETH_CARD_TYPE_OSX) &&
             qeth_adp_supported(card, IPA_SETADP_SET_ACCESS_CONTROL)) {
                rc = qeth_setadpparms_set_access_ctrl(card,
-                       card->options.isolation);
+                       card->options.isolation, fallback);
                if (rc) {
                        QETH_DBF_MESSAGE(3,
                                "IPA(SET_ACCESS_CTRL,%s,%d) sent failed\n",
                                card->gdev->dev.kobj.name,
                                rc);
+                       rc = -EOPNOTSUPP;
                }
        } else if (card->options.isolation != ISOLATION_MODE_NONE) {
                card->options.isolation = ISOLATION_MODE_NONE;
@@ -4672,7 +4700,7 @@ static int qeth_qdio_establish(struct qeth_card *card)
        init_data.output_sbal_addr_array = (void **) out_sbal_ptrs;
        init_data.output_sbal_state_array = card->qdio.out_bufstates;
        init_data.scan_threshold =
-               (card->info.type == QETH_CARD_TYPE_IQD) ? 8 : 32;
+               (card->info.type == QETH_CARD_TYPE_IQD) ? 1 : 32;
 
        if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
                QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) {
@@ -4765,14 +4793,14 @@ static struct ccw_driver qeth_ccw_driver = {
 
 int qeth_core_hardsetup_card(struct qeth_card *card)
 {
-       int retries = 0;
+       int retries = 3;
        int rc;
 
        QETH_DBF_TEXT(SETUP, 2, "hrdsetup");
        atomic_set(&card->force_alloc_skb, 0);
        qeth_update_from_chp_desc(card);
 retry:
-       if (retries)
+       if (retries < 3)
                QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n",
                        dev_name(&card->gdev->dev));
        ccw_device_set_offline(CARD_DDEV(card));
@@ -4794,7 +4822,7 @@ retriable:
                return rc;
        } else if (rc) {
                QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
-               if (++retries > 3)
+               if (--retries < 0)
                        goto out;
                else
                        goto retry;
@@ -5094,13 +5122,81 @@ static const struct device_type qeth_osn_devtype = {
        .groups = qeth_osn_attr_groups,
 };
 
+#define DBF_NAME_LEN   20
+
+struct qeth_dbf_entry {
+       char dbf_name[DBF_NAME_LEN];
+       debug_info_t *dbf_info;
+       struct list_head dbf_list;
+};
+
+static LIST_HEAD(qeth_dbf_list);
+static DEFINE_MUTEX(qeth_dbf_list_mutex);
+
+static debug_info_t *qeth_get_dbf_entry(char *name)
+{
+       struct qeth_dbf_entry *entry;
+       debug_info_t *rc = NULL;
+
+       mutex_lock(&qeth_dbf_list_mutex);
+       list_for_each_entry(entry, &qeth_dbf_list, dbf_list) {
+               if (strcmp(entry->dbf_name, name) == 0) {
+                       rc = entry->dbf_info;
+                       break;
+               }
+       }
+       mutex_unlock(&qeth_dbf_list_mutex);
+       return rc;
+}
+
+static int qeth_add_dbf_entry(struct qeth_card *card, char *name)
+{
+       struct qeth_dbf_entry *new_entry;
+
+       card->debug = debug_register(name, 2, 1, 8);
+       if (!card->debug) {
+               QETH_DBF_TEXT_(SETUP, 2, "%s", "qcdbf");
+               goto err;
+       }
+       if (debug_register_view(card->debug, &debug_hex_ascii_view))
+               goto err_dbg;
+       new_entry = kzalloc(sizeof(struct qeth_dbf_entry), GFP_KERNEL);
+       if (!new_entry)
+               goto err_dbg;
+       strncpy(new_entry->dbf_name, name, DBF_NAME_LEN);
+       new_entry->dbf_info = card->debug;
+       mutex_lock(&qeth_dbf_list_mutex);
+       list_add(&new_entry->dbf_list, &qeth_dbf_list);
+       mutex_unlock(&qeth_dbf_list_mutex);
+
+       return 0;
+
+err_dbg:
+       debug_unregister(card->debug);
+err:
+       return -ENOMEM;
+}
+
+static void qeth_clear_dbf_list(void)
+{
+       struct qeth_dbf_entry *entry, *tmp;
+
+       mutex_lock(&qeth_dbf_list_mutex);
+       list_for_each_entry_safe(entry, tmp, &qeth_dbf_list, dbf_list) {
+               list_del(&entry->dbf_list);
+               debug_unregister(entry->dbf_info);
+               kfree(entry);
+       }
+       mutex_unlock(&qeth_dbf_list_mutex);
+}
+
 static int qeth_core_probe_device(struct ccwgroup_device *gdev)
 {
        struct qeth_card *card;
        struct device *dev;
        int rc;
        unsigned long flags;
-       char dbf_name[20];
+       char dbf_name[DBF_NAME_LEN];
 
        QETH_DBF_TEXT(SETUP, 2, "probedev");
 
@@ -5119,13 +5215,12 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
 
        snprintf(dbf_name, sizeof(dbf_name), "qeth_card_%s",
                dev_name(&gdev->dev));
-       card->debug = debug_register(dbf_name, 2, 1, 8);
+       card->debug = qeth_get_dbf_entry(dbf_name);
        if (!card->debug) {
-               QETH_DBF_TEXT_(SETUP, 2, "%s", "qcdbf");
-               rc = -ENOMEM;
-               goto err_card;
+               rc = qeth_add_dbf_entry(card, dbf_name);
+               if (rc)
+                       goto err_card;
        }
-       debug_register_view(card->debug, &debug_hex_ascii_view);
 
        card->read.ccwdev  = gdev->cdev[0];
        card->write.ccwdev = gdev->cdev[1];
@@ -5139,12 +5234,12 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
        rc = qeth_determine_card_type(card);
        if (rc) {
                QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
-               goto err_dbf;
+               goto err_card;
        }
        rc = qeth_setup_card(card);
        if (rc) {
                QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
-               goto err_dbf;
+               goto err_card;
        }
 
        if (card->info.type == QETH_CARD_TYPE_OSN)
@@ -5157,7 +5252,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
        case QETH_CARD_TYPE_OSM:
                rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2);
                if (rc)
-                       goto err_dbf;
+                       goto err_card;
                rc = card->discipline->setup(card->gdev);
                if (rc)
                        goto err_disc;
@@ -5176,8 +5271,6 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
 
 err_disc:
        qeth_core_free_discipline(card);
-err_dbf:
-       debug_unregister(card->debug);
 err_card:
        qeth_core_free_card(card);
 err_dev:
@@ -5197,7 +5290,6 @@ static void qeth_core_remove_device(struct ccwgroup_device *gdev)
                qeth_core_free_discipline(card);
        }
 
-       debug_unregister(card->debug);
        write_lock_irqsave(&qeth_core_card_list.rwlock, flags);
        list_del(&card->list);
        write_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
@@ -5551,9 +5643,12 @@ static int __init qeth_core_init(void)
 
        pr_info("loading core functions\n");
        INIT_LIST_HEAD(&qeth_core_card_list.list);
+       INIT_LIST_HEAD(&qeth_dbf_list);
        rwlock_init(&qeth_core_card_list.rwlock);
        mutex_init(&qeth_mod_mutex);
 
+       qeth_wq = create_singlethread_workqueue("qeth_wq");
+
        rc = qeth_register_dbf_views();
        if (rc)
                goto out_err;
@@ -5600,6 +5695,8 @@ out_err:
 
 static void __exit qeth_core_exit(void)
 {
+       qeth_clear_dbf_list();
+       destroy_workqueue(qeth_wq);
        ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver);
        ccw_driver_unregister(&qeth_ccw_driver);
        kmem_cache_destroy(qeth_qdio_outbuf_cache);
index 5cebfddb86bdfbb40b2a0cfa6f212e5d0656cf95..06c55780005e5316769811b8f8bdd7a08745b360 100644 (file)
@@ -204,6 +204,7 @@ static struct ipa_rc_msg qeth_ipa_rc_msg[] = {
        {IPA_RC_INVALID_SETRTG_INDICATOR, "Invalid SETRTG indicator"},
        {IPA_RC_MC_ADDR_ALREADY_DEFINED, "Multicast address already defined"},
        {IPA_RC_LAN_OFFLINE,            "STRTLAN_LAN_DISABLED - LAN offline"},
+       {IPA_RC_VEPA_TO_VEB_TRANSITION, "Adj. switch disabled port mode RR"},
        {IPA_RC_INVALID_IP_VERSION2,    "Invalid IP version"},
        {IPA_RC_ENOMEM,                 "Memory problem"},
        {IPA_RC_FFFF,                   "Unknown Error"}
index 3690bbf2cb3cf3699abadeb4f2aa0703e11c2ce2..07085d55f9a1d2c705dbdbdbdcdd2a4270ecac03 100644 (file)
@@ -177,6 +177,7 @@ enum qeth_ipa_return_codes {
        IPA_RC_INVALID_SETRTG_INDICATOR = 0xe012,
        IPA_RC_MC_ADDR_ALREADY_DEFINED  = 0xe013,
        IPA_RC_LAN_OFFLINE              = 0xe080,
+       IPA_RC_VEPA_TO_VEB_TRANSITION   = 0xe090,
        IPA_RC_INVALID_IP_VERSION2      = 0xf001,
        IPA_RC_ENOMEM                   = 0xfffe,
        IPA_RC_FFFF                     = 0xffff
@@ -269,6 +270,9 @@ enum qeth_ipa_set_access_mode_rc {
        SET_ACCESS_CTRL_RC_ALREADY_ISOLATED     = 0x0010,
        SET_ACCESS_CTRL_RC_NONE_SHARED_ADAPTER  = 0x0014,
        SET_ACCESS_CTRL_RC_ACTIVE_CHECKSUM_OFF  = 0x0018,
+       SET_ACCESS_CTRL_RC_REFLREL_UNSUPPORTED  = 0x0022,
+       SET_ACCESS_CTRL_RC_REFLREL_FAILED       = 0x0024,
+       SET_ACCESS_CTRL_RC_REFLREL_DEACT_FAILED = 0x0028,
 };
 
 
@@ -386,6 +390,7 @@ struct qeth_snmp_ureq {
 /* SET_ACCESS_CONTROL: same format for request and reply */
 struct qeth_set_access_ctrl {
        __u32 subcmd_code;
+       __u8 reserved[8];
 } __attribute__((packed));
 
 struct qeth_query_oat {
index 9655dc0ea0ec7187c65de00eb30399bf13ffe1fb..425c0ecf1f3b9fd2ae3c2c55f61b1ad10f08c028 100644 (file)
@@ -513,10 +513,11 @@ static ssize_t qeth_dev_isolation_store(struct device *dev,
        rc = count;
 
        /* defer IP assist if device is offline (until discipline->set_online)*/
+       card->options.prev_isolation = card->options.isolation;
        card->options.isolation = isolation;
        if (card->state == CARD_STATE_SOFTSETUP ||
            card->state == CARD_STATE_UP) {
-               int ipa_rc = qeth_set_access_ctrl_online(card);
+               int ipa_rc = qeth_set_access_ctrl_online(card, 1);
                if (ipa_rc != 0)
                        rc = ipa_rc;
        }
index 73195553f84b168442918a0c6697d9ef090999c2..d690166efeaffbd4d47f1d39d3111af232876e66 100644 (file)
@@ -1025,9 +1025,14 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
 
 contin:
        if ((card->info.type == QETH_CARD_TYPE_OSD) ||
-           (card->info.type == QETH_CARD_TYPE_OSX))
+           (card->info.type == QETH_CARD_TYPE_OSX)) {
                /* configure isolation level */
-               qeth_set_access_ctrl_online(card);
+               rc = qeth_set_access_ctrl_online(card, 0);
+               if (rc) {
+                       rc = -ENODEV;
+                       goto out_remove;
+               }
+       }
 
        if (card->info.type != QETH_CARD_TYPE_OSN &&
            card->info.type != QETH_CARD_TYPE_OSM)
@@ -1144,12 +1149,9 @@ static int qeth_l2_recover(void *ptr)
                dev_info(&card->gdev->dev,
                        "Device successfully recovered!\n");
        else {
-               if (rtnl_trylock()) {
-                       dev_close(card->dev);
-                       rtnl_unlock();
-                       dev_warn(&card->gdev->dev, "The qeth device driver "
+               qeth_close_dev(card);
+               dev_warn(&card->gdev->dev, "The qeth device driver "
                                "failed to recover an error on the device\n");
-               }
        }
        qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
        qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
index 0749efe1c6d9c68ac5abce23361d630aaa227cbc..091ca0efa1c539e0ca27f57f55a00cb543bfc304 100644 (file)
@@ -1449,7 +1449,8 @@ static int qeth_l3_start_ipassists(struct qeth_card *card)
 {
        QETH_CARD_TEXT(card, 3, "strtipas");
 
-       qeth_set_access_ctrl_online(card);      /* go on*/
+       if (qeth_set_access_ctrl_online(card, 0))
+               return -EIO;
        qeth_l3_start_ipa_arp_processing(card); /* go on*/
        qeth_l3_start_ipa_ip_fragmentation(card);       /* go on*/
        qeth_l3_start_ipa_source_mac(card);     /* go on*/
@@ -3388,8 +3389,10 @@ contin:
                QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
        if (!card->options.sniffer) {
                rc = qeth_l3_start_ipassists(card);
-               if (rc)
+               if (rc) {
                        QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
+                       goto out_remove;
+               }
                rc = qeth_l3_setrouting_v4(card);
                if (rc)
                        QETH_DBF_TEXT_(SETUP, 2, "4err%d", rc);
@@ -3511,12 +3514,9 @@ static int qeth_l3_recover(void *ptr)
                dev_info(&card->gdev->dev,
                        "Device successfully recovered!\n");
        else {
-               if (rtnl_trylock()) {
-                       dev_close(card->dev);
-                       rtnl_unlock();
-                       dev_warn(&card->gdev->dev, "The qeth device driver "
+               qeth_close_dev(card);
+               dev_warn(&card->gdev->dev, "The qeth device driver "
                                "failed to recover an error on the device\n");
-               }
        }
        qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
        qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
index 542668292900fa9fe2e5afca92215f46104e0520..1a9d1e3ce64cc94aa36581fd29cefb6084f3502f 100644 (file)
@@ -355,7 +355,7 @@ fail:
 extern int bbc_envctrl_init(struct bbc_i2c_bus *bp);
 extern void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp);
 
-static int __devinit bbc_i2c_probe(struct platform_device *op)
+static int bbc_i2c_probe(struct platform_device *op)
 {
        struct bbc_i2c_bus *bp;
        int err, index = 0;
@@ -379,7 +379,7 @@ static int __devinit bbc_i2c_probe(struct platform_device *op)
        return err;
 }
 
-static int __devexit bbc_i2c_remove(struct platform_device *op)
+static int bbc_i2c_remove(struct platform_device *op)
 {
        struct bbc_i2c_bus *bp = dev_get_drvdata(&op->dev);
 
@@ -413,7 +413,7 @@ static struct platform_driver bbc_i2c_driver = {
                .of_match_table = bbc_i2c_match,
        },
        .probe          = bbc_i2c_probe,
-       .remove         = __devexit_p(bbc_i2c_remove),
+       .remove         = bbc_i2c_remove,
 };
 
 module_platform_driver(bbc_i2c_driver);
index b160073e54b65e76baa876f06720d4ab92ae160e..e85c803b30cdfd0362940a281f054d4d1b9644d6 100644 (file)
@@ -171,7 +171,7 @@ static struct miscdevice d7s_miscdev = {
        .fops           = &d7s_fops
 };
 
-static int __devinit d7s_probe(struct platform_device *op)
+static int d7s_probe(struct platform_device *op)
 {
        struct device_node *opts;
        int err = -EINVAL;
@@ -236,7 +236,7 @@ out_free:
        goto out;
 }
 
-static int __devexit d7s_remove(struct platform_device *op)
+static int d7s_remove(struct platform_device *op)
 {
        struct d7s *p = dev_get_drvdata(&op->dev);
        u8 regs = readb(p->regs);
@@ -272,7 +272,7 @@ static struct platform_driver d7s_driver = {
                .of_match_table = d7s_match,
        },
        .probe          = d7s_probe,
-       .remove         = __devexit_p(d7s_remove),
+       .remove         = d7s_remove,
 };
 
 module_platform_driver(d7s_driver);
index 0bc18569f9c0afe35c908ea2676cf59973538dae..ddbe5a9e713dfba93218ad886e5df1f49b9fd19c 100644 (file)
@@ -1028,7 +1028,7 @@ static int kenvctrld(void *__unused)
        return 0;
 }
 
-static int __devinit envctrl_probe(struct platform_device *op)
+static int envctrl_probe(struct platform_device *op)
 {
        struct device_node *dp;
        int index, err;
@@ -1104,7 +1104,7 @@ out_iounmap:
        return err;
 }
 
-static int __devexit envctrl_remove(struct platform_device *op)
+static int envctrl_remove(struct platform_device *op)
 {
        int index;
 
@@ -1135,7 +1135,7 @@ static struct platform_driver envctrl_driver = {
                .of_match_table = envctrl_match,
        },
        .probe          = envctrl_probe,
-       .remove         = __devexit_p(envctrl_remove),
+       .remove         = envctrl_remove,
 };
 
 module_platform_driver(envctrl_driver);
index 327657e2e2648ca79b8030e1c1218972076f8e90..d9f268f237749df06e63f11cec4c19c69326f995 100644 (file)
@@ -159,7 +159,7 @@ static const struct file_operations flash_fops = {
 
 static struct miscdevice flash_dev = { FLASH_MINOR, "flash", &flash_fops };
 
-static int __devinit flash_probe(struct platform_device *op)
+static int flash_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct device_node *parent;
@@ -190,7 +190,7 @@ static int __devinit flash_probe(struct platform_device *op)
        return misc_register(&flash_dev);
 }
 
-static int __devexit flash_remove(struct platform_device *op)
+static int flash_remove(struct platform_device *op)
 {
        misc_deregister(&flash_dev);
 
@@ -212,7 +212,7 @@ static struct platform_driver flash_driver = {
                .of_match_table = flash_match,
        },
        .probe          = flash_probe,
-       .remove         = __devexit_p(flash_remove),
+       .remove         = flash_remove,
 };
 
 module_platform_driver(flash_driver);
index a9e468cc1caca686f82459341fcaa13f71addbeb..b0aae0536d588441aee8409e200ba417a6080b39 100644 (file)
@@ -347,7 +347,7 @@ static void uctrl_get_external_status(struct uctrl_driver *driver)
        
 }
 
-static int __devinit uctrl_probe(struct platform_device *op)
+static int uctrl_probe(struct platform_device *op)
 {
        struct uctrl_driver *p;
        int err = -ENOMEM;
@@ -402,7 +402,7 @@ out_free:
        goto out;
 }
 
-static int __devexit uctrl_remove(struct platform_device *op)
+static int uctrl_remove(struct platform_device *op)
 {
        struct uctrl_driver *p = dev_get_drvdata(&op->dev);
 
@@ -430,7 +430,7 @@ static struct platform_driver uctrl_driver = {
                .of_match_table = uctrl_match,
        },
        .probe          = uctrl_probe,
-       .remove         = __devexit_p(uctrl_remove),
+       .remove         = uctrl_remove,
 };
 
 
index 3868ab2397c6bcb3418d7f2b8663739438e86809..d1f0120cdb98228bcea7ef0b638c6ee900c75233 100644 (file)
@@ -2029,7 +2029,7 @@ static struct scsi_host_template driver_template = {
 };
 
 /* This function will probe and initialize a card */
-static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
+static int twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
 {
        struct Scsi_Host *host = NULL;
        TW_Device_Extension *tw_dev;
@@ -2305,7 +2305,7 @@ out_disable_device:
 #endif
 
 /* PCI Devices supported by this driver */
-static struct pci_device_id twa_pci_tbl[] __devinitdata = {
+static struct pci_device_id twa_pci_tbl[] = {
        { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
index 13e39e1fdfe288b88e9aded1305e21240debc48e..52a2f0580d97502bfababc11ac7a30f36d8bf100 100644 (file)
@@ -1604,7 +1604,7 @@ static struct scsi_host_template driver_template = {
 };
 
 /* This function will probe and initialize a card */
-static int __devinit twl_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
+static int twl_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
 {
        struct Scsi_Host *host = NULL;
        TW_Device_Extension *tw_dev;
@@ -1893,7 +1893,7 @@ out_disable_device:
 #endif
 
 /* PCI Devices supported by this driver */
-static struct pci_device_id twl_pci_tbl[] __devinitdata = {
+static struct pci_device_id twl_pci_tbl[] = {
        { PCI_VDEVICE(3WARE, PCI_DEVICE_ID_3WARE_9750) },
        { }
 };
index 7fe96ff60c581c324a4eaecbf79d8c2e083bf7f8..62071d2fc1ce3a4e457edce2862b5d5da0bbf41f 100644 (file)
@@ -2281,7 +2281,7 @@ static struct scsi_host_template driver_template = {
 };
 
 /* This function will probe and initialize a card */
-static int __devinit tw_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
+static int tw_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
 {
        struct Scsi_Host *host = NULL;
        TW_Device_Extension *tw_dev;
@@ -2422,7 +2422,7 @@ static void tw_remove(struct pci_dev *pdev)
 } /* End tw_remove() */
 
 /* PCI Devices supported by this driver */
-static struct pci_device_id tw_pci_tbl[] __devinitdata = {
+static struct pci_device_id tw_pci_tbl[] = {
        { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_1000,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_7000,
index d4da3708763b7612ef5e7574578245c5e4534c1f..d7ca247efa35b3125fa2f3d0e67b967a600c4d15 100644 (file)
@@ -3615,7 +3615,7 @@ static void __exit BusLogic_exit(void)
 __setup("BusLogic=", BusLogic_Setup);
 
 #ifdef MODULE
-static struct pci_device_id BusLogic_pci_tbl[] __devinitdata = {
+static struct pci_device_id BusLogic_pci_tbl[] = {
        { PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC,
index 165e4dd865d9c025393a24ad8a349173952f290f..450353e04dde8b6ed03ad594b57f65705790bd48 100644 (file)
@@ -814,7 +814,7 @@ static char *lprint_opcode(int opcode, char *pos, char *buffer, int length)
  *     Locks: interrupts must be enabled when we are called 
  */
 
-static int __devinit NCR5380_init(struct Scsi_Host *instance, int flags)
+static int NCR5380_init(struct Scsi_Host *instance, int flags)
 {
        NCR5380_local_declare();
        int i, pass;
index 8647256ad66df3540e0fee4c264c202ef9bc0eca..b39a2409a50716d3a554f3570363d2f8cd895cf1 100644 (file)
@@ -114,7 +114,7 @@ MODULE_DESCRIPTION("NCR Dual700 SCSI Driver");
 MODULE_LICENSE("GPL");
 module_param(NCR_D700, charp, 0);
 
-static __u8 __devinitdata id_array[2*(MCA_MAX_SLOT_NR + 1)] =
+static __u8 id_array[2*(MCA_MAX_SLOT_NR + 1)] =
        { [0 ... 2*(MCA_MAX_SLOT_NR + 1)-1] = 7 };
 
 #ifdef MODULE
@@ -173,7 +173,7 @@ struct NCR_D700_private {
        char                    pad;
 };
 
-static int __devinit
+static int
 NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq,
                   int slot, u32 region, int differential)
 {
@@ -243,7 +243,7 @@ NCR_D700_intr(int irq, void *data)
  * essentially connectecd to the MCA bus independently, it is easier
  * to set them up as two separate host adapters, rather than one
  * adapter with two channels */
-static int __devinit
+static int
 NCR_D700_probe(struct device *dev)
 {
        struct NCR_D700_private *p;
@@ -349,7 +349,7 @@ NCR_D700_probe(struct device *dev)
        return 0;
 }
 
-static void __devexit
+static void
 NCR_D700_remove_one(struct Scsi_Host *host)
 {
        scsi_remove_host(host);
@@ -359,7 +359,7 @@ NCR_D700_remove_one(struct Scsi_Host *host)
        release_region(host->base, 64);
 }
 
-static int __devexit
+static int
 NCR_D700_remove(struct device *dev)
 {
        struct NCR_D700_private *p = dev_get_drvdata(dev);
@@ -380,7 +380,7 @@ static struct mca_driver NCR_D700_driver = {
                .name           = "NCR_D700",
                .bus            = &mca_bus_type,
                .probe          = NCR_D700_probe,
-               .remove         = __devexit_p(NCR_D700_remove),
+               .remove         = NCR_D700_remove,
        },
 };
 
index afdbb9addf18aec48ba703152ce24e258de74129..05835bf1bf9cf271bdb1190a411b1d3378f08e80 100644 (file)
@@ -351,7 +351,7 @@ static struct mca_driver NCR_Q720_driver = {
                .name           = "NCR_Q720",
                .bus            = &mca_bus_type,
                .probe          = NCR_Q720_probe,
-               .remove         = __devexit_p(NCR_Q720_remove),
+               .remove         = NCR_Q720_remove,
        },
 };
 
index a391090a17c5ba73efa23384e360deba12733354..0163457c12bba0abe5859ddc67a99a3dc55338f4 100644 (file)
@@ -1082,8 +1082,8 @@ static struct scsi_host_template inia100_template = {
        .use_clustering         = ENABLE_CLUSTERING,
 };
 
-static int __devinit inia100_probe_one(struct pci_dev *pdev,
-               const struct pci_device_id *id)
+static int inia100_probe_one(struct pci_dev *pdev,
+                            const struct pci_device_id *id)
 {
        struct Scsi_Host *shost;
        struct orc_host *host;
@@ -1197,7 +1197,7 @@ out:
        return error;
 }
 
-static void __devexit inia100_remove_one(struct pci_dev *pdev)
+static void inia100_remove_one(struct pci_dev *pdev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
        struct orc_host *host = (struct orc_host *)shost->hostdata;
@@ -1224,7 +1224,7 @@ static struct pci_driver inia100_pci_driver = {
        .name           = "inia100",
        .id_table       = inia100_pci_tbl,
        .probe          = inia100_probe_one,
-       .remove         = __devexit_p(inia100_remove_one),
+       .remove         = inia100_remove_one,
 };
 
 static int __init inia100_init(void)
index 79a30633d4aa1d9af1cf69f5ae27c2ee666e4d87..3e09aa21c1ca787141aa7f02d08a4aa50dfce7a3 100644 (file)
@@ -179,8 +179,7 @@ static struct scsi_host_template a2091_scsi_template = {
        .use_clustering         = DISABLE_CLUSTERING
 };
 
-static int __devinit a2091_probe(struct zorro_dev *z,
-                                const struct zorro_device_id *ent)
+static int a2091_probe(struct zorro_dev *z, const struct zorro_device_id *ent)
 {
        struct Scsi_Host *instance;
        int error;
@@ -239,7 +238,7 @@ fail_alloc:
        return error;
 }
 
-static void __devexit a2091_remove(struct zorro_dev *z)
+static void a2091_remove(struct zorro_dev *z)
 {
        struct Scsi_Host *instance = zorro_get_drvdata(z);
        struct a2091_hostdata *hdata = shost_priv(instance);
@@ -251,7 +250,7 @@ static void __devexit a2091_remove(struct zorro_dev *z)
        release_mem_region(z->resource.start, 256);
 }
 
-static struct zorro_device_id a2091_zorro_tbl[] __devinitdata = {
+static struct zorro_device_id a2091_zorro_tbl[] = {
        { ZORRO_PROD_CBM_A590_A2091_1 },
        { ZORRO_PROD_CBM_A590_A2091_2 },
        { 0 }
@@ -262,7 +261,7 @@ static struct zorro_driver a2091_driver = {
        .name           = "a2091",
        .id_table       = a2091_zorro_tbl,
        .probe          = a2091_probe,
-       .remove         = __devexit_p(a2091_remove),
+       .remove         = a2091_remove,
 };
 
 static int __init a2091_init(void)
index cb7f1582a6d158ebc41e1ca1e6dcb4b390d098ba..408a42ef787a32b6d8fece98c717376ce93c1270 100644 (file)
@@ -88,13 +88,7 @@ char aac_driver_version[] = AAC_DRIVER_FULL_VERSION;
  *
  * Note: The last field is used to index into aac_drivers below.
  */
-#ifdef DECLARE_PCI_DEVICE_TABLE
-static DECLARE_PCI_DEVICE_TABLE(aac_pci_tbl) = {
-#elif defined(__devinitconst)
-static const struct pci_device_id aac_pci_tbl[] __devinitconst = {
-#else
-static const struct pci_device_id aac_pci_tbl[] __devinitconst = {
-#endif
+static const struct pci_device_id aac_pci_tbl[] = {
        { 0x1028, 0x0001, 0x1028, 0x0001, 0, 0, 0 }, /* PERC 2/Si (Iguana/PERC2Si) */
        { 0x1028, 0x0002, 0x1028, 0x0002, 0, 0, 1 }, /* PERC 3/Di (Opal/PERC3Di) */
        { 0x1028, 0x0003, 0x1028, 0x0003, 0, 0, 2 }, /* PERC 3/Si (SlimFast/PERC3Si */
@@ -1107,8 +1101,7 @@ static void __aac_shutdown(struct aac_dev * aac)
                pci_disable_msi(aac->pdev);
 }
 
-static int __devinit aac_probe_one(struct pci_dev *pdev,
-               const struct pci_device_id *id)
+static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        unsigned index = id->driver_data;
        struct Scsi_Host *shost;
@@ -1310,7 +1303,7 @@ static void aac_shutdown(struct pci_dev *dev)
        __aac_shutdown((struct aac_dev *)shost->hostdata);
 }
 
-static void __devexit aac_remove_one(struct pci_dev *pdev)
+static void aac_remove_one(struct pci_dev *pdev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
        struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
@@ -1341,7 +1334,7 @@ static struct pci_driver aac_pci_driver = {
        .name           = AAC_DRIVERNAME,
        .id_table       = aac_pci_tbl,
        .probe          = aac_probe_one,
-       .remove         = __devexit_p(aac_remove_one),
+       .remove         = aac_remove_one,
        .shutdown       = aac_shutdown,
 };
 
index 374c4edf4fcbc2a62f82d30e0b38bb2313a471ab..dcfaee66a8b932eed7457e25b0932cbbad7405f5 100644 (file)
@@ -9526,7 +9526,7 @@ advansys_queuecommand_lck(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *
 
 static DEF_SCSI_QCMD(advansys_queuecommand)
 
-static ushort __devinit AscGetEisaChipCfg(PortAddr iop_base)
+static ushort AscGetEisaChipCfg(PortAddr iop_base)
 {
        PortAddr eisa_cfg_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
            (PortAddr) (ASC_EISA_CFG_IOP_MASK);
@@ -9537,8 +9537,8 @@ static ushort __devinit AscGetEisaChipCfg(PortAddr iop_base)
  * Return the BIOS address of the adapter at the specified
  * I/O port and with the specified bus type.
  */
-static unsigned short __devinit
-AscGetChipBiosAddress(PortAddr iop_base, unsigned short bus_type)
+static unsigned short AscGetChipBiosAddress(PortAddr iop_base,
+                                           unsigned short bus_type)
 {
        unsigned short cfg_lsw;
        unsigned short bios_addr;
@@ -9569,7 +9569,7 @@ AscGetChipBiosAddress(PortAddr iop_base, unsigned short bus_type)
        return bios_addr;
 }
 
-static uchar __devinit AscSetChipScsiID(PortAddr iop_base, uchar new_host_id)
+static uchar AscSetChipScsiID(PortAddr iop_base, uchar new_host_id)
 {
        ushort cfg_lsw;
 
@@ -9583,7 +9583,7 @@ static uchar __devinit AscSetChipScsiID(PortAddr iop_base, uchar new_host_id)
        return (AscGetChipScsiID(iop_base));
 }
 
-static unsigned char __devinit AscGetChipScsiCtrl(PortAddr iop_base)
+static unsigned char AscGetChipScsiCtrl(PortAddr iop_base)
 {
        unsigned char sc;
 
@@ -9593,8 +9593,8 @@ static unsigned char __devinit AscGetChipScsiCtrl(PortAddr iop_base)
        return sc;
 }
 
-static unsigned char __devinit
-AscGetChipVersion(PortAddr iop_base, unsigned short bus_type)
+static unsigned char AscGetChipVersion(PortAddr iop_base,
+                                      unsigned short bus_type)
 {
        if (bus_type & ASC_IS_EISA) {
                PortAddr eisa_iop;
@@ -9608,7 +9608,7 @@ AscGetChipVersion(PortAddr iop_base, unsigned short bus_type)
 }
 
 #ifdef CONFIG_ISA
-static void __devinit AscEnableIsaDma(uchar dma_channel)
+static void AscEnableIsaDma(uchar dma_channel)
 {
        if (dma_channel < 4) {
                outp(0x000B, (ushort)(0xC0 | dma_channel));
@@ -9638,7 +9638,7 @@ static int AscStopQueueExe(PortAddr iop_base)
        return (0);
 }
 
-static ASC_DCNT __devinit AscGetMaxDmaCount(ushort bus_type)
+static ASC_DCNT AscGetMaxDmaCount(ushort bus_type)
 {
        if (bus_type & ASC_IS_ISA)
                return ASC_MAX_ISA_DMA_COUNT;
@@ -9648,7 +9648,7 @@ static ASC_DCNT __devinit AscGetMaxDmaCount(ushort bus_type)
 }
 
 #ifdef CONFIG_ISA
-static ushort __devinit AscGetIsaDmaChannel(PortAddr iop_base)
+static ushort AscGetIsaDmaChannel(PortAddr iop_base)
 {
        ushort channel;
 
@@ -9660,7 +9660,7 @@ static ushort __devinit AscGetIsaDmaChannel(PortAddr iop_base)
        return (channel + 4);
 }
 
-static ushort __devinit AscSetIsaDmaChannel(PortAddr iop_base, ushort dma_channel)
+static ushort AscSetIsaDmaChannel(PortAddr iop_base, ushort dma_channel)
 {
        ushort cfg_lsw;
        uchar value;
@@ -9678,7 +9678,7 @@ static ushort __devinit AscSetIsaDmaChannel(PortAddr iop_base, ushort dma_channe
        return 0;
 }
 
-static uchar __devinit AscGetIsaDmaSpeed(PortAddr iop_base)
+static uchar AscGetIsaDmaSpeed(PortAddr iop_base)
 {
        uchar speed_value;
 
@@ -9689,7 +9689,7 @@ static uchar __devinit AscGetIsaDmaSpeed(PortAddr iop_base)
        return speed_value;
 }
 
-static uchar __devinit AscSetIsaDmaSpeed(PortAddr iop_base, uchar speed_value)
+static uchar AscSetIsaDmaSpeed(PortAddr iop_base, uchar speed_value)
 {
        speed_value &= 0x07;
        AscSetBank(iop_base, 1);
@@ -9699,7 +9699,7 @@ static uchar __devinit AscSetIsaDmaSpeed(PortAddr iop_base, uchar speed_value)
 }
 #endif /* CONFIG_ISA */
 
-static ushort __devinit AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc)
+static ushort AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc)
 {
        int i;
        PortAddr iop_base;
@@ -9786,7 +9786,7 @@ static ushort __devinit AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc)
        return warn_code;
 }
 
-static int __devinit AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg)
+static int AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg)
 {
        int retry;
 
@@ -9801,12 +9801,12 @@ static int __devinit AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg)
        return 0;
 }
 
-static void __devinit AscWaitEEPRead(void)
+static void AscWaitEEPRead(void)
 {
        mdelay(1);
 }
 
-static ushort __devinit AscReadEEPWord(PortAddr iop_base, uchar addr)
+static ushort AscReadEEPWord(PortAddr iop_base, uchar addr)
 {
        ushort read_wval;
        uchar cmd_reg;
@@ -9821,8 +9821,8 @@ static ushort __devinit AscReadEEPWord(PortAddr iop_base, uchar addr)
        return read_wval;
 }
 
-static ushort __devinit
-AscGetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
+static ushort AscGetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf,
+                             ushort bus_type)
 {
        ushort wval;
        ushort sum;
@@ -9868,7 +9868,7 @@ AscGetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
        return sum;
 }
 
-static int __devinit AscTestExternalLram(ASC_DVC_VAR *asc_dvc)
+static int AscTestExternalLram(ASC_DVC_VAR *asc_dvc)
 {
        PortAddr iop_base;
        ushort q_addr;
@@ -9890,12 +9890,12 @@ static int __devinit AscTestExternalLram(ASC_DVC_VAR *asc_dvc)
        return (sta);
 }
 
-static void __devinit AscWaitEEPWrite(void)
+static void AscWaitEEPWrite(void)
 {
        mdelay(20);
 }
 
-static int __devinit AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg)
+static int AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg)
 {
        ushort read_back;
        int retry;
@@ -9914,8 +9914,7 @@ static int __devinit AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg)
        }
 }
 
-static ushort __devinit
-AscWriteEEPWord(PortAddr iop_base, uchar addr, ushort word_val)
+static ushort AscWriteEEPWord(PortAddr iop_base, uchar addr, ushort word_val)
 {
        ushort read_wval;
 
@@ -9935,8 +9934,8 @@ AscWriteEEPWord(PortAddr iop_base, uchar addr, ushort word_val)
        return (read_wval);
 }
 
-static int __devinit
-AscSetEEPConfigOnce(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
+static int AscSetEEPConfigOnce(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf,
+                              ushort bus_type)
 {
        int n_error;
        ushort *wbuf;
@@ -10031,8 +10030,8 @@ AscSetEEPConfigOnce(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
        return n_error;
 }
 
-static int __devinit
-AscSetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
+static int AscSetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf,
+                          ushort bus_type)
 {
        int retry;
        int n_error;
@@ -10050,7 +10049,7 @@ AscSetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
        return n_error;
 }
 
-static ushort __devinit AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
+static ushort AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
 {
        ASCEEP_CONFIG eep_config_buf;
        ASCEEP_CONFIG *eep_config;
@@ -10215,7 +10214,7 @@ static ushort __devinit AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
        return (warn_code);
 }
 
-static int __devinit AscInitGetConfig(struct Scsi_Host *shost)
+static int AscInitGetConfig(struct Scsi_Host *shost)
 {
        struct asc_board *board = shost_priv(shost);
        ASC_DVC_VAR *asc_dvc = &board->dvc_var.asc_dvc_var;
@@ -10269,7 +10268,7 @@ static int __devinit AscInitGetConfig(struct Scsi_Host *shost)
        return asc_dvc->err_code;
 }
 
-static int __devinit AscInitSetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
+static int AscInitSetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
 {
        struct asc_board *board = shost_priv(shost);
        ASC_DVC_VAR *asc_dvc = &board->dvc_var.asc_dvc_var;
@@ -10383,7 +10382,7 @@ static int __devinit AscInitSetConfig(struct pci_dev *pdev, struct Scsi_Host *sh
  * on big-endian platforms so char fields read as words are actually being
  * unswapped on big-endian platforms.
  */
-static ADVEEP_3550_CONFIG Default_3550_EEPROM_Config __devinitdata = {
+static ADVEEP_3550_CONFIG Default_3550_EEPROM_Config = {
        ADV_EEPROM_BIOS_ENABLE, /* cfg_lsw */
        0x0000,                 /* cfg_msw */
        0xFFFF,                 /* disc_enable */
@@ -10421,7 +10420,7 @@ static ADVEEP_3550_CONFIG Default_3550_EEPROM_Config __devinitdata = {
        0                       /* num_of_err */
 };
 
-static ADVEEP_3550_CONFIG ADVEEP_3550_Config_Field_IsChar __devinitdata = {
+static ADVEEP_3550_CONFIG ADVEEP_3550_Config_Field_IsChar = {
        0,                      /* cfg_lsw */
        0,                      /* cfg_msw */
        0,                      /* -disc_enable */
@@ -10459,7 +10458,7 @@ static ADVEEP_3550_CONFIG ADVEEP_3550_Config_Field_IsChar __devinitdata = {
        0                       /* num_of_err */
 };
 
-static ADVEEP_38C0800_CONFIG Default_38C0800_EEPROM_Config __devinitdata = {
+static ADVEEP_38C0800_CONFIG Default_38C0800_EEPROM_Config = {
        ADV_EEPROM_BIOS_ENABLE, /* 00 cfg_lsw */
        0x0000,                 /* 01 cfg_msw */
        0xFFFF,                 /* 02 disc_enable */
@@ -10524,7 +10523,7 @@ static ADVEEP_38C0800_CONFIG Default_38C0800_EEPROM_Config __devinitdata = {
        0                       /* 63 reserved */
 };
 
-static ADVEEP_38C0800_CONFIG ADVEEP_38C0800_Config_Field_IsChar __devinitdata = {
+static ADVEEP_38C0800_CONFIG ADVEEP_38C0800_Config_Field_IsChar = {
        0,                      /* 00 cfg_lsw */
        0,                      /* 01 cfg_msw */
        0,                      /* 02 disc_enable */
@@ -10589,7 +10588,7 @@ static ADVEEP_38C0800_CONFIG ADVEEP_38C0800_Config_Field_IsChar __devinitdata =
        0                       /* 63 reserved */
 };
 
-static ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config __devinitdata = {
+static ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config = {
        ADV_EEPROM_BIOS_ENABLE, /* 00 cfg_lsw */
        0x0000,                 /* 01 cfg_msw */
        0xFFFF,                 /* 02 disc_enable */
@@ -10654,7 +10653,7 @@ static ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config __devinitdata = {
        0                       /* 63 reserved */
 };
 
-static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata = {
+static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar = {
        0,                      /* 00 cfg_lsw */
        0,                      /* 01 cfg_msw */
        0,                      /* 02 disc_enable */
@@ -10723,7 +10722,7 @@ static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata =
 /*
  * Wait for EEPROM command to complete
  */
-static void __devinit AdvWaitEEPCmd(AdvPortAddr iop_base)
+static void AdvWaitEEPCmd(AdvPortAddr iop_base)
 {
        int eep_delay_ms;
 
@@ -10742,7 +10741,7 @@ static void __devinit AdvWaitEEPCmd(AdvPortAddr iop_base)
 /*
  * Read the EEPROM from specified location
  */
-static ushort __devinit AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
+static ushort AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
 {
        AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
                             ASC_EEP_CMD_READ | eep_word_addr);
@@ -10753,8 +10752,8 @@ static ushort __devinit AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
 /*
  * Write the EEPROM from 'cfg_buf'.
  */
-static void __devinit
-AdvSet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
+static void AdvSet3550EEPConfig(AdvPortAddr iop_base,
+                               ADVEEP_3550_CONFIG *cfg_buf)
 {
        ushort *wbuf;
        ushort addr, chksum;
@@ -10820,8 +10819,8 @@ AdvSet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
 /*
  * Write the EEPROM from 'cfg_buf'.
  */
-static void __devinit
-AdvSet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
+static void AdvSet38C0800EEPConfig(AdvPortAddr iop_base,
+                                  ADVEEP_38C0800_CONFIG *cfg_buf)
 {
        ushort *wbuf;
        ushort *charfields;
@@ -10887,8 +10886,8 @@ AdvSet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
 /*
  * Write the EEPROM from 'cfg_buf'.
  */
-static void __devinit
-AdvSet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
+static void AdvSet38C1600EEPConfig(AdvPortAddr iop_base,
+                                  ADVEEP_38C1600_CONFIG *cfg_buf)
 {
        ushort *wbuf;
        ushort *charfields;
@@ -10956,8 +10955,8 @@ AdvSet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
  *
  * Return a checksum based on the EEPROM configuration read.
  */
-static ushort __devinit
-AdvGet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
+static ushort AdvGet3550EEPConfig(AdvPortAddr iop_base,
+                                 ADVEEP_3550_CONFIG *cfg_buf)
 {
        ushort wval, chksum;
        ushort *wbuf;
@@ -10999,8 +10998,8 @@ AdvGet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
  *
  * Return a checksum based on the EEPROM configuration read.
  */
-static ushort __devinit
-AdvGet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
+static ushort AdvGet38C0800EEPConfig(AdvPortAddr iop_base,
+                                    ADVEEP_38C0800_CONFIG *cfg_buf)
 {
        ushort wval, chksum;
        ushort *wbuf;
@@ -11042,8 +11041,8 @@ AdvGet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
  *
  * Return a checksum based on the EEPROM configuration read.
  */
-static ushort __devinit
-AdvGet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
+static ushort AdvGet38C1600EEPConfig(AdvPortAddr iop_base,
+                                    ADVEEP_38C1600_CONFIG *cfg_buf)
 {
        ushort wval, chksum;
        ushort *wbuf;
@@ -11092,7 +11091,7 @@ AdvGet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
  *
  * Note: Chip is stopped on entry.
  */
-static int __devinit AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
+static int AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
 {
        AdvPortAddr iop_base;
        ushort warn_code;
@@ -11242,7 +11241,7 @@ static int __devinit AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
  *
  * Note: Chip is stopped on entry.
  */
-static int __devinit AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
+static int AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
 {
        AdvPortAddr iop_base;
        ushort warn_code;
@@ -11441,7 +11440,7 @@ static int __devinit AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
  *
  * Note: Chip is stopped on entry.
  */
-static int __devinit AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
+static int AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
 {
        AdvPortAddr iop_base;
        ushort warn_code;
@@ -11661,8 +11660,7 @@ static int __devinit AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
  * For a non-fatal error return a warning code. If there are no warnings
  * then 0 is returned.
  */
-static int __devinit
-AdvInitGetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
+static int AdvInitGetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
 {
        struct asc_board *board = shost_priv(shost);
        ADV_DVC_VAR *asc_dvc = &board->dvc_var.adv_dvc_var;
@@ -11769,7 +11767,7 @@ static struct scsi_host_template advansys_template = {
        .use_clustering = ENABLE_CLUSTERING,
 };
 
-static int __devinit advansys_wide_init_chip(struct Scsi_Host *shost)
+static int advansys_wide_init_chip(struct Scsi_Host *shost)
 {
        struct asc_board *board = shost_priv(shost);
        struct adv_dvc_var *adv_dvc = &board->dvc_var.adv_dvc_var;
@@ -11882,8 +11880,8 @@ static void advansys_wide_free_mem(struct asc_board *board)
        }
 }
 
-static int __devinit advansys_board_found(struct Scsi_Host *shost,
-                                         unsigned int iop, int bus_type)
+static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
+                               int bus_type)
 {
        struct pci_dev *pdev;
        struct asc_board *boardp = shost_priv(shost);
@@ -12428,7 +12426,7 @@ static PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] = {
  * 10: 12
  * 11: 15
  */
-static unsigned int __devinit advansys_isa_irq_no(PortAddr iop_base)
+static unsigned int advansys_isa_irq_no(PortAddr iop_base)
 {
        unsigned short cfg_lsw = AscGetChipCfgLsw(iop_base);
        unsigned int chip_irq = ((cfg_lsw >> 2) & 0x03) + 10;
@@ -12437,7 +12435,7 @@ static unsigned int __devinit advansys_isa_irq_no(PortAddr iop_base)
        return chip_irq;
 }
 
-static int __devinit advansys_isa_probe(struct device *dev, unsigned int id)
+static int advansys_isa_probe(struct device *dev, unsigned int id)
 {
        int err = -ENODEV;
        PortAddr iop_base = _asc_def_iop_base[id];
@@ -12477,7 +12475,7 @@ static int __devinit advansys_isa_probe(struct device *dev, unsigned int id)
        return err;
 }
 
-static int __devexit advansys_isa_remove(struct device *dev, unsigned int id)
+static int advansys_isa_remove(struct device *dev, unsigned int id)
 {
        int ioport = _asc_def_iop_base[id];
        advansys_release(dev_get_drvdata(dev));
@@ -12487,7 +12485,7 @@ static int __devexit advansys_isa_remove(struct device *dev, unsigned int id)
 
 static struct isa_driver advansys_isa_driver = {
        .probe          = advansys_isa_probe,
-       .remove         = __devexit_p(advansys_isa_remove),
+       .remove         = advansys_isa_remove,
        .driver = {
                .owner  = THIS_MODULE,
                .name   = DRV_NAME,
@@ -12505,7 +12503,7 @@ static struct isa_driver advansys_isa_driver = {
  * 110: 15
  * 111: invalid
  */
-static unsigned int __devinit advansys_vlb_irq_no(PortAddr iop_base)
+static unsigned int advansys_vlb_irq_no(PortAddr iop_base)
 {
        unsigned short cfg_lsw = AscGetChipCfgLsw(iop_base);
        unsigned int chip_irq = ((cfg_lsw >> 2) & 0x07) + 9;
@@ -12514,7 +12512,7 @@ static unsigned int __devinit advansys_vlb_irq_no(PortAddr iop_base)
        return chip_irq;
 }
 
-static int __devinit advansys_vlb_probe(struct device *dev, unsigned int id)
+static int advansys_vlb_probe(struct device *dev, unsigned int id)
 {
        int err = -ENODEV;
        PortAddr iop_base = _asc_def_iop_base[id];
@@ -12561,14 +12559,14 @@ static int __devinit advansys_vlb_probe(struct device *dev, unsigned int id)
 
 static struct isa_driver advansys_vlb_driver = {
        .probe          = advansys_vlb_probe,
-       .remove         = __devexit_p(advansys_isa_remove),
+       .remove         = advansys_isa_remove,
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "advansys_vlb",
        },
 };
 
-static struct eisa_device_id advansys_eisa_table[] __devinitdata = {
+static struct eisa_device_id advansys_eisa_table[] = {
        { "ABP7401" },
        { "ABP7501" },
        { "" }
@@ -12595,7 +12593,7 @@ struct eisa_scsi_data {
  * 110: invalid
  * 111: invalid
  */
-static unsigned int __devinit advansys_eisa_irq_no(struct eisa_device *edev)
+static unsigned int advansys_eisa_irq_no(struct eisa_device *edev)
 {
        unsigned short cfg_lsw = inw(edev->base_addr + 0xc86);
        unsigned int chip_irq = ((cfg_lsw >> 8) & 0x07) + 10;
@@ -12604,7 +12602,7 @@ static unsigned int __devinit advansys_eisa_irq_no(struct eisa_device *edev)
        return chip_irq;
 }
 
-static int __devinit advansys_eisa_probe(struct device *dev)
+static int advansys_eisa_probe(struct device *dev)
 {
        int i, ioport, irq = 0;
        int err;
@@ -12677,7 +12675,7 @@ static int __devinit advansys_eisa_probe(struct device *dev)
        return err;
 }
 
-static __devexit int advansys_eisa_remove(struct device *dev)
+static int advansys_eisa_remove(struct device *dev)
 {
        int i;
        struct eisa_scsi_data *data = dev_get_drvdata(dev);
@@ -12701,12 +12699,12 @@ static struct eisa_driver advansys_eisa_driver = {
        .driver = {
                .name =         DRV_NAME,
                .probe =        advansys_eisa_probe,
-               .remove =       __devexit_p(advansys_eisa_remove),
+               .remove =       advansys_eisa_remove,
        }
 };
 
 /* PCI Devices supported by this driver */
-static struct pci_device_id advansys_pci_tbl[] __devinitdata = {
+static struct pci_device_id advansys_pci_tbl[] = {
        {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_1200A,
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940,
@@ -12724,7 +12722,7 @@ static struct pci_device_id advansys_pci_tbl[] __devinitdata = {
 
 MODULE_DEVICE_TABLE(pci, advansys_pci_tbl);
 
-static void __devinit advansys_set_latency(struct pci_dev *pdev)
+static void advansys_set_latency(struct pci_dev *pdev)
 {
        if ((pdev->device == PCI_DEVICE_ID_ASP_1200A) ||
            (pdev->device == PCI_DEVICE_ID_ASP_ABP940)) {
@@ -12737,8 +12735,8 @@ static void __devinit advansys_set_latency(struct pci_dev *pdev)
        }
 }
 
-static int __devinit
-advansys_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int advansys_pci_probe(struct pci_dev *pdev,
+                             const struct pci_device_id *ent)
 {
        int err, ioport;
        struct Scsi_Host *shost;
@@ -12791,7 +12789,7 @@ advansys_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        return err;
 }
 
-static void __devexit advansys_pci_remove(struct pci_dev *pdev)
+static void advansys_pci_remove(struct pci_dev *pdev)
 {
        advansys_release(pci_get_drvdata(pdev));
        pci_release_regions(pdev);
@@ -12802,7 +12800,7 @@ static struct pci_driver advansys_pci_driver = {
        .name =         DRV_NAME,
        .id_table =     advansys_pci_tbl,
        .probe =        advansys_pci_probe,
-       .remove =       __devexit_p(advansys_pci_remove),
+       .remove =       advansys_pci_remove,
 };
 
 static int __init advansys_init(void)
index dd4547bf688122b4775428ee5c01539b936f9259..a284be17699f32ce37e7315adbc56d512d75b19e 100644 (file)
@@ -420,7 +420,7 @@ MODULE_PARM_DESC(aha152x1, "parameters for second controller");
 #endif /* MODULE */
 
 #ifdef __ISAPNP__
-static struct isapnp_device_id id_table[] __devinitdata = {
+static struct isapnp_device_id id_table[] = {
        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1502), 0 },
        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1505), 0 },
        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1510), 0 },
index a3e6ed353917f9018f2613db4095101199eb6fae..df775e6ba5796c6cc8be7ed53a50fd4f269e73ac 100644 (file)
@@ -646,7 +646,7 @@ static int aha1740_probe (struct device *dev)
        return -ENODEV;
 }
 
-static __devexit int aha1740_remove (struct device *dev)
+static int aha1740_remove (struct device *dev)
 {
        struct Scsi_Host *shpnt = dev_get_drvdata(dev);
        struct aha1740_hostdata *host = HOSTDATA (shpnt);
@@ -677,7 +677,7 @@ static struct eisa_driver aha1740_driver = {
        .driver   = {
                .name    = "aha1740",
                .probe   = aha1740_probe,
-               .remove  = __devexit_p (aha1740_remove),
+               .remove  = aha1740_remove,
        },
 };
 
index 1c4120c3db41f622fc4277c6d7e549c71a3a18b5..c56741fc4b994ad38138261b63444d28f22c3fc8 100644 (file)
@@ -85,7 +85,7 @@ static struct scsi_host_template aic94xx_sht = {
        .ioctl                  = sas_ioctl,
 };
 
-static int __devinit asd_map_memio(struct asd_ha_struct *asd_ha)
+static int asd_map_memio(struct asd_ha_struct *asd_ha)
 {
        int err, i;
        struct asd_ha_addrspace *io_handle;
@@ -146,7 +146,7 @@ static void asd_unmap_memio(struct asd_ha_struct *asd_ha)
        pci_release_region(asd_ha->pcidev, 0);
 }
 
-static int __devinit asd_map_ioport(struct asd_ha_struct *asd_ha)
+static int asd_map_ioport(struct asd_ha_struct *asd_ha)
 {
        int i = PCI_IOBAR_OFFSET, err;
        struct asd_ha_addrspace *io_handle = &asd_ha->io_handle[0];
@@ -175,7 +175,7 @@ static void asd_unmap_ioport(struct asd_ha_struct *asd_ha)
        pci_release_region(asd_ha->pcidev, PCI_IOBAR_OFFSET);
 }
 
-static int __devinit asd_map_ha(struct asd_ha_struct *asd_ha)
+static int asd_map_ha(struct asd_ha_struct *asd_ha)
 {
        int err;
        u16 cmd_reg;
@@ -221,7 +221,7 @@ static const char *asd_dev_rev[30] = {
        [8] = "B0",
 };
 
-static int __devinit asd_common_setup(struct asd_ha_struct *asd_ha)
+static int asd_common_setup(struct asd_ha_struct *asd_ha)
 {
        int err, i;
 
@@ -257,7 +257,7 @@ Err:
        return err;
 }
 
-static int __devinit asd_aic9410_setup(struct asd_ha_struct *asd_ha)
+static int asd_aic9410_setup(struct asd_ha_struct *asd_ha)
 {
        int err = asd_common_setup(asd_ha);
 
@@ -272,7 +272,7 @@ static int __devinit asd_aic9410_setup(struct asd_ha_struct *asd_ha)
        return 0;
 }
 
-static int __devinit asd_aic9405_setup(struct asd_ha_struct *asd_ha)
+static int asd_aic9405_setup(struct asd_ha_struct *asd_ha)
 {
        int err = asd_common_setup(asd_ha);
 
@@ -531,7 +531,7 @@ static void asd_remove_dev_attrs(struct asd_ha_struct *asd_ha)
 static const struct asd_pcidev_struct {
        const char * name;
        int (*setup)(struct asd_ha_struct *asd_ha);
-} asd_pcidev_data[] __devinitconst = {
+} asd_pcidev_data[] = {
        /* Id 0 is used for dynamic ids. */
        { .name  = "Adaptec AIC-94xx SAS/SATA Host Adapter",
          .setup = asd_aic9410_setup
@@ -731,8 +731,7 @@ static int asd_unregister_sas_ha(struct asd_ha_struct *asd_ha)
        return err;
 }
 
-static int __devinit asd_pci_probe(struct pci_dev *dev,
-                                  const struct pci_device_id *id)
+static int asd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        const struct asd_pcidev_struct *asd_dev;
        unsigned asd_id = (unsigned) id->driver_data;
@@ -924,7 +923,7 @@ static void asd_turn_off_leds(struct asd_ha_struct *asd_ha)
        }
 }
 
-static void __devexit asd_pci_remove(struct pci_dev *dev)
+static void asd_pci_remove(struct pci_dev *dev)
 {
        struct asd_ha_struct *asd_ha = pci_get_drvdata(dev);
 
@@ -1012,7 +1011,7 @@ static struct sas_domain_function_template aic94xx_transport_functions = {
        .lldd_ata_set_dmamode   = asd_set_dmamode,
 };
 
-static const struct pci_device_id aic94xx_pci_table[] __devinitconst = {
+static const struct pci_device_id aic94xx_pci_table[] = {
        {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x410),0, 0, 1},
        {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x412),0, 0, 1},
        {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x416),0, 0, 1},
@@ -1031,7 +1030,7 @@ static struct pci_driver aic94xx_pci_driver = {
        .name           = ASD_DRIVER_NAME,
        .id_table       = aic94xx_pci_table,
        .probe          = asd_pci_probe,
-       .remove         = __devexit_p(asd_pci_remove),
+       .remove         = asd_pci_remove,
 };
 
 static int __init aic94xx_init(void)
index b330438ac662631bdc720426fdb7cad5a539cd4c..3e1172adb37b0a9d012c6afba811bcbb033fb80b 100644 (file)
@@ -2965,8 +2965,7 @@ static struct scsi_host_template acornscsi_template = {
        .proc_name              = "acornscsi",
 };
 
-static int __devinit
-acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
 {
        struct Scsi_Host *host;
        AS_Host *ashost;
@@ -3032,7 +3031,7 @@ acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit acornscsi_remove(struct expansion_card *ec)
+static void acornscsi_remove(struct expansion_card *ec)
 {
        struct Scsi_Host *host = ecard_get_drvdata(ec);
        AS_Host *ashost = (AS_Host *)host->hostdata;
@@ -3063,7 +3062,7 @@ static const struct ecard_id acornscsi_cids[] = {
 
 static struct ecard_driver acornscsi_driver = {
        .probe          = acornscsi_probe,
-       .remove         = __devexit_p(acornscsi_remove),
+       .remove         = acornscsi_remove,
        .id_table       = acornscsi_cids,
        .drv = {
                .name           = "acornscsi",
index 2a28b4ad1975b8f66bb846f41f5928bfdaf880d3..9274510294acaf74c72e9980d2147863000c7303 100644 (file)
@@ -276,8 +276,7 @@ static struct scsi_host_template arxescsi_template = {
        .proc_name                      = "arxescsi",
 };
 
-static int __devinit
-arxescsi_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int arxescsi_probe(struct expansion_card *ec, const struct ecard_id *id)
 {
        struct Scsi_Host *host;
        struct arxescsi_info *info;
@@ -340,7 +339,7 @@ arxescsi_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit arxescsi_remove(struct expansion_card *ec)
+static void arxescsi_remove(struct expansion_card *ec)
 {
        struct Scsi_Host *host = ecard_get_drvdata(ec);
 
@@ -359,7 +358,7 @@ static const struct ecard_id arxescsi_cids[] = {
 
 static struct ecard_driver arxescsi_driver = {
        .probe          = arxescsi_probe,
-       .remove         = __devexit_p(arxescsi_remove),
+       .remove         = arxescsi_remove,
        .id_table       = arxescsi_cids,
        .drv = {
                .name           = "arxescsi",
index c3b99c93637aaa1ec958fe0dde1c2b9998226ccb..c93938b246d59c29ec2414b05c1749b216b5b128 100644 (file)
@@ -225,8 +225,8 @@ static struct scsi_host_template cumanascsi_template = {
        .proc_name              = "CumanaSCSI-1",
 };
 
-static int __devinit
-cumanascsi1_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int cumanascsi1_probe(struct expansion_card *ec,
+                            const struct ecard_id *id)
 {
        struct Scsi_Host *host;
        int ret;
@@ -298,7 +298,7 @@ cumanascsi1_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit cumanascsi1_remove(struct expansion_card *ec)
+static void cumanascsi1_remove(struct expansion_card *ec)
 {
        struct Scsi_Host *host = ecard_get_drvdata(ec);
 
@@ -320,7 +320,7 @@ static const struct ecard_id cumanascsi1_cids[] = {
 
 static struct ecard_driver cumanascsi1_driver = {
        .probe          = cumanascsi1_probe,
-       .remove         = __devexit_p(cumanascsi1_remove),
+       .remove         = cumanascsi1_remove,
        .id_table       = cumanascsi1_cids,
        .drv = {
                .name           = "cumanascsi1",
index 547987b86384e9fa693e43c0e5b27f23f52ae8b1..e3bae93c3c22c3a82efa0d337b3eea9a7a650b60 100644 (file)
@@ -397,8 +397,8 @@ static struct scsi_host_template cumanascsi2_template = {
        .proc_name                      = "cumanascsi2",
 };
 
-static int __devinit
-cumanascsi2_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int cumanascsi2_probe(struct expansion_card *ec,
+                            const struct ecard_id *id)
 {
        struct Scsi_Host *host;
        struct cumanascsi2_info *info;
@@ -495,7 +495,7 @@ cumanascsi2_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit cumanascsi2_remove(struct expansion_card *ec)
+static void cumanascsi2_remove(struct expansion_card *ec)
 {
        struct Scsi_Host *host = ecard_get_drvdata(ec);
        struct cumanascsi2_info *info = (struct cumanascsi2_info *)host->hostdata;
@@ -519,7 +519,7 @@ static const struct ecard_id cumanascsi2_cids[] = {
 
 static struct ecard_driver cumanascsi2_driver = {
        .probe          = cumanascsi2_probe,
-       .remove         = __devexit_p(cumanascsi2_remove),
+       .remove         = cumanascsi2_remove,
        .id_table       = cumanascsi2_cids,
        .drv = {
                .name           = "cumanascsi2",
index 968d08358d20684a0d23253ba008ecadf5e0a3b6..8e36908415ec3eecaf6743890e9656303376357c 100644 (file)
@@ -515,8 +515,7 @@ static struct scsi_host_template eesox_template = {
        .proc_name                      = "eesox",
 };
 
-static int __devinit
-eesoxscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int eesoxscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
 {
        struct Scsi_Host *host;
        struct eesoxscsi_info *info;
@@ -617,7 +616,7 @@ eesoxscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit eesoxscsi_remove(struct expansion_card *ec)
+static void eesoxscsi_remove(struct expansion_card *ec)
 {
        struct Scsi_Host *host = ecard_get_drvdata(ec);
        struct eesoxscsi_info *info = (struct eesoxscsi_info *)host->hostdata;
@@ -643,7 +642,7 @@ static const struct ecard_id eesoxscsi_cids[] = {
 
 static struct ecard_driver eesoxscsi_driver = {
        .probe          = eesoxscsi_probe,
-       .remove         = __devexit_p(eesoxscsi_remove),
+       .remove         = eesoxscsi_remove,
        .id_table       = eesoxscsi_cids,
        .drv = {
                .name           = "eesoxscsi",
index fc6a5aabf66eadf9a90d2e6c11e2cc45018d6f8a..48facdc18002d6e7a2e9eb27e30bfa79807d5eec 100644 (file)
@@ -129,8 +129,7 @@ static struct scsi_host_template oakscsi_template = {
        .proc_name              = "oakscsi",
 };
 
-static int __devinit
-oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
 {
        struct Scsi_Host *host;
        int ret = -ENOMEM;
@@ -182,7 +181,7 @@ oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit oakscsi_remove(struct expansion_card *ec)
+static void oakscsi_remove(struct expansion_card *ec)
 {
        struct Scsi_Host *host = ecard_get_drvdata(ec);
 
@@ -202,7 +201,7 @@ static const struct ecard_id oakscsi_cids[] = {
 
 static struct ecard_driver oakscsi_driver = {
        .probe          = oakscsi_probe,
-       .remove         = __devexit_p(oakscsi_remove),
+       .remove         = oakscsi_remove,
        .id_table       = oakscsi_cids,
        .drv = {
                .name           = "oakscsi",
index 9274c0677b9c1d38c8334a6a69c7dc66c2dd581b..246600b935550a450cf7c6d24ce91962ac61af8e 100644 (file)
@@ -309,8 +309,8 @@ static struct scsi_host_template powertecscsi_template = {
        .proc_name                      = "powertec",
 };
 
-static int __devinit
-powertecscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
+static int powertecscsi_probe(struct expansion_card *ec,
+                             const struct ecard_id *id)
 {
        struct Scsi_Host *host;
        struct powertec_info *info;
@@ -409,7 +409,7 @@ powertecscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
        return ret;
 }
 
-static void __devexit powertecscsi_remove(struct expansion_card *ec)
+static void powertecscsi_remove(struct expansion_card *ec)
 {
        struct Scsi_Host *host = ecard_get_drvdata(ec);
        struct powertec_info *info = (struct powertec_info *)host->hostdata;
@@ -435,7 +435,7 @@ static const struct ecard_id powertecscsi_cids[] = {
 
 static struct ecard_driver powertecscsi_driver = {
        .probe          = powertecscsi_probe,
-       .remove         = __devexit_p(powertecscsi_remove),
+       .remove         = powertecscsi_remove,
        .id_table       = powertecscsi_cids,
        .drv = {
                .name           = "powertecscsi",
index a540162ac59c1483bfd71c43a2384df4a1525529..cfc73041f102968198a2a858bbaf5478caf5b43e 100644 (file)
@@ -3210,7 +3210,7 @@ static struct pci_driver atp870u_driver = {
        .id_table       = atp870u_id_table,
        .name           = "atp870u",
        .probe          = atp870u_probe,
-       .remove         = __devexit_p(atp870u_remove),
+       .remove         = atp870u_remove,
 };
 
 static int __init atp870u_init(void)
index 48d37dded8f16fbd64290aa599b187d54b9baef3..4e2733d2300365761e7dba5df79e3a1b606c67e2 100644 (file)
@@ -4790,8 +4790,8 @@ beiscsi_hw_health_check(struct work_struct *work)
                              msecs_to_jiffies(1000));
 }
 
-static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev,
-                               const struct pci_device_id *id)
+static int beiscsi_dev_probe(struct pci_dev *pcidev,
+                            const struct pci_device_id *id)
 {
        struct beiscsi_hba *phba = NULL;
        struct hwi_controller *phwi_ctrlr;
index 895b0e516e07cfb6d724ae39bdb6fe2992583b79..e6bf12675db8d363f2f94a9483c2a3770e165ad9 100644 (file)
@@ -1739,7 +1739,7 @@ static struct pci_driver bfad_pci_driver = {
        .name = BFAD_DRIVER_NAME,
        .id_table = bfad_id_table,
        .probe = bfad_pci_probe,
-       .remove = __devexit_p(bfad_pci_remove),
+       .remove = bfad_pci_remove,
        .err_handler = &bfad_err_handler,
 };
 
index e0558656c6462ed30b3ef1b67816b128f4a4f584..70ecd953a5793e2990d4f9e32715e2ada15d22cb 100644 (file)
@@ -25,7 +25,7 @@ DEFINE_PER_CPU(struct bnx2fc_percpu_s, bnx2fc_percpu);
 #define DRV_MODULE_RELDATE     "Jun 04, 2012"
 
 
-static char version[] __devinitdata =
+static char version[] =
                "Broadcom NetXtreme II FCoE Driver " DRV_MODULE_NAME \
                " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 
index ee009e4ad097949785c677b9b343f3eeb8abbc7a..50fef6963a811baa61b1fbec94e250a4e7457179 100644 (file)
@@ -21,7 +21,7 @@ static u32 adapter_count;
 #define DRV_MODULE_VERSION     "2.7.2.2"
 #define DRV_MODULE_RELDATE     "Apr 25, 2012"
 
-static char version[] __devinitdata =
+static char version[] =
                "Broadcom NetXtreme II iSCSI Driver " DRV_MODULE_NAME \
                " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 
index d40ea2f5be106374a71d037b17eb7c91263b5e88..1e3f96adf9da9f6ab752211a5e54d7e0b0a2c1e8 100644 (file)
@@ -34,7 +34,7 @@ static struct scsi_host_template bvme6000_scsi_driver_template = {
 
 static struct platform_device *bvme6000_scsi_device;
 
-static __devinit int
+static int
 bvme6000_probe(struct platform_device *dev)
 {
        struct Scsi_Host *host;
@@ -88,7 +88,7 @@ bvme6000_probe(struct platform_device *dev)
        return -ENODEV;
 }
 
-static __devexit int
+static int
 bvme6000_device_remove(struct platform_device *dev)
 {
        struct Scsi_Host *host = platform_get_drvdata(dev);
@@ -108,7 +108,7 @@ static struct platform_driver bvme6000_scsi_driver = {
                .owner          = THIS_MODULE,
        },
        .probe          = bvme6000_probe,
-       .remove         = __devexit_p(bvme6000_device_remove),
+       .remove         = bvme6000_device_remove,
 };
 
 static int __init bvme6000_scsi_init(void)
index fdd408ff80ad9fb0681100b27c297a2fc143b24d..b42cbbd3d92dc3887ee809818825ed3a562262a0 100644 (file)
@@ -115,9 +115,8 @@ static const struct file_operations csio_mem_debugfs_fops = {
        .llseek  = default_llseek,
 };
 
-static void __devinit
-csio_add_debugfs_mem(struct csio_hw *hw, const char *name,
-                    unsigned int idx, unsigned int size_mb)
+static void csio_add_debugfs_mem(struct csio_hw *hw, const char *name,
+                                unsigned int idx, unsigned int size_mb)
 {
        struct dentry *de;
 
@@ -127,8 +126,7 @@ csio_add_debugfs_mem(struct csio_hw *hw, const char *name,
                de->d_inode->i_size = size_mb << 20;
 }
 
-static int __devinit
-csio_setup_debugfs(struct csio_hw *hw)
+static int csio_setup_debugfs(struct csio_hw *hw)
 {
        int i;
 
@@ -531,8 +529,7 @@ csio_resource_free(struct csio_hw *hw)
  * Allocates HW structure, DMA, memory resources, maps BARS to
  * host memory and initializes HW module.
  */
-static struct csio_hw * __devinit
-csio_hw_alloc(struct pci_dev *pdev)
+static struct csio_hw *csio_hw_alloc(struct pci_dev *pdev)
 {
        struct csio_hw *hw;
 
@@ -956,8 +953,7 @@ csio_lnode_init_post(struct csio_lnode *ln)
  * - Once hardware is ready, initiated scan of the host via
  *   scsi_scan_host.
  */
-static int __devinit
-csio_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
+static int csio_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int rv;
        int bars;
@@ -1036,8 +1032,7 @@ err:
  *
  * Used during hotplug operation.
  */
-static void __devexit
-csio_remove_one(struct pci_dev *pdev)
+static void csio_remove_one(struct pci_dev *pdev)
 {
        struct csio_hw *hw = pci_get_drvdata(pdev);
        int bars = pci_select_bars(pdev, IORESOURCE_MEM);
index 13aeca3d51f24919ddf10406e941fd04b25c00bc..865c64fa923c1483804b48469bb962689742b84c 100644 (file)
@@ -489,7 +489,7 @@ struct ParameterData {
        int def;                /* default value */
        int safe;               /* safe value */
 };
-static struct ParameterData __devinitdata cfg_data[] = {
+static struct ParameterData cfg_data[] = {
        { /* adapter id */
                CFG_PARAM_UNSET,
                0,
@@ -574,7 +574,7 @@ MODULE_PARM_DESC(reset_delay, "Reset delay in seconds. Default 1 (0-180)");
  * set_safe_settings - if the use_safe_settings option is set then
  * set all values to the safe and slow values.
  **/
-static void __devinit set_safe_settings(void)
+static void set_safe_settings(void)
 {
        if (use_safe_settings)
        {
@@ -593,7 +593,7 @@ static void __devinit set_safe_settings(void)
  * fix_settings - reset any boot parameters which are out of range
  * back to the default values.
  **/
-static void __devinit fix_settings(void)
+static void fix_settings(void)
 {
        int i;
 
@@ -620,7 +620,7 @@ static void __devinit fix_settings(void)
  * Mapping from the eeprom delay index value (index into this array)
  * to the number of actual seconds that the delay should be for.
  */
-static char __devinitdata eeprom_index_to_delay_map[] = 
+static char eeprom_index_to_delay_map[] =
        { 1, 3, 5, 10, 16, 30, 60, 120 };
 
 
@@ -630,7 +630,7 @@ static char __devinitdata eeprom_index_to_delay_map[] =
  *
  * @eeprom: The eeprom structure in which we find the delay index to map.
  **/
-static void __devinit eeprom_index_to_delay(struct NvRamType *eeprom)
+static void eeprom_index_to_delay(struct NvRamType *eeprom)
 {
        eeprom->delay_time = eeprom_index_to_delay_map[eeprom->delay_time];
 }
@@ -643,7 +643,7 @@ static void __devinit eeprom_index_to_delay(struct NvRamType *eeprom)
  *
  * @delay: The delay, in seconds, to find the eeprom index for.
  **/
-static int __devinit delay_to_eeprom_index(int delay)
+static int delay_to_eeprom_index(int delay)
 {
        u8 idx = 0;
        while (idx < 7 && eeprom_index_to_delay_map[idx] < delay)
@@ -659,7 +659,7 @@ static int __devinit delay_to_eeprom_index(int delay)
  *
  * @eeprom: The eeprom data to override with command line options.
  **/
-static void __devinit eeprom_override(struct NvRamType *eeprom)
+static void eeprom_override(struct NvRamType *eeprom)
 {
        u8 id;
 
@@ -3938,7 +3938,7 @@ static void dc395x_slave_destroy(struct scsi_device *scsi_device)
  *
  * @io_port: base I/O address
  **/
-static void __devinit trms1040_wait_30us(unsigned long io_port)
+static void trms1040_wait_30us(unsigned long io_port)
 {
        /* ScsiPortStallExecution(30); wait 30 us */
        outb(5, io_port + TRM_S1040_GEN_TIMER);
@@ -3955,7 +3955,7 @@ static void __devinit trms1040_wait_30us(unsigned long io_port)
  * @cmd:       SB + op code (command) to send
  * @addr:      address to send
  **/
-static void __devinit trms1040_write_cmd(unsigned long io_port, u8 cmd, u8 addr)
+static void trms1040_write_cmd(unsigned long io_port, u8 cmd, u8 addr)
 {
        int i;
        u8 send_data;
@@ -4000,7 +4000,7 @@ static void __devinit trms1040_write_cmd(unsigned long io_port, u8 cmd, u8 addr)
  * @addr:      offset into EEPROM
  * @byte:      bytes to write
  **/
-static void __devinit trms1040_set_data(unsigned long io_port, u8 addr, u8 byte)
+static void trms1040_set_data(unsigned long io_port, u8 addr, u8 byte)
 {
        int i;
        u8 send_data;
@@ -4054,7 +4054,7 @@ static void __devinit trms1040_set_data(unsigned long io_port, u8 addr, u8 byte)
  * @eeprom:    the data to write
  * @io_port:   the base io port
  **/
-static void __devinit trms1040_write_all(struct NvRamType *eeprom, unsigned long io_port)
+static void trms1040_write_all(struct NvRamType *eeprom, unsigned long io_port)
 {
        u8 *b_eeprom = (u8 *)eeprom;
        u8 addr;
@@ -4094,7 +4094,7 @@ static void __devinit trms1040_write_all(struct NvRamType *eeprom, unsigned long
  *
  * Returns the byte read.
  **/
-static u8 __devinit trms1040_get_data(unsigned long io_port, u8 addr)
+static u8 trms1040_get_data(unsigned long io_port, u8 addr)
 {
        int i;
        u8 read_byte;
@@ -4132,7 +4132,7 @@ static u8 __devinit trms1040_get_data(unsigned long io_port, u8 addr)
  * @eeprom:    where to store the data
  * @io_port:   the base io port
  **/
-static void __devinit trms1040_read_all(struct NvRamType *eeprom, unsigned long io_port)
+static void trms1040_read_all(struct NvRamType *eeprom, unsigned long io_port)
 {
        u8 *b_eeprom = (u8 *)eeprom;
        u8 addr;
@@ -4162,7 +4162,7 @@ static void __devinit trms1040_read_all(struct NvRamType *eeprom, unsigned long
  * @eeprom:    caller allocated strcuture to read the eeprom data into
  * @io_port:   io port to read from
  **/
-static void __devinit check_eeprom(struct NvRamType *eeprom, unsigned long io_port)
+static void check_eeprom(struct NvRamType *eeprom, unsigned long io_port)
 {
        u16 *w_eeprom = (u16 *)eeprom;
        u16 w_addr;
@@ -4232,7 +4232,7 @@ static void __devinit check_eeprom(struct NvRamType *eeprom, unsigned long io_po
  *
  * @eeprom: The eeprom data strucutre to show details for.
  **/
-static void __devinit print_eeprom_settings(struct NvRamType *eeprom)
+static void print_eeprom_settings(struct NvRamType *eeprom)
 {
        dprintkl(KERN_INFO, "Used settings: AdapterID=%02i, Speed=%i(%02i.%01iMHz), dev_mode=0x%02x\n",
                eeprom->scsi_id,
@@ -4260,7 +4260,7 @@ static void adapter_sg_tables_free(struct AdapterCtlBlk *acb)
 /*
  * Allocate SG tables; as we have to pci_map them, an SG list (struct SGentry*)
  * should never cross a page boundary */
-static int __devinit adapter_sg_tables_alloc(struct AdapterCtlBlk *acb)
+static int adapter_sg_tables_alloc(struct AdapterCtlBlk *acb)
 {
        const unsigned mem_needed = (DC395x_MAX_SRB_CNT+1)
                                    *SEGMENTX_LEN;
@@ -4306,7 +4306,7 @@ static int __devinit adapter_sg_tables_alloc(struct AdapterCtlBlk *acb)
  *
  * @acb: The adapter to print the information for.
  **/
-static void __devinit adapter_print_config(struct AdapterCtlBlk *acb)
+static void adapter_print_config(struct AdapterCtlBlk *acb)
 {
        u8 bval;
 
@@ -4350,7 +4350,7 @@ static void __devinit adapter_print_config(struct AdapterCtlBlk *acb)
  *
  * @acb: The adapter to initialize.
  **/
-static void __devinit adapter_init_params(struct AdapterCtlBlk *acb)
+static void adapter_init_params(struct AdapterCtlBlk *acb)
 {
        struct NvRamType *eeprom = &acb->eeprom;
        int i;
@@ -4412,7 +4412,7 @@ static void __devinit adapter_init_params(struct AdapterCtlBlk *acb)
  *
  * @host: The scsi host instance to fill in the values for.
  **/
-static void __devinit adapter_init_scsi_host(struct Scsi_Host *host)
+static void adapter_init_scsi_host(struct Scsi_Host *host)
 {
         struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata;
        struct NvRamType *eeprom = &acb->eeprom;
@@ -4453,7 +4453,7 @@ static void __devinit adapter_init_scsi_host(struct Scsi_Host *host)
  *
  * @acb: The adapter which we are to init.
  **/
-static void __devinit adapter_init_chip(struct AdapterCtlBlk *acb)
+static void adapter_init_chip(struct AdapterCtlBlk *acb)
 {
         struct NvRamType *eeprom = &acb->eeprom;
         
@@ -4506,8 +4506,8 @@ static void __devinit adapter_init_chip(struct AdapterCtlBlk *acb)
  * Returns 0 if the initialization succeeds, any other value on
  * failure.
  **/
-static int __devinit adapter_init(struct AdapterCtlBlk *acb,
-       unsigned long io_port, u32 io_port_len, unsigned int irq)
+static int adapter_init(struct AdapterCtlBlk *acb, unsigned long io_port,
+                       u32 io_port_len, unsigned int irq)
 {
        if (!request_region(io_port, io_port_len, DC395X_NAME)) {
                dprintkl(KERN_ERR, "Failed to reserve IO region 0x%lx\n", io_port);
@@ -4794,8 +4794,7 @@ static void banner_display(void)
  *
  * Returns 0 on success, or an error code (-ve) on failure.
  **/
-static int __devinit dc395x_init_one(struct pci_dev *dev,
-               const struct pci_device_id *id)
+static int dc395x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct Scsi_Host *scsi_host = NULL;
        struct AdapterCtlBlk *acb = NULL;
@@ -4861,7 +4860,7 @@ fail:
  *
  * @dev: The PCI device to initialize.
  **/
-static void __devexit dc395x_remove_one(struct pci_dev *dev)
+static void dc395x_remove_one(struct pci_dev *dev)
 {
        struct Scsi_Host *scsi_host = pci_get_drvdata(dev);
        struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata);
@@ -4892,7 +4891,7 @@ static struct pci_driver dc395x_driver = {
        .name           = DC395X_NAME,
        .id_table       = dc395x_pci_table,
        .probe          = dc395x_init_one,
-       .remove         = __devexit_p(dc395x_remove_one),
+       .remove         = dc395x_remove_one,
 };
 
 
index 207352cc70ccbb43c1a9945653554faf5de187d4..4b0dd8c567077e53583a0d59b85a2aa8db7e93b7 100644 (file)
@@ -68,8 +68,8 @@ static struct scsi_host_template dmx3191d_driver_template = {
        .use_clustering         = DISABLE_CLUSTERING,
 };
 
-static int __devinit dmx3191d_probe_one(struct pci_dev *pdev,
-               const struct pci_device_id *id)
+static int dmx3191d_probe_one(struct pci_dev *pdev,
+                             const struct pci_device_id *id)
 {
        struct Scsi_Host *shost;
        unsigned long io;
@@ -123,7 +123,7 @@ static int __devinit dmx3191d_probe_one(struct pci_dev *pdev,
        return error;
 }
 
-static void __devexit dmx3191d_remove_one(struct pci_dev *pdev)
+static void dmx3191d_remove_one(struct pci_dev *pdev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
 
@@ -150,7 +150,7 @@ static struct pci_driver dmx3191d_pci_driver = {
        .name           = DMX3191D_DRIVER_NAME,
        .id_table       = dmx3191d_pci_tbl,
        .probe          = dmx3191d_probe_one,
-       .remove         = __devexit_p(dmx3191d_remove_one),
+       .remove         = dmx3191d_remove_one,
 };
 
 static int __init dmx3191d_init(void)
index 1a2a1e5824e3a5f117adba1661a4c9cbd2ce32f6..fff682976c56202de49122628de392b35cfa737d 100644 (file)
@@ -1771,7 +1771,7 @@ struct scsi_host_template fdomain_driver_template = {
 #ifndef PCMCIA
 #ifdef CONFIG_PCI
 
-static struct pci_device_id fdomain_pci_tbl[] __devinitdata = {
+static struct pci_device_id fdomain_pci_tbl[] = {
        { PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { }
index fc98eb61e760daaa35d5a98ce92cdefa3f1b80b9..fbf3ac6e0c55e65516d2fbbecc9630164b89c4a4 100644 (file)
@@ -399,8 +399,7 @@ static u8 *fnic_get_mac(struct fc_lport *lport)
        return fnic->data_src_addr;
 }
 
-static int __devinit fnic_probe(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct Scsi_Host *host;
        struct fc_lport *lp;
@@ -774,7 +773,7 @@ err_out:
        return err;
 }
 
-static void __devexit fnic_remove(struct pci_dev *pdev)
+static void fnic_remove(struct pci_dev *pdev)
 {
        struct fnic *fnic = pci_get_drvdata(pdev);
        struct fc_lport *lp = fnic->lport;
@@ -849,7 +848,7 @@ static struct pci_driver fnic_driver = {
        .name = DRV_NAME,
        .id_table = fnic_id_table,
        .probe = fnic_probe,
-       .remove = __devexit_p(fnic_remove),
+       .remove = fnic_remove,
 };
 
 static int __init fnic_init_module(void)
index 1a5954f0915acc3739e18115dea344a6f2b080ca..5041f925c19140eb901a48cfcb1ff7ed448c9146 100644 (file)
@@ -939,7 +939,7 @@ module_param(dtc_3181e, int, 0);
 MODULE_LICENSE("GPL");
 
 #ifndef SCSI_G_NCR5380_MEM
-static struct isapnp_device_id id_table[] __devinitdata = {
+static struct isapnp_device_id id_table[] = {
        {
         ISAPNP_ANY_ID, ISAPNP_ANY_ID,
         ISAPNP_VENDOR('D', 'T', 'C'), ISAPNP_FUNCTION(0x436e),
index 5d72274c507ff7d271b607289dcced6e0f6c3138..599790e41a989046592a5ce50fc5bb3a2cc80804 100644 (file)
@@ -590,7 +590,7 @@ static struct pci_driver gdth_pci_driver = {
        .remove         = gdth_pci_remove_one,
 };
 
-static void __devexit gdth_pci_remove_one(struct pci_dev *pdev)
+static void gdth_pci_remove_one(struct pci_dev *pdev)
 {
        gdth_ha_str *ha = pci_get_drvdata(pdev);
 
@@ -602,8 +602,8 @@ static void __devexit gdth_pci_remove_one(struct pci_dev *pdev)
        pci_disable_device(pdev);
 }
 
-static int __devinit gdth_pci_init_one(struct pci_dev *pdev,
-                                      const struct pci_device_id *ent)
+static int gdth_pci_init_one(struct pci_dev *pdev,
+                            const struct pci_device_id *ent)
 {
        u16 vendor = pdev->vendor;
        u16 device = pdev->device;
@@ -855,8 +855,8 @@ static int __init gdth_init_isa(u32 bios_adr,gdth_ha_str *ha)
 #endif /* CONFIG_ISA */
 
 #ifdef CONFIG_PCI
-static int __devinit gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr,
-                                  gdth_ha_str *ha)
+static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr,
+                        gdth_ha_str *ha)
 {
     register gdt6_dpram_str __iomem *dp6_ptr;
     register gdt6c_dpram_str __iomem *dp6c_ptr;
@@ -1239,7 +1239,7 @@ static int __devinit gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr,
 
 /* controller protocol functions */
 
-static void __devinit gdth_enable_int(gdth_ha_str *ha)
+static void gdth_enable_int(gdth_ha_str *ha)
 {
     unsigned long flags;
     gdt2_dpram_str __iomem *dp2_ptr;
@@ -1555,7 +1555,7 @@ static int gdth_internal_cmd(gdth_ha_str *ha, u8 service, u16 opcode,
 
 /* search for devices */
 
-static int __devinit gdth_search_drives(gdth_ha_str *ha)
+static int gdth_search_drives(gdth_ha_str *ha)
 {
     u16 cdev_cnt, i;
     int ok;
@@ -4959,8 +4959,7 @@ static int __init gdth_eisa_probe_one(u16 eisa_slot)
 #endif /* CONFIG_EISA */
 
 #ifdef CONFIG_PCI
-static int __devinit gdth_pci_probe_one(gdth_pci_str *pcistr,
-                            gdth_ha_str **ha_out)
+static int gdth_pci_probe_one(gdth_pci_str *pcistr, gdth_ha_str **ha_out)
 {
        struct Scsi_Host *shp;
        gdth_ha_str *ha;
index 488fbc648656409be4bfb77167171d53b5e1839f..dbe4cc6b9f8b75be0823653fb05dd8e15e279cc9 100644 (file)
@@ -204,7 +204,7 @@ static struct scsi_host_template gvp11_scsi_template = {
        .use_clustering         = DISABLE_CLUSTERING
 };
 
-static int __devinit check_wd33c93(struct gvp11_scsiregs *regs)
+static int check_wd33c93(struct gvp11_scsiregs *regs)
 {
 #ifdef CHECK_WD33C93
        volatile unsigned char *sasr_3393, *scmd_3393;
@@ -284,8 +284,7 @@ static int __devinit check_wd33c93(struct gvp11_scsiregs *regs)
        return 0;
 }
 
-static int __devinit gvp11_probe(struct zorro_dev *z,
-                                const struct zorro_device_id *ent)
+static int gvp11_probe(struct zorro_dev *z, const struct zorro_device_id *ent)
 {
        struct Scsi_Host *instance;
        unsigned long address;
@@ -380,7 +379,7 @@ fail_check_or_alloc:
        return error;
 }
 
-static void __devexit gvp11_remove(struct zorro_dev *z)
+static void gvp11_remove(struct zorro_dev *z)
 {
        struct Scsi_Host *instance = zorro_get_drvdata(z);
        struct gvp11_hostdata *hdata = shost_priv(instance);
@@ -398,7 +397,7 @@ static void __devexit gvp11_remove(struct zorro_dev *z)
         * SERIES I though).
         */
 
-static struct zorro_device_id gvp11_zorro_tbl[] __devinitdata = {
+static struct zorro_device_id gvp11_zorro_tbl[] = {
        { ZORRO_PROD_GVP_COMBO_030_R3_SCSI,     ~0x00ffffff },
        { ZORRO_PROD_GVP_SERIES_II,             ~0x00ffffff },
        { ZORRO_PROD_GVP_GFORCE_030_SCSI,       ~0x01ffffff },
@@ -414,7 +413,7 @@ static struct zorro_driver gvp11_driver = {
        .name           = "gvp11",
        .id_table       = gvp11_zorro_tbl,
        .probe          = gvp11_probe,
-       .remove         = __devexit_p(gvp11_remove),
+       .remove         = gvp11_remove,
 };
 
 static int __init gvp11_init(void)
index 4217e49aea4624b5e0b2c9354a25b627fe10b915..4f338061b5c3305f3863ef0360aab649da737f8a 100644 (file)
@@ -189,16 +189,16 @@ static void check_ioctl_unit_attention(struct ctlr_info *h,
 /* performant mode helper functions */
 static void calc_bucket_map(int *bucket, int num_buckets,
        int nsgs, int *bucket_map);
-static __devinit void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h);
+static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h);
 static inline u32 next_command(struct ctlr_info *h, u8 q);
-static int __devinit hpsa_find_cfg_addrs(struct pci_dev *pdev,
-       void __iomem *vaddr, u32 *cfg_base_addr, u64 *cfg_base_addr_index,
-       u64 *cfg_offset);
-static int __devinit hpsa_pci_find_memory_BAR(struct pci_dev *pdev,
-       unsigned long *memory_bar);
-static int __devinit hpsa_lookup_board_id(struct pci_dev *pdev, u32 *board_id);
-static int __devinit hpsa_wait_for_board_state(struct pci_dev *pdev,
-       void __iomem *vaddr, int wait_for_ready);
+static int hpsa_find_cfg_addrs(struct pci_dev *pdev, void __iomem *vaddr,
+                              u32 *cfg_base_addr, u64 *cfg_base_addr_index,
+                              u64 *cfg_offset);
+static int hpsa_pci_find_memory_BAR(struct pci_dev *pdev,
+                                   unsigned long *memory_bar);
+static int hpsa_lookup_board_id(struct pci_dev *pdev, u32 *board_id);
+static int hpsa_wait_for_board_state(struct pci_dev *pdev, void __iomem *vaddr,
+                                    int wait_for_ready);
 static inline void finish_cmd(struct CommandList *c);
 #define BOARD_NOT_READY 0
 #define BOARD_READY 1
@@ -3182,8 +3182,8 @@ static int hpsa_ioctl(struct scsi_device *dev, int cmd, void *arg)
        }
 }
 
-static int __devinit hpsa_send_host_reset(struct ctlr_info *h,
-       unsigned char *scsi3addr, u8 reset_type)
+static int hpsa_send_host_reset(struct ctlr_info *h, unsigned char *scsi3addr,
+                               u8 reset_type)
 {
        struct CommandList *c;
 
@@ -3606,8 +3606,8 @@ static irqreturn_t do_hpsa_intr_msi(int irq, void *queue)
  * in simple mode, not performant mode due to the tag lookup.
  * We only ever use this immediately after a controller reset.
  */
-static __devinit int hpsa_message(struct pci_dev *pdev, unsigned char opcode,
-                                               unsigned char type)
+static int hpsa_message(struct pci_dev *pdev, unsigned char opcode,
+                       unsigned char type)
 {
        struct Command {
                struct CommandListHeader CommandHeader;
@@ -3756,14 +3756,13 @@ static int hpsa_controller_hard_reset(struct pci_dev *pdev,
        return 0;
 }
 
-static __devinit void init_driver_version(char *driver_version, int len)
+static void init_driver_version(char *driver_version, int len)
 {
        memset(driver_version, 0, len);
        strncpy(driver_version, HPSA " " HPSA_DRIVER_VERSION, len - 1);
 }
 
-static __devinit int write_driver_ver_to_cfgtable(
-       struct CfgTable __iomem *cfgtable)
+static int write_driver_ver_to_cfgtable(struct CfgTable __iomem *cfgtable)
 {
        char *driver_version;
        int i, size = sizeof(cfgtable->driver_version);
@@ -3779,8 +3778,8 @@ static __devinit int write_driver_ver_to_cfgtable(
        return 0;
 }
 
-static __devinit void read_driver_ver_from_cfgtable(
-       struct CfgTable __iomem *cfgtable, unsigned char *driver_ver)
+static void read_driver_ver_from_cfgtable(struct CfgTable __iomem *cfgtable,
+                                         unsigned char *driver_ver)
 {
        int i;
 
@@ -3788,8 +3787,7 @@ static __devinit void read_driver_ver_from_cfgtable(
                driver_ver[i] = readb(&cfgtable->driver_version[i]);
 }
 
-static __devinit int controller_reset_failed(
-       struct CfgTable __iomem *cfgtable)
+static int controller_reset_failed(struct CfgTable __iomem *cfgtable)
 {
 
        char *driver_ver, *old_driver_ver;
@@ -3812,7 +3810,7 @@ static __devinit int controller_reset_failed(
 /* This does a hard reset of the controller using PCI power management
  * states or the using the doorbell register.
  */
-static __devinit int hpsa_kdump_hard_reset_controller(struct pci_dev *pdev)
+static int hpsa_kdump_hard_reset_controller(struct pci_dev *pdev)
 {
        u64 cfg_offset;
        u32 cfg_base_addr;
@@ -4029,7 +4027,7 @@ static int find_PCI_BAR_index(struct pci_dev *pdev, unsigned long pci_bar_addr)
  * controllers that are capable. If not, we use IO-APIC mode.
  */
 
-static void __devinit hpsa_interrupt_mode(struct ctlr_info *h)
+static void hpsa_interrupt_mode(struct ctlr_info *h)
 {
 #ifdef CONFIG_PCI_MSI
        int err, i;
@@ -4077,7 +4075,7 @@ default_int_mode:
        h->intr[h->intr_mode] = h->pdev->irq;
 }
 
-static int __devinit hpsa_lookup_board_id(struct pci_dev *pdev, u32 *board_id)
+static int hpsa_lookup_board_id(struct pci_dev *pdev, u32 *board_id)
 {
        int i;
        u32 subsystem_vendor_id, subsystem_device_id;
@@ -4101,8 +4099,8 @@ static int __devinit hpsa_lookup_board_id(struct pci_dev *pdev, u32 *board_id)
        return ARRAY_SIZE(products) - 1; /* generic unknown smart array */
 }
 
-static int __devinit hpsa_pci_find_memory_BAR(struct pci_dev *pdev,
-       unsigned long *memory_bar)
+static int hpsa_pci_find_memory_BAR(struct pci_dev *pdev,
+                                   unsigned long *memory_bar)
 {
        int i;
 
@@ -4118,8 +4116,8 @@ static int __devinit hpsa_pci_find_memory_BAR(struct pci_dev *pdev,
        return -ENODEV;
 }
 
-static int __devinit hpsa_wait_for_board_state(struct pci_dev *pdev,
-       void __iomem *vaddr, int wait_for_ready)
+static int hpsa_wait_for_board_state(struct pci_dev *pdev, void __iomem *vaddr,
+                                    int wait_for_ready)
 {
        int i, iterations;
        u32 scratchpad;
@@ -4143,9 +4141,9 @@ static int __devinit hpsa_wait_for_board_state(struct pci_dev *pdev,
        return -ENODEV;
 }
 
-static int __devinit hpsa_find_cfg_addrs(struct pci_dev *pdev,
-       void __iomem *vaddr, u32 *cfg_base_addr, u64 *cfg_base_addr_index,
-       u64 *cfg_offset)
+static int hpsa_find_cfg_addrs(struct pci_dev *pdev, void __iomem *vaddr,
+                              u32 *cfg_base_addr, u64 *cfg_base_addr_index,
+                              u64 *cfg_offset)
 {
        *cfg_base_addr = readl(vaddr + SA5_CTCFG_OFFSET);
        *cfg_offset = readl(vaddr + SA5_CTMEM_OFFSET);
@@ -4158,7 +4156,7 @@ static int __devinit hpsa_find_cfg_addrs(struct pci_dev *pdev,
        return 0;
 }
 
-static int __devinit hpsa_find_cfgtables(struct ctlr_info *h)
+static int hpsa_find_cfgtables(struct ctlr_info *h)
 {
        u64 cfg_offset;
        u32 cfg_base_addr;
@@ -4187,7 +4185,7 @@ static int __devinit hpsa_find_cfgtables(struct ctlr_info *h)
        return 0;
 }
 
-static void __devinit hpsa_get_max_perf_mode_cmds(struct ctlr_info *h)
+static void hpsa_get_max_perf_mode_cmds(struct ctlr_info *h)
 {
        h->max_commands = readl(&(h->cfgtable->MaxPerformantModeCommands));
 
@@ -4208,7 +4206,7 @@ static void __devinit hpsa_get_max_perf_mode_cmds(struct ctlr_info *h)
  * max commands, max SG elements without chaining, and with chaining,
  * SG chain block size, etc.
  */
-static void __devinit hpsa_find_board_params(struct ctlr_info *h)
+static void hpsa_find_board_params(struct ctlr_info *h)
 {
        hpsa_get_max_perf_mode_cmds(h);
        h->nr_cmds = h->max_commands - 4; /* Allow room for some ioctls */
@@ -4266,7 +4264,7 @@ static inline void hpsa_p600_dma_prefetch_quirk(struct ctlr_info *h)
        writel(dma_prefetch, h->vaddr + I2O_DMA1_CFG);
 }
 
-static void __devinit hpsa_wait_for_mode_change_ack(struct ctlr_info *h)
+static void hpsa_wait_for_mode_change_ack(struct ctlr_info *h)
 {
        int i;
        u32 doorbell_value;
@@ -4287,7 +4285,7 @@ static void __devinit hpsa_wait_for_mode_change_ack(struct ctlr_info *h)
        }
 }
 
-static int __devinit hpsa_enter_simple_mode(struct ctlr_info *h)
+static int hpsa_enter_simple_mode(struct ctlr_info *h)
 {
        u32 trans_support;
 
@@ -4310,7 +4308,7 @@ static int __devinit hpsa_enter_simple_mode(struct ctlr_info *h)
        return 0;
 }
 
-static int __devinit hpsa_pci_init(struct ctlr_info *h)
+static int hpsa_pci_init(struct ctlr_info *h)
 {
        int prod_index, err;
 
@@ -4378,7 +4376,7 @@ err_out_free_res:
        return err;
 }
 
-static void __devinit hpsa_hba_inquiry(struct ctlr_info *h)
+static void hpsa_hba_inquiry(struct ctlr_info *h)
 {
        int rc;
 
@@ -4394,7 +4392,7 @@ static void __devinit hpsa_hba_inquiry(struct ctlr_info *h)
        }
 }
 
-static __devinit int hpsa_init_reset_devices(struct pci_dev *pdev)
+static int hpsa_init_reset_devices(struct pci_dev *pdev)
 {
        int rc, i;
 
@@ -4426,7 +4424,7 @@ static __devinit int hpsa_init_reset_devices(struct pci_dev *pdev)
        return 0;
 }
 
-static __devinit int hpsa_allocate_cmd_pool(struct ctlr_info *h)
+static int hpsa_allocate_cmd_pool(struct ctlr_info *h)
 {
        h->cmd_pool_bits = kzalloc(
                DIV_ROUND_UP(h->nr_cmds, BITS_PER_LONG) *
@@ -4499,7 +4497,7 @@ static int hpsa_request_irq(struct ctlr_info *h,
        return 0;
 }
 
-static int __devinit hpsa_kdump_soft_reset(struct ctlr_info *h)
+static int hpsa_kdump_soft_reset(struct ctlr_info *h)
 {
        if (hpsa_send_host_reset(h, RAID_CTLR_LUNID,
                HPSA_RESET_TYPE_CONTROLLER)) {
@@ -4713,8 +4711,7 @@ static void stop_controller_lockup_detector(struct ctlr_info *h)
        spin_unlock_irqrestore(&lockup_detector_lock, flags);
 }
 
-static int __devinit hpsa_init_one(struct pci_dev *pdev,
-                                   const struct pci_device_id *ent)
+static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int dac, rc;
        struct ctlr_info *h;
@@ -4910,7 +4907,7 @@ static void hpsa_shutdown(struct pci_dev *pdev)
        hpsa_free_irqs_and_disable_msix(h);
 }
 
-static void __devexit hpsa_free_device_info(struct ctlr_info *h)
+static void hpsa_free_device_info(struct ctlr_info *h)
 {
        int i;
 
@@ -4918,7 +4915,7 @@ static void __devexit hpsa_free_device_info(struct ctlr_info *h)
                kfree(h->dev[i]);
 }
 
-static void __devexit hpsa_remove_one(struct pci_dev *pdev)
+static void hpsa_remove_one(struct pci_dev *pdev)
 {
        struct ctlr_info *h;
 
@@ -4966,7 +4963,7 @@ static int hpsa_resume(__attribute__((unused)) struct pci_dev *pdev)
 static struct pci_driver hpsa_pci_driver = {
        .name = HPSA,
        .probe = hpsa_init_one,
-       .remove = __devexit_p(hpsa_remove_one),
+       .remove = hpsa_remove_one,
        .id_table = hpsa_pci_device_id, /* id_table */
        .shutdown = hpsa_shutdown,
        .suspend = hpsa_suspend,
@@ -5010,8 +5007,7 @@ static void  calc_bucket_map(int bucket[], int num_buckets,
        }
 }
 
-static __devinit void hpsa_enter_performant_mode(struct ctlr_info *h,
-       u32 use_short_tags)
+static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 use_short_tags)
 {
        int i;
        unsigned long register_value;
@@ -5079,7 +5075,7 @@ static __devinit void hpsa_enter_performant_mode(struct ctlr_info *h,
        h->transMethod = CFGTBL_Trans_Performant;
 }
 
-static __devinit void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h)
+static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h)
 {
        u32 trans_support;
        int i;
index 138e573f37ef5b08ceadafbe90ec39701507704e..ee196b363d81c16cb2c85702bab0bb929d43d1b0 100644 (file)
@@ -1282,8 +1282,7 @@ static int hptiop_internal_memfree_mvfrey(struct hptiop_hba *hba)
                return -1;
 }
 
-static int __devinit hptiop_probe(struct pci_dev *pcidev,
-                                       const struct pci_device_id *id)
+static int hptiop_probe(struct pci_dev *pcidev, const struct pci_device_id *id)
 {
        struct Scsi_Host *host = NULL;
        struct hptiop_hba *hba;
index 5e8d51bd03de92222874321ec874559b9a91ec83..cc82d0f322b6cb30fd3fdaf1fd5e49665302dece 100644 (file)
@@ -4905,7 +4905,7 @@ static unsigned long ibmvfc_get_desired_dma(struct vio_dev *vdev)
        return pool_dma + ((512 * 1024) * driver_template.cmd_per_lun);
 }
 
-static struct vio_device_id ibmvfc_device_table[] __devinitdata = {
+static struct vio_device_id ibmvfc_device_table[] = {
        {"fcp", "IBM,vfc-client"},
        { "", "" }
 };
index ef9a54c7da6730b2f7ff9fc07a6037f12fb02a96..a044f593e8b98437e208cc1b785ca58371483890 100644 (file)
@@ -2362,7 +2362,7 @@ static int ibmvscsi_resume(struct device *dev)
  * ibmvscsi_device_table: Used by vio.c to match devices in the device tree we 
  * support.
  */
-static struct vio_device_id ibmvscsi_device_table[] __devinitdata = {
+static struct vio_device_id ibmvscsi_device_table[] = {
        {"vscsi", "IBM,v-scsi"},
        { "", "" }
 };
index aa7ed81e92371140738bbe4f8d32559662e9b3d7..bf9eca84516658b5a6ad00527e665e4b2457672d 100644 (file)
@@ -907,7 +907,7 @@ static int ibmvstgt_remove(struct vio_dev *dev)
        return 0;
 }
 
-static struct vio_device_id ibmvstgt_device_table[] __devinitdata = {
+static struct vio_device_id ibmvstgt_device_table[] = {
        {"v-scsi-host", "IBM,v-scsi-host"},
        {"",""}
 };
index dd741bcd6ccd78e1190fad6dd688b826756b0cdf..280d5af113d1deb851791ca2f9d254b6d45b149c 100644 (file)
@@ -2992,7 +2992,7 @@ static struct pci_driver initio_pci_driver = {
        .name           = "initio",
        .id_table       = initio_pci_tbl,
        .probe          = initio_probe_one,
-       .remove         = __devexit_p(initio_remove_one),
+       .remove         = initio_remove_one,
 };
 
 static int __init initio_init_driver(void)
index fe6029f4df164406e406fb8ca6b2c698461fd48a..1d7da3f41ebb62db01cb74d4f2478b3d595fdbef 100644 (file)
@@ -8296,7 +8296,7 @@ static pci_ers_result_t ipr_pci_error_detected(struct pci_dev *pdev,
  * Return value:
  *     0 on success / -EIO on failure
  **/
-static int __devinit ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg)
+static int ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg)
 {
        int rc = 0;
        unsigned long host_lock_flags = 0;
@@ -8425,7 +8425,7 @@ static void ipr_free_all_resources(struct ipr_ioa_cfg *ioa_cfg)
  * Return value:
  *     0 on success / -ENOMEM on allocation failure
  **/
-static int __devinit ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
+static int ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
 {
        struct ipr_cmnd *ipr_cmd;
        struct ipr_ioarcb *ioarcb;
@@ -8497,7 +8497,7 @@ static int __devinit ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
  * Return value:
  *     0 on success / non-zero for error
  **/
-static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg)
+static int ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg)
 {
        struct pci_dev *pdev = ioa_cfg->pdev;
        int i, rc = -ENOMEM;
@@ -8601,7 +8601,7 @@ out_free_res_entries:
  * Return value:
  *     none
  **/
-static void __devinit ipr_initialize_bus_attr(struct ipr_ioa_cfg *ioa_cfg)
+static void ipr_initialize_bus_attr(struct ipr_ioa_cfg *ioa_cfg)
 {
        int i;
 
@@ -8625,8 +8625,8 @@ static void __devinit ipr_initialize_bus_attr(struct ipr_ioa_cfg *ioa_cfg)
  * Return value:
  *     none
  **/
-static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg,
-                                      struct Scsi_Host *host, struct pci_dev *pdev)
+static void ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg,
+                            struct Scsi_Host *host, struct pci_dev *pdev)
 {
        const struct ipr_interrupt_offsets *p;
        struct ipr_interrupts *t;
@@ -8712,7 +8712,7 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg,
  * Return value:
  *     ptr to chip information on success / NULL on failure
  **/
-static const struct ipr_chip_t * __devinit
+static const struct ipr_chip_t *
 ipr_get_chip_info(const struct pci_device_id *dev_id)
 {
        int i;
@@ -8734,7 +8734,7 @@ ipr_get_chip_info(const struct pci_device_id *dev_id)
  * Return value:
  *     0 on success / non-zero on failure
  **/
-static irqreturn_t __devinit ipr_test_intr(int irq, void *devp)
+static irqreturn_t ipr_test_intr(int irq, void *devp)
 {
        struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)devp;
        unsigned long lock_flags = 0;
@@ -8761,8 +8761,7 @@ static irqreturn_t __devinit ipr_test_intr(int irq, void *devp)
  * Return value:
  *     0 on success / non-zero on failure
  **/
-static int __devinit ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg,
-                                 struct pci_dev *pdev)
+static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
 {
        int rc;
        volatile u32 int_reg;
@@ -8815,8 +8814,8 @@ static int __devinit ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg,
  * Return value:
  *     0 on success / non-zero on failure
  **/
-static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
-                                  const struct pci_device_id *dev_id)
+static int ipr_probe_ioa(struct pci_dev *pdev,
+                        const struct pci_device_id *dev_id)
 {
        struct ipr_ioa_cfg *ioa_cfg;
        struct Scsi_Host *host;
@@ -9113,7 +9112,7 @@ static void __ipr_remove(struct pci_dev *pdev)
  * Return value:
  *     none
  **/
-static void __devexit ipr_remove(struct pci_dev *pdev)
+static void ipr_remove(struct pci_dev *pdev)
 {
        struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
 
@@ -9136,8 +9135,7 @@ static void __devexit ipr_remove(struct pci_dev *pdev)
  * Return value:
  *     0 on success / non-zero on failure
  **/
-static int __devinit ipr_probe(struct pci_dev *pdev,
-                              const struct pci_device_id *dev_id)
+static int ipr_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
 {
        struct ipr_ioa_cfg *ioa_cfg;
        int rc;
@@ -9218,7 +9216,7 @@ static void ipr_shutdown(struct pci_dev *pdev)
        wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
 }
 
-static struct pci_device_id ipr_pci_table[] __devinitdata = {
+static struct pci_device_id ipr_pci_table[] = {
        { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
                PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_5702, 0, 0, 0 },
        { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
@@ -9305,7 +9303,7 @@ static struct pci_driver ipr_driver = {
        .name = IPR_NAME,
        .id_table = ipr_pci_table,
        .probe = ipr_probe,
-       .remove = __devexit_p(ipr_remove),
+       .remove = ipr_remove,
        .shutdown = ipr_shutdown,
        .err_handler = &ipr_err_handler,
 };
index b6d7a5c2fc9497b0dcbcfa78d73d75bd173a44e5..9aa86a315a088c9a450e8ff061196349e5c13f34 100644 (file)
@@ -389,14 +389,14 @@ MODULE_DEVICE_TABLE( pci, ips_pci_table );
 
 static char ips_hot_plug_name[] = "ips";
 
-static int __devinit  ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent);
-static void __devexit ips_remove_device(struct pci_dev *pci_dev);
+static int  ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent);
+static void ips_remove_device(struct pci_dev *pci_dev);
 
 static struct pci_driver ips_pci_driver = {
        .name           = ips_hot_plug_name,
        .id_table       = ips_pci_table,
        .probe          = ips_insert_device,
-       .remove         = __devexit_p(ips_remove_device),
+       .remove         = ips_remove_device,
 };
 
 
@@ -6837,7 +6837,7 @@ err_out_sh:
 /*   Routine Description:                                                    */
 /*     Remove one Adapter ( Hot Plugging )                                   */
 /*---------------------------------------------------------------------------*/
-static void __devexit
+static void
 ips_remove_device(struct pci_dev *pci_dev)
 {
        struct Scsi_Host *sh = pci_get_drvdata(pci_dev);
@@ -6898,7 +6898,7 @@ module_exit(ips_module_exit);
 /*   Return Value:                                                           */
 /*     0 if Successful, else non-zero                                        */
 /*---------------------------------------------------------------------------*/
-static int __devinit
+static int
 ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent)
 {
        int index = -1;
index b74050b95d6af93ad5720baa39790b852a7f1413..d73fdcfeb45a19e1695dc188b045e29c72e57557 100644 (file)
@@ -282,7 +282,7 @@ static void isci_unregister(struct isci_host *isci_host)
        scsi_host_put(shost);
 }
 
-static int __devinit isci_pci_init(struct pci_dev *pdev)
+static int isci_pci_init(struct pci_dev *pdev)
 {
        int err, bar_num, bar_mask = 0;
        void __iomem * const *iomap;
@@ -616,7 +616,7 @@ static struct isci_host *isci_host_alloc(struct pci_dev *pdev, int id)
        return NULL;
 }
 
-static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+static int isci_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct isci_pci_info *pci_info;
        int err, i;
@@ -709,7 +709,7 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
        return err;
 }
 
-static void __devexit isci_pci_remove(struct pci_dev *pdev)
+static void isci_pci_remove(struct pci_dev *pdev)
 {
        struct isci_host *ihost;
        int i;
@@ -778,7 +778,7 @@ static struct pci_driver isci_pci_driver = {
        .name           = DRV_NAME,
        .id_table       = isci_id_table,
        .probe          = isci_pci_probe,
-       .remove         = __devexit_p(isci_pci_remove),
+       .remove         = isci_pci_remove,
 #ifdef CONFIG_PM
        .driver.pm      = &isci_pm_ops,
 #endif
index 27cfb0cb186cd7fdd79029ef724c7e6c8beed79a..69efbf12b299ac351d61bf8a324fa51a6ca69e09 100644 (file)
@@ -129,7 +129,7 @@ static const struct esp_driver_ops jazz_esp_ops = {
        .dma_error      =       jazz_esp_dma_error,
 };
 
-static int __devinit esp_jazz_probe(struct platform_device *dev)
+static int esp_jazz_probe(struct platform_device *dev)
 {
        struct scsi_host_template *tpnt = &scsi_esp_template;
        struct Scsi_Host *host;
@@ -201,7 +201,7 @@ fail:
        return err;
 }
 
-static int __devexit esp_jazz_remove(struct platform_device *dev)
+static int esp_jazz_remove(struct platform_device *dev)
 {
        struct esp *esp = dev_get_drvdata(&dev->dev);
        unsigned int irq = esp->host->irq;
@@ -223,7 +223,7 @@ MODULE_ALIAS("platform:jazz_esp");
 
 static struct platform_driver esp_jazz_driver = {
        .probe          = esp_jazz_probe,
-       .remove         = __devexit_p(esp_jazz_remove),
+       .remove         = esp_jazz_remove,
        .driver = {
                .name   = "jazz_esp",
                .owner  = THIS_MODULE,
index 23880f8fe7e4fccb985997d782fce852b916ed54..5c4ded997265d4833f63039c17edf93ba6ecbd12 100644 (file)
@@ -168,7 +168,7 @@ static struct parisc_driver lasi700_driver = {
        .name =         "lasi_scsi",
        .id_table =     lasi700_ids,
        .probe =        lasi700_probe,
-       .remove =       __devexit_p(lasi700_driver_remove),
+       .remove =       lasi700_driver_remove,
 };
 
 static int __init
index c20eec78adc16e6b75f1df76536b5cbacb3c777b..89ad55807012007654e5fb4888ef36ac838016fa 100644 (file)
@@ -8813,7 +8813,7 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
  *     0 - driver can claim the device
  *     negative value - driver can not claim the device
  **/
-static int __devinit
+static int
 lpfc_pci_probe_one_s3(struct pci_dev *pdev, const struct pci_device_id *pid)
 {
        struct lpfc_hba   *phba;
@@ -8980,7 +8980,7 @@ out_free_phba:
  * removed from PCI bus, it performs all the necessary cleanup for the HBA
  * device to be removed from the PCI subsystem properly.
  **/
-static void __devexit
+static void
 lpfc_pci_remove_one_s3(struct pci_dev *pdev)
 {
        struct Scsi_Host  *shost = pci_get_drvdata(pdev);
@@ -9587,7 +9587,7 @@ lpfc_sli4_request_firmware_update(struct lpfc_hba *phba, uint8_t fw_upgrade)
  *     0 - driver can claim the device
  *     negative value - driver can not claim the device
  **/
-static int __devinit
+static int
 lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid)
 {
        struct lpfc_hba   *phba;
@@ -9779,7 +9779,7 @@ out_free_phba:
  * removed from PCI bus, it performs all the necessary cleanup for the HBA
  * device to be removed from the PCI subsystem properly.
  **/
-static void __devexit
+static void
 lpfc_pci_remove_one_s4(struct pci_dev *pdev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
@@ -10205,7 +10205,7 @@ lpfc_io_resume_s4(struct pci_dev *pdev)
  *     0 - driver can claim the device
  *     negative value - driver can not claim the device
  **/
-static int __devinit
+static int
 lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
 {
        int rc;
@@ -10233,7 +10233,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
  * remove routine, which will perform all the necessary cleanup for the
  * device to be removed from the PCI subsystem properly.
  **/
-static void __devexit
+static void
 lpfc_pci_remove_one(struct pci_dev *pdev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
@@ -10575,7 +10575,7 @@ static struct pci_driver lpfc_driver = {
        .name           = LPFC_DRIVER_NAME,
        .id_table       = lpfc_id_table,
        .probe          = lpfc_pci_probe_one,
-       .remove         = __devexit_p(lpfc_pci_remove_one),
+       .remove         = lpfc_pci_remove_one,
        .suspend        = lpfc_pci_suspend_one,
        .resume         = lpfc_pci_resume_one,
        .err_handler    = &lpfc_err_handler,
index 70eb1f79b1ba2f9fd08568e190bfb9126ece962c..994fc5caf036c89434f1231425696ec6ecd398ba 100644 (file)
@@ -481,7 +481,7 @@ static struct esp_driver_ops mac_esp_ops = {
        .dma_error        = mac_esp_dma_error,
 };
 
-static int __devinit esp_mac_probe(struct platform_device *dev)
+static int esp_mac_probe(struct platform_device *dev)
 {
        struct scsi_host_template *tpnt = &scsi_esp_template;
        struct Scsi_Host *host;
@@ -591,7 +591,7 @@ fail:
        return err;
 }
 
-static int __devexit esp_mac_remove(struct platform_device *dev)
+static int esp_mac_remove(struct platform_device *dev)
 {
        struct mac_esp_priv *mep = platform_get_drvdata(dev);
        struct esp *esp = mep->esp;
@@ -614,7 +614,7 @@ static int __devexit esp_mac_remove(struct platform_device *dev)
 
 static struct platform_driver esp_mac_driver = {
        .probe    = esp_mac_probe,
-       .remove   = __devexit_p(esp_mac_remove),
+       .remove   = esp_mac_remove,
        .driver   = {
                .name   = DRV_MODULE_NAME,
                .owner  = THIS_MODULE,
index 76ad72d32c3f5ef8123b0b32b921de5ad7634f86..9504ec0ec68291273a2ad3ef6845e3c4e0c94bc5 100644 (file)
@@ -4522,7 +4522,7 @@ static struct scsi_host_template megaraid_template = {
        .eh_host_reset_handler          = megaraid_reset,
 };
 
-static int __devinit
+static int
 megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct Scsi_Host *host;
@@ -4914,7 +4914,7 @@ __megaraid_shutdown(adapter_t *adapter)
                mdelay(1000);
 }
 
-static void __devexit
+static void
 megaraid_remove_one(struct pci_dev *pdev)
 {
        struct Scsi_Host *host = pci_get_drvdata(pdev);
@@ -5008,7 +5008,7 @@ static struct pci_driver megaraid_pci_driver = {
        .name           = "megaraid_legacy",
        .id_table       = megaraid_pci_tbl,
        .probe          = megaraid_probe_one,
-       .remove         = __devexit_p(megaraid_remove_one),
+       .remove         = megaraid_remove_one,
        .shutdown       = megaraid_shutdown,
 };
 
index 54b1c5bb310f99f52e6a119eb7634ecb3f95d698..e6a1e0b38a19a8710eb30ca4bcfe615703224108 100644 (file)
@@ -305,7 +305,7 @@ static struct pci_driver megaraid_pci_driver = {
        .name           = "megaraid",
        .id_table       = pci_id_table_g,
        .probe          = megaraid_probe_one,
-       .remove         = __devexit_p(megaraid_detach_one),
+       .remove         = megaraid_detach_one,
        .shutdown       = megaraid_mbox_shutdown,
 };
 
@@ -434,7 +434,7 @@ megaraid_exit(void)
  * This routine should be called whenever a new adapter is detected by the
  * PCI hotplug susbsystem.
  */
-static int __devinit
+static int
 megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        adapter_t       *adapter;
@@ -735,7 +735,7 @@ megaraid_io_detach(adapter_t *adapter)
  * - Allocate memory required for all the commands
  * - Use internal library of FW routines, build up complete soft state
  */
-static int __devinit
+static int
 megaraid_init_mbox(adapter_t *adapter)
 {
        struct pci_dev          *pdev;
index e4f2baacf1e1783ec9054bae3f7013afb5af0a5f..66a0fec0437b316ae8f25f55a493da9873de81b2 100644 (file)
@@ -3972,8 +3972,8 @@ fail_set_dma_mask:
  * @pdev:              PCI device structure
  * @id:                        PCI ids of supported hotplugged adapter
  */
-static int __devinit
-megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
+static int megasas_probe_one(struct pci_dev *pdev,
+                            const struct pci_device_id *id)
 {
        int rval, pos, i, j;
        struct Scsi_Host *host;
@@ -4525,7 +4525,7 @@ fail_ready_state:
  * megasas_detach_one -        PCI hot"un"plug entry point
  * @pdev:              PCI device structure
  */
-static void __devexit megasas_detach_one(struct pci_dev *pdev)
+static void megasas_detach_one(struct pci_dev *pdev)
 {
        int i;
        struct Scsi_Host *host;
@@ -5119,7 +5119,7 @@ static struct pci_driver megasas_pci_driver = {
        .name = "megaraid_sas",
        .id_table = megasas_pci_table,
        .probe = megasas_probe_one,
-       .remove = __devexit_p(megasas_detach_one),
+       .remove = megasas_detach_one,
        .suspend = megasas_suspend,
        .resume = megasas_resume,
        .shutdown = megasas_shutdown,
index af4e6c451b1b56239d26a87dd23d4835bac69153..c6bdc92672298acabb6da842ba840710894ca6ab 100644 (file)
@@ -7686,7 +7686,7 @@ _scsih_shutdown(struct pci_dev *pdev)
  * Routine called when unloading the driver.
  * Return nothing.
  */
-static void __devexit
+static void
 _scsih_remove(struct pci_dev *pdev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
@@ -8338,7 +8338,7 @@ static struct pci_driver scsih_driver = {
        .name           = MPT2SAS_DRIVER_NAME,
        .id_table       = scsih_pci_table,
        .probe          = _scsih_probe,
-       .remove         = __devexit_p(_scsih_remove),
+       .remove         = _scsih_remove,
        .shutdown       = _scsih_shutdown,
        .err_handler    = &_scsih_err_handler,
 #ifdef CONFIG_PM
index 05f80450ac7e6c96e7173289419696f883d5abb3..6421a06c4ce20dac97de5f4ada0e431ed33a24f0 100644 (file)
@@ -7374,8 +7374,7 @@ _scsih_ir_shutdown(struct MPT3SAS_ADAPTER *ioc)
  * Routine called when unloading the driver.
  * Return nothing.
  */
-static void __devexit
-_scsih_remove(struct pci_dev *pdev)
+static void _scsih_remove(struct pci_dev *pdev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(pdev);
        struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
@@ -8044,7 +8043,7 @@ static struct pci_driver scsih_driver = {
        .name           = MPT3SAS_DRIVER_NAME,
        .id_table       = scsih_pci_table,
        .probe          = _scsih_probe,
-       .remove         = __devexit_p(_scsih_remove),
+       .remove         = _scsih_remove,
        .shutdown       = _scsih_shutdown,
        .err_handler    = &_scsih_err_handler,
 #ifdef CONFIG_PM
index 39f554f5f26114b1e5a7f401036974d9119cc697..8fbb97a8bfd32dc71aa0e784ef1810059626ed00 100644 (file)
@@ -34,8 +34,7 @@ static struct scsi_host_template mvme16x_scsi_driver_template = {
 
 static struct platform_device *mvme16x_scsi_device;
 
-static __devinit int
-mvme16x_probe(struct platform_device *dev)
+static int mvme16x_probe(struct platform_device *dev)
 {
        struct Scsi_Host * host = NULL;
        struct NCR_700_Host_Parameters *hostdata;
@@ -103,8 +102,7 @@ mvme16x_probe(struct platform_device *dev)
        return -ENODEV;
 }
 
-static __devexit int
-mvme16x_device_remove(struct platform_device *dev)
+static int mvme16x_device_remove(struct platform_device *dev)
 {
        struct Scsi_Host *host = platform_get_drvdata(dev);
        struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
@@ -131,7 +129,7 @@ static struct platform_driver mvme16x_scsi_driver = {
                .owner          = THIS_MODULE,
        },
        .probe          = mvme16x_probe,
-       .remove         = __devexit_p(mvme16x_device_remove),
+       .remove         = mvme16x_device_remove,
 };
 
 static int __init mvme16x_scsi_init(void)
index 8ba47229049f5d44bde2a6d55a145f9c1b277fff..8bb06995adfb0e1f5dc90287f4a358022bc29602 100644 (file)
@@ -41,7 +41,7 @@ static void mvs_64xx_detect_porttype(struct mvs_info *mvi, int i)
                phy->phy_type |= PORT_TYPE_SATA;
 }
 
-static void __devinit mvs_64xx_enable_xmt(struct mvs_info *mvi, int phy_id)
+static void mvs_64xx_enable_xmt(struct mvs_info *mvi, int phy_id)
 {
        void __iomem *regs = mvi->regs;
        u32 tmp;
@@ -54,7 +54,7 @@ static void __devinit mvs_64xx_enable_xmt(struct mvs_info *mvi, int phy_id)
        mw32(MVS_PCS, tmp);
 }
 
-static void __devinit mvs_64xx_phy_hacks(struct mvs_info *mvi)
+static void mvs_64xx_phy_hacks(struct mvs_info *mvi)
 {
        void __iomem *regs = mvi->regs;
        int i;
@@ -156,7 +156,7 @@ void mvs_64xx_clear_srs_irq(struct mvs_info *mvi, u8 reg_set, u8 clear_all)
        }
 }
 
-static int __devinit mvs_64xx_chip_reset(struct mvs_info *mvi)
+static int mvs_64xx_chip_reset(struct mvs_info *mvi)
 {
        void __iomem *regs = mvi->regs;
        u32 tmp;
@@ -250,7 +250,7 @@ static void mvs_64xx_phy_enable(struct mvs_info *mvi, u32 phy_id)
        }
 }
 
-static int __devinit mvs_64xx_init(struct mvs_info *mvi)
+static int mvs_64xx_init(struct mvs_info *mvi)
 {
        void __iomem *regs = mvi->regs;
        int i;
index 7e423e5ad5e103e53e9df4868ebc3ffee0608e08..1e4479f3331a44692934cf9a2c7bb7421185b09d 100644 (file)
@@ -216,8 +216,7 @@ void set_phy_rate(struct mvs_info *mvi, int phy_id, u8 rate)
        mvs_write_port_vsr_data(mvi, phy_id, phy_cfg.v);
 }
 
-static void __devinit
-mvs_94xx_config_reg_from_hba(struct mvs_info *mvi, int phy_id)
+static void mvs_94xx_config_reg_from_hba(struct mvs_info *mvi, int phy_id)
 {
        u32 temp;
        temp = (u32)(*(u32 *)&mvi->hba_info_param.phy_tuning[phy_id]);
@@ -258,7 +257,7 @@ mvs_94xx_config_reg_from_hba(struct mvs_info *mvi, int phy_id)
                mvi->hba_info_param.phy_rate[phy_id]);
 }
 
-static void __devinit mvs_94xx_enable_xmt(struct mvs_info *mvi, int phy_id)
+static void mvs_94xx_enable_xmt(struct mvs_info *mvi, int phy_id)
 {
        void __iomem *regs = mvi->regs;
        u32 tmp;
@@ -331,7 +330,7 @@ static void mvs_94xx_phy_enable(struct mvs_info *mvi, u32 phy_id)
        mvs_write_port_vsr_data(mvi, phy_id, tmp & 0xfd7fffff);
 }
 
-static int __devinit mvs_94xx_init(struct mvs_info *mvi)
+static int mvs_94xx_init(struct mvs_info *mvi)
 {
        void __iomem *regs = mvi->regs;
        int i;
index bcc408042cee3b54c8e93ab890d9a0c2e69f2e9a..8c4479ab49e80f409f2f0e3e7f2fee747c2b7140 100644 (file)
@@ -160,7 +160,7 @@ static inline void mvs_write_port_irq_mask(struct mvs_info *mvi,
                        MVS_P4_INT_MASK, port, val);
 }
 
-static inline void __devinit mvs_phy_hacks(struct mvs_info *mvi)
+static inline void mvs_phy_hacks(struct mvs_info *mvi)
 {
        u32 tmp;
 
index cc59dff3810b3d9e03ba7c418942fcd5eb5f8122..ce90d0546cddf3a0e7b85957c003266c05d2d6fd 100644 (file)
@@ -96,7 +96,7 @@ static struct sas_domain_function_template mvs_transport_ops = {
 
 };
 
-static void __devinit mvs_phy_init(struct mvs_info *mvi, int phy_id)
+static void mvs_phy_init(struct mvs_info *mvi, int phy_id)
 {
        struct mvs_phy *phy = &mvi->phy[phy_id];
        struct asd_sas_phy *sas_phy = &phy->sas_phy;
@@ -235,7 +235,7 @@ static irqreturn_t mvs_interrupt(int irq, void *opaque)
        return IRQ_HANDLED;
 }
 
-static int __devinit mvs_alloc(struct mvs_info *mvi, struct Scsi_Host *shost)
+static int mvs_alloc(struct mvs_info *mvi, struct Scsi_Host *shost)
 {
        int i = 0, slot_nr;
        char pool_name[32];
@@ -373,7 +373,7 @@ void mvs_iounmap(void __iomem *regs)
        iounmap(regs);
 }
 
-static struct mvs_info *__devinit mvs_pci_alloc(struct pci_dev *pdev,
+static struct mvs_info *mvs_pci_alloc(struct pci_dev *pdev,
                                const struct pci_device_id *ent,
                                struct Scsi_Host *shost, unsigned int id)
 {
@@ -444,7 +444,7 @@ static int pci_go_64(struct pci_dev *pdev)
        return rc;
 }
 
-static int __devinit mvs_prep_sas_ha_init(struct Scsi_Host *shost,
+static int mvs_prep_sas_ha_init(struct Scsi_Host *shost,
                                const struct mvs_chip_info *chip_info)
 {
        int phy_nr, port_nr; unsigned short core_nr;
@@ -486,7 +486,7 @@ exit_free:
 
 }
 
-static void  __devinit mvs_post_sas_ha_init(struct Scsi_Host *shost,
+static void  mvs_post_sas_ha_init(struct Scsi_Host *shost,
                        const struct mvs_chip_info *chip_info)
 {
        int can_queue, i = 0, j = 0;
@@ -537,8 +537,7 @@ static void mvs_init_sas_add(struct mvs_info *mvi)
        memcpy(mvi->sas_addr, &mvi->phy[0].dev_sas_addr, SAS_ADDR_SIZE);
 }
 
-static int __devinit mvs_pci_init(struct pci_dev *pdev,
-                                 const struct pci_device_id *ent)
+static int mvs_pci_init(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        unsigned int rc, nhost = 0;
        struct mvs_info *mvi;
@@ -645,7 +644,7 @@ err_out_enable:
        return rc;
 }
 
-static void __devexit mvs_pci_remove(struct pci_dev *pdev)
+static void mvs_pci_remove(struct pci_dev *pdev)
 {
        unsigned short core_nr, i = 0;
        struct sas_ha_struct *sha = pci_get_drvdata(pdev);
@@ -677,7 +676,7 @@ static void __devexit mvs_pci_remove(struct pci_dev *pdev)
        return;
 }
 
-static struct pci_device_id __devinitdata mvs_pci_table[] = {
+static struct pci_device_id mvs_pci_table[] = {
        { PCI_VDEVICE(MARVELL, 0x6320), chip_6320 },
        { PCI_VDEVICE(MARVELL, 0x6340), chip_6440 },
        {
@@ -748,7 +747,7 @@ static struct pci_driver mvs_pci_driver = {
        .name           = DRV_NAME,
        .id_table       = mvs_pci_table,
        .probe          = mvs_pci_init,
-       .remove         = __devexit_p(mvs_pci_remove),
+       .remove         = mvs_pci_remove,
 };
 
 static ssize_t
index a3776d6ced60df7606b329f39ca3780914486741..078c63913b5596f05503410b79ac9cf71dc7f5b0 100644 (file)
@@ -220,8 +220,8 @@ int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
        return rc;
 }
 
-void __devinit mvs_set_sas_addr(struct mvs_info *mvi, int port_id,
-                               u32 off_lo, u32 off_hi, u64 sas_addr)
+void mvs_set_sas_addr(struct mvs_info *mvi, int port_id, u32 off_lo,
+                     u32 off_hi, u64 sas_addr)
 {
        u32 lo = (u32)sas_addr;
        u32 hi = (u32)(sas_addr>>32);
index da249553858c4d1240348b6d0387b15d69dc64e8..2ae77a0394b2b24ae1500802f31f444ff281d8e8 100644 (file)
@@ -456,8 +456,8 @@ int mvs_ioremap(struct mvs_info *mvi, int bar, int bar_ex);
 void mvs_phys_reset(struct mvs_info *mvi, u32 phy_mask, int hard);
 int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
                        void *funcdata);
-void __devinit mvs_set_sas_addr(struct mvs_info *mvi, int port_id,
-                               u32 off_lo, u32 off_hi, u64 sas_addr);
+void mvs_set_sas_addr(struct mvs_info *mvi, int port_id, u32 off_lo,
+                     u32 off_hi, u64 sas_addr);
 void mvs_scan_start(struct Scsi_Host *shost);
 int mvs_scan_finished(struct Scsi_Host *shost, unsigned long time);
 int mvs_queue_command(struct sas_task *task, const int num,
index c585a925b3cd1e159832b86a8b531b011059ec91..4594ccaaf49ba2ce3f697c2fab355efe493f122d 100644 (file)
@@ -2506,8 +2506,7 @@ fail_add_device:
  * @pdev:              PCI device structure
  * @id:                        PCI ids of supported hotplugged adapter
  */
-static int __devinit mvumi_probe_one(struct pci_dev *pdev,
-                                       const struct pci_device_id *id)
+static int mvumi_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct Scsi_Host *host;
        struct mvumi_hba *mhba;
@@ -2728,7 +2727,7 @@ static struct pci_driver mvumi_pci_driver = {
        .name = MV_DRIVER_NAME,
        .id_table = mvumi_pci_table,
        .probe = mvumi_probe_one,
-       .remove = __devexit_p(mvumi_detach_one),
+       .remove = mvumi_detach_one,
        .shutdown = mvumi_shutdown,
 #ifdef CONFIG_PM
        .suspend = mvumi_suspend,
index 62b616891a33f684f0081a6efa427d4a6a22f3d1..1cc0c1c69c880b1f37d0c89063beff4b5566b697 100644 (file)
@@ -76,7 +76,7 @@ static const char *nsp32_release_version = "1.2";
 /****************************************************************************
  * Supported hardware
  */
-static struct pci_device_id nsp32_pci_table[] __devinitdata = {
+static struct pci_device_id nsp32_pci_table[] = {
        {
                .vendor      = PCI_VENDOR_ID_IODATA,
                .device      = PCI_DEVICE_ID_NINJASCSI_32BI_CBSC_II,
@@ -186,10 +186,10 @@ static nsp32_sync_table nsp32_sync_table_pci[] = {
  * function declaration
  */
 /* module entry point */
-static int  __devinit nsp32_probe (struct pci_dev *, const struct pci_device_id *);
-static void __devexit nsp32_remove(struct pci_dev *);
-static int  __init    init_nsp32  (void);
-static void __exit    exit_nsp32  (void);
+static int         nsp32_probe (struct pci_dev *, const struct pci_device_id *);
+static void        nsp32_remove(struct pci_dev *);
+static int  __init init_nsp32  (void);
+static void __exit exit_nsp32  (void);
 
 /* struct struct scsi_host_template */
 static int         nsp32_proc_info   (struct Scsi_Host *, char *, char **, off_t, int, int);
@@ -3382,7 +3382,7 @@ static int nsp32_resume(struct pci_dev *pdev)
 /************************************************************************
  * PCI/Cardbus probe/remove routine
  */
-static int __devinit nsp32_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+static int nsp32_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int ret;
        nsp32_hw_data *data = &nsp32_data_base;
@@ -3418,7 +3418,7 @@ static int __devinit nsp32_probe(struct pci_dev *pdev, const struct pci_device_i
        return ret;
 }
 
-static void __devexit nsp32_remove(struct pci_dev *pdev)
+static void nsp32_remove(struct pci_dev *pdev)
 {
        struct Scsi_Host *host = pci_get_drvdata(pdev);
 
@@ -3435,7 +3435,7 @@ static struct pci_driver nsp32_driver = {
        .name           = "nsp32",
        .id_table       = nsp32_pci_table,
        .probe          = nsp32_probe,
-       .remove         = __devexit_p(nsp32_remove),
+       .remove         = nsp32_remove,
 #ifdef CONFIG_PM
        .suspend        = nsp32_suspend, 
        .resume         = nsp32_resume, 
index bf54aafc2d717aee606de8c928c08ef6a39bba41..b8dd05074abb4f61faebbe0af12bd3074fd8b930 100644 (file)
@@ -47,7 +47,7 @@
  * read_main_config_table - read the configure table and save it.
  * @pm8001_ha: our hba card information
  */
-static void __devinit read_main_config_table(struct pm8001_hba_info *pm8001_ha)
+static void read_main_config_table(struct pm8001_hba_info *pm8001_ha)
 {
        void __iomem *address = pm8001_ha->main_cfg_tbl_addr;
        pm8001_ha->main_cfg_tbl.signature       = pm8001_mr32(address, 0x00);
@@ -83,8 +83,7 @@ static void __devinit read_main_config_table(struct pm8001_hba_info *pm8001_ha)
  * read_general_status_table - read the general status table and save it.
  * @pm8001_ha: our hba card information
  */
-static void __devinit
-read_general_status_table(struct pm8001_hba_info *pm8001_ha)
+static void read_general_status_table(struct pm8001_hba_info *pm8001_ha)
 {
        void __iomem *address = pm8001_ha->general_stat_tbl_addr;
        pm8001_ha->gs_tbl.gst_len_mpistate      = pm8001_mr32(address, 0x00);
@@ -118,8 +117,7 @@ read_general_status_table(struct pm8001_hba_info *pm8001_ha)
  * read_inbnd_queue_table - read the inbound queue table and save it.
  * @pm8001_ha: our hba card information
  */
-static void __devinit
-read_inbnd_queue_table(struct pm8001_hba_info *pm8001_ha)
+static void read_inbnd_queue_table(struct pm8001_hba_info *pm8001_ha)
 {
        int inbQ_num = 1;
        int i;
@@ -137,8 +135,7 @@ read_inbnd_queue_table(struct pm8001_hba_info *pm8001_ha)
  * read_outbnd_queue_table - read the outbound queue table and save it.
  * @pm8001_ha: our hba card information
  */
-static void __devinit
-read_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha)
+static void read_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha)
 {
        int outbQ_num = 1;
        int i;
@@ -156,8 +153,7 @@ read_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha)
  * init_default_table_values - init the default table.
  * @pm8001_ha: our hba card information
  */
-static void __devinit
-init_default_table_values(struct pm8001_hba_info *pm8001_ha)
+static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
 {
        int qn = 1;
        int i;
@@ -250,8 +246,7 @@ init_default_table_values(struct pm8001_hba_info *pm8001_ha)
  * update_main_config_table - update the main default table to the HBA.
  * @pm8001_ha: our hba card information
  */
-static void __devinit
-update_main_config_table(struct pm8001_hba_info *pm8001_ha)
+static void update_main_config_table(struct pm8001_hba_info *pm8001_ha)
 {
        void __iomem *address = pm8001_ha->main_cfg_tbl_addr;
        pm8001_mw32(address, 0x24,
@@ -297,8 +292,8 @@ update_main_config_table(struct pm8001_hba_info *pm8001_ha)
  * update_inbnd_queue_table - update the inbound queue table to the HBA.
  * @pm8001_ha: our hba card information
  */
-static void __devinit
-update_inbnd_queue_table(struct pm8001_hba_info *pm8001_ha, int number)
+static void update_inbnd_queue_table(struct pm8001_hba_info *pm8001_ha,
+                                    int number)
 {
        void __iomem *address = pm8001_ha->inbnd_q_tbl_addr;
        u16 offset = number * 0x20;
@@ -318,8 +313,8 @@ update_inbnd_queue_table(struct pm8001_hba_info *pm8001_ha, int number)
  * update_outbnd_queue_table - update the outbound queue table to the HBA.
  * @pm8001_ha: our hba card information
  */
-static void __devinit
-update_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha, int number)
+static void update_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha,
+                                     int number)
 {
        void __iomem *address = pm8001_ha->outbnd_q_tbl_addr;
        u16 offset = number * 0x24;
@@ -370,8 +365,8 @@ int pm8001_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue)
  * @pm8001_ha: our hba card information
  * @SSCbit: set SSCbit to 0 to disable all phys ssc; 1 to enable all phys ssc.
  */
-static void __devinit
-mpi_set_phys_g3_with_ssc(struct pm8001_hba_info *pm8001_ha, u32 SSCbit)
+static void mpi_set_phys_g3_with_ssc(struct pm8001_hba_info *pm8001_ha,
+                                    u32 SSCbit)
 {
        u32 value, offset, i;
        unsigned long flags;
@@ -438,9 +433,8 @@ mpi_set_phys_g3_with_ssc(struct pm8001_hba_info *pm8001_ha, u32 SSCbit)
  * @pm8001_ha: our hba card information
  * @interval - interval time for each OPEN_REJECT (RETRY). The units are in 1us.
  */
-static void __devinit
-mpi_set_open_retry_interval_reg(struct pm8001_hba_info *pm8001_ha,
-                               u32 interval)
+static void mpi_set_open_retry_interval_reg(struct pm8001_hba_info *pm8001_ha,
+                                           u32 interval)
 {
        u32 offset;
        u32 value;
@@ -601,7 +595,7 @@ static void init_pci_device_addresses(struct pm8001_hba_info *pm8001_ha)
  * pm8001_chip_init - the main init function that initialize whole PM8001 chip.
  * @pm8001_ha: our hba card information
  */
-static int __devinit pm8001_chip_init(struct pm8001_hba_info *pm8001_ha)
+static int pm8001_chip_init(struct pm8001_hba_info *pm8001_ha)
 {
        /* check the firmware status */
        if (-1 == check_fw_ready(pm8001_ha)) {
index 0267c22f87419e5c87375992b7c5dec707d41edc..4c9fe733fe8889d2bdb66657ff5928294237b766 100644 (file)
@@ -104,8 +104,7 @@ static struct sas_domain_function_template pm8001_transport_ops = {
  *@pm8001_ha: our hba structure.
  *@phy_id: phy id.
  */
-static void __devinit pm8001_phy_init(struct pm8001_hba_info *pm8001_ha,
-       int phy_id)
+static void pm8001_phy_init(struct pm8001_hba_info *pm8001_ha, int phy_id)
 {
        struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
        struct asd_sas_phy *sas_phy = &phy->sas_phy;
@@ -195,7 +194,7 @@ static irqreturn_t pm8001_interrupt(int irq, void *opaque)
  * @pm8001_ha:our hba structure.
  *
  */
-static int __devinit pm8001_alloc(struct pm8001_hba_info *pm8001_ha)
+static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha)
 {
        int i;
        spin_lock_init(&pm8001_ha->lock);
@@ -360,8 +359,9 @@ static int pm8001_ioremap(struct pm8001_hba_info *pm8001_ha)
  * @ent: ent
  * @shost: scsi host struct which has been initialized before.
  */
-static struct pm8001_hba_info *__devinit
-pm8001_pci_alloc(struct pci_dev *pdev, u32 chip_id, struct Scsi_Host *shost)
+static struct pm8001_hba_info *pm8001_pci_alloc(struct pci_dev *pdev,
+                                               u32 chip_id,
+                                               struct Scsi_Host *shost)
 {
        struct pm8001_hba_info *pm8001_ha;
        struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
@@ -433,8 +433,8 @@ static int pci_go_44(struct pci_dev *pdev)
  * @shost: scsi host which has been allocated outside.
  * @chip_info: our ha struct.
  */
-static int __devinit pm8001_prep_sas_ha_init(struct Scsi_Host * shost,
-       const struct pm8001_chip_info *chip_info)
+static int pm8001_prep_sas_ha_init(struct Scsi_Host *shost,
+                                  const struct pm8001_chip_info *chip_info)
 {
        int phy_nr, port_nr;
        struct asd_sas_phy **arr_phy;
@@ -479,8 +479,8 @@ exit:
  * @shost: scsi host which has been allocated outside
  * @chip_info: our ha struct.
  */
-static void  __devinit pm8001_post_sas_ha_init(struct Scsi_Host *shost,
-       const struct pm8001_chip_info *chip_info)
+static void  pm8001_post_sas_ha_init(struct Scsi_Host *shost,
+                                    const struct pm8001_chip_info *chip_info)
 {
        int i = 0;
        struct pm8001_hba_info *pm8001_ha;
@@ -615,8 +615,8 @@ intx:
  * pci driver it is invoked, all struct an hardware initilization should be done
  * here, also, register interrupt
  */
-static int __devinit pm8001_pci_probe(struct pci_dev *pdev,
-       const struct pci_device_id *ent)
+static int pm8001_pci_probe(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        unsigned int rc;
        u32     pci_reg;
@@ -707,7 +707,7 @@ err_out_enable:
        return rc;
 }
 
-static void __devexit pm8001_pci_remove(struct pci_dev *pdev)
+static void pm8001_pci_remove(struct pci_dev *pdev)
 {
        struct sas_ha_struct *sha = pci_get_drvdata(pdev);
        struct pm8001_hba_info *pm8001_ha;
@@ -842,7 +842,7 @@ err_out_enable:
        return rc;
 }
 
-static struct pci_device_id __devinitdata pm8001_pci_table[] = {
+static struct pci_device_id pm8001_pci_table[] = {
        {
                PCI_VDEVICE(PMC_Sierra, 0x8001), chip_8001
        },
@@ -857,7 +857,7 @@ static struct pci_driver pm8001_pci_driver = {
        .name           = DRV_NAME,
        .id_table       = pm8001_pci_table,
        .probe          = pm8001_pci_probe,
-       .remove         = __devexit_p(pm8001_pci_remove),
+       .remove         = pm8001_pci_remove,
        .suspend        = pm8001_pci_suspend,
        .resume         = pm8001_pci_resume,
 };
index af763eab2039022b997a572b324e6d9466a7449b..b46f5e90683793043853ca6a6f2ad500b9746806 100644 (file)
@@ -125,7 +125,7 @@ static struct pmcraid_chip_details pmcraid_chip_cfg[] = {
 /*
  * PCI device ids supported by pmcraid driver
  */
-static struct pci_device_id pmcraid_pci_table[] __devinitdata = {
+static struct pci_device_id pmcraid_pci_table[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_PMC, PCI_DEVICE_ID_PMC_MAXRAID),
          0, 0, (kernel_ulong_t)&pmcraid_chip_cfg[0]
        },
@@ -4818,8 +4818,7 @@ pmcraid_release_control_blocks(
  * Return Value
  *     0 in case of success; -ENOMEM in case of failure
  */
-static int __devinit
-pmcraid_allocate_cmd_blocks(struct pmcraid_instance *pinstance)
+static int pmcraid_allocate_cmd_blocks(struct pmcraid_instance *pinstance)
 {
        int i;
 
@@ -4855,8 +4854,7 @@ pmcraid_allocate_cmd_blocks(struct pmcraid_instance *pinstance)
  * Return Value
  *  0 in case it can allocate all control blocks, otherwise -ENOMEM
  */
-static int __devinit
-pmcraid_allocate_control_blocks(struct pmcraid_instance *pinstance)
+static int pmcraid_allocate_control_blocks(struct pmcraid_instance *pinstance)
 {
        int i;
 
@@ -4922,8 +4920,7 @@ pmcraid_release_host_rrqs(struct pmcraid_instance *pinstance, int maxindex)
  * Return value
  *     0 hrrq buffers are allocated, -ENOMEM otherwise.
  */
-static int __devinit
-pmcraid_allocate_host_rrqs(struct pmcraid_instance *pinstance)
+static int pmcraid_allocate_host_rrqs(struct pmcraid_instance *pinstance)
 {
        int i, buffer_size;
 
@@ -5062,8 +5059,7 @@ static void pmcraid_release_config_buffers(struct pmcraid_instance *pinstance)
  * Return Value
  *     0 for successful allocation, -ENOMEM for any failure
  */
-static int __devinit
-pmcraid_allocate_config_buffers(struct pmcraid_instance *pinstance)
+static int pmcraid_allocate_config_buffers(struct pmcraid_instance *pinstance)
 {
        int i;
 
@@ -5181,7 +5177,7 @@ static void pmcraid_release_buffers(struct pmcraid_instance *pinstance)
  * Return Value
  *      0 in case all of the blocks are allocated, -ENOMEM otherwise.
  */
-static int __devinit pmcraid_init_buffers(struct pmcraid_instance *pinstance)
+static int pmcraid_init_buffers(struct pmcraid_instance *pinstance)
 {
        int i;
 
@@ -5281,11 +5277,8 @@ static void pmcraid_reinit_buffers(struct pmcraid_instance *pinstance)
  * Return Value
  *      0 on success, non-zero in case of any failure
  */
-static int __devinit pmcraid_init_instance(
-       struct pci_dev *pdev,
-       struct Scsi_Host *host,
-       void __iomem *mapped_pci_addr
-)
+static int pmcraid_init_instance(struct pci_dev *pdev, struct Scsi_Host *host,
+                                void __iomem *mapped_pci_addr)
 {
        struct pmcraid_instance *pinstance =
                (struct pmcraid_instance *)host->hostdata;
@@ -5442,7 +5435,7 @@ static void pmcraid_release_chrdev(struct pmcraid_instance *pinstance)
  * Return value
  *       none
  */
-static void __devexit pmcraid_remove(struct pci_dev *pdev)
+static void pmcraid_remove(struct pci_dev *pdev)
 {
        struct pmcraid_instance *pinstance = pci_get_drvdata(pdev);
 
@@ -5883,10 +5876,8 @@ static void pmcraid_querycfg(struct pmcraid_cmd *cmd)
  *     returns 0 if the device is claimed and successfully configured.
  *     returns non-zero error code in case of any failure
  */
-static int __devinit pmcraid_probe(
-       struct pci_dev *pdev,
-       const struct pci_device_id *dev_id
-)
+static int pmcraid_probe(struct pci_dev *pdev,
+                        const struct pci_device_id *dev_id)
 {
        struct pmcraid_instance *pinstance;
        struct Scsi_Host *host;
index 959f10055be77cf2e9cf04e98d0229633cfa8489..e6e2a30493e69d6baeda15585a840865fd26c6f9 100644 (file)
@@ -359,7 +359,7 @@ static struct scsi_host_template ps3rom_host_template = {
 };
 
 
-static int __devinit ps3rom_probe(struct ps3_system_bus_device *_dev)
+static int ps3rom_probe(struct ps3_system_bus_device *_dev)
 {
        struct ps3_storage_device *dev = to_ps3_storage_device(&_dev->core);
        int error;
index 538230be5cca1be39898aa37bffb1d220f1ddb41..5a522c5bbd433910e3f745005fe3bc6ded93da54 100644 (file)
@@ -1438,7 +1438,7 @@ qla1280_return_status(struct response * sts, struct scsi_cmnd *cp)
  * Returns:
  *      0 = success
  */
-static int __devinit
+static int
 qla1280_initialize_adapter(struct scsi_qla_host *ha)
 {
        struct device_reg __iomem *reg;
@@ -4230,7 +4230,7 @@ static struct scsi_host_template qla1280_driver_template = {
 };
 
 
-static int __devinit
+static int
 qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int devnum = id->driver_data;
@@ -4399,7 +4399,7 @@ qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 }
 
 
-static void __devexit
+static void
 qla1280_remove_one(struct pci_dev *pdev)
 {
        struct Scsi_Host *host = pci_get_drvdata(pdev);
@@ -4433,7 +4433,7 @@ static struct pci_driver qla1280_pci_driver = {
        .name           = "qla1280",
        .id_table       = qla1280_pci_tbl,
        .probe          = qla1280_probe_one,
-       .remove         = __devexit_p(qla1280_remove_one),
+       .remove         = qla1280_remove_one,
 };
 
 static int __init
index 3a1661cf8c1e59bcc94837fc003a68d6963e70ce..10d23f8b7036c11c025e4341829046667749d38f 100644 (file)
@@ -2154,7 +2154,7 @@ qla2xxx_scan_finished(struct Scsi_Host *shost, unsigned long time)
 /*
  * PCI driver interface
  */
-static int __devinit
+static int
 qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        int     ret = -ENODEV;
index fbc546e893ac2bcad8ea7a42d430096ea2905429..4cec123a6a6a5f02503bb3ebc4175479cbe10030 100644 (file)
@@ -5124,8 +5124,8 @@ void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset)
  * It returns zero if successful. It also initializes all data necessary for
  * the driver.
  **/
-static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
-                                          const struct pci_device_id *ent)
+static int qla4xxx_probe_adapter(struct pci_dev *pdev,
+                                const struct pci_device_id *ent)
 {
        int ret = -ENODEV, status;
        struct Scsi_Host *host;
@@ -5464,7 +5464,7 @@ static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha)
  * qla4xxx_remove_adapter - callback function to remove adapter.
  * @pci_dev: PCI device pointer
  **/
-static void __devexit qla4xxx_remove_adapter(struct pci_dev *pdev)
+static void qla4xxx_remove_adapter(struct pci_dev *pdev)
 {
        struct scsi_qla_host *ha;
 
index 1e874f1fb5c64a403fd6e7da8365edce51b929df..13d628b56ff790473d2088759fba4d8a32b7cd1e 100644 (file)
@@ -142,7 +142,7 @@ module_param_array(irq, int, NULL, 0);
 MODULE_PARM_DESC(iobase, "I/O address");
 MODULE_PARM_DESC(irq, "IRQ");
 
-static int __devinit qlogicfas_detect(struct scsi_host_template *sht)
+static int qlogicfas_detect(struct scsi_host_template *sht)
 {
        struct Scsi_Host *shost;
        struct qlogicfas408_priv *priv;
index 71fddbc60f181feb15bbd30994f16dc5b35d4831..6d48d30bed050d350768ec7ffb3a9e64b7bd04f2 100644 (file)
@@ -461,7 +461,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
 
 #define PTI_RESET_LIMIT 400
 
-static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
+static int qlogicpti_load_firmware(struct qlogicpti *qpti)
 {
        const struct firmware *fw;
        const char fwname[] = "qlogic/isp1000.bin";
@@ -670,7 +670,7 @@ static int qlogicpti_verify_tmon(struct qlogicpti *qpti)
 
 static irqreturn_t qpti_intr(int irq, void *dev_id);
 
-static void __devinit qpti_chain_add(struct qlogicpti *qpti)
+static void qpti_chain_add(struct qlogicpti *qpti)
 {
        spin_lock_irq(&qptichain_lock);
        if (qptichain != NULL) {
@@ -686,7 +686,7 @@ static void __devinit qpti_chain_add(struct qlogicpti *qpti)
        spin_unlock_irq(&qptichain_lock);
 }
 
-static void __devexit qpti_chain_del(struct qlogicpti *qpti)
+static void qpti_chain_del(struct qlogicpti *qpti)
 {
        spin_lock_irq(&qptichain_lock);
        if (qptichain == qpti) {
@@ -701,7 +701,7 @@ static void __devexit qpti_chain_del(struct qlogicpti *qpti)
        spin_unlock_irq(&qptichain_lock);
 }
 
-static int __devinit qpti_map_regs(struct qlogicpti *qpti)
+static int qpti_map_regs(struct qlogicpti *qpti)
 {
        struct platform_device *op = qpti->op;
 
@@ -724,7 +724,7 @@ static int __devinit qpti_map_regs(struct qlogicpti *qpti)
        return 0;
 }
 
-static int __devinit qpti_register_irq(struct qlogicpti *qpti)
+static int qpti_register_irq(struct qlogicpti *qpti)
 {
        struct platform_device *op = qpti->op;
 
@@ -749,7 +749,7 @@ fail:
        return -1;
 }
 
-static void __devinit qpti_get_scsi_id(struct qlogicpti *qpti)
+static void qpti_get_scsi_id(struct qlogicpti *qpti)
 {
        struct platform_device *op = qpti->op;
        struct device_node *dp;
@@ -803,7 +803,7 @@ static void qpti_get_clock(struct qlogicpti *qpti)
 /* The request and response queues must each be aligned
  * on a page boundary.
  */
-static int __devinit qpti_map_queues(struct qlogicpti *qpti)
+static int qpti_map_queues(struct qlogicpti *qpti)
 {
        struct platform_device *op = qpti->op;
 
@@ -1292,7 +1292,7 @@ static struct scsi_host_template qpti_template = {
 };
 
 static const struct of_device_id qpti_match[];
-static int __devinit qpti_sbus_probe(struct platform_device *op)
+static int qpti_sbus_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct Scsi_Host *host;
@@ -1402,7 +1402,7 @@ fail_unlink:
        return -ENODEV;
 }
 
-static int __devexit qpti_sbus_remove(struct platform_device *op)
+static int qpti_sbus_remove(struct platform_device *op)
 {
        struct qlogicpti *qpti = dev_get_drvdata(&op->dev);
 
@@ -1459,7 +1459,7 @@ static struct platform_driver qpti_sbus_driver = {
                .of_match_table = qpti_match,
        },
        .probe          = qpti_sbus_probe,
-       .remove         = __devexit_p(qpti_sbus_remove),
+       .remove         = qpti_sbus_remove,
 };
 
 static int __init qpti_init(void)
index 3a9d85ca6047068b495c208a844f5a4ce3c71b52..a464d959f66e647d7f923f8d2c0099119a2b41af 100644 (file)
@@ -226,7 +226,7 @@ static struct scsi_host_template sgiwd93_template = {
        .use_clustering         = DISABLE_CLUSTERING,
 };
 
-static int __devinit sgiwd93_probe(struct platform_device *pdev)
+static int sgiwd93_probe(struct platform_device *pdev)
 {
        struct sgiwd93_platform_data *pd = pdev->dev.platform_data;
        unsigned char *wdregs = pd->wdregs;
@@ -312,7 +312,7 @@ static int __exit sgiwd93_remove(struct platform_device *pdev)
 
 static struct platform_driver sgiwd93_driver = {
        .probe  = sgiwd93_probe,
-       .remove = __devexit_p(sgiwd93_remove),
+       .remove = sgiwd93_remove,
        .driver = {
                .name   = "sgiwd93",
                .owner  = THIS_MODULE,
index a318264a4ba1dc8895faeb8d058899e1e28b2318..3b3b56f4a8300ae7ebac68f4c27fb26863cef1e8 100644 (file)
@@ -94,9 +94,9 @@ static struct scsi_host_template sim710_driver_template = {
        .module                 = THIS_MODULE,
 };
 
-static __devinit int
-sim710_probe_common(struct device *dev, unsigned long base_addr,
-                   int irq, int clock, int differential, int scsi_id)
+static int sim710_probe_common(struct device *dev, unsigned long base_addr,
+                              int irq, int clock, int differential,
+                              int scsi_id)
 {
        struct Scsi_Host * host = NULL;
        struct NCR_700_Host_Parameters *hostdata =
@@ -153,8 +153,7 @@ sim710_probe_common(struct device *dev, unsigned long base_addr,
        return -ENODEV;
 }
 
-static __devexit int
-sim710_device_remove(struct device *dev)
+static int sim710_device_remove(struct device *dev)
 {
        struct Scsi_Host *host = dev_get_drvdata(dev);
        struct NCR_700_Host_Parameters *hostdata =
@@ -221,7 +220,7 @@ static struct eisa_driver sim710_eisa_driver = {
        .driver = {
                .name           = "sim710",
                .probe          = sim710_eisa_probe,
-               .remove         = __devexit_p(sim710_device_remove),
+               .remove         = sim710_device_remove,
        },
 };
 #endif /* CONFIG_EISA */
index cf51432f8e72e94add7726b5aa323d7c54cc79ed..52d54e7425db957b2dc1805935a2365ade7eb98a 100644 (file)
@@ -65,7 +65,7 @@ static struct scsi_host_template snirm710_template = {
        .module         = THIS_MODULE,
 };
 
-static int __devinit snirm710_probe(struct platform_device *dev)
+static int snirm710_probe(struct platform_device *dev)
 {
        unsigned long base;
        struct NCR_700_Host_Parameters *hostdata;
@@ -134,7 +134,7 @@ static int __exit snirm710_driver_remove(struct platform_device *dev)
 
 static struct platform_driver snirm710_driver = {
        .probe  = snirm710_probe,
-       .remove = __devexit_p(snirm710_driver_remove),
+       .remove = snirm710_driver_remove,
        .driver = {
                .name   = "snirm_53c710",
                .owner  = THIS_MODULE,
index 606215e54b8896f38deeb51603a29f8e12cd5e40..325c31caa6e0dd98dbce0724b968a7ee5efcba69 100644 (file)
@@ -1540,8 +1540,7 @@ static void stex_free_irq(struct st_hba *hba)
                pci_disable_msi(pdev);
 }
 
-static int __devinit
-stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+static int stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct st_hba *hba;
        struct Scsi_Host *host;
@@ -1815,7 +1814,7 @@ static struct pci_driver stex_pci_driver = {
        .name           = DRV_NAME,
        .id_table       = stex_pci_tbl,
        .probe          = stex_probe,
-       .remove         = __devexit_p(stex_remove),
+       .remove         = stex_remove,
        .shutdown       = stex_shutdown,
 };
 
index 0621037f027129970748ac77ad918ef0dd6d1442..534eb96fc3a7c4892b9f2fc82c165095d52d3166 100644 (file)
@@ -194,7 +194,7 @@ static const struct esp_driver_ops sun3x_esp_ops = {
        .dma_error      =       sun3x_esp_dma_error,
 };
 
-static int __devinit esp_sun3x_probe(struct platform_device *dev)
+static int esp_sun3x_probe(struct platform_device *dev)
 {
        struct scsi_host_template *tpnt = &scsi_esp_template;
        struct Scsi_Host *host;
@@ -268,7 +268,7 @@ fail:
        return err;
 }
 
-static int __devexit esp_sun3x_remove(struct platform_device *dev)
+static int esp_sun3x_remove(struct platform_device *dev)
 {
        struct esp *esp = dev_get_drvdata(&dev->dev);
        unsigned int irq = esp->host->irq;
@@ -292,7 +292,7 @@ static int __devexit esp_sun3x_remove(struct platform_device *dev)
 
 static struct platform_driver esp_sun3x_driver = {
        .probe          = esp_sun3x_probe,
-       .remove         = __devexit_p(esp_sun3x_remove),
+       .remove         = esp_sun3x_remove,
        .driver = {
                .name   = "sun3x_esp",
                .owner  = THIS_MODULE,
index 676fe9ac7f61267bf156f7235aaa94e3c29af0a0..f2e68459f7ea6fa8d775c40ec93a49534ea675f3 100644 (file)
@@ -43,8 +43,7 @@ enum dvma_rev {
        dvmahme
 };
 
-static int __devinit esp_sbus_setup_dma(struct esp *esp,
-                                       struct platform_device *dma_of)
+static int esp_sbus_setup_dma(struct esp *esp, struct platform_device *dma_of)
 {
        esp->dma = dma_of;
 
@@ -79,7 +78,7 @@ static int __devinit esp_sbus_setup_dma(struct esp *esp,
 
 }
 
-static int __devinit esp_sbus_map_regs(struct esp *esp, int hme)
+static int esp_sbus_map_regs(struct esp *esp, int hme)
 {
        struct platform_device *op = esp->dev;
        struct resource *res;
@@ -99,7 +98,7 @@ static int __devinit esp_sbus_map_regs(struct esp *esp, int hme)
        return 0;
 }
 
-static int __devinit esp_sbus_map_command_block(struct esp *esp)
+static int esp_sbus_map_command_block(struct esp *esp)
 {
        struct platform_device *op = esp->dev;
 
@@ -111,7 +110,7 @@ static int __devinit esp_sbus_map_command_block(struct esp *esp)
        return 0;
 }
 
-static int __devinit esp_sbus_register_irq(struct esp *esp)
+static int esp_sbus_register_irq(struct esp *esp)
 {
        struct Scsi_Host *host = esp->host;
        struct platform_device *op = esp->dev;
@@ -120,7 +119,7 @@ static int __devinit esp_sbus_register_irq(struct esp *esp)
        return request_irq(host->irq, scsi_esp_intr, IRQF_SHARED, "ESP", esp);
 }
 
-static void __devinit esp_get_scsi_id(struct esp *esp, struct platform_device *espdma)
+static void esp_get_scsi_id(struct esp *esp, struct platform_device *espdma)
 {
        struct platform_device *op = esp->dev;
        struct device_node *dp;
@@ -142,7 +141,7 @@ done:
        esp->scsi_id_mask = (1 << esp->scsi_id);
 }
 
-static void __devinit esp_get_differential(struct esp *esp)
+static void esp_get_differential(struct esp *esp)
 {
        struct platform_device *op = esp->dev;
        struct device_node *dp;
@@ -154,7 +153,7 @@ static void __devinit esp_get_differential(struct esp *esp)
                esp->flags &= ~ESP_FLAG_DIFFERENTIAL;
 }
 
-static void __devinit esp_get_clock_params(struct esp *esp)
+static void esp_get_clock_params(struct esp *esp)
 {
        struct platform_device *op = esp->dev;
        struct device_node *bus_dp, *dp;
@@ -170,7 +169,7 @@ static void __devinit esp_get_clock_params(struct esp *esp)
        esp->cfreq = fmhz;
 }
 
-static void __devinit esp_get_bursts(struct esp *esp, struct platform_device *dma_of)
+static void esp_get_bursts(struct esp *esp, struct platform_device *dma_of)
 {
        struct device_node *dma_dp = dma_of->dev.of_node;
        struct platform_device *op = esp->dev;
@@ -195,7 +194,7 @@ static void __devinit esp_get_bursts(struct esp *esp, struct platform_device *dm
        esp->bursts = bursts;
 }
 
-static void __devinit esp_sbus_get_props(struct esp *esp, struct platform_device *espdma)
+static void esp_sbus_get_props(struct esp *esp, struct platform_device *espdma)
 {
        esp_get_scsi_id(esp, espdma);
        esp_get_differential(esp);
@@ -487,9 +486,8 @@ static const struct esp_driver_ops sbus_esp_ops = {
        .dma_error      =       sbus_esp_dma_error,
 };
 
-static int __devinit esp_sbus_probe_one(struct platform_device *op,
-                                       struct platform_device *espdma,
-                                       int hme)
+static int esp_sbus_probe_one(struct platform_device *op,
+                             struct platform_device *espdma, int hme)
 {
        struct scsi_host_template *tpnt = &scsi_esp_template;
        struct Scsi_Host *host;
@@ -562,7 +560,7 @@ fail:
        return err;
 }
 
-static int __devinit esp_sbus_probe(struct platform_device *op)
+static int esp_sbus_probe(struct platform_device *op)
 {
        struct device_node *dma_node = NULL;
        struct device_node *dp = op->dev.of_node;
@@ -585,7 +583,7 @@ static int __devinit esp_sbus_probe(struct platform_device *op)
        return esp_sbus_probe_one(op, dma_of, hme);
 }
 
-static int __devexit esp_sbus_remove(struct platform_device *op)
+static int esp_sbus_remove(struct platform_device *op)
 {
        struct esp *esp = dev_get_drvdata(&op->dev);
        struct platform_device *dma_of = esp->dma;
@@ -639,7 +637,7 @@ static struct platform_driver esp_sbus_driver = {
                .of_match_table = esp_match,
        },
        .probe          = esp_sbus_probe,
-       .remove         = __devexit_p(esp_sbus_remove),
+       .remove         = esp_sbus_remove,
 };
 
 static int __init sunesp_init(void)
index ac4eca6a532810d71de3812cf377847d484bc388..0b7819f3e09b1736288a1827b5410c39efcdc437 100644 (file)
@@ -581,7 +581,7 @@ static int sym53c416_test(int base)
 }
 
 
-static struct isapnp_device_id id_table[] __devinitdata = {
+static struct isapnp_device_id id_table[] = {
        {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
                ISAPNP_VENDOR('S','L','I'), ISAPNP_FUNCTION(0x4161), 0 },
        {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
index e2b8e68b57e7b3dfe1a467e0046a9d83318713c1..599568299fbea49bce5847b060645d59f059b76e 100644 (file)
@@ -1284,8 +1284,7 @@ static int sym53c8xx_proc_info(struct Scsi_Host *shost, char *buffer,
  * sym_free_resources() should be used instead of this function after calling
  * sym_attach().
  */
-static void __devinit
-sym_iounmap_device(struct sym_device *device)
+static void sym_iounmap_device(struct sym_device *device)
 {
        if (device->s.ioaddr)
                pci_iounmap(device->pdev, device->s.ioaddr);
@@ -1325,8 +1324,8 @@ static void sym_free_resources(struct sym_hcb *np, struct pci_dev *pdev,
  *  If all is OK, install interrupt handling and
  *  start the timer daemon.
  */
-static struct Scsi_Host * __devinit sym_attach(struct scsi_host_template *tpnt,
-               int unit, struct sym_device *dev)
+static struct Scsi_Host *sym_attach(struct scsi_host_template *tpnt, int unit,
+                                   struct sym_device *dev)
 {
        struct sym_data *sym_data;
        struct sym_hcb *np = NULL;
@@ -1481,7 +1480,7 @@ static struct Scsi_Host * __devinit sym_attach(struct scsi_host_template *tpnt,
  *    Detect and try to read SYMBIOS and TEKRAM NVRAM.
  */
 #if SYM_CONF_NVRAM_SUPPORT
-static void __devinit sym_get_nvram(struct sym_device *devp, struct sym_nvram *nvp)
+static void sym_get_nvram(struct sym_device *devp, struct sym_nvram *nvp)
 {
        devp->nvram = nvp;
        nvp->type = 0;
@@ -1494,7 +1493,7 @@ static inline void sym_get_nvram(struct sym_device *devp, struct sym_nvram *nvp)
 }
 #endif /* SYM_CONF_NVRAM_SUPPORT */
 
-static int __devinit sym_check_supported(struct sym_device *device)
+static int sym_check_supported(struct sym_device *device)
 {
        struct sym_chip *chip;
        struct pci_dev *pdev = device->pdev;
@@ -1531,7 +1530,7 @@ static int __devinit sym_check_supported(struct sym_device *device)
  * Ignore Symbios chips controlled by various RAID controllers.
  * These controllers set value 0x52414944 at RAM end - 16.
  */
-static int __devinit sym_check_raid(struct sym_device *device)
+static int sym_check_raid(struct sym_device *device)
 {
        unsigned int ram_size, ram_val;
 
@@ -1552,7 +1551,7 @@ static int __devinit sym_check_raid(struct sym_device *device)
        return -ENODEV;
 }
 
-static int __devinit sym_set_workarounds(struct sym_device *device)
+static int sym_set_workarounds(struct sym_device *device)
 {
        struct sym_chip *chip = &device->chip;
        struct pci_dev *pdev = device->pdev;
@@ -1602,8 +1601,7 @@ static int __devinit sym_set_workarounds(struct sym_device *device)
 /*
  * Map HBA registers and on-chip SRAM (if present).
  */
-static int __devinit
-sym_iomap_device(struct sym_device *device)
+static int sym_iomap_device(struct sym_device *device)
 {
        struct pci_dev *pdev = device->pdev;
        struct pci_bus_region bus_addr;
@@ -1751,8 +1749,7 @@ static struct scsi_host_template sym2_template = {
 
 static int attach_count;
 
-static int __devinit sym2_probe(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+static int sym2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct sym_device sym_dev;
        struct sym_nvram nvram;
@@ -2077,7 +2074,7 @@ static struct spi_function_template sym2_transport_functions = {
        .get_signalling = sym2_get_signalling,
 };
 
-static struct pci_device_id sym2_id_table[] __devinitdata = {
+static struct pci_device_id sym2_id_table[] = {
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C810,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C820,
index a1baccce05f08a9abbae70522a478ce5f2f12911..9327f5fcec4e85c9a8d8606bd9347b7d0702709e 100644 (file)
@@ -2219,7 +2219,7 @@ static struct scsi_host_template driver_template = {
  *
  **********************************************************************/
 
-static void __devinit dc390_eeprom_prepare_read(struct pci_dev *pdev, u8 cmd)
+static void dc390_eeprom_prepare_read(struct pci_dev *pdev, u8 cmd)
 {
        u8 carryFlag = 1, j = 0x80, bval;
        int i;
@@ -2242,7 +2242,7 @@ static void __devinit dc390_eeprom_prepare_read(struct pci_dev *pdev, u8 cmd)
        }
 }
 
-static u16 __devinit dc390_eeprom_get_data(struct pci_dev *pdev)
+static u16 dc390_eeprom_get_data(struct pci_dev *pdev)
 {
        int i;
        u16 wval = 0;
@@ -2264,7 +2264,7 @@ static u16 __devinit dc390_eeprom_get_data(struct pci_dev *pdev)
        return wval;
 }
 
-static void __devinit dc390_read_eeprom(struct pci_dev *pdev, u16 *ptr)
+static void dc390_read_eeprom(struct pci_dev *pdev, u16 *ptr)
 {
        u8 cmd = EEPROM_READ, i;
 
@@ -2282,7 +2282,7 @@ static void __devinit dc390_read_eeprom(struct pci_dev *pdev, u16 *ptr)
 }
 
 /* Override EEprom values with explicitly set values */
-static void __devinit dc390_eeprom_override(u8 index)
+static void dc390_eeprom_override(u8 index)
 {
        u8 *ptr = (u8 *) dc390_eepromBuf[index], id;
 
@@ -2305,7 +2305,7 @@ static void __devinit dc390_eeprom_override(u8 index)
        }
 }
 
-static int __devinitdata tmscsim_def[] = {
+static int tmscsim_def[] = {
        7,
        0 /* 10MHz */,
        PARITY_CHK_ | SEND_START_ | EN_DISCONNECT_ | SYNC_NEGO_ | TAG_QUEUEING_,
@@ -2315,7 +2315,7 @@ static int __devinitdata tmscsim_def[] = {
 };
 
 /* Copy defaults over set values where missing */
-static void __devinit dc390_fill_with_defaults (void)
+static void dc390_fill_with_defaults (void)
 {
        int i;
 
@@ -2335,7 +2335,7 @@ static void __devinit dc390_fill_with_defaults (void)
                tmscsim[5] = 180;
 }
 
-static void __devinit dc390_check_eeprom(struct pci_dev *pdev, u8 index)
+static void dc390_check_eeprom(struct pci_dev *pdev, u8 index)
 {
        u8 interpd[] = {1, 3, 5, 10, 16, 30, 60, 120};
        u8 EEbuf[128];
@@ -2372,7 +2372,7 @@ static void __devinit dc390_check_eeprom(struct pci_dev *pdev, u8 index)
        }
 }
 
-static void __devinit dc390_init_hw(struct dc390_acb *pACB, u8 index)
+static void dc390_init_hw(struct dc390_acb *pACB, u8 index)
 {
        struct Scsi_Host *shost = pACB->pScsiHost;
        u8 dstate;
@@ -2422,8 +2422,7 @@ static void __devinit dc390_init_hw(struct dc390_acb *pACB, u8 index)
        DC390_write8(DMA_Status, dstate);
 }
 
-static int __devinit dc390_probe_one(struct pci_dev *pdev,
-                                   const struct pci_device_id *id)
+static int dc390_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct dc390_acb *pACB;
        struct Scsi_Host *shost;
@@ -2532,7 +2531,7 @@ static int __devinit dc390_probe_one(struct pci_dev *pdev,
  *
  * @dev: The PCI device to remove.
  */
-static void __devexit dc390_remove_one(struct pci_dev *dev)
+static void dc390_remove_one(struct pci_dev *dev)
 {
        struct Scsi_Host *scsi_host = pci_get_drvdata(dev);
        unsigned long iflags;
@@ -2568,7 +2567,7 @@ static struct pci_driver dc390_driver = {
        .name           = "tmscsim",
        .id_table       = tmscsim_pci_tbl,
        .probe          = dc390_probe_one,
-       .remove         = __devexit_p(dc390_remove_one),
+       .remove         = dc390_remove_one,
 };
 
 static int __init dc390_module_init(void)
index 58f4ba6fe4124320a49e10e282d60e42f624adfe..91a4046ca9ba438f920b8e2b3e2a03b22ed4c682 100644 (file)
@@ -1811,8 +1811,7 @@ static int ufshcd_set_dma_mask(struct ufs_hba *hba)
  *
  * Returns 0 on success, non-zero value on failure
  */
-static int __devinit
-ufshcd_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+static int ufshcd_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct Scsi_Host *host;
        struct ufs_hba *hba;
@@ -1947,7 +1946,7 @@ static struct pci_driver ufshcd_pci_driver = {
        .name = UFSHCD,
        .id_table = ufshcd_pci_tbl,
        .probe = ufshcd_probe,
-       .remove = __devexit_p(ufshcd_remove),
+       .remove = ufshcd_remove,
        .shutdown = ufshcd_shutdown,
 #ifdef CONFIG_PM
        .suspend = ufshcd_suspend,
index 74ab67a169ec2b170cd9c92137852cfdb56e6fea..3449a1f8c656246d2a0aa6631c46d8b53f571e9f 100644 (file)
@@ -679,7 +679,7 @@ out:
        return err;
 }
 
-static int __devinit virtscsi_probe(struct virtio_device *vdev)
+static int virtscsi_probe(struct virtio_device *vdev)
 {
        struct Scsi_Host *shost;
        struct virtio_scsi *vscsi;
@@ -733,7 +733,7 @@ virtscsi_init_failed:
        return err;
 }
 
-static void __devexit virtscsi_remove(struct virtio_device *vdev)
+static void virtscsi_remove(struct virtio_device *vdev)
 {
        struct Scsi_Host *shost = virtio_scsi_host(vdev);
        struct virtio_scsi *vscsi = shost_priv(shost);
@@ -785,7 +785,7 @@ static struct virtio_driver virtio_scsi_driver = {
        .freeze = virtscsi_freeze,
        .restore = virtscsi_restore,
 #endif
-       .remove = __devexit_p(virtscsi_remove),
+       .remove = virtscsi_remove,
 };
 
 static int __init init(void)
index 20b3a483c2ccedada3a5b65f53bdd1db0f4b07cb..3bfaa66fa0d16d31610ee33ef41c9cce10031f1a 100644 (file)
@@ -397,7 +397,7 @@ static void pvscsi_unmap_buffers(const struct pvscsi_adapter *adapter,
                                 SCSI_SENSE_BUFFERSIZE, PCI_DMA_FROMDEVICE);
 }
 
-static int __devinit pvscsi_allocate_rings(struct pvscsi_adapter *adapter)
+static int pvscsi_allocate_rings(struct pvscsi_adapter *adapter)
 {
        adapter->rings_state = pci_alloc_consistent(adapter->dev, PAGE_SIZE,
                                                    &adapter->ringStatePA);
@@ -1152,7 +1152,7 @@ static void pvscsi_release_resources(struct pvscsi_adapter *adapter)
  * just use a statically allocated scatter list.
  *
  */
-static int __devinit pvscsi_allocate_sg(struct pvscsi_adapter *adapter)
+static int pvscsi_allocate_sg(struct pvscsi_adapter *adapter)
 {
        struct pvscsi_ctx *ctx;
        int i;
@@ -1233,8 +1233,7 @@ exit:
        return numPhys;
 }
 
-static int __devinit pvscsi_probe(struct pci_dev *pdev,
-                                 const struct pci_device_id *id)
+static int pvscsi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct pvscsi_adapter *adapter;
        struct Scsi_Host *host;
@@ -1454,7 +1453,7 @@ static struct pci_driver pvscsi_pci_driver = {
        .name           = "vmw_pvscsi",
        .id_table       = pvscsi_pci_tbl,
        .probe          = pvscsi_probe,
-       .remove         = __devexit_p(pvscsi_remove),
+       .remove         = pvscsi_remove,
        .shutdown       = pvscsi_shutdown,
 };
 
index 27e84e4b1fa98857d571f3abafdfe9f4b03cf7ad..97ccb0383539e42429b0ef77303cb6f032b29ed3 100644 (file)
@@ -182,7 +182,7 @@ static struct parisc_driver zalon_driver = {
        .name =         "zalon",
        .id_table =     zalon_tbl,
        .probe =        zalon_probe,
-       .remove =       __devexit_p(zalon_remove),
+       .remove =       zalon_remove,
 };
 
 static int __init zalon7xx_init(void)
index e17764d7147624045fefb50ea95c477a9b04a8a1..cbf3476c68cd3511e13592296198da53ddcc441d 100644 (file)
@@ -38,7 +38,7 @@ static struct zorro_driver_data {
        const char *name;
        unsigned long offset;
        int absolute;   /* offset is absolute address */
-} zorro7xx_driver_data[] __devinitdata = {
+} zorro7xx_driver_data[] = {
        { .name = "PowerUP 603e+", .offset = 0xf40000, .absolute = 1 },
        { .name = "WarpEngine 40xx", .offset = 0x40000 },
        { .name = "A4091", .offset = 0x800000 },
@@ -46,7 +46,7 @@ static struct zorro_driver_data {
        { 0 }
 };
 
-static struct zorro_device_id zorro7xx_zorro_tbl[] __devinitdata = {
+static struct zorro_device_id zorro7xx_zorro_tbl[] = {
        {
                .id = ZORRO_PROD_PHASE5_BLIZZARD_603E_PLUS,
                .driver_data = (unsigned long)&zorro7xx_driver_data[0],
@@ -71,8 +71,8 @@ static struct zorro_device_id zorro7xx_zorro_tbl[] __devinitdata = {
 };
 MODULE_DEVICE_TABLE(zorro, zorro7xx_zorro_tbl);
 
-static int __devinit zorro7xx_init_one(struct zorro_dev *z,
-                                      const struct zorro_device_id *ent)
+static int zorro7xx_init_one(struct zorro_dev *z,
+                            const struct zorro_device_id *ent)
 {
        struct Scsi_Host *host;
        struct NCR_700_Host_Parameters *hostdata;
@@ -150,7 +150,7 @@ static int __devinit zorro7xx_init_one(struct zorro_dev *z,
        return -ENODEV;
 }
 
-static __devexit void zorro7xx_remove_one(struct zorro_dev *z)
+static void zorro7xx_remove_one(struct zorro_dev *z)
 {
        struct Scsi_Host *host = zorro_get_drvdata(z);
        struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
@@ -167,7 +167,7 @@ static struct zorro_driver zorro7xx_driver = {
        .name     = "zorro7xx-scsi",
        .id_table = zorro7xx_zorro_tbl,
        .probe    = zorro7xx_init_one,
-       .remove   = __devexit_p(zorro7xx_remove_one),
+       .remove   = zorro7xx_remove_one,
 };
 
 static int __init zorro7xx_scsi_init(void)
index 038fa071382ac0e3c89be50977bb25b6160f58d5..6a24f07c2013b0bf4fce27384edc1e3e31ba12ee 100644 (file)
@@ -165,7 +165,7 @@ static int sh_pfc_gpio_match(struct gpio_chip *gc, void *data)
        return !!strstr(gc->label, data);
 }
 
-static int __devinit sh_pfc_gpio_probe(struct platform_device *pdev)
+static int sh_pfc_gpio_probe(struct platform_device *pdev)
 {
        struct sh_pfc_chip *chip;
        struct gpio_chip *gc;
@@ -184,7 +184,7 @@ static int __devinit sh_pfc_gpio_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit sh_pfc_gpio_remove(struct platform_device *pdev)
+static int sh_pfc_gpio_remove(struct platform_device *pdev)
 {
        struct sh_pfc_chip *chip = platform_get_drvdata(pdev);
        int ret;
@@ -199,7 +199,7 @@ static int __devexit sh_pfc_gpio_remove(struct platform_device *pdev)
 
 static struct platform_driver sh_pfc_gpio_driver = {
        .probe          = sh_pfc_gpio_probe,
-       .remove         = __devexit_p(sh_pfc_gpio_remove),
+       .remove         = sh_pfc_gpio_remove,
        .driver         = {
                .name   = KBUILD_MODNAME,
                .owner  = THIS_MODULE,
index 0646bf6e7889a10ed6e4773af378c264377d5f8b..4109b769eac034160b718a847f0bcfd83c02a2f8 100644 (file)
@@ -328,10 +328,10 @@ static struct pinctrl_desc sh_pfc_pinctrl_desc = {
        .confops        = &sh_pfc_pinconf_ops,
 };
 
-static inline void __devinit sh_pfc_map_one_gpio(struct sh_pfc *pfc,
-                                                struct sh_pfc_pinctrl *pmx,
-                                                struct pinmux_gpio *gpio,
-                                                unsigned offset)
+static inline void sh_pfc_map_one_gpio(struct sh_pfc *pfc,
+                                      struct sh_pfc_pinctrl *pmx,
+                                      struct pinmux_gpio *gpio,
+                                      unsigned offset)
 {
        struct pinmux_data_reg *dummy;
        unsigned long flags;
@@ -351,8 +351,7 @@ static inline void __devinit sh_pfc_map_one_gpio(struct sh_pfc *pfc,
 }
 
 /* pinmux ranges -> pinctrl pin descs */
-static int __devinit sh_pfc_map_gpios(struct sh_pfc *pfc,
-                                     struct sh_pfc_pinctrl *pmx)
+static int sh_pfc_map_gpios(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
 {
        unsigned long flags;
        int i;
@@ -396,8 +395,7 @@ static int __devinit sh_pfc_map_gpios(struct sh_pfc *pfc,
        return 0;
 }
 
-static int __devinit sh_pfc_map_functions(struct sh_pfc *pfc,
-                                         struct sh_pfc_pinctrl *pmx)
+static int sh_pfc_map_functions(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
 {
        unsigned long flags;
        int i, fn;
@@ -421,7 +419,7 @@ static int __devinit sh_pfc_map_functions(struct sh_pfc *pfc,
        return 0;
 }
 
-static int __devinit sh_pfc_pinctrl_probe(struct platform_device *pdev)
+static int sh_pfc_pinctrl_probe(struct platform_device *pdev)
 {
        struct sh_pfc *pfc;
        int ret;
@@ -465,7 +463,7 @@ free_pads:
        return ret;
 }
 
-static int __devexit sh_pfc_pinctrl_remove(struct platform_device *pdev)
+static int sh_pfc_pinctrl_remove(struct platform_device *pdev)
 {
        struct sh_pfc_pinctrl *pmx = platform_get_drvdata(pdev);
 
@@ -482,7 +480,7 @@ static int __devexit sh_pfc_pinctrl_remove(struct platform_device *pdev)
 
 static struct platform_driver sh_pfc_pinctrl_driver = {
        .probe          = sh_pfc_pinctrl_probe,
-       .remove         = __devexit_p(sh_pfc_pinctrl_remove),
+       .remove         = sh_pfc_pinctrl_remove,
        .driver         = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
index b3b33fa26acda7bb99483341980f47bed9e6a213..fb7ea0d9a734dad8de9cbc66c6a80c7bab958b23 100644 (file)
@@ -575,11 +575,10 @@ void ioc3_unregister_submodule(struct ioc3_submodule *is)
  * Device management *
  *********************/
 
-static char * __devinitdata
-ioc3_class_names[]={"unknown", "IP27 BaseIO", "IP30 system", "MENET 1/2/3",
-                       "MENET 4", "CADduo", "Altix Serial"};
+static char *ioc3_class_names[] = { "unknown", "IP27 BaseIO", "IP30 system",
+                       "MENET 1/2/3", "MENET 4", "CADduo", "Altix Serial" };
 
-static int __devinit ioc3_class(struct ioc3_driver_data *idd)
+static int ioc3_class(struct ioc3_driver_data *idd)
 {
        int res = IOC3_CLASS_NONE;
        /* NIC-based logic */
@@ -602,8 +601,7 @@ static int __devinit ioc3_class(struct ioc3_driver_data *idd)
        return res;
 }
 /* Adds a new instance of an IOC3 card */
-static int __devinit
-ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
+static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
 {
        struct ioc3_driver_data *idd;
        uint32_t pcmd;
@@ -755,7 +753,7 @@ out:
 }
 
 /* Removes a particular instance of an IOC3 card. */
-static void __devexit ioc3_remove(struct pci_dev *pdev)
+static void ioc3_remove(struct pci_dev *pdev)
 {
        int id;
        struct ioc3_driver_data *idd;
@@ -807,7 +805,7 @@ static struct pci_driver ioc3_driver = {
        .name = "IOC3",
        .id_table = ioc3_id_table,
        .probe = ioc3_probe,
-       .remove = __devexit_p(ioc3_remove),
+       .remove = ioc3_remove,
 };
 
 MODULE_DEVICE_TABLE(pci, ioc3_id_table);
index ff3c8a21f10d90397dc9fda07b99dcfb08ebc9b9..5d6f2ec1c705f4ede0ced96ca75efdf8495879d6 100644 (file)
@@ -162,8 +162,7 @@ config SSB_DRIVER_GIGE
 
 config SSB_DRIVER_GPIO
        bool "SSB GPIO driver"
-       depends on SSB
-       select GPIOLIB
+       depends on SSB && GPIOLIB
        help
          Driver to provide access to the GPIO pins on the bus.
 
index f30ea689933a8be5608c1a0cc331b075a10051fd..21f71a1581fa6cefcd3e055e4001aa259ee92729 100644 (file)
@@ -107,9 +107,8 @@ void gige_pcicfg_write32(struct ssb_gige *dev,
        gige_write32(dev, SSB_GIGE_PCICFG + offset, value);
 }
 
-static int __devinit ssb_gige_pci_read_config(struct pci_bus *bus,
-                                             unsigned int devfn, int reg,
-                                             int size, u32 *val)
+static int ssb_gige_pci_read_config(struct pci_bus *bus, unsigned int devfn,
+                                   int reg, int size, u32 *val)
 {
        struct ssb_gige *dev = container_of(bus->ops, struct ssb_gige, pci_ops);
        unsigned long flags;
@@ -138,9 +137,8 @@ static int __devinit ssb_gige_pci_read_config(struct pci_bus *bus,
        return PCIBIOS_SUCCESSFUL;
 }
 
-static int __devinit ssb_gige_pci_write_config(struct pci_bus *bus,
-                                              unsigned int devfn, int reg,
-                                              int size, u32 val)
+static int ssb_gige_pci_write_config(struct pci_bus *bus, unsigned int devfn,
+                                    int reg, int size, u32 val)
 {
        struct ssb_gige *dev = container_of(bus->ops, struct ssb_gige, pci_ops);
        unsigned long flags;
@@ -169,8 +167,8 @@ static int __devinit ssb_gige_pci_write_config(struct pci_bus *bus,
        return PCIBIOS_SUCCESSFUL;
 }
 
-static int __devinit ssb_gige_probe(struct ssb_device *sdev,
-                                   const struct ssb_device_id *id)
+static int ssb_gige_probe(struct ssb_device *sdev,
+                         const struct ssb_device_id *id)
 {
        struct ssb_gige *dev;
        u32 base, tmslow, tmshigh;
index 49d209173f55b1de99e306dc105c7ebd5e52c1b5..59801d23d7ec13624010be83c11ce5fd0f80a6c6 100644 (file)
@@ -315,7 +315,7 @@ int ssb_pcicore_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
        return ssb_mips_irq(extpci_core->dev) + 2;
 }
 
-static void __devinit ssb_pcicore_init_hostmode(struct ssb_pcicore *pc)
+static void ssb_pcicore_init_hostmode(struct ssb_pcicore *pc)
 {
        u32 val;
 
@@ -380,7 +380,7 @@ static void __devinit ssb_pcicore_init_hostmode(struct ssb_pcicore *pc)
        register_pci_controller(&ssb_pcicore_controller);
 }
 
-static int __devinit pcicore_is_in_hostmode(struct ssb_pcicore *pc)
+static int pcicore_is_in_hostmode(struct ssb_pcicore *pc)
 {
        struct ssb_bus *bus = pc->dev->bus;
        u16 chipid_top;
@@ -413,7 +413,7 @@ static int __devinit pcicore_is_in_hostmode(struct ssb_pcicore *pc)
  * Workarounds.
  **************************************************/
 
-static void __devinit ssb_pcicore_fix_sprom_core_index(struct ssb_pcicore *pc)
+static void ssb_pcicore_fix_sprom_core_index(struct ssb_pcicore *pc)
 {
        u16 tmp = pcicore_read16(pc, SSB_PCICORE_SPROM(0));
        if (((tmp & 0xF000) >> 12) != pc->dev->core_index) {
@@ -515,7 +515,7 @@ static void ssb_pcicore_pcie_setup_workarounds(struct ssb_pcicore *pc)
  * Generic and Clientmode operation code.
  **************************************************/
 
-static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc)
+static void ssb_pcicore_init_clientmode(struct ssb_pcicore *pc)
 {
        struct ssb_device *pdev = pc->dev;
        struct ssb_bus *bus = pdev->bus;
@@ -534,7 +534,7 @@ static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc)
        }
 }
 
-void __devinit ssb_pcicore_init(struct ssb_pcicore *pc)
+void ssb_pcicore_init(struct ssb_pcicore *pc)
 {
        struct ssb_device *dev = pc->dev;
 
index c82c5c95fe85022180971af93139b8fc33416c50..772ad9b5c304fc986b459c4f4c6c5513e70ecd16 100644 (file)
@@ -548,7 +548,7 @@ error:
 }
 
 /* Needs ssb_buses_lock() */
-static int __devinit ssb_attach_queued_buses(void)
+static int ssb_attach_queued_buses(void)
 {
        struct ssb_bus *bus, *n;
        int err = 0;
@@ -761,9 +761,9 @@ out:
        return err;
 }
 
-static int __devinit ssb_bus_register(struct ssb_bus *bus,
-                                     ssb_invariants_func_t get_invariants,
-                                     unsigned long baseaddr)
+static int ssb_bus_register(struct ssb_bus *bus,
+                           ssb_invariants_func_t get_invariants,
+                           unsigned long baseaddr)
 {
        int err;
 
@@ -851,8 +851,7 @@ err_disable_xtal:
 }
 
 #ifdef CONFIG_SSB_PCIHOST
-int __devinit ssb_bus_pcibus_register(struct ssb_bus *bus,
-                                     struct pci_dev *host_pci)
+int ssb_bus_pcibus_register(struct ssb_bus *bus, struct pci_dev *host_pci)
 {
        int err;
 
@@ -875,9 +874,9 @@ EXPORT_SYMBOL(ssb_bus_pcibus_register);
 #endif /* CONFIG_SSB_PCIHOST */
 
 #ifdef CONFIG_SSB_PCMCIAHOST
-int __devinit ssb_bus_pcmciabus_register(struct ssb_bus *bus,
-                                        struct pcmcia_device *pcmcia_dev,
-                                        unsigned long baseaddr)
+int ssb_bus_pcmciabus_register(struct ssb_bus *bus,
+                              struct pcmcia_device *pcmcia_dev,
+                              unsigned long baseaddr)
 {
        int err;
 
@@ -897,9 +896,8 @@ EXPORT_SYMBOL(ssb_bus_pcmciabus_register);
 #endif /* CONFIG_SSB_PCMCIAHOST */
 
 #ifdef CONFIG_SSB_SDIOHOST
-int __devinit ssb_bus_sdiobus_register(struct ssb_bus *bus,
-                                      struct sdio_func *func,
-                                      unsigned int quirks)
+int ssb_bus_sdiobus_register(struct ssb_bus *bus, struct sdio_func *func,
+                            unsigned int quirks)
 {
        int err;
 
@@ -919,9 +917,8 @@ int __devinit ssb_bus_sdiobus_register(struct ssb_bus *bus,
 EXPORT_SYMBOL(ssb_bus_sdiobus_register);
 #endif /* CONFIG_SSB_PCMCIAHOST */
 
-int __devinit ssb_bus_ssbbus_register(struct ssb_bus *bus,
-                                     unsigned long baseaddr,
-                                     ssb_invariants_func_t get_invariants)
+int ssb_bus_ssbbus_register(struct ssb_bus *bus, unsigned long baseaddr,
+                           ssb_invariants_func_t get_invariants)
 {
        int err;
 
index af5448f5e2d2242b86fff652fe58c0f8d3219b67..32ed1fa4a82eae28cad87ea0eeb77333dbe7b8e2 100644 (file)
@@ -54,8 +54,8 @@ static int ssb_pcihost_resume(struct pci_dev *dev)
 # define ssb_pcihost_resume    NULL
 #endif /* CONFIG_PM */
 
-static int __devinit ssb_pcihost_probe(struct pci_dev *dev,
-                                      const struct pci_device_id *id)
+static int ssb_pcihost_probe(struct pci_dev *dev,
+                            const struct pci_device_id *id)
 {
        struct ssb_bus *ssb;
        int err = -ENOMEM;
@@ -111,7 +111,7 @@ static void ssb_pcihost_remove(struct pci_dev *dev)
        pci_set_drvdata(dev, NULL);
 }
 
-int __devinit ssb_pcihost_register(struct pci_driver *driver)
+int ssb_pcihost_register(struct pci_driver *driver)
 {
        driver->probe = ssb_pcihost_probe;
        driver->remove = ssb_pcihost_remove;
index 7de2a10213bd9d49294daa57430992e6934168ea..36eec320569c6bd14d077be6328b34ae4fede36f 100644 (file)
@@ -444,6 +444,7 @@ config COMEDI_ADQ12B
 
 config COMEDI_NI_AT_A2150
        tristate "NI AT-A2150 ISA card support"
+       select COMEDI_FC
        depends on VIRT_TO_BUS
        ---help---
          Enable support for National Instruments AT-A2150 cards
index b7bba1790a20005bbb955c50ba9a142a1480ac51..9b038e4a7e711eea1b5bd3873706847b701de2fe 100644 (file)
@@ -1549,6 +1549,9 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd,
        if (cmd == COMEDI_DEVCONFIG) {
                rc = do_devconfig_ioctl(dev,
                                        (struct comedi_devconfig __user *)arg);
+               if (rc == 0)
+                       /* Evade comedi_auto_unconfig(). */
+                       dev_file_info->hardware_device = NULL;
                goto done;
        }
 
index fb3d09323ba145c2460408971459ee29f39bd63b..01de996239f1e6142f07f9851cc840e8ddc14a75 100644 (file)
@@ -345,7 +345,7 @@ static int waveform_ai_cancel(struct comedi_device *dev,
        struct waveform_private *devpriv = dev->private;
 
        devpriv->timer_running = 0;
-       del_timer(&devpriv->timer);
+       del_timer_sync(&devpriv->timer);
        return 0;
 }
 
index aaac0b2cc9eb7172ab963aa361e8d7e828ceb751..fd1662b4175db8755b8c605ed90f08437c12ba4c 100644 (file)
@@ -963,7 +963,7 @@ static const struct ni_board_struct ni_boards[] = {
         .ao_range_table = &range_ni_M_625x_ao,
         .reg_type = ni_reg_625x,
         .ao_unipolar = 0,
-        .ao_speed = 357,
+        .ao_speed = 350,
         .num_p0_dio_channels = 8,
         .caldac = {caldac_none},
         .has_8255 = 0,
@@ -982,7 +982,7 @@ static const struct ni_board_struct ni_boards[] = {
         .ao_range_table = &range_ni_M_625x_ao,
         .reg_type = ni_reg_625x,
         .ao_unipolar = 0,
-        .ao_speed = 357,
+        .ao_speed = 350,
         .num_p0_dio_channels = 8,
         .caldac = {caldac_none},
         .has_8255 = 0,
@@ -1001,7 +1001,7 @@ static const struct ni_board_struct ni_boards[] = {
         .ao_range_table = &range_ni_M_625x_ao,
         .reg_type = ni_reg_625x,
         .ao_unipolar = 0,
-        .ao_speed = 357,
+        .ao_speed = 350,
         .num_p0_dio_channels = 8,
         .caldac = {caldac_none},
         .has_8255 = 0,
@@ -1037,7 +1037,7 @@ static const struct ni_board_struct ni_boards[] = {
         .ao_range_table = &range_ni_M_625x_ao,
         .reg_type = ni_reg_625x,
         .ao_unipolar = 0,
-        .ao_speed = 357,
+        .ao_speed = 350,
         .num_p0_dio_channels = 32,
         .caldac = {caldac_none},
         .has_8255 = 0,
@@ -1056,7 +1056,7 @@ static const struct ni_board_struct ni_boards[] = {
         .ao_range_table = &range_ni_M_625x_ao,
         .reg_type = ni_reg_625x,
         .ao_unipolar = 0,
-        .ao_speed = 357,
+        .ao_speed = 350,
         .num_p0_dio_channels = 32,
         .caldac = {caldac_none},
         .has_8255 = 0,
@@ -1092,7 +1092,7 @@ static const struct ni_board_struct ni_boards[] = {
         .ao_range_table = &range_ni_M_628x_ao,
         .reg_type = ni_reg_628x,
         .ao_unipolar = 1,
-        .ao_speed = 357,
+        .ao_speed = 350,
         .num_p0_dio_channels = 8,
         .caldac = {caldac_none},
         .has_8255 = 0,
@@ -1111,7 +1111,7 @@ static const struct ni_board_struct ni_boards[] = {
         .ao_range_table = &range_ni_M_628x_ao,
         .reg_type = ni_reg_628x,
         .ao_unipolar = 1,
-        .ao_speed = 357,
+        .ao_speed = 350,
         .num_p0_dio_channels = 8,
         .caldac = {caldac_none},
         .has_8255 = 0,
@@ -1147,7 +1147,7 @@ static const struct ni_board_struct ni_boards[] = {
         .ao_range_table = &range_ni_M_628x_ao,
         .reg_type = ni_reg_628x,
         .ao_unipolar = 1,
-        .ao_speed = 357,
+        .ao_speed = 350,
         .num_p0_dio_channels = 32,
         .caldac = {caldac_none},
         .has_8255 = 0,
index f15059ca37814806b6072469aad4340d3ebcfd42..a0a30b3f2dcd3d6978653dc9cfcd0296e9e590dc 100644 (file)
@@ -3917,7 +3917,7 @@ static int et131x_mii_probe(struct net_device *netdev)
        }
 
        phydev = phy_connect(netdev, dev_name(&phydev->dev),
-                       &et131x_adjust_link, 0, PHY_INTERFACE_MODE_MII);
+                            &et131x_adjust_link, PHY_INTERFACE_MODE_MII);
 
        if (IS_ERR(phydev)) {
                dev_err(&adapter->pdev->dev, "Could not attach to PHY\n");
index 580406cb1808e55b201aafad0611f62ed536744f..b2f8331e4acf90005887a7f1e5947d0c7b560aea 100644 (file)
@@ -3,7 +3,9 @@ config FIREWIRE_SERIAL
        depends on FIREWIRE
        help
           This enables TTY over IEEE 1394, providing high-speed serial
-         connectivity to cabled peers.
+         connectivity to cabled peers. This driver implements a
+         ad-hoc transport protocol and is currently limited to
+         Linux-to-Linux communication.
 
          To compile this driver as a module, say M here:  the module will
          be called firewire-serial.
index 726900548eae5c8136861588d4bce475cd9349b4..8dae8fb252233905b380927218cb80b8bb96e4cc 100644 (file)
@@ -1,5 +1,5 @@
-TODOs
------
+TODOs prior to this driver moving out of staging
+------------------------------------------------
 1. Implement retries for RCODE_BUSY, RCODE_NO_ACK and RCODE_SEND_ERROR
    - I/O is handled asynchronously which presents some issues when error
      conditions occur.
@@ -11,17 +11,9 @@ TODOs
 -- Issues with firewire stack --
 1. This driver uses the same unregistered vendor id that the firewire core does
      (0xd00d1e). Perhaps this could be exposed as a define in
-     firewire-constants.h?
-2. MAX_ASYNC_PAYLOAD needs to be publicly exposed by core/ohci
-   - otherwise how will this driver know the max size of address window to
-     open for one packet write?
+     firewire.h?
 3. Maybe device_max_receive() and link_speed_to_max_payload() should be
      taken up by the firewire core?
-4. To avoid dropping rx data while still limiting the maximum buffering,
-     the size of the AR context must be known. How to expose this to drivers?
-5. Explore if bigger AR context will reduce RCODE_BUSY responses
-   (or auto-grow to certain max size -- but this would require major surgery
-    as the current AR is contiguously mapped)
 
 -- Issues with TTY core --
   1. Hack for alternate device name scheme
index 61ee29083b268ece51870b1c80c60035acd4fa55..d03a7f57e8d475ceddedb052d42b3077c2a7745d 100644 (file)
@@ -179,7 +179,7 @@ static void dump_profile(struct seq_file *m, struct stats *stats)
 /* Returns the max receive packet size for the given card */
 static inline int device_max_receive(struct fw_device *fw_device)
 {
-       return 1 <<  (clamp_t(int, fw_device->max_rec, 8U, 13U) + 1);
+       return 1 <<  (clamp_t(int, fw_device->max_rec, 8U, 11U) + 1);
 }
 
 static void fwtty_log_tx_error(struct fwtty_port *port, int rcode)
index 8b572edf95634264ce5897938b1bc279a618c243..caa1c1ea82d5f783782efd263f2f60500a68062b 100644 (file)
@@ -374,10 +374,10 @@ static inline void fwtty_bind_console(struct fwtty_port *port,
  */
 static inline int link_speed_to_max_payload(unsigned speed)
 {
-       static const int max_async[] = { 307, 614, 1229, 2458, 4916, 9832, };
-       BUILD_BUG_ON(ARRAY_SIZE(max_async) - 1 != SCODE_3200);
+       static const int max_async[] = { 307, 614, 1229, 2458, };
+       BUILD_BUG_ON(ARRAY_SIZE(max_async) - 1 != SCODE_800);
 
-       speed = clamp(speed, (unsigned) SCODE_100, (unsigned) SCODE_3200);
+       speed = clamp(speed, (unsigned) SCODE_100, (unsigned) SCODE_800);
        if (limit_bw)
                return max_async[speed];
        else
index ea295b25308c470525e9213ad039c46eadc95ca5..87979a0d03a91358d1e892ed133292f855bfad3e 100644 (file)
@@ -27,8 +27,8 @@ config ADIS16130
 config ADIS16260
        tristate "Analog Devices ADIS16260 Digital Gyroscope Sensor SPI driver"
        depends on SPI
-       select IIO_TRIGGER if IIO_BUFFER
-       select IIO_SW_RING if IIO_BUFFER
+       select IIO_ADIS_LIB
+       select IIO_ADIS_LIB_BUFFER if IIO_BUFFER
        help
          Say yes here to build support for Analog Devices ADIS16260 ADIS16265
          ADIS16250 ADIS16255 and ADIS16251 programmable digital gyroscope sensors.
index ecf0f44bc70e1daf8dc4133d5d1a56e251560e8e..cec19f1cf56cb261ae5dc4782d266022813e6c15 100644 (file)
@@ -584,7 +584,6 @@ int imx_drm_add_encoder(struct drm_encoder *encoder,
 
        ret = imx_drm_encoder_register(imx_drm_encoder);
        if (ret) {
-               kfree(imx_drm_encoder);
                ret = -ENOMEM;
                goto err_register;
        }
index 677e665ca86d62dc764db90ca7205385cd2166c2..f7059cddd7fdb2da864ff19975d4ca99fbb0664f 100644 (file)
@@ -1104,7 +1104,9 @@ static int ipu_probe(struct platform_device *pdev)
        if (ret)
                goto out_failed_irq;
 
-       ipu_reset(ipu);
+       ret = ipu_reset(ipu);
+       if (ret)
+               goto out_failed_reset;
 
        /* Set MCU_T to divide MCU access window into 2 */
        ipu_cm_write(ipu, 0x00400000L | (IPU_MCU_T_DEFAULT << 18),
@@ -1129,6 +1131,7 @@ failed_add_clients:
        ipu_submodules_exit(ipu);
 failed_submodules_init:
        ipu_irq_exit(ipu);
+out_failed_reset:
 out_failed_irq:
        clk_disable_unprepare(ipu->clk);
 failed_clk_get:
index 1892006526b52fbf85eb19ca8e943db1b96615da..4b3a019409b5793632efa538cdcf65e0030f217f 100644 (file)
@@ -452,7 +452,7 @@ static int ipu_get_resources(struct ipu_crtc *ipu_crtc,
        int ret;
 
        ipu_crtc->ipu_ch = ipu_idmac_get(ipu, pdata->dma[0]);
-       if (IS_ERR_OR_NULL(ipu_crtc->ipu_ch)) {
+       if (IS_ERR(ipu_crtc->ipu_ch)) {
                ret = PTR_ERR(ipu_crtc->ipu_ch);
                goto err_out;
        }
@@ -472,7 +472,7 @@ static int ipu_get_resources(struct ipu_crtc *ipu_crtc,
        if (pdata->dp >= 0) {
                ipu_crtc->dp = ipu_dp_get(ipu, pdata->dp);
                if (IS_ERR(ipu_crtc->dp)) {
-                       ret = PTR_ERR(ipu_crtc->ipu_ch);
+                       ret = PTR_ERR(ipu_crtc->dp);
                        goto err_out;
                }
        }
@@ -548,6 +548,8 @@ static int ipu_drm_probe(struct platform_device *pdev)
        ipu_crtc->dev = &pdev->dev;
 
        ret = ipu_crtc_init(ipu_crtc, pdata);
+       if (ret)
+               return ret;
 
        platform_set_drvdata(pdev, ipu_crtc);
 
index 1ca0e0016de424b249219b178dcb9ee71654fd06..d85e058f2845a014c0216cabeda52d70cc7bf0b6 100644 (file)
@@ -5,6 +5,7 @@
 
 ccflags-y := -Iinclude/drm -Werror
 omapdrm-y := omap_drv.o \
+       omap_irq.o \
        omap_debugfs.o \
        omap_crtc.o \
        omap_plane.o \
index 938c7888ca319ae1d82e566b086ab1e9abf133a2..abeeb00aaa12ca758c4c3c085b170ffe709fc5af 100644 (file)
@@ -17,9 +17,6 @@ TODO
 . Revisit GEM sync object infrastructure.. TTM has some framework for this
   already.  Possibly this could be refactored out and made more common?
   There should be some way to do this with less wheel-reinvention.
-. Review DSS vs KMS mismatches.  The omap_dss_device is sort of part encoder,
-  part connector.  Which results in a bit of duct tape to fwd calls from
-  encoder to connector.  Possibly this could be done a bit better.
 . Solve PM sequencing on resume.  DMM/TILER must be reloaded before any
   access is made from any component in the system.  Which means on suspend
   CRTC's should be disabled, and on resume the LUT should be reprogrammed
index 91edb3f9697292961883ca5876f4ab520b27ed6a..4cc9ee733c5fb4a80c656ad978ca6a349e07b8dc 100644 (file)
 struct omap_connector {
        struct drm_connector base;
        struct omap_dss_device *dssdev;
+       struct drm_encoder *encoder;
 };
 
-static inline void copy_timings_omap_to_drm(struct drm_display_mode *mode,
+void copy_timings_omap_to_drm(struct drm_display_mode *mode,
                struct omap_video_timings *timings)
 {
        mode->clock = timings->pixel_clock;
@@ -64,7 +65,7 @@ static inline void copy_timings_omap_to_drm(struct drm_display_mode *mode,
                mode->flags |= DRM_MODE_FLAG_NVSYNC;
 }
 
-static inline void copy_timings_drm_to_omap(struct omap_video_timings *timings,
+void copy_timings_drm_to_omap(struct omap_video_timings *timings,
                struct drm_display_mode *mode)
 {
        timings->pixel_clock = mode->clock;
@@ -96,48 +97,7 @@ static inline void copy_timings_drm_to_omap(struct omap_video_timings *timings,
        timings->sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES;
 }
 
-static void omap_connector_dpms(struct drm_connector *connector, int mode)
-{
-       struct omap_connector *omap_connector = to_omap_connector(connector);
-       struct omap_dss_device *dssdev = omap_connector->dssdev;
-       int old_dpms;
-
-       DBG("%s: %d", dssdev->name, mode);
-
-       old_dpms = connector->dpms;
-
-       /* from off to on, do from crtc to connector */
-       if (mode < old_dpms)
-               drm_helper_connector_dpms(connector, mode);
-
-       if (mode == DRM_MODE_DPMS_ON) {
-               /* store resume info for suspended displays */
-               switch (dssdev->state) {
-               case OMAP_DSS_DISPLAY_SUSPENDED:
-                       dssdev->activate_after_resume = true;
-                       break;
-               case OMAP_DSS_DISPLAY_DISABLED: {
-                       int ret = dssdev->driver->enable(dssdev);
-                       if (ret) {
-                               DBG("%s: failed to enable: %d",
-                                               dssdev->name, ret);
-                               dssdev->driver->disable(dssdev);
-                       }
-                       break;
-               }
-               default:
-                       break;
-               }
-       } else {
-               /* TODO */
-       }
-
-       /* from on to off, do from connector to crtc */
-       if (mode > old_dpms)
-               drm_helper_connector_dpms(connector, mode);
-}
-
-enum drm_connector_status omap_connector_detect(
+static enum drm_connector_status omap_connector_detect(
                struct drm_connector *connector, bool force)
 {
        struct omap_connector *omap_connector = to_omap_connector(connector);
@@ -164,8 +124,6 @@ static void omap_connector_destroy(struct drm_connector *connector)
        struct omap_connector *omap_connector = to_omap_connector(connector);
        struct omap_dss_device *dssdev = omap_connector->dssdev;
 
-       dssdev->driver->disable(dssdev);
-
        DBG("%s", omap_connector->dssdev->name);
        drm_sysfs_connector_remove(connector);
        drm_connector_cleanup(connector);
@@ -261,36 +219,12 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
 struct drm_encoder *omap_connector_attached_encoder(
                struct drm_connector *connector)
 {
-       int i;
        struct omap_connector *omap_connector = to_omap_connector(connector);
-
-       for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
-               struct drm_mode_object *obj;
-
-               if (connector->encoder_ids[i] == 0)
-                       break;
-
-               obj = drm_mode_object_find(connector->dev,
-                               connector->encoder_ids[i],
-                               DRM_MODE_OBJECT_ENCODER);
-
-               if (obj) {
-                       struct drm_encoder *encoder = obj_to_encoder(obj);
-                       struct omap_overlay_manager *mgr =
-                                       omap_encoder_get_manager(encoder);
-                       DBG("%s: found %s", omap_connector->dssdev->name,
-                                       mgr->name);
-                       return encoder;
-               }
-       }
-
-       DBG("%s: no encoder", omap_connector->dssdev->name);
-
-       return NULL;
+       return omap_connector->encoder;
 }
 
 static const struct drm_connector_funcs omap_connector_funcs = {
-       .dpms = omap_connector_dpms,
+       .dpms = drm_helper_connector_dpms,
        .detect = omap_connector_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .destroy = omap_connector_destroy,
@@ -302,34 +236,6 @@ static const struct drm_connector_helper_funcs omap_connector_helper_funcs = {
        .best_encoder = omap_connector_attached_encoder,
 };
 
-/* called from encoder when mode is set, to propagate settings to the dssdev */
-void omap_connector_mode_set(struct drm_connector *connector,
-               struct drm_display_mode *mode)
-{
-       struct drm_device *dev = connector->dev;
-       struct omap_connector *omap_connector = to_omap_connector(connector);
-       struct omap_dss_device *dssdev = omap_connector->dssdev;
-       struct omap_dss_driver *dssdrv = dssdev->driver;
-       struct omap_video_timings timings = {0};
-
-       copy_timings_drm_to_omap(&timings, mode);
-
-       DBG("%s: set mode: %d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x",
-                       omap_connector->dssdev->name,
-                       mode->base.id, mode->name, mode->vrefresh, mode->clock,
-                       mode->hdisplay, mode->hsync_start,
-                       mode->hsync_end, mode->htotal,
-                       mode->vdisplay, mode->vsync_start,
-                       mode->vsync_end, mode->vtotal, mode->type, mode->flags);
-
-       if (dssdrv->check_timings(dssdev, &timings)) {
-               dev_err(dev->dev, "could not set timings\n");
-               return;
-       }
-
-       dssdrv->set_timings(dssdev, &timings);
-}
-
 /* flush an area of the framebuffer (in case of manual update display that
  * is not automatically flushed)
  */
@@ -344,7 +250,8 @@ void omap_connector_flush(struct drm_connector *connector,
 
 /* initialize connector */
 struct drm_connector *omap_connector_init(struct drm_device *dev,
-               int connector_type, struct omap_dss_device *dssdev)
+               int connector_type, struct omap_dss_device *dssdev,
+               struct drm_encoder *encoder)
 {
        struct drm_connector *connector = NULL;
        struct omap_connector *omap_connector;
@@ -360,6 +267,8 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
        }
 
        omap_connector->dssdev = dssdev;
+       omap_connector->encoder = encoder;
+
        connector = &omap_connector->base;
 
        drm_connector_init(dev, connector, &omap_connector_funcs,
index d87bd84257bd7542c6175964e3f5510822958a51..5c6ed6040eff572a384659561e1fdbaf427c883c 100644 (file)
 struct omap_crtc {
        struct drm_crtc base;
        struct drm_plane *plane;
+
        const char *name;
-       int id;
+       int pipe;
+       enum omap_channel channel;
+       struct omap_overlay_manager_info info;
+
+       /*
+        * Temporary: eventually this will go away, but it is needed
+        * for now to keep the output's happy.  (They only need
+        * mgr->id.)  Eventually this will be replaced w/ something
+        * more common-panel-framework-y
+        */
+       struct omap_overlay_manager mgr;
+
+       struct omap_video_timings timings;
+       bool enabled;
+       bool full_update;
+
+       struct omap_drm_apply apply;
+
+       struct omap_drm_irq apply_irq;
+       struct omap_drm_irq error_irq;
+
+       /* list of in-progress apply's: */
+       struct list_head pending_applies;
+
+       /* list of queued apply's: */
+       struct list_head queued_applies;
+
+       /* for handling queued and in-progress applies: */
+       struct work_struct apply_work;
 
        /* if there is a pending flip, these will be non-null: */
        struct drm_pending_vblank_event *event;
        struct drm_framebuffer *old_fb;
+
+       /* for handling page flips without caring about what
+        * the callback is called from.  Possibly we should just
+        * make omap_gem always call the cb from the worker so
+        * we don't have to care about this..
+        *
+        * XXX maybe fold into apply_work??
+        */
+       struct work_struct page_flip_work;
+};
+
+/*
+ * Manager-ops, callbacks from output when they need to configure
+ * the upstream part of the video pipe.
+ *
+ * Most of these we can ignore until we add support for command-mode
+ * panels.. for video-mode the crtc-helpers already do an adequate
+ * job of sequencing the setup of the video pipe in the proper order
+ */
+
+/* we can probably ignore these until we support command-mode panels: */
+static void omap_crtc_start_update(struct omap_overlay_manager *mgr)
+{
+}
+
+static int omap_crtc_enable(struct omap_overlay_manager *mgr)
+{
+       return 0;
+}
+
+static void omap_crtc_disable(struct omap_overlay_manager *mgr)
+{
+}
+
+static void omap_crtc_set_timings(struct omap_overlay_manager *mgr,
+               const struct omap_video_timings *timings)
+{
+       struct omap_crtc *omap_crtc = container_of(mgr, struct omap_crtc, mgr);
+       DBG("%s", omap_crtc->name);
+       omap_crtc->timings = *timings;
+       omap_crtc->full_update = true;
+}
+
+static void omap_crtc_set_lcd_config(struct omap_overlay_manager *mgr,
+               const struct dss_lcd_mgr_config *config)
+{
+       struct omap_crtc *omap_crtc = container_of(mgr, struct omap_crtc, mgr);
+       DBG("%s", omap_crtc->name);
+       dispc_mgr_set_lcd_config(omap_crtc->channel, config);
+}
+
+static int omap_crtc_register_framedone_handler(
+               struct omap_overlay_manager *mgr,
+               void (*handler)(void *), void *data)
+{
+       return 0;
+}
+
+static void omap_crtc_unregister_framedone_handler(
+               struct omap_overlay_manager *mgr,
+               void (*handler)(void *), void *data)
+{
+}
+
+static const struct dss_mgr_ops mgr_ops = {
+               .start_update = omap_crtc_start_update,
+               .enable = omap_crtc_enable,
+               .disable = omap_crtc_disable,
+               .set_timings = omap_crtc_set_timings,
+               .set_lcd_config = omap_crtc_set_lcd_config,
+               .register_framedone_handler = omap_crtc_register_framedone_handler,
+               .unregister_framedone_handler = omap_crtc_unregister_framedone_handler,
 };
 
+/*
+ * CRTC funcs:
+ */
+
 static void omap_crtc_destroy(struct drm_crtc *crtc)
 {
        struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+
+       DBG("%s", omap_crtc->name);
+
+       WARN_ON(omap_crtc->apply_irq.registered);
+       omap_irq_unregister(crtc->dev, &omap_crtc->error_irq);
+
        omap_crtc->plane->funcs->destroy(omap_crtc->plane);
        drm_crtc_cleanup(crtc);
+
        kfree(omap_crtc);
 }
 
@@ -48,14 +160,25 @@ static void omap_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
        struct omap_drm_private *priv = crtc->dev->dev_private;
        struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+       bool enabled = (mode == DRM_MODE_DPMS_ON);
        int i;
 
-       WARN_ON(omap_plane_dpms(omap_crtc->plane, mode));
+       DBG("%s: %d", omap_crtc->name, mode);
+
+       if (enabled != omap_crtc->enabled) {
+               omap_crtc->enabled = enabled;
+               omap_crtc->full_update = true;
+               omap_crtc_apply(crtc, &omap_crtc->apply);
 
-       for (i = 0; i < priv->num_planes; i++) {
-               struct drm_plane *plane = priv->planes[i];
-               if (plane->crtc == crtc)
-                       WARN_ON(omap_plane_dpms(plane, mode));
+               /* also enable our private plane: */
+               WARN_ON(omap_plane_dpms(omap_crtc->plane, mode));
+
+               /* and any attached overlay planes: */
+               for (i = 0; i < priv->num_planes; i++) {
+                       struct drm_plane *plane = priv->planes[i];
+                       if (plane->crtc == crtc)
+                               WARN_ON(omap_plane_dpms(plane, mode));
+               }
        }
 }
 
@@ -73,12 +196,26 @@ static int omap_crtc_mode_set(struct drm_crtc *crtc,
                struct drm_framebuffer *old_fb)
 {
        struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
-       struct drm_plane *plane = omap_crtc->plane;
 
-       return omap_plane_mode_set(plane, crtc, crtc->fb,
+       mode = adjusted_mode;
+
+       DBG("%s: set mode: %d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x",
+                       omap_crtc->name, mode->base.id, mode->name,
+                       mode->vrefresh, mode->clock,
+                       mode->hdisplay, mode->hsync_start,
+                       mode->hsync_end, mode->htotal,
+                       mode->vdisplay, mode->vsync_start,
+                       mode->vsync_end, mode->vtotal,
+                       mode->type, mode->flags);
+
+       copy_timings_drm_to_omap(&omap_crtc->timings, mode);
+       omap_crtc->full_update = true;
+
+       return omap_plane_mode_set(omap_crtc->plane, crtc, crtc->fb,
                        0, 0, mode->hdisplay, mode->vdisplay,
                        x << 16, y << 16,
-                       mode->hdisplay << 16, mode->vdisplay << 16);
+                       mode->hdisplay << 16, mode->vdisplay << 16,
+                       NULL, NULL);
 }
 
 static void omap_crtc_prepare(struct drm_crtc *crtc)
@@ -102,10 +239,11 @@ static int omap_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
        struct drm_plane *plane = omap_crtc->plane;
        struct drm_display_mode *mode = &crtc->mode;
 
-       return plane->funcs->update_plane(plane, crtc, crtc->fb,
+       return omap_plane_mode_set(plane, crtc, crtc->fb,
                        0, 0, mode->hdisplay, mode->vdisplay,
                        x << 16, y << 16,
-                       mode->hdisplay << 16, mode->vdisplay << 16);
+                       mode->hdisplay << 16, mode->vdisplay << 16,
+                       NULL, NULL);
 }
 
 static void omap_crtc_load_lut(struct drm_crtc *crtc)
@@ -114,63 +252,54 @@ static void omap_crtc_load_lut(struct drm_crtc *crtc)
 
 static void vblank_cb(void *arg)
 {
-       static uint32_t sequence;
        struct drm_crtc *crtc = arg;
        struct drm_device *dev = crtc->dev;
        struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
-       struct drm_pending_vblank_event *event = omap_crtc->event;
        unsigned long flags;
-       struct timeval now;
 
-       WARN_ON(!event);
+       spin_lock_irqsave(&dev->event_lock, flags);
+
+       /* wakeup userspace */
+       if (omap_crtc->event)
+               drm_send_vblank_event(dev, omap_crtc->pipe, omap_crtc->event);
 
        omap_crtc->event = NULL;
+       omap_crtc->old_fb = NULL;
 
-       /* wakeup userspace */
-       if (event) {
-               do_gettimeofday(&now);
-
-               spin_lock_irqsave(&dev->event_lock, flags);
-               /* TODO: we can't yet use the vblank time accounting,
-                * because omapdss lower layer is the one that knows
-                * the irq # and registers the handler, which more or
-                * less defeats how drm_irq works.. for now just fake
-                * the sequence number and use gettimeofday..
-                *
-               event->event.sequence = drm_vblank_count_and_time(
-                               dev, omap_crtc->id, &now);
-                */
-               event->event.sequence = sequence++;
-               event->event.tv_sec = now.tv_sec;
-               event->event.tv_usec = now.tv_usec;
-               list_add_tail(&event->base.link,
-                               &event->base.file_priv->event_list);
-               wake_up_interruptible(&event->base.file_priv->event_wait);
-               spin_unlock_irqrestore(&dev->event_lock, flags);
-       }
+       spin_unlock_irqrestore(&dev->event_lock, flags);
 }
 
-static void page_flip_cb(void *arg)
+static void page_flip_worker(struct work_struct *work)
 {
-       struct drm_crtc *crtc = arg;
-       struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
-       struct drm_framebuffer *old_fb = omap_crtc->old_fb;
+       struct omap_crtc *omap_crtc =
+                       container_of(work, struct omap_crtc, page_flip_work);
+       struct drm_crtc *crtc = &omap_crtc->base;
+       struct drm_device *dev = crtc->dev;
+       struct drm_display_mode *mode = &crtc->mode;
        struct drm_gem_object *bo;
 
-       omap_crtc->old_fb = NULL;
-
-       omap_crtc_mode_set_base(crtc, crtc->x, crtc->y, old_fb);
-
-       /* really we'd like to setup the callback atomically w/ setting the
-        * new scanout buffer to avoid getting stuck waiting an extra vblank
-        * cycle.. for now go for correctness and later figure out speed..
-        */
-       omap_plane_on_endwin(omap_crtc->plane, vblank_cb, crtc);
+       mutex_lock(&dev->mode_config.mutex);
+       omap_plane_mode_set(omap_crtc->plane, crtc, crtc->fb,
+                       0, 0, mode->hdisplay, mode->vdisplay,
+                       crtc->x << 16, crtc->y << 16,
+                       mode->hdisplay << 16, mode->vdisplay << 16,
+                       vblank_cb, crtc);
+       mutex_unlock(&dev->mode_config.mutex);
 
        bo = omap_framebuffer_bo(crtc->fb, 0);
        drm_gem_object_unreference_unlocked(bo);
 }
 
+static void page_flip_cb(void *arg)
+{
+       struct drm_crtc *crtc = arg;
+       struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+       struct omap_drm_private *priv = crtc->dev->dev_private;
+
+       /* avoid assumptions about what ctxt we are called from: */
+       queue_work(priv->wq, &omap_crtc->page_flip_work);
+}
+
 static int omap_crtc_page_flip_locked(struct drm_crtc *crtc,
                 struct drm_framebuffer *fb,
                 struct drm_pending_vblank_event *event)
@@ -179,14 +308,14 @@ static int omap_crtc_page_flip_locked(struct drm_crtc *crtc,
        struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
        struct drm_gem_object *bo;
 
-       DBG("%d -> %d", crtc->fb ? crtc->fb->base.id : -1, fb->base.id);
+       DBG("%d -> %d (event=%p)", crtc->fb ? crtc->fb->base.id : -1,
+                       fb->base.id, event);
 
-       if (omap_crtc->event) {
+       if (omap_crtc->old_fb) {
                dev_err(dev->dev, "already a pending flip\n");
                return -EINVAL;
        }
 
-       omap_crtc->old_fb = crtc->fb;
        omap_crtc->event = event;
        crtc->fb = fb;
 
@@ -234,14 +363,244 @@ static const struct drm_crtc_helper_funcs omap_crtc_helper_funcs = {
        .load_lut = omap_crtc_load_lut,
 };
 
+const struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc)
+{
+       struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+       return &omap_crtc->timings;
+}
+
+enum omap_channel omap_crtc_channel(struct drm_crtc *crtc)
+{
+       struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+       return omap_crtc->channel;
+}
+
+static void omap_crtc_error_irq(struct omap_drm_irq *irq, uint32_t irqstatus)
+{
+       struct omap_crtc *omap_crtc =
+                       container_of(irq, struct omap_crtc, error_irq);
+       struct drm_crtc *crtc = &omap_crtc->base;
+       DRM_ERROR("%s: errors: %08x\n", omap_crtc->name, irqstatus);
+       /* avoid getting in a flood, unregister the irq until next vblank */
+       omap_irq_unregister(crtc->dev, &omap_crtc->error_irq);
+}
+
+static void omap_crtc_apply_irq(struct omap_drm_irq *irq, uint32_t irqstatus)
+{
+       struct omap_crtc *omap_crtc =
+                       container_of(irq, struct omap_crtc, apply_irq);
+       struct drm_crtc *crtc = &omap_crtc->base;
+
+       if (!omap_crtc->error_irq.registered)
+               omap_irq_register(crtc->dev, &omap_crtc->error_irq);
+
+       if (!dispc_mgr_go_busy(omap_crtc->channel)) {
+               struct omap_drm_private *priv =
+                               crtc->dev->dev_private;
+               DBG("%s: apply done", omap_crtc->name);
+               omap_irq_unregister(crtc->dev, &omap_crtc->apply_irq);
+               queue_work(priv->wq, &omap_crtc->apply_work);
+       }
+}
+
+static void apply_worker(struct work_struct *work)
+{
+       struct omap_crtc *omap_crtc =
+                       container_of(work, struct omap_crtc, apply_work);
+       struct drm_crtc *crtc = &omap_crtc->base;
+       struct drm_device *dev = crtc->dev;
+       struct omap_drm_apply *apply, *n;
+       bool need_apply;
+
+       /*
+        * Synchronize everything on mode_config.mutex, to keep
+        * the callbacks and list modification all serialized
+        * with respect to modesetting ioctls from userspace.
+        */
+       mutex_lock(&dev->mode_config.mutex);
+       dispc_runtime_get();
+
+       /*
+        * If we are still pending a previous update, wait.. when the
+        * pending update completes, we get kicked again.
+        */
+       if (omap_crtc->apply_irq.registered)
+               goto out;
+
+       /* finish up previous apply's: */
+       list_for_each_entry_safe(apply, n,
+                       &omap_crtc->pending_applies, pending_node) {
+               apply->post_apply(apply);
+               list_del(&apply->pending_node);
+       }
+
+       need_apply = !list_empty(&omap_crtc->queued_applies);
+
+       /* then handle the next round of of queued apply's: */
+       list_for_each_entry_safe(apply, n,
+                       &omap_crtc->queued_applies, queued_node) {
+               apply->pre_apply(apply);
+               list_del(&apply->queued_node);
+               apply->queued = false;
+               list_add_tail(&apply->pending_node,
+                               &omap_crtc->pending_applies);
+       }
+
+       if (need_apply) {
+               enum omap_channel channel = omap_crtc->channel;
+
+               DBG("%s: GO", omap_crtc->name);
+
+               if (dispc_mgr_is_enabled(channel)) {
+                       omap_irq_register(dev, &omap_crtc->apply_irq);
+                       dispc_mgr_go(channel);
+               } else {
+                       struct omap_drm_private *priv = dev->dev_private;
+                       queue_work(priv->wq, &omap_crtc->apply_work);
+               }
+       }
+
+out:
+       dispc_runtime_put();
+       mutex_unlock(&dev->mode_config.mutex);
+}
+
+int omap_crtc_apply(struct drm_crtc *crtc,
+               struct omap_drm_apply *apply)
+{
+       struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+
+       WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
+
+       /* no need to queue it again if it is already queued: */
+       if (apply->queued)
+               return 0;
+
+       apply->queued = true;
+       list_add_tail(&apply->queued_node, &omap_crtc->queued_applies);
+
+       /*
+        * If there are no currently pending updates, then go ahead and
+        * kick the worker immediately, otherwise it will run again when
+        * the current update finishes.
+        */
+       if (list_empty(&omap_crtc->pending_applies)) {
+               struct omap_drm_private *priv = crtc->dev->dev_private;
+               queue_work(priv->wq, &omap_crtc->apply_work);
+       }
+
+       return 0;
+}
+
+/* called only from apply */
+static void set_enabled(struct drm_crtc *crtc, bool enable)
+{
+       struct drm_device *dev = crtc->dev;
+       struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+       enum omap_channel channel = omap_crtc->channel;
+       struct omap_irq_wait *wait = NULL;
+
+       if (dispc_mgr_is_enabled(channel) == enable)
+               return;
+
+       /* ignore sync-lost irqs during enable/disable */
+       omap_irq_unregister(crtc->dev, &omap_crtc->error_irq);
+
+       if (dispc_mgr_get_framedone_irq(channel)) {
+               if (!enable) {
+                       wait = omap_irq_wait_init(dev,
+                                       dispc_mgr_get_framedone_irq(channel), 1);
+               }
+       } else {
+               /*
+                * When we disable digit output, we need to wait until fields
+                * are done.  Otherwise the DSS is still working, and turning
+                * off the clocks prevents DSS from going to OFF mode. And when
+                * enabling, we need to wait for the extra sync losts
+                */
+               wait = omap_irq_wait_init(dev,
+                               dispc_mgr_get_vsync_irq(channel), 2);
+       }
+
+       dispc_mgr_enable(channel, enable);
+
+       if (wait) {
+               int ret = omap_irq_wait(dev, wait, msecs_to_jiffies(100));
+               if (ret) {
+                       dev_err(dev->dev, "%s: timeout waiting for %s\n",
+                                       omap_crtc->name, enable ? "enable" : "disable");
+               }
+       }
+
+       omap_irq_register(crtc->dev, &omap_crtc->error_irq);
+}
+
+static void omap_crtc_pre_apply(struct omap_drm_apply *apply)
+{
+       struct omap_crtc *omap_crtc =
+                       container_of(apply, struct omap_crtc, apply);
+       struct drm_crtc *crtc = &omap_crtc->base;
+       struct drm_encoder *encoder = NULL;
+
+       DBG("%s: enabled=%d, full=%d", omap_crtc->name,
+                       omap_crtc->enabled, omap_crtc->full_update);
+
+       if (omap_crtc->full_update) {
+               struct omap_drm_private *priv = crtc->dev->dev_private;
+               int i;
+               for (i = 0; i < priv->num_encoders; i++) {
+                       if (priv->encoders[i]->crtc == crtc) {
+                               encoder = priv->encoders[i];
+                               break;
+                       }
+               }
+       }
+
+       if (!omap_crtc->enabled) {
+               set_enabled(&omap_crtc->base, false);
+               if (encoder)
+                       omap_encoder_set_enabled(encoder, false);
+       } else {
+               if (encoder) {
+                       omap_encoder_set_enabled(encoder, false);
+                       omap_encoder_update(encoder, &omap_crtc->mgr,
+                                       &omap_crtc->timings);
+                       omap_encoder_set_enabled(encoder, true);
+                       omap_crtc->full_update = false;
+               }
+
+               dispc_mgr_setup(omap_crtc->channel, &omap_crtc->info);
+               dispc_mgr_set_timings(omap_crtc->channel,
+                               &omap_crtc->timings);
+               set_enabled(&omap_crtc->base, true);
+       }
+
+       omap_crtc->full_update = false;
+}
+
+static void omap_crtc_post_apply(struct omap_drm_apply *apply)
+{
+       /* nothing needed for post-apply */
+}
+
+static const char *channel_names[] = {
+               [OMAP_DSS_CHANNEL_LCD] = "lcd",
+               [OMAP_DSS_CHANNEL_DIGIT] = "tv",
+               [OMAP_DSS_CHANNEL_LCD2] = "lcd2",
+};
+
 /* initialize crtc */
 struct drm_crtc *omap_crtc_init(struct drm_device *dev,
-               struct omap_overlay *ovl, int id)
+               struct drm_plane *plane, enum omap_channel channel, int id)
 {
        struct drm_crtc *crtc = NULL;
-       struct omap_crtc *omap_crtc = kzalloc(sizeof(*omap_crtc), GFP_KERNEL);
+       struct omap_crtc *omap_crtc;
+       struct omap_overlay_manager_info *info;
+
+       DBG("%s", channel_names[channel]);
 
-       DBG("%s", ovl->name);
+       omap_crtc = kzalloc(sizeof(*omap_crtc), GFP_KERNEL);
 
        if (!omap_crtc) {
                dev_err(dev->dev, "could not allocate CRTC\n");
@@ -250,10 +609,40 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
 
        crtc = &omap_crtc->base;
 
-       omap_crtc->plane = omap_plane_init(dev, ovl, (1 << id), true);
+       INIT_WORK(&omap_crtc->page_flip_work, page_flip_worker);
+       INIT_WORK(&omap_crtc->apply_work, apply_worker);
+
+       INIT_LIST_HEAD(&omap_crtc->pending_applies);
+       INIT_LIST_HEAD(&omap_crtc->queued_applies);
+
+       omap_crtc->apply.pre_apply  = omap_crtc_pre_apply;
+       omap_crtc->apply.post_apply = omap_crtc_post_apply;
+
+       omap_crtc->apply_irq.irqmask = pipe2vbl(id);
+       omap_crtc->apply_irq.irq = omap_crtc_apply_irq;
+
+       omap_crtc->error_irq.irqmask =
+                       dispc_mgr_get_sync_lost_irq(channel);
+       omap_crtc->error_irq.irq = omap_crtc_error_irq;
+       omap_irq_register(dev, &omap_crtc->error_irq);
+
+       omap_crtc->channel = channel;
+       omap_crtc->plane = plane;
        omap_crtc->plane->crtc = crtc;
-       omap_crtc->name = ovl->name;
-       omap_crtc->id = id;
+       omap_crtc->name = channel_names[channel];
+       omap_crtc->pipe = id;
+
+       /* temporary: */
+       omap_crtc->mgr.id = channel;
+
+       dss_install_mgr_ops(&mgr_ops);
+
+       /* TODO: fix hard-coded setup.. add properties! */
+       info = &omap_crtc->info;
+       info->default_color = 0x00000000;
+       info->trans_key = 0x00000000;
+       info->trans_key_type = OMAP_DSS_COLOR_KEY_GFX_DST;
+       info->trans_enabled = false;
 
        drm_crtc_init(dev, crtc, &omap_crtc_funcs);
        drm_crtc_helper_add(crtc, &omap_crtc_helper_funcs);
index 84943e5ba1d6563f49877ada93e022a1d67b5385..ae5ecc2efbc758268d692d732482d1f49f13c352 100644 (file)
@@ -74,320 +74,99 @@ static int get_connector_type(struct omap_dss_device *dssdev)
        }
 }
 
-#if 0 /* enable when dss2 supports hotplug */
-static int omap_drm_notifier(struct notifier_block *nb,
-               unsigned long evt, void *arg)
-{
-       switch (evt) {
-       case OMAP_DSS_SIZE_CHANGE:
-       case OMAP_DSS_HOTPLUG_CONNECT:
-       case OMAP_DSS_HOTPLUG_DISCONNECT: {
-               struct drm_device *dev = drm_device;
-               DBG("hotplug event: evt=%d, dev=%p", evt, dev);
-               if (dev)
-                       drm_sysfs_hotplug_event(dev);
-
-               return NOTIFY_OK;
-       }
-       default:  /* don't care about other events for now */
-               return NOTIFY_DONE;
-       }
-}
-#endif
-
-static void dump_video_chains(void)
-{
-       int i;
-
-       DBG("dumping video chains: ");
-       for (i = 0; i < omap_dss_get_num_overlays(); i++) {
-               struct omap_overlay *ovl = omap_dss_get_overlay(i);
-               struct omap_overlay_manager *mgr = ovl->manager;
-               struct omap_dss_device *dssdev = mgr ?
-                                       mgr->get_device(mgr) : NULL;
-               if (dssdev) {
-                       DBG("%d: %s -> %s -> %s", i, ovl->name, mgr->name,
-                                               dssdev->name);
-               } else if (mgr) {
-                       DBG("%d: %s -> %s", i, ovl->name, mgr->name);
-               } else {
-                       DBG("%d: %s", i, ovl->name);
-               }
-       }
-}
-
-/* create encoders for each manager */
-static int create_encoder(struct drm_device *dev,
-               struct omap_overlay_manager *mgr)
-{
-       struct omap_drm_private *priv = dev->dev_private;
-       struct drm_encoder *encoder = omap_encoder_init(dev, mgr);
-
-       if (!encoder) {
-               dev_err(dev->dev, "could not create encoder: %s\n",
-                               mgr->name);
-               return -ENOMEM;
-       }
-
-       BUG_ON(priv->num_encoders >= ARRAY_SIZE(priv->encoders));
-
-       priv->encoders[priv->num_encoders++] = encoder;
-
-       return 0;
-}
-
-/* create connectors for each display device */
-static int create_connector(struct drm_device *dev,
-               struct omap_dss_device *dssdev)
+static int omap_modeset_init(struct drm_device *dev)
 {
        struct omap_drm_private *priv = dev->dev_private;
-       static struct notifier_block *notifier;
-       struct drm_connector *connector;
-       int j;
-
-       if (!dssdev->driver) {
-               dev_warn(dev->dev, "%s has no driver.. skipping it\n",
-                               dssdev->name);
-               return 0;
-       }
+       struct omap_dss_device *dssdev = NULL;
+       int num_ovls = dss_feat_get_num_ovls();
+       int id;
 
-       if (!(dssdev->driver->get_timings ||
-                               dssdev->driver->read_edid)) {
-               dev_warn(dev->dev, "%s driver does not support "
-                       "get_timings or read_edid.. skipping it!\n",
-                       dssdev->name);
-               return 0;
-       }
+       drm_mode_config_init(dev);
 
-       connector = omap_connector_init(dev,
-                       get_connector_type(dssdev), dssdev);
+       omap_drm_irq_install(dev);
 
-       if (!connector) {
-               dev_err(dev->dev, "could not create connector: %s\n",
-                               dssdev->name);
-               return -ENOMEM;
-       }
-
-       BUG_ON(priv->num_connectors >= ARRAY_SIZE(priv->connectors));
+       /*
+        * Create private planes and CRTCs for the last NUM_CRTCs overlay
+        * plus manager:
+        */
+       for (id = 0; id < min(num_crtc, num_ovls); id++) {
+               struct drm_plane *plane;
+               struct drm_crtc *crtc;
 
-       priv->connectors[priv->num_connectors++] = connector;
+               plane = omap_plane_init(dev, id, true);
+               crtc = omap_crtc_init(dev, plane, pipe2chan(id), id);
 
-#if 0 /* enable when dss2 supports hotplug */
-       notifier = kzalloc(sizeof(struct notifier_block), GFP_KERNEL);
-       notifier->notifier_call = omap_drm_notifier;
-       omap_dss_add_notify(dssdev, notifier);
-#else
-       notifier = NULL;
-#endif
+               BUG_ON(priv->num_crtcs >= ARRAY_SIZE(priv->crtcs));
+               priv->crtcs[id] = crtc;
+               priv->num_crtcs++;
 
-       for (j = 0; j < priv->num_encoders; j++) {
-               struct omap_overlay_manager *mgr =
-                       omap_encoder_get_manager(priv->encoders[j]);
-               if (mgr->get_device(mgr) == dssdev) {
-                       drm_mode_connector_attach_encoder(connector,
-                                       priv->encoders[j]);
-               }
+               priv->planes[id] = plane;
+               priv->num_planes++;
        }
 
-       return 0;
-}
-
-/* create up to max_overlays CRTCs mapping to overlays.. by default,
- * connect the overlays to different managers/encoders, giving priority
- * to encoders connected to connectors with a detected connection
- */
-static int create_crtc(struct drm_device *dev, struct omap_overlay *ovl,
-               int *j, unsigned int connected_connectors)
-{
-       struct omap_drm_private *priv = dev->dev_private;
-       struct omap_overlay_manager *mgr = NULL;
-       struct drm_crtc *crtc;
-
-       /* find next best connector, ones with detected connection first
+       /*
+        * Create normal planes for the remaining overlays:
         */
-       while (*j < priv->num_connectors && !mgr) {
-               if (connected_connectors & (1 << *j)) {
-                       struct drm_encoder *encoder =
-                               omap_connector_attached_encoder(
-                                               priv->connectors[*j]);
-                       if (encoder)
-                               mgr = omap_encoder_get_manager(encoder);
+       for (; id < num_ovls; id++) {
+               struct drm_plane *plane = omap_plane_init(dev, id, false);
 
-               }
-               (*j)++;
+               BUG_ON(priv->num_planes >= ARRAY_SIZE(priv->planes));
+               priv->planes[priv->num_planes++] = plane;
        }
 
-       /* if we couldn't find another connected connector, lets start
-        * looking at the unconnected connectors:
-        *
-        * note: it might not be immediately apparent, but thanks to
-        * the !mgr check in both this loop and the one above, the only
-        * way to enter this loop is with *j == priv->num_connectors,
-        * so idx can never go negative.
-        */
-       while (*j < 2 * priv->num_connectors && !mgr) {
-               int idx = *j - priv->num_connectors;
-               if (!(connected_connectors & (1 << idx))) {
-                       struct drm_encoder *encoder =
-                               omap_connector_attached_encoder(
-                                               priv->connectors[idx]);
-                       if (encoder)
-                               mgr = omap_encoder_get_manager(encoder);
+       for_each_dss_dev(dssdev) {
+               struct drm_connector *connector;
+               struct drm_encoder *encoder;
 
+               if (!dssdev->driver) {
+                       dev_warn(dev->dev, "%s has no driver.. skipping it\n",
+                                       dssdev->name);
+                       return 0;
                }
-               (*j)++;
-       }
-
-       crtc = omap_crtc_init(dev, ovl, priv->num_crtcs);
-
-       if (!crtc) {
-               dev_err(dev->dev, "could not create CRTC: %s\n",
-                               ovl->name);
-               return -ENOMEM;
-       }
 
-       BUG_ON(priv->num_crtcs >= ARRAY_SIZE(priv->crtcs));
-
-       priv->crtcs[priv->num_crtcs++] = crtc;
-
-       return 0;
-}
-
-static int create_plane(struct drm_device *dev, struct omap_overlay *ovl,
-               unsigned int possible_crtcs)
-{
-       struct omap_drm_private *priv = dev->dev_private;
-       struct drm_plane *plane =
-                       omap_plane_init(dev, ovl, possible_crtcs, false);
-
-       if (!plane) {
-               dev_err(dev->dev, "could not create plane: %s\n",
-                               ovl->name);
-               return -ENOMEM;
-       }
-
-       BUG_ON(priv->num_planes >= ARRAY_SIZE(priv->planes));
-
-       priv->planes[priv->num_planes++] = plane;
-
-       return 0;
-}
-
-static int match_dev_name(struct omap_dss_device *dssdev, void *data)
-{
-       return !strcmp(dssdev->name, data);
-}
-
-static unsigned int detect_connectors(struct drm_device *dev)
-{
-       struct omap_drm_private *priv = dev->dev_private;
-       unsigned int connected_connectors = 0;
-       int i;
-
-       for (i = 0; i < priv->num_connectors; i++) {
-               struct drm_connector *connector = priv->connectors[i];
-               if (omap_connector_detect(connector, true) ==
-                               connector_status_connected) {
-                       connected_connectors |= (1 << i);
+               if (!(dssdev->driver->get_timings ||
+                                       dssdev->driver->read_edid)) {
+                       dev_warn(dev->dev, "%s driver does not support "
+                               "get_timings or read_edid.. skipping it!\n",
+                               dssdev->name);
+                       return 0;
                }
-       }
-
-       return connected_connectors;
-}
 
-static int omap_modeset_init(struct drm_device *dev)
-{
-       const struct omap_drm_platform_data *pdata = dev->dev->platform_data;
-       struct omap_kms_platform_data *kms_pdata = NULL;
-       struct omap_drm_private *priv = dev->dev_private;
-       struct omap_dss_device *dssdev = NULL;
-       int i, j;
-       unsigned int connected_connectors = 0;
+               encoder = omap_encoder_init(dev, dssdev);
 
-       drm_mode_config_init(dev);
-
-       if (pdata && pdata->kms_pdata) {
-               kms_pdata = pdata->kms_pdata;
-
-               /* if platform data is provided by the board file, use it to
-                * control which overlays, managers, and devices we own.
-                */
-               for (i = 0; i < kms_pdata->mgr_cnt; i++) {
-                       struct omap_overlay_manager *mgr =
-                               omap_dss_get_overlay_manager(
-                                               kms_pdata->mgr_ids[i]);
-                       create_encoder(dev, mgr);
-               }
-
-               for (i = 0; i < kms_pdata->dev_cnt; i++) {
-                       struct omap_dss_device *dssdev =
-                               omap_dss_find_device(
-                                       (void *)kms_pdata->dev_names[i],
-                                       match_dev_name);
-                       if (!dssdev) {
-                               dev_warn(dev->dev, "no such dssdev: %s\n",
-                                               kms_pdata->dev_names[i]);
-                               continue;
-                       }
-                       create_connector(dev, dssdev);
+               if (!encoder) {
+                       dev_err(dev->dev, "could not create encoder: %s\n",
+                                       dssdev->name);
+                       return -ENOMEM;
                }
 
-               connected_connectors = detect_connectors(dev);
+               connector = omap_connector_init(dev,
+                               get_connector_type(dssdev), dssdev, encoder);
 
-               j = 0;
-               for (i = 0; i < kms_pdata->ovl_cnt; i++) {
-                       struct omap_overlay *ovl =
-                               omap_dss_get_overlay(kms_pdata->ovl_ids[i]);
-                       create_crtc(dev, ovl, &j, connected_connectors);
+               if (!connector) {
+                       dev_err(dev->dev, "could not create connector: %s\n",
+                                       dssdev->name);
+                       return -ENOMEM;
                }
 
-               for (i = 0; i < kms_pdata->pln_cnt; i++) {
-                       struct omap_overlay *ovl =
-                               omap_dss_get_overlay(kms_pdata->pln_ids[i]);
-                       create_plane(dev, ovl, (1 << priv->num_crtcs) - 1);
-               }
-       } else {
-               /* otherwise just grab up to CONFIG_DRM_OMAP_NUM_CRTCS and try
-                * to make educated guesses about everything else
-                */
-               int max_overlays = min(omap_dss_get_num_overlays(), num_crtc);
+               BUG_ON(priv->num_encoders >= ARRAY_SIZE(priv->encoders));
+               BUG_ON(priv->num_connectors >= ARRAY_SIZE(priv->connectors));
 
-               for (i = 0; i < omap_dss_get_num_overlay_managers(); i++)
-                       create_encoder(dev, omap_dss_get_overlay_manager(i));
-
-               for_each_dss_dev(dssdev) {
-                       create_connector(dev, dssdev);
-               }
+               priv->encoders[priv->num_encoders++] = encoder;
+               priv->connectors[priv->num_connectors++] = connector;
 
-               connected_connectors = detect_connectors(dev);
+               drm_mode_connector_attach_encoder(connector, encoder);
 
-               j = 0;
-               for (i = 0; i < max_overlays; i++) {
-                       create_crtc(dev, omap_dss_get_overlay(i),
-                                       &j, connected_connectors);
-               }
-
-               /* use any remaining overlays as drm planes */
-               for (; i < omap_dss_get_num_overlays(); i++) {
-                       struct omap_overlay *ovl = omap_dss_get_overlay(i);
-                       create_plane(dev, ovl, (1 << priv->num_crtcs) - 1);
+               /* figure out which crtc's we can connect the encoder to: */
+               encoder->possible_crtcs = 0;
+               for (id = 0; id < priv->num_crtcs; id++) {
+                       enum omap_dss_output_id supported_outputs =
+                                       dss_feat_get_supported_outputs(pipe2chan(id));
+                       if (supported_outputs & dssdev->output->id)
+                               encoder->possible_crtcs |= (1 << id);
                }
        }
 
-       /* for now keep the mapping of CRTCs and encoders static.. */
-       for (i = 0; i < priv->num_encoders; i++) {
-               struct drm_encoder *encoder = priv->encoders[i];
-               struct omap_overlay_manager *mgr =
-                               omap_encoder_get_manager(encoder);
-
-               encoder->possible_crtcs = (1 << priv->num_crtcs) - 1;
-
-               DBG("%s: possible_crtcs=%08x", mgr->name,
-                                       encoder->possible_crtcs);
-       }
-
-       dump_video_chains();
-
        dev->mode_config.min_width = 32;
        dev->mode_config.min_height = 32;
 
@@ -450,7 +229,7 @@ static int ioctl_gem_new(struct drm_device *dev, void *data,
                struct drm_file *file_priv)
 {
        struct drm_omap_gem_new *args = data;
-       DBG("%p:%p: size=0x%08x, flags=%08x", dev, file_priv,
+       VERB("%p:%p: size=0x%08x, flags=%08x", dev, file_priv,
                        args->size.bytes, args->flags);
        return omap_gem_new_handle(dev, file_priv, args->size,
                        args->flags, &args->handle);
@@ -510,7 +289,7 @@ static int ioctl_gem_info(struct drm_device *dev, void *data,
        struct drm_gem_object *obj;
        int ret = 0;
 
-       DBG("%p:%p: handle=%d", dev, file_priv, args->handle);
+       VERB("%p:%p: handle=%d", dev, file_priv, args->handle);
 
        obj = drm_gem_object_lookup(dev, file_priv, args->handle);
        if (!obj)
@@ -565,14 +344,6 @@ static int dev_load(struct drm_device *dev, unsigned long flags)
 
        dev->dev_private = priv;
 
-       ret = omapdss_compat_init();
-       if (ret) {
-               dev_err(dev->dev, "coult not init omapdss\n");
-               dev->dev_private = NULL;
-               kfree(priv);
-               return ret;
-       }
-
        priv->wq = alloc_ordered_workqueue("omapdrm", 0);
 
        INIT_LIST_HEAD(&priv->obj_list);
@@ -584,10 +355,13 @@ static int dev_load(struct drm_device *dev, unsigned long flags)
                dev_err(dev->dev, "omap_modeset_init failed: ret=%d\n", ret);
                dev->dev_private = NULL;
                kfree(priv);
-               omapdss_compat_uninit();
                return ret;
        }
 
+       ret = drm_vblank_init(dev, priv->num_crtcs);
+       if (ret)
+               dev_warn(dev->dev, "could not init vblank\n");
+
        priv->fbdev = omap_fbdev_init(dev);
        if (!priv->fbdev) {
                dev_warn(dev->dev, "omap_fbdev_init failed\n");
@@ -596,10 +370,6 @@ static int dev_load(struct drm_device *dev, unsigned long flags)
 
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, priv->num_crtcs);
-       if (ret)
-               dev_warn(dev->dev, "could not init vblank\n");
-
        return 0;
 }
 
@@ -609,8 +379,9 @@ static int dev_unload(struct drm_device *dev)
 
        DBG("unload: dev=%p", dev);
 
-       drm_vblank_cleanup(dev);
        drm_kms_helper_poll_fini(dev);
+       drm_vblank_cleanup(dev);
+       omap_drm_irq_uninstall(dev);
 
        omap_fbdev_free(dev);
        omap_modeset_free(dev);
@@ -619,8 +390,6 @@ static int dev_unload(struct drm_device *dev)
        flush_workqueue(priv->wq);
        destroy_workqueue(priv->wq);
 
-       omapdss_compat_uninit();
-
        kfree(dev->dev_private);
        dev->dev_private = NULL;
 
@@ -680,7 +449,9 @@ static void dev_lastclose(struct drm_device *dev)
                }
        }
 
+       mutex_lock(&dev->mode_config.mutex);
        ret = drm_fb_helper_restore_fbdev_mode(priv->fbdev);
+       mutex_unlock(&dev->mode_config.mutex);
        if (ret)
                DBG("failed to restore crtc mode");
 }
@@ -695,60 +466,6 @@ static void dev_postclose(struct drm_device *dev, struct drm_file *file)
        DBG("postclose: dev=%p, file=%p", dev, file);
 }
 
-/**
- * enable_vblank - enable vblank interrupt events
- * @dev: DRM device
- * @crtc: which irq to enable
- *
- * Enable vblank interrupts for @crtc.  If the device doesn't have
- * a hardware vblank counter, this routine should be a no-op, since
- * interrupts will have to stay on to keep the count accurate.
- *
- * RETURNS
- * Zero on success, appropriate errno if the given @crtc's vblank
- * interrupt cannot be enabled.
- */
-static int dev_enable_vblank(struct drm_device *dev, int crtc)
-{
-       DBG("enable_vblank: dev=%p, crtc=%d", dev, crtc);
-       return 0;
-}
-
-/**
- * disable_vblank - disable vblank interrupt events
- * @dev: DRM device
- * @crtc: which irq to enable
- *
- * Disable vblank interrupts for @crtc.  If the device doesn't have
- * a hardware vblank counter, this routine should be a no-op, since
- * interrupts will have to stay on to keep the count accurate.
- */
-static void dev_disable_vblank(struct drm_device *dev, int crtc)
-{
-       DBG("disable_vblank: dev=%p, crtc=%d", dev, crtc);
-}
-
-static irqreturn_t dev_irq_handler(DRM_IRQ_ARGS)
-{
-       return IRQ_HANDLED;
-}
-
-static void dev_irq_preinstall(struct drm_device *dev)
-{
-       DBG("irq_preinstall: dev=%p", dev);
-}
-
-static int dev_irq_postinstall(struct drm_device *dev)
-{
-       DBG("irq_postinstall: dev=%p", dev);
-       return 0;
-}
-
-static void dev_irq_uninstall(struct drm_device *dev)
-{
-       DBG("irq_uninstall: dev=%p", dev);
-}
-
 static const struct vm_operations_struct omap_gem_vm_ops = {
        .fault = omap_gem_fault,
        .open = drm_gem_vm_open,
@@ -778,12 +495,12 @@ static struct drm_driver omap_drm_driver = {
                .preclose = dev_preclose,
                .postclose = dev_postclose,
                .get_vblank_counter = drm_vblank_count,
-               .enable_vblank = dev_enable_vblank,
-               .disable_vblank = dev_disable_vblank,
-               .irq_preinstall = dev_irq_preinstall,
-               .irq_postinstall = dev_irq_postinstall,
-               .irq_uninstall = dev_irq_uninstall,
-               .irq_handler = dev_irq_handler,
+               .enable_vblank = omap_irq_enable_vblank,
+               .disable_vblank = omap_irq_disable_vblank,
+               .irq_preinstall = omap_irq_preinstall,
+               .irq_postinstall = omap_irq_postinstall,
+               .irq_uninstall = omap_irq_uninstall,
+               .irq_handler = omap_irq_handler,
 #ifdef CONFIG_DEBUG_FS
                .debugfs_init = omap_debugfs_init,
                .debugfs_cleanup = omap_debugfs_cleanup,
index 1d4aea53b75da20e44be90b4a32e589a4a067785..cd1f22b0b124ddbf9eb1eff0efe5b77ddb7fd061 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/platform_data/omap_drm.h>
 #include "omap_drm.h"
 
+
 #define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
 #define VERB(fmt, ...) if (0) DRM_DEBUG(fmt, ##__VA_ARGS__) /* verbose debug */
 
  */
 #define MAX_MAPPERS 2
 
+/* parameters which describe (unrotated) coordinates of scanout within a fb: */
+struct omap_drm_window {
+       uint32_t rotation;
+       int32_t  crtc_x, crtc_y;                /* signed because can be offscreen */
+       uint32_t crtc_w, crtc_h;
+       uint32_t src_x, src_y;
+       uint32_t src_w, src_h;
+};
+
+/* Once GO bit is set, we can't make further updates to shadowed registers
+ * until the GO bit is cleared.  So various parts in the kms code that need
+ * to update shadowed registers queue up a pair of callbacks, pre_apply
+ * which is called before setting GO bit, and post_apply that is called
+ * after GO bit is cleared.  The crtc manages the queuing, and everyone
+ * else goes thru omap_crtc_apply() using these callbacks so that the
+ * code which has to deal w/ GO bit state is centralized.
+ */
+struct omap_drm_apply {
+       struct list_head pending_node, queued_node;
+       bool queued;
+       void (*pre_apply)(struct omap_drm_apply *apply);
+       void (*post_apply)(struct omap_drm_apply *apply);
+};
+
+/* For transiently registering for different DSS irqs that various parts
+ * of the KMS code need during setup/configuration.  We these are not
+ * necessarily the same as what drm_vblank_get/put() are requesting, and
+ * the hysteresis in drm_vblank_put() is not necessarily desirable for
+ * internal housekeeping related irq usage.
+ */
+struct omap_drm_irq {
+       struct list_head node;
+       uint32_t irqmask;
+       bool registered;
+       void (*irq)(struct omap_drm_irq *irq, uint32_t irqstatus);
+};
+
+/* For KMS code that needs to wait for a certain # of IRQs:
+ */
+struct omap_irq_wait;
+struct omap_irq_wait * omap_irq_wait_init(struct drm_device *dev,
+               uint32_t irqmask, int count);
+int omap_irq_wait(struct drm_device *dev, struct omap_irq_wait *wait,
+               unsigned long timeout);
+
 struct omap_drm_private {
        uint32_t omaprev;
 
@@ -58,6 +104,7 @@ struct omap_drm_private {
 
        struct workqueue_struct *wq;
 
+       /* list of GEM objects: */
        struct list_head obj_list;
 
        bool has_dmm;
@@ -65,6 +112,11 @@ struct omap_drm_private {
        /* properties: */
        struct drm_property *rotation_prop;
        struct drm_property *zorder_prop;
+
+       /* irq handling: */
+       struct list_head irq_list;    /* list of omap_drm_irq */
+       uint32_t vblank_mask;         /* irq bits set for userspace vblank */
+       struct omap_drm_irq error_handler;
 };
 
 /* this should probably be in drm-core to standardize amongst drivers */
@@ -75,15 +127,6 @@ struct omap_drm_private {
 #define DRM_REFLECT_X  4
 #define DRM_REFLECT_Y  5
 
-/* parameters which describe (unrotated) coordinates of scanout within a fb: */
-struct omap_drm_window {
-       uint32_t rotation;
-       int32_t  crtc_x, crtc_y;                /* signed because can be offscreen */
-       uint32_t crtc_w, crtc_h;
-       uint32_t src_x, src_y;
-       uint32_t src_w, src_h;
-};
-
 #ifdef CONFIG_DEBUG_FS
 int omap_debugfs_init(struct drm_minor *minor);
 void omap_debugfs_cleanup(struct drm_minor *minor);
@@ -92,23 +135,36 @@ void omap_gem_describe(struct drm_gem_object *obj, struct seq_file *m);
 void omap_gem_describe_objects(struct list_head *list, struct seq_file *m);
 #endif
 
+int omap_irq_enable_vblank(struct drm_device *dev, int crtc);
+void omap_irq_disable_vblank(struct drm_device *dev, int crtc);
+irqreturn_t omap_irq_handler(DRM_IRQ_ARGS);
+void omap_irq_preinstall(struct drm_device *dev);
+int omap_irq_postinstall(struct drm_device *dev);
+void omap_irq_uninstall(struct drm_device *dev);
+void omap_irq_register(struct drm_device *dev, struct omap_drm_irq *irq);
+void omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq);
+int omap_drm_irq_uninstall(struct drm_device *dev);
+int omap_drm_irq_install(struct drm_device *dev);
+
 struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev);
 void omap_fbdev_free(struct drm_device *dev);
 
+const struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc);
+enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
+int omap_crtc_apply(struct drm_crtc *crtc,
+               struct omap_drm_apply *apply);
 struct drm_crtc *omap_crtc_init(struct drm_device *dev,
-               struct omap_overlay *ovl, int id);
+               struct drm_plane *plane, enum omap_channel channel, int id);
 
 struct drm_plane *omap_plane_init(struct drm_device *dev,
-               struct omap_overlay *ovl, unsigned int possible_crtcs,
-               bool priv);
+               int plane_id, bool private_plane);
 int omap_plane_dpms(struct drm_plane *plane, int mode);
 int omap_plane_mode_set(struct drm_plane *plane,
                struct drm_crtc *crtc, struct drm_framebuffer *fb,
                int crtc_x, int crtc_y,
                unsigned int crtc_w, unsigned int crtc_h,
                uint32_t src_x, uint32_t src_y,
-               uint32_t src_w, uint32_t src_h);
-void omap_plane_on_endwin(struct drm_plane *plane,
+               uint32_t src_w, uint32_t src_h,
                void (*fxn)(void *), void *arg);
 void omap_plane_install_properties(struct drm_plane *plane,
                struct drm_mode_object *obj);
@@ -116,21 +172,25 @@ int omap_plane_set_property(struct drm_plane *plane,
                struct drm_property *property, uint64_t val);
 
 struct drm_encoder *omap_encoder_init(struct drm_device *dev,
-               struct omap_overlay_manager *mgr);
-struct omap_overlay_manager *omap_encoder_get_manager(
+               struct omap_dss_device *dssdev);
+int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled);
+int omap_encoder_update(struct drm_encoder *encoder,
+               struct omap_overlay_manager *mgr,
+               struct omap_video_timings *timings);
+
+struct drm_connector *omap_connector_init(struct drm_device *dev,
+               int connector_type, struct omap_dss_device *dssdev,
                struct drm_encoder *encoder);
 struct drm_encoder *omap_connector_attached_encoder(
                struct drm_connector *connector);
-enum drm_connector_status omap_connector_detect(
-               struct drm_connector *connector, bool force);
-
-struct drm_connector *omap_connector_init(struct drm_device *dev,
-               int connector_type, struct omap_dss_device *dssdev);
-void omap_connector_mode_set(struct drm_connector *connector,
-               struct drm_display_mode *mode);
 void omap_connector_flush(struct drm_connector *connector,
                int x, int y, int w, int h);
 
+void copy_timings_omap_to_drm(struct drm_display_mode *mode,
+               struct omap_video_timings *timings);
+void copy_timings_drm_to_omap(struct omap_video_timings *timings,
+               struct drm_display_mode *mode);
+
 uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
                uint32_t max_formats, enum omap_color_mode supported_modes);
 struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
@@ -207,6 +267,40 @@ static inline int align_pitch(int pitch, int width, int bpp)
        return ALIGN(pitch, 8 * bytespp);
 }
 
+static inline enum omap_channel pipe2chan(int pipe)
+{
+       int num_mgrs = dss_feat_get_num_mgrs();
+
+       /*
+        * We usually don't want to create a CRTC for each manager,
+        * at least not until we have a way to expose private planes
+        * to userspace.  Otherwise there would not be enough video
+        * pipes left for drm planes.  The higher #'d managers tend
+        * to have more features so start in reverse order.
+        */
+       return num_mgrs - pipe - 1;
+}
+
+/* map crtc to vblank mask */
+static inline uint32_t pipe2vbl(int crtc)
+{
+       enum omap_channel channel = pipe2chan(crtc);
+       return dispc_mgr_get_vsync_irq(channel);
+}
+
+static inline int crtc2pipe(struct drm_device *dev, struct drm_crtc *crtc)
+{
+       struct omap_drm_private *priv = dev->dev_private;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(priv->crtcs); i++)
+               if (priv->crtcs[i] == crtc)
+                       return i;
+
+       BUG();  /* bogus CRTC ptr */
+       return -1;
+}
+
 /* should these be made into common util helpers?
  */
 
index 5341d5e3e3179e30b2bbe8540b12cc935843a2b7..e053160d2db38c9fd6d77bea4971e22635ef18ad 100644 (file)
 #include "drm_crtc.h"
 #include "drm_crtc_helper.h"
 
+#include <linux/list.h>
+
+
 /*
  * encoder funcs
  */
 
 #define to_omap_encoder(x) container_of(x, struct omap_encoder, base)
 
+/* The encoder and connector both map to same dssdev.. the encoder
+ * handles the 'active' parts, ie. anything the modifies the state
+ * of the hw, and the connector handles the 'read-only' parts, like
+ * detecting connection and reading edid.
+ */
 struct omap_encoder {
        struct drm_encoder base;
-       struct omap_overlay_manager *mgr;
+       struct omap_dss_device *dssdev;
 };
 
 static void omap_encoder_destroy(struct drm_encoder *encoder)
 {
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-       DBG("%s", omap_encoder->mgr->name);
        drm_encoder_cleanup(encoder);
        kfree(omap_encoder);
 }
 
+static const struct drm_encoder_funcs omap_encoder_funcs = {
+       .destroy = omap_encoder_destroy,
+};
+
+/*
+ * The CRTC drm_crtc_helper_set_mode() doesn't really give us the right
+ * order.. the easiest way to work around this for now is to make all
+ * the encoder-helper's no-op's and have the omap_crtc code take care
+ * of the sequencing and call us in the right points.
+ *
+ * Eventually to handle connecting CRTCs to different encoders properly,
+ * either the CRTC helpers need to change or we need to replace
+ * drm_crtc_helper_set_mode(), but lets wait until atomic-modeset for
+ * that.
+ */
+
 static void omap_encoder_dpms(struct drm_encoder *encoder, int mode)
 {
-       struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-       DBG("%s: %d", omap_encoder->mgr->name, mode);
 }
 
 static bool omap_encoder_mode_fixup(struct drm_encoder *encoder,
                                  const struct drm_display_mode *mode,
                                  struct drm_display_mode *adjusted_mode)
 {
-       struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-       DBG("%s", omap_encoder->mgr->name);
        return true;
 }
 
@@ -60,47 +79,16 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder,
                                struct drm_display_mode *mode,
                                struct drm_display_mode *adjusted_mode)
 {
-       struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-       struct drm_device *dev = encoder->dev;
-       struct omap_drm_private *priv = dev->dev_private;
-       int i;
-
-       mode = adjusted_mode;
-
-       DBG("%s: set mode: %dx%d", omap_encoder->mgr->name,
-                       mode->hdisplay, mode->vdisplay);
-
-       for (i = 0; i < priv->num_connectors; i++) {
-               struct drm_connector *connector = priv->connectors[i];
-               if (connector->encoder == encoder)
-                       omap_connector_mode_set(connector, mode);
-
-       }
 }
 
 static void omap_encoder_prepare(struct drm_encoder *encoder)
 {
-       struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-       struct drm_encoder_helper_funcs *encoder_funcs =
-                               encoder->helper_private;
-       DBG("%s", omap_encoder->mgr->name);
-       encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
 }
 
 static void omap_encoder_commit(struct drm_encoder *encoder)
 {
-       struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-       struct drm_encoder_helper_funcs *encoder_funcs =
-                               encoder->helper_private;
-       DBG("%s", omap_encoder->mgr->name);
-       omap_encoder->mgr->apply(omap_encoder->mgr);
-       encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
 }
 
-static const struct drm_encoder_funcs omap_encoder_funcs = {
-       .destroy = omap_encoder_destroy,
-};
-
 static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
        .dpms = omap_encoder_dpms,
        .mode_fixup = omap_encoder_mode_fixup,
@@ -109,23 +97,54 @@ static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
        .commit = omap_encoder_commit,
 };
 
-struct omap_overlay_manager *omap_encoder_get_manager(
-               struct drm_encoder *encoder)
+/*
+ * Instead of relying on the helpers for modeset, the omap_crtc code
+ * calls these functions in the proper sequence.
+ */
+
+int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled)
 {
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
-       return omap_encoder->mgr;
+       struct omap_dss_device *dssdev = omap_encoder->dssdev;
+       struct omap_dss_driver *dssdrv = dssdev->driver;
+
+       if (enabled) {
+               return dssdrv->enable(dssdev);
+       } else {
+               dssdrv->disable(dssdev);
+               return 0;
+       }
+}
+
+int omap_encoder_update(struct drm_encoder *encoder,
+               struct omap_overlay_manager *mgr,
+               struct omap_video_timings *timings)
+{
+       struct drm_device *dev = encoder->dev;
+       struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
+       struct omap_dss_device *dssdev = omap_encoder->dssdev;
+       struct omap_dss_driver *dssdrv = dssdev->driver;
+       int ret;
+
+       dssdev->output->manager = mgr;
+
+       ret = dssdrv->check_timings(dssdev, timings);
+       if (ret) {
+               dev_err(dev->dev, "could not set timings: %d\n", ret);
+               return ret;
+       }
+
+       dssdrv->set_timings(dssdev, timings);
+
+       return 0;
 }
 
 /* initialize encoder */
 struct drm_encoder *omap_encoder_init(struct drm_device *dev,
-               struct omap_overlay_manager *mgr)
+               struct omap_dss_device *dssdev)
 {
        struct drm_encoder *encoder = NULL;
        struct omap_encoder *omap_encoder;
-       struct omap_overlay_manager_info info;
-       int ret;
-
-       DBG("%s", mgr->name);
 
        omap_encoder = kzalloc(sizeof(*omap_encoder), GFP_KERNEL);
        if (!omap_encoder) {
@@ -133,33 +152,14 @@ struct drm_encoder *omap_encoder_init(struct drm_device *dev,
                goto fail;
        }
 
-       omap_encoder->mgr = mgr;
+       omap_encoder->dssdev = dssdev;
+
        encoder = &omap_encoder->base;
 
        drm_encoder_init(dev, encoder, &omap_encoder_funcs,
                         DRM_MODE_ENCODER_TMDS);
        drm_encoder_helper_add(encoder, &omap_encoder_helper_funcs);
 
-       mgr->get_manager_info(mgr, &info);
-
-       /* TODO: fix hard-coded setup.. */
-       info.default_color = 0x00000000;
-       info.trans_key = 0x00000000;
-       info.trans_key_type = OMAP_DSS_COLOR_KEY_GFX_DST;
-       info.trans_enabled = false;
-
-       ret = mgr->set_manager_info(mgr, &info);
-       if (ret) {
-               dev_err(dev->dev, "could not set manager info\n");
-               goto fail;
-       }
-
-       ret = mgr->apply(mgr);
-       if (ret) {
-               dev_err(dev->dev, "could not apply\n");
-               goto fail;
-       }
-
        return encoder;
 
 fail:
index 9a302062b031d4ea70d8205523aea7694dc5e54f..b6c5b5c6c8c53dbd39e84baa91cd43e1b81ebfb7 100644 (file)
@@ -194,7 +194,7 @@ struct dma_buf_ops omap_dmabuf_ops = {
 struct dma_buf *omap_gem_prime_export(struct drm_device *dev,
                struct drm_gem_object *obj, int flags)
 {
-       return dma_buf_export(obj, &omap_dmabuf_ops, obj->size, 0600);
+       return dma_buf_export(obj, &omap_dmabuf_ops, obj->size, flags);
 }
 
 struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev,
@@ -207,7 +207,12 @@ struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev,
                obj = buffer->priv;
                /* is it from our device? */
                if (obj->dev == dev) {
+                       /*
+                        * Importing dmabuf exported from out own gem increases
+                        * refcount on gem itself instead of f_count of dmabuf.
+                        */
                        drm_gem_object_reference(obj);
+                       dma_buf_put(buffer);
                        return obj;
                }
        }
diff --git a/drivers/staging/omapdrm/omap_irq.c b/drivers/staging/omapdrm/omap_irq.c
new file mode 100644 (file)
index 0000000..2629ba7
--- /dev/null
@@ -0,0 +1,322 @@
+/*
+ * drivers/staging/omapdrm/omap_irq.c
+ *
+ * Copyright (C) 2012 Texas Instruments
+ * Author: Rob Clark <rob.clark@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "omap_drv.h"
+
+static DEFINE_SPINLOCK(list_lock);
+
+static void omap_irq_error_handler(struct omap_drm_irq *irq,
+               uint32_t irqstatus)
+{
+       DRM_ERROR("errors: %08x\n", irqstatus);
+}
+
+/* call with list_lock and dispc runtime held */
+static void omap_irq_update(struct drm_device *dev)
+{
+       struct omap_drm_private *priv = dev->dev_private;
+       struct omap_drm_irq *irq;
+       uint32_t irqmask = priv->vblank_mask;
+
+       BUG_ON(!spin_is_locked(&list_lock));
+
+       list_for_each_entry(irq, &priv->irq_list, node)
+               irqmask |= irq->irqmask;
+
+       DBG("irqmask=%08x", irqmask);
+
+       dispc_write_irqenable(irqmask);
+       dispc_read_irqenable();        /* flush posted write */
+}
+
+void omap_irq_register(struct drm_device *dev, struct omap_drm_irq *irq)
+{
+       struct omap_drm_private *priv = dev->dev_private;
+       unsigned long flags;
+
+       dispc_runtime_get();
+       spin_lock_irqsave(&list_lock, flags);
+
+       if (!WARN_ON(irq->registered)) {
+               irq->registered = true;
+               list_add(&irq->node, &priv->irq_list);
+               omap_irq_update(dev);
+       }
+
+       spin_unlock_irqrestore(&list_lock, flags);
+       dispc_runtime_put();
+}
+
+void omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq)
+{
+       unsigned long flags;
+
+       dispc_runtime_get();
+       spin_lock_irqsave(&list_lock, flags);
+
+       if (!WARN_ON(!irq->registered)) {
+               irq->registered = false;
+               list_del(&irq->node);
+               omap_irq_update(dev);
+       }
+
+       spin_unlock_irqrestore(&list_lock, flags);
+       dispc_runtime_put();
+}
+
+struct omap_irq_wait {
+       struct omap_drm_irq irq;
+       int count;
+};
+
+static DECLARE_WAIT_QUEUE_HEAD(wait_event);
+
+static void wait_irq(struct omap_drm_irq *irq, uint32_t irqstatus)
+{
+       struct omap_irq_wait *wait =
+                       container_of(irq, struct omap_irq_wait, irq);
+       wait->count--;
+       wake_up_all(&wait_event);
+}
+
+struct omap_irq_wait * omap_irq_wait_init(struct drm_device *dev,
+               uint32_t irqmask, int count)
+{
+       struct omap_irq_wait *wait = kzalloc(sizeof(*wait), GFP_KERNEL);
+       wait->irq.irq = wait_irq;
+       wait->irq.irqmask = irqmask;
+       wait->count = count;
+       omap_irq_register(dev, &wait->irq);
+       return wait;
+}
+
+int omap_irq_wait(struct drm_device *dev, struct omap_irq_wait *wait,
+               unsigned long timeout)
+{
+       int ret = wait_event_timeout(wait_event, (wait->count <= 0), timeout);
+       omap_irq_unregister(dev, &wait->irq);
+       kfree(wait);
+       if (ret == 0)
+               return -1;
+       return 0;
+}
+
+/**
+ * enable_vblank - enable vblank interrupt events
+ * @dev: DRM device
+ * @crtc: which irq to enable
+ *
+ * Enable vblank interrupts for @crtc.  If the device doesn't have
+ * a hardware vblank counter, this routine should be a no-op, since
+ * interrupts will have to stay on to keep the count accurate.
+ *
+ * RETURNS
+ * Zero on success, appropriate errno if the given @crtc's vblank
+ * interrupt cannot be enabled.
+ */
+int omap_irq_enable_vblank(struct drm_device *dev, int crtc)
+{
+       struct omap_drm_private *priv = dev->dev_private;
+       unsigned long flags;
+
+       DBG("dev=%p, crtc=%d", dev, crtc);
+
+       dispc_runtime_get();
+       spin_lock_irqsave(&list_lock, flags);
+       priv->vblank_mask |= pipe2vbl(crtc);
+       omap_irq_update(dev);
+       spin_unlock_irqrestore(&list_lock, flags);
+       dispc_runtime_put();
+
+       return 0;
+}
+
+/**
+ * disable_vblank - disable vblank interrupt events
+ * @dev: DRM device
+ * @crtc: which irq to enable
+ *
+ * Disable vblank interrupts for @crtc.  If the device doesn't have
+ * a hardware vblank counter, this routine should be a no-op, since
+ * interrupts will have to stay on to keep the count accurate.
+ */
+void omap_irq_disable_vblank(struct drm_device *dev, int crtc)
+{
+       struct omap_drm_private *priv = dev->dev_private;
+       unsigned long flags;
+
+       DBG("dev=%p, crtc=%d", dev, crtc);
+
+       dispc_runtime_get();
+       spin_lock_irqsave(&list_lock, flags);
+       priv->vblank_mask &= ~pipe2vbl(crtc);
+       omap_irq_update(dev);
+       spin_unlock_irqrestore(&list_lock, flags);
+       dispc_runtime_put();
+}
+
+irqreturn_t omap_irq_handler(DRM_IRQ_ARGS)
+{
+       struct drm_device *dev = (struct drm_device *) arg;
+       struct omap_drm_private *priv = dev->dev_private;
+       struct omap_drm_irq *handler, *n;
+       unsigned long flags;
+       unsigned int id;
+       u32 irqstatus;
+
+       irqstatus = dispc_read_irqstatus();
+       dispc_clear_irqstatus(irqstatus);
+       dispc_read_irqstatus();        /* flush posted write */
+
+       VERB("irqs: %08x", irqstatus);
+
+       for (id = 0; id < priv->num_crtcs; id++)
+               if (irqstatus & pipe2vbl(id))
+                       drm_handle_vblank(dev, id);
+
+       spin_lock_irqsave(&list_lock, flags);
+       list_for_each_entry_safe(handler, n, &priv->irq_list, node) {
+               if (handler->irqmask & irqstatus) {
+                       spin_unlock_irqrestore(&list_lock, flags);
+                       handler->irq(handler, handler->irqmask & irqstatus);
+                       spin_lock_irqsave(&list_lock, flags);
+               }
+       }
+       spin_unlock_irqrestore(&list_lock, flags);
+
+       return IRQ_HANDLED;
+}
+
+void omap_irq_preinstall(struct drm_device *dev)
+{
+       DBG("dev=%p", dev);
+       dispc_runtime_get();
+       dispc_clear_irqstatus(0xffffffff);
+       dispc_runtime_put();
+}
+
+int omap_irq_postinstall(struct drm_device *dev)
+{
+       struct omap_drm_private *priv = dev->dev_private;
+       struct omap_drm_irq *error_handler = &priv->error_handler;
+
+       DBG("dev=%p", dev);
+
+       INIT_LIST_HEAD(&priv->irq_list);
+
+       error_handler->irq = omap_irq_error_handler;
+       error_handler->irqmask = DISPC_IRQ_OCP_ERR;
+
+       /* for now ignore DISPC_IRQ_SYNC_LOST_DIGIT.. really I think
+        * we just need to ignore it while enabling tv-out
+        */
+       error_handler->irqmask &= ~DISPC_IRQ_SYNC_LOST_DIGIT;
+
+       omap_irq_register(dev, error_handler);
+
+       return 0;
+}
+
+void omap_irq_uninstall(struct drm_device *dev)
+{
+       DBG("dev=%p", dev);
+       // TODO prolly need to call drm_irq_uninstall() somewhere too
+}
+
+/*
+ * We need a special version, instead of just using drm_irq_install(),
+ * because we need to register the irq via omapdss.  Once omapdss and
+ * omapdrm are merged together we can assign the dispc hwmod data to
+ * ourselves and drop these and just use drm_irq_{install,uninstall}()
+ */
+
+int omap_drm_irq_install(struct drm_device *dev)
+{
+       int ret;
+
+       mutex_lock(&dev->struct_mutex);
+
+       if (dev->irq_enabled) {
+               mutex_unlock(&dev->struct_mutex);
+               return -EBUSY;
+       }
+       dev->irq_enabled = 1;
+       mutex_unlock(&dev->struct_mutex);
+
+       /* Before installing handler */
+       if (dev->driver->irq_preinstall)
+               dev->driver->irq_preinstall(dev);
+
+       ret = dispc_request_irq(dev->driver->irq_handler, dev);
+
+       if (ret < 0) {
+               mutex_lock(&dev->struct_mutex);
+               dev->irq_enabled = 0;
+               mutex_unlock(&dev->struct_mutex);
+               return ret;
+       }
+
+       /* After installing handler */
+       if (dev->driver->irq_postinstall)
+               ret = dev->driver->irq_postinstall(dev);
+
+       if (ret < 0) {
+               mutex_lock(&dev->struct_mutex);
+               dev->irq_enabled = 0;
+               mutex_unlock(&dev->struct_mutex);
+               dispc_free_irq(dev);
+       }
+
+       return ret;
+}
+
+int omap_drm_irq_uninstall(struct drm_device *dev)
+{
+       unsigned long irqflags;
+       int irq_enabled, i;
+
+       mutex_lock(&dev->struct_mutex);
+       irq_enabled = dev->irq_enabled;
+       dev->irq_enabled = 0;
+       mutex_unlock(&dev->struct_mutex);
+
+       /*
+        * Wake up any waiters so they don't hang.
+        */
+       if (dev->num_crtcs) {
+               spin_lock_irqsave(&dev->vbl_lock, irqflags);
+               for (i = 0; i < dev->num_crtcs; i++) {
+                       DRM_WAKEUP(&dev->vbl_queue[i]);
+                       dev->vblank_enabled[i] = 0;
+                       dev->last_vblank[i] =
+                               dev->driver->get_vblank_counter(dev, i);
+               }
+               spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+       }
+
+       if (!irq_enabled)
+               return -EINVAL;
+
+       if (dev->driver->irq_uninstall)
+               dev->driver->irq_uninstall(dev);
+
+       dispc_free_irq(dev);
+
+       return 0;
+}
index 2a8e5bab49c908aa2ef3edd9da4ded8f6074dd67..bb989d7f026dcafd62f1aba1f5d1877ea34d3d9b 100644 (file)
@@ -41,12 +41,14 @@ struct callback {
 
 struct omap_plane {
        struct drm_plane base;
-       struct omap_overlay *ovl;
+       int id;  /* TODO rename omap_plane -> omap_plane_id in omapdss so I can use the enum */
+       const char *name;
        struct omap_overlay_info info;
+       struct omap_drm_apply apply;
 
        /* position/orientation of scanout within the fb: */
        struct omap_drm_window win;
-
+       bool enabled;
 
        /* last fb that we pinned: */
        struct drm_framebuffer *pinned_fb;
@@ -54,189 +56,15 @@ struct omap_plane {
        uint32_t nformats;
        uint32_t formats[32];
 
-       /* for synchronizing access to unpins fifo */
-       struct mutex unpin_mutex;
+       struct omap_drm_irq error_irq;
 
-       /* set of bo's pending unpin until next END_WIN irq */
+       /* set of bo's pending unpin until next post_apply() */
        DECLARE_KFIFO_PTR(unpin_fifo, struct drm_gem_object *);
-       int num_unpins, pending_num_unpins;
-
-       /* for deferred unpin when we need to wait for scanout complete irq */
-       struct work_struct work;
-
-       /* callback on next endwin irq */
-       struct callback endwin;
-};
 
-/* map from ovl->id to the irq we are interested in for scanout-done */
-static const uint32_t id2irq[] = {
-               [OMAP_DSS_GFX]    = DISPC_IRQ_GFX_END_WIN,
-               [OMAP_DSS_VIDEO1] = DISPC_IRQ_VID1_END_WIN,
-               [OMAP_DSS_VIDEO2] = DISPC_IRQ_VID2_END_WIN,
-               [OMAP_DSS_VIDEO3] = DISPC_IRQ_VID3_END_WIN,
+       // XXX maybe get rid of this and handle vblank in crtc too?
+       struct callback apply_done_cb;
 };
 
-static void dispc_isr(void *arg, uint32_t mask)
-{
-       struct drm_plane *plane = arg;
-       struct omap_plane *omap_plane = to_omap_plane(plane);
-       struct omap_drm_private *priv = plane->dev->dev_private;
-
-       omap_dispc_unregister_isr(dispc_isr, plane,
-                       id2irq[omap_plane->ovl->id]);
-
-       queue_work(priv->wq, &omap_plane->work);
-}
-
-static void unpin_worker(struct work_struct *work)
-{
-       struct omap_plane *omap_plane =
-                       container_of(work, struct omap_plane, work);
-       struct callback endwin;
-
-       mutex_lock(&omap_plane->unpin_mutex);
-       DBG("unpinning %d of %d", omap_plane->num_unpins,
-                       omap_plane->num_unpins + omap_plane->pending_num_unpins);
-       while (omap_plane->num_unpins > 0) {
-               struct drm_gem_object *bo = NULL;
-               int ret = kfifo_get(&omap_plane->unpin_fifo, &bo);
-               WARN_ON(!ret);
-               omap_gem_put_paddr(bo);
-               drm_gem_object_unreference_unlocked(bo);
-               omap_plane->num_unpins--;
-       }
-       endwin = omap_plane->endwin;
-       omap_plane->endwin.fxn = NULL;
-       mutex_unlock(&omap_plane->unpin_mutex);
-
-       if (endwin.fxn)
-               endwin.fxn(endwin.arg);
-}
-
-static void install_irq(struct drm_plane *plane)
-{
-       struct omap_plane *omap_plane = to_omap_plane(plane);
-       struct omap_overlay *ovl = omap_plane->ovl;
-       int ret;
-
-       ret = omap_dispc_register_isr(dispc_isr, plane, id2irq[ovl->id]);
-
-       /*
-        * omapdss has upper limit on # of registered irq handlers,
-        * which we shouldn't hit.. but if we do the limit should
-        * be raised or bad things happen:
-        */
-       WARN_ON(ret == -EBUSY);
-}
-
-/* push changes down to dss2 */
-static int commit(struct drm_plane *plane)
-{
-       struct drm_device *dev = plane->dev;
-       struct omap_plane *omap_plane = to_omap_plane(plane);
-       struct omap_overlay *ovl = omap_plane->ovl;
-       struct omap_overlay_info *info = &omap_plane->info;
-       int ret;
-
-       DBG("%s", ovl->name);
-       DBG("%dx%d -> %dx%d (%d)", info->width, info->height, info->out_width,
-                       info->out_height, info->screen_width);
-       DBG("%d,%d %08x %08x", info->pos_x, info->pos_y,
-                       info->paddr, info->p_uv_addr);
-
-       /* NOTE: do we want to do this at all here, or just wait
-        * for dpms(ON) since other CRTC's may not have their mode
-        * set yet, so fb dimensions may still change..
-        */
-       ret = ovl->set_overlay_info(ovl, info);
-       if (ret) {
-               dev_err(dev->dev, "could not set overlay info\n");
-               return ret;
-       }
-
-       mutex_lock(&omap_plane->unpin_mutex);
-       omap_plane->num_unpins += omap_plane->pending_num_unpins;
-       omap_plane->pending_num_unpins = 0;
-       mutex_unlock(&omap_plane->unpin_mutex);
-
-       /* our encoder doesn't necessarily get a commit() after this, in
-        * particular in the dpms() and mode_set_base() cases, so force the
-        * manager to update:
-        *
-        * could this be in the encoder somehow?
-        */
-       if (ovl->manager) {
-               ret = ovl->manager->apply(ovl->manager);
-               if (ret) {
-                       dev_err(dev->dev, "could not apply settings\n");
-                       return ret;
-               }
-
-               /*
-                * NOTE: really this should be atomic w/ mgr->apply() but
-                * omapdss does not expose such an API
-                */
-               if (omap_plane->num_unpins > 0)
-                       install_irq(plane);
-
-       } else {
-               struct omap_drm_private *priv = dev->dev_private;
-               queue_work(priv->wq, &omap_plane->work);
-       }
-
-
-       if (ovl->is_enabled(ovl)) {
-               omap_framebuffer_flush(plane->fb, info->pos_x, info->pos_y,
-                               info->out_width, info->out_height);
-       }
-
-       return 0;
-}
-
-/* when CRTC that we are attached to has potentially changed, this checks
- * if we are attached to proper manager, and if necessary updates.
- */
-static void update_manager(struct drm_plane *plane)
-{
-       struct omap_drm_private *priv = plane->dev->dev_private;
-       struct omap_plane *omap_plane = to_omap_plane(plane);
-       struct omap_overlay *ovl = omap_plane->ovl;
-       struct omap_overlay_manager *mgr = NULL;
-       int i;
-
-       if (plane->crtc) {
-               for (i = 0; i < priv->num_encoders; i++) {
-                       struct drm_encoder *encoder = priv->encoders[i];
-                       if (encoder->crtc == plane->crtc) {
-                               mgr = omap_encoder_get_manager(encoder);
-                               break;
-                       }
-               }
-       }
-
-       if (ovl->manager != mgr) {
-               bool enabled = ovl->is_enabled(ovl);
-
-               /* don't switch things around with enabled overlays: */
-               if (enabled)
-                       omap_plane_dpms(plane, DRM_MODE_DPMS_OFF);
-
-               if (ovl->manager) {
-                       DBG("disconnecting %s from %s", ovl->name,
-                                       ovl->manager->name);
-                       ovl->unset_manager(ovl);
-               }
-
-               if (mgr) {
-                       DBG("connecting %s to %s", ovl->name, mgr->name);
-                       ovl->set_manager(ovl, mgr);
-               }
-
-               if (enabled && mgr)
-                       omap_plane_dpms(plane, DRM_MODE_DPMS_ON);
-       }
-}
-
 static void unpin(void *arg, struct drm_gem_object *bo)
 {
        struct drm_plane *plane = arg;
@@ -244,7 +72,6 @@ static void unpin(void *arg, struct drm_gem_object *bo)
 
        if (kfifo_put(&omap_plane->unpin_fifo,
                        (const struct drm_gem_object **)&bo)) {
-               omap_plane->pending_num_unpins++;
                /* also hold a ref so it isn't free'd while pinned */
                drm_gem_object_reference(bo);
        } else {
@@ -264,13 +91,19 @@ static int update_pin(struct drm_plane *plane, struct drm_framebuffer *fb)
 
                DBG("%p -> %p", pinned_fb, fb);
 
-               mutex_lock(&omap_plane->unpin_mutex);
+               if (fb)
+                       drm_framebuffer_reference(fb);
+
                ret = omap_framebuffer_replace(pinned_fb, fb, plane, unpin);
-               mutex_unlock(&omap_plane->unpin_mutex);
+
+               if (pinned_fb)
+                       drm_framebuffer_unreference(pinned_fb);
 
                if (ret) {
                        dev_err(plane->dev->dev, "could not swap %p -> %p\n",
                                        omap_plane->pinned_fb, fb);
+                       if (fb)
+                               drm_framebuffer_unreference(fb);
                        omap_plane->pinned_fb = NULL;
                        return ret;
                }
@@ -281,31 +114,90 @@ static int update_pin(struct drm_plane *plane, struct drm_framebuffer *fb)
        return 0;
 }
 
-/* update parameters that are dependent on the framebuffer dimensions and
- * position within the fb that this plane scans out from. This is called
- * when framebuffer or x,y base may have changed.
- */
-static void update_scanout(struct drm_plane *plane)
+static void omap_plane_pre_apply(struct omap_drm_apply *apply)
 {
-       struct omap_plane *omap_plane = to_omap_plane(plane);
-       struct omap_overlay_info *info = &omap_plane->info;
+       struct omap_plane *omap_plane =
+                       container_of(apply, struct omap_plane, apply);
        struct omap_drm_window *win = &omap_plane->win;
+       struct drm_plane *plane = &omap_plane->base;
+       struct drm_device *dev = plane->dev;
+       struct omap_overlay_info *info = &omap_plane->info;
+       struct drm_crtc *crtc = plane->crtc;
+       enum omap_channel channel;
+       bool enabled = omap_plane->enabled && crtc;
+       bool ilace, replication;
        int ret;
 
-       ret = update_pin(plane, plane->fb);
-       if (ret) {
-               dev_err(plane->dev->dev,
-                       "could not pin fb: %d\n", ret);
-               omap_plane_dpms(plane, DRM_MODE_DPMS_OFF);
+       DBG("%s, enabled=%d", omap_plane->name, enabled);
+
+       /* if fb has changed, pin new fb: */
+       update_pin(plane, enabled ? plane->fb : NULL);
+
+       if (!enabled) {
+               dispc_ovl_enable(omap_plane->id, false);
                return;
        }
 
+       channel = omap_crtc_channel(crtc);
+
+       /* update scanout: */
        omap_framebuffer_update_scanout(plane->fb, win, info);
 
-       DBG("%s: %d,%d: %08x %08x (%d)", omap_plane->ovl->name,
-                       win->src_x, win->src_y,
-                       (u32)info->paddr, (u32)info->p_uv_addr,
+       DBG("%dx%d -> %dx%d (%d)", info->width, info->height,
+                       info->out_width, info->out_height,
                        info->screen_width);
+       DBG("%d,%d %08x %08x", info->pos_x, info->pos_y,
+                       info->paddr, info->p_uv_addr);
+
+       /* TODO: */
+       ilace = false;
+       replication = false;
+
+       /* and finally, update omapdss: */
+       ret = dispc_ovl_setup(omap_plane->id, info,
+                       replication, omap_crtc_timings(crtc), false);
+       if (ret) {
+               dev_err(dev->dev, "dispc_ovl_setup failed: %d\n", ret);
+               return;
+       }
+
+       dispc_ovl_enable(omap_plane->id, true);
+       dispc_ovl_set_channel_out(omap_plane->id, channel);
+}
+
+static void omap_plane_post_apply(struct omap_drm_apply *apply)
+{
+       struct omap_plane *omap_plane =
+                       container_of(apply, struct omap_plane, apply);
+       struct drm_plane *plane = &omap_plane->base;
+       struct omap_overlay_info *info = &omap_plane->info;
+       struct drm_gem_object *bo = NULL;
+       struct callback cb;
+
+       cb = omap_plane->apply_done_cb;
+       omap_plane->apply_done_cb.fxn = NULL;
+
+       while (kfifo_get(&omap_plane->unpin_fifo, &bo)) {
+               omap_gem_put_paddr(bo);
+               drm_gem_object_unreference_unlocked(bo);
+       }
+
+       if (cb.fxn)
+               cb.fxn(cb.arg);
+
+       if (omap_plane->enabled) {
+               omap_framebuffer_flush(plane->fb, info->pos_x, info->pos_y,
+                               info->out_width, info->out_height);
+       }
+}
+
+static int apply(struct drm_plane *plane)
+{
+       if (plane->crtc) {
+               struct omap_plane *omap_plane = to_omap_plane(plane);
+               return omap_crtc_apply(plane->crtc, &omap_plane->apply);
+       }
+       return 0;
 }
 
 int omap_plane_mode_set(struct drm_plane *plane,
@@ -313,7 +205,8 @@ int omap_plane_mode_set(struct drm_plane *plane,
                int crtc_x, int crtc_y,
                unsigned int crtc_w, unsigned int crtc_h,
                uint32_t src_x, uint32_t src_y,
-               uint32_t src_w, uint32_t src_h)
+               uint32_t src_w, uint32_t src_h,
+               void (*fxn)(void *), void *arg)
 {
        struct omap_plane *omap_plane = to_omap_plane(plane);
        struct omap_drm_window *win = &omap_plane->win;
@@ -329,17 +222,20 @@ int omap_plane_mode_set(struct drm_plane *plane,
        win->src_w = src_w >> 16;
        win->src_h = src_h >> 16;
 
-       /* note: this is done after this fxn returns.. but if we need
-        * to do a commit/update_scanout, etc before this returns we
-        * need the current value.
-        */
+       if (fxn) {
+               /* omap_crtc should ensure that a new page flip
+                * isn't permitted while there is one pending:
+                */
+               BUG_ON(omap_plane->apply_done_cb.fxn);
+
+               omap_plane->apply_done_cb.fxn = fxn;
+               omap_plane->apply_done_cb.arg = arg;
+       }
+
        plane->fb = fb;
        plane->crtc = crtc;
 
-       update_scanout(plane);
-       update_manager(plane);
-
-       return 0;
+       return apply(plane);
 }
 
 static int omap_plane_update(struct drm_plane *plane,
@@ -349,9 +245,12 @@ static int omap_plane_update(struct drm_plane *plane,
                uint32_t src_x, uint32_t src_y,
                uint32_t src_w, uint32_t src_h)
 {
-       omap_plane_mode_set(plane, crtc, fb, crtc_x, crtc_y, crtc_w, crtc_h,
-                       src_x, src_y, src_w, src_h);
-       return omap_plane_dpms(plane, DRM_MODE_DPMS_ON);
+       struct omap_plane *omap_plane = to_omap_plane(plane);
+       omap_plane->enabled = true;
+       return omap_plane_mode_set(plane, crtc, fb,
+                       crtc_x, crtc_y, crtc_w, crtc_h,
+                       src_x, src_y, src_w, src_h,
+                       NULL, NULL);
 }
 
 static int omap_plane_disable(struct drm_plane *plane)
@@ -364,48 +263,32 @@ static int omap_plane_disable(struct drm_plane *plane)
 static void omap_plane_destroy(struct drm_plane *plane)
 {
        struct omap_plane *omap_plane = to_omap_plane(plane);
-       DBG("%s", omap_plane->ovl->name);
+
+       DBG("%s", omap_plane->name);
+
+       omap_irq_unregister(plane->dev, &omap_plane->error_irq);
+
        omap_plane_disable(plane);
        drm_plane_cleanup(plane);
-       WARN_ON(omap_plane->pending_num_unpins + omap_plane->num_unpins > 0);
+
+       WARN_ON(!kfifo_is_empty(&omap_plane->unpin_fifo));
        kfifo_free(&omap_plane->unpin_fifo);
+
        kfree(omap_plane);
 }
 
 int omap_plane_dpms(struct drm_plane *plane, int mode)
 {
        struct omap_plane *omap_plane = to_omap_plane(plane);
-       struct omap_overlay *ovl = omap_plane->ovl;
-       int r;
+       bool enabled = (mode == DRM_MODE_DPMS_ON);
+       int ret = 0;
 
-       DBG("%s: %d", omap_plane->ovl->name, mode);
-
-       if (mode == DRM_MODE_DPMS_ON) {
-               update_scanout(plane);
-               r = commit(plane);
-               if (!r)
-                       r = ovl->enable(ovl);
-       } else {
-               struct omap_drm_private *priv = plane->dev->dev_private;
-               r = ovl->disable(ovl);
-               update_pin(plane, NULL);
-               queue_work(priv->wq, &omap_plane->work);
+       if (enabled != omap_plane->enabled) {
+               omap_plane->enabled = enabled;
+               ret = apply(plane);
        }
 
-       return r;
-}
-
-void omap_plane_on_endwin(struct drm_plane *plane,
-               void (*fxn)(void *), void *arg)
-{
-       struct omap_plane *omap_plane = to_omap_plane(plane);
-
-       mutex_lock(&omap_plane->unpin_mutex);
-       omap_plane->endwin.fxn = fxn;
-       omap_plane->endwin.arg = arg;
-       mutex_unlock(&omap_plane->unpin_mutex);
-
-       install_irq(plane);
+       return ret;
 }
 
 /* helper to install properties which are common to planes and crtcs */
@@ -454,25 +337,13 @@ int omap_plane_set_property(struct drm_plane *plane,
        int ret = -EINVAL;
 
        if (property == priv->rotation_prop) {
-               struct omap_overlay *ovl = omap_plane->ovl;
-
-               DBG("%s: rotation: %02x", ovl->name, (uint32_t)val);
+               DBG("%s: rotation: %02x", omap_plane->name, (uint32_t)val);
                omap_plane->win.rotation = val;
-
-               if (ovl->is_enabled(ovl))
-                       ret = omap_plane_dpms(plane, DRM_MODE_DPMS_ON);
-               else
-                       ret = 0;
+               ret = apply(plane);
        } else if (property == priv->zorder_prop) {
-               struct omap_overlay *ovl = omap_plane->ovl;
-
-               DBG("%s: zorder: %d", ovl->name, (uint32_t)val);
+               DBG("%s: zorder: %02x", omap_plane->name, (uint32_t)val);
                omap_plane->info.zorder = val;
-
-               if (ovl->is_enabled(ovl))
-                       ret = omap_plane_dpms(plane, DRM_MODE_DPMS_ON);
-               else
-                       ret = 0;
+               ret = apply(plane);
        }
 
        return ret;
@@ -485,20 +356,38 @@ static const struct drm_plane_funcs omap_plane_funcs = {
                .set_property = omap_plane_set_property,
 };
 
+static void omap_plane_error_irq(struct omap_drm_irq *irq, uint32_t irqstatus)
+{
+       struct omap_plane *omap_plane =
+                       container_of(irq, struct omap_plane, error_irq);
+       DRM_ERROR("%s: errors: %08x\n", omap_plane->name, irqstatus);
+}
+
+static const char *plane_names[] = {
+               [OMAP_DSS_GFX] = "gfx",
+               [OMAP_DSS_VIDEO1] = "vid1",
+               [OMAP_DSS_VIDEO2] = "vid2",
+               [OMAP_DSS_VIDEO3] = "vid3",
+};
+
+static const uint32_t error_irqs[] = {
+               [OMAP_DSS_GFX] = DISPC_IRQ_GFX_FIFO_UNDERFLOW,
+               [OMAP_DSS_VIDEO1] = DISPC_IRQ_VID1_FIFO_UNDERFLOW,
+               [OMAP_DSS_VIDEO2] = DISPC_IRQ_VID2_FIFO_UNDERFLOW,
+               [OMAP_DSS_VIDEO3] = DISPC_IRQ_VID3_FIFO_UNDERFLOW,
+};
+
 /* initialize plane */
 struct drm_plane *omap_plane_init(struct drm_device *dev,
-               struct omap_overlay *ovl, unsigned int possible_crtcs,
-               bool priv)
+               int id, bool private_plane)
 {
+       struct omap_drm_private *priv = dev->dev_private;
        struct drm_plane *plane = NULL;
        struct omap_plane *omap_plane;
+       struct omap_overlay_info *info;
        int ret;
 
-       DBG("%s: possible_crtcs=%08x, priv=%d", ovl->name,
-                       possible_crtcs, priv);
-
-       /* friendly reminder to update table for future hw: */
-       WARN_ON(ovl->id >= ARRAY_SIZE(id2irq));
+       DBG("%s: priv=%d", plane_names[id], private_plane);
 
        omap_plane = kzalloc(sizeof(*omap_plane), GFP_KERNEL);
        if (!omap_plane) {
@@ -506,47 +395,50 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
                goto fail;
        }
 
-       mutex_init(&omap_plane->unpin_mutex);
-
        ret = kfifo_alloc(&omap_plane->unpin_fifo, 16, GFP_KERNEL);
        if (ret) {
                dev_err(dev->dev, "could not allocate unpin FIFO\n");
                goto fail;
        }
 
-       INIT_WORK(&omap_plane->work, unpin_worker);
-
        omap_plane->nformats = omap_framebuffer_get_formats(
                        omap_plane->formats, ARRAY_SIZE(omap_plane->formats),
-                       ovl->supported_modes);
-       omap_plane->ovl = ovl;
+                       dss_feat_get_supported_color_modes(id));
+       omap_plane->id = id;
+       omap_plane->name = plane_names[id];
+
        plane = &omap_plane->base;
 
-       drm_plane_init(dev, plane, possible_crtcs, &omap_plane_funcs,
-                       omap_plane->formats, omap_plane->nformats, priv);
+       omap_plane->apply.pre_apply  = omap_plane_pre_apply;
+       omap_plane->apply.post_apply = omap_plane_post_apply;
+
+       omap_plane->error_irq.irqmask = error_irqs[id];
+       omap_plane->error_irq.irq = omap_plane_error_irq;
+       omap_irq_register(dev, &omap_plane->error_irq);
+
+       drm_plane_init(dev, plane, (1 << priv->num_crtcs) - 1, &omap_plane_funcs,
+                       omap_plane->formats, omap_plane->nformats, private_plane);
 
        omap_plane_install_properties(plane, &plane->base);
 
        /* get our starting configuration, set defaults for parameters
         * we don't currently use, etc:
         */
-       ovl->get_overlay_info(ovl, &omap_plane->info);
-       omap_plane->info.rotation_type = OMAP_DSS_ROT_DMA;
-       omap_plane->info.rotation = OMAP_DSS_ROT_0;
-       omap_plane->info.global_alpha = 0xff;
-       omap_plane->info.mirror = 0;
+       info = &omap_plane->info;
+       info->rotation_type = OMAP_DSS_ROT_DMA;
+       info->rotation = OMAP_DSS_ROT_0;
+       info->global_alpha = 0xff;
+       info->mirror = 0;
 
        /* Set defaults depending on whether we are a CRTC or overlay
         * layer.
         * TODO add ioctl to give userspace an API to change this.. this
         * will come in a subsequent patch.
         */
-       if (priv)
+       if (private_plane)
                omap_plane->info.zorder = 0;
        else
-               omap_plane->info.zorder = ovl->id;
-
-       update_manager(plane);
+               omap_plane->info.zorder = id;
 
        return plane;
 
index ae38475854b50249f6787b90762cd025c26fef5b..d10d75e8a33fc6775b8901297a6c9de397b064ce 100644 (file)
@@ -937,7 +937,8 @@ short alloc_rx_desc_ring(struct net_device *dev, u16 bufsize, int count)
 
                dma_tmp = pci_map_single(pdev, buf, bufsize * sizeof(u8),
                                         PCI_DMA_FROMDEVICE);
-
+               if (pci_dma_mapping_error(pdev, dma_tmp))
+                       return -1;
                if (-1 == buffer_add(&(priv->rxbuffer), buf, dma_tmp,
                           &(priv->rxbufferhead))) {
                        DMESGE("Unable to allocate mem RX buf");
index 808aab6fa5ef70b23baf41cbe4bbad20ca6d9f9c..a9d78e9651c6006a981c7e26c920f71cd57692d2 100644 (file)
@@ -1183,6 +1183,8 @@ void  rtl8192_tx_fill_desc(struct net_device *dev, struct tx_desc *pdesc,
                                                pTxFwInfo->TxRate,
                                                cb_desc);
 
+       if (pci_dma_mapping_error(priv->pdev, mapping))
+               RT_TRACE(COMP_ERR, "DMA Mapping error\n");;
        if (cb_desc->bAMPDUEnable) {
                pTxFwInfo->AllowAggregation = 1;
                pTxFwInfo->RxMF = cb_desc->ampdu_factor;
@@ -1280,6 +1282,8 @@ void  rtl8192_tx_fill_cmd_desc(struct net_device *dev,
        dma_addr_t mapping = pci_map_single(priv->pdev, skb->data, skb->len,
                         PCI_DMA_TODEVICE);
 
+       if (pci_dma_mapping_error(priv->pdev, mapping))
+               RT_TRACE(COMP_ERR, "DMA Mapping error\n");;
        memset(entry, 0, 12);
        entry->LINIP = cb_desc->bLastIniPkt;
        entry->FirstSeg = 1;
index 1a70f324552f14becf86c43d347b4977b84cd94e..4ebf99b3097543b07cad50a264e700d70b926e27 100644 (file)
@@ -2104,7 +2104,10 @@ static short rtl8192_alloc_rx_desc_ring(struct net_device *dev)
                                                  skb_tail_pointer_rsl(skb),
                                                  priv->rxbuffersize,
                                                  PCI_DMA_FROMDEVICE);
-
+                       if (pci_dma_mapping_error(priv->pdev, *mapping)) {
+                               dev_kfree_skb_any(skb);
+                               return -1;
+                       }
                        entry->BufferAddress = cpu_to_le32(*mapping);
 
                        entry->Length = priv->rxbuffersize;
@@ -2397,7 +2400,11 @@ static void rtl8192_rx_normal(struct net_device *dev)
                                                    skb_tail_pointer_rsl(skb),
                                                    priv->rxbuffersize,
                                                    PCI_DMA_FROMDEVICE);
-
+                       if (pci_dma_mapping_error(priv->pdev,
+                                                 *((dma_addr_t *)skb->cb))) {
+                               dev_kfree_skb_any(skb);
+                               return;
+                       }
                }
 done:
                pdesc->BufferAddress = cpu_to_le32(*((dma_addr_t *)skb->cb));
index 6b73843e580af46e373c7885898b45e97baa9928..a96cd06d69dd7fc9ed78d71ec920763b8c33c022 100644 (file)
@@ -63,6 +63,8 @@ static struct usb_device_id rtl871x_usb_id_tbl[] = {
        {USB_DEVICE(0x0B05, 0x1791)}, /* 11n mode disable */
        /* Belkin */
        {USB_DEVICE(0x050D, 0x945A)},
+       /* ISY IWL - Belkin clone */
+       {USB_DEVICE(0x050D, 0x11F1)},
        /* Corega */
        {USB_DEVICE(0x07AA, 0x0047)},
        /* D-Link */
index ac87c5e38dee05ec7f8e072a3d27c5c346594a13..1facad625554b0b88baf67c70e4a33b46d77560b 100644 (file)
@@ -2,6 +2,7 @@ config SB105X
        tristate "SystemBase PCI Multiport UART"
        select SERIAL_CORE
        depends on PCI
+       depends on X86
        help
          A driver for the SystemBase Multi-2/PCI serial card
 
index edb2a85b9d52512c41b161db44b5f74e93a44cd8..131afd0c460c3ba2f82f7beb68d11c75b59cbbaa 100644 (file)
@@ -3054,6 +3054,7 @@ static int init_mp_dev(struct pci_dev *pcidev, mppcibrd_t brd)
                                sbdev->nr_ports = ((portnum_hex/16)*10) + (portnum_hex % 16);
                        }
                        break;
+#ifdef CONFIG_PARPORT
                case PCI_DEVICE_ID_MP2S1P :
                        sbdev->nr_ports = 2;
 
@@ -3073,6 +3074,7 @@ static int init_mp_dev(struct pci_dev *pcidev, mppcibrd_t brd)
                        /* add PC compatible parallel port */
                        parport_pc_probe_port(pcidev->resource[2].start, pcidev->resource[3].start, PARPORT_IRQ_NONE, PARPORT_DMA_NONE, &pcidev->dev, 0);
                        break;
+#endif
        }
 
        ret = request_region(sbdev->uart_access_addr, (8*sbdev->nr_ports), sbdev->name);
index df9533798095cd7b2e2b08a1799f206c5091e07c..7616f058a00b43ab4c1dd91d0384e6a5400b9a65 100644 (file)
@@ -342,7 +342,7 @@ int synth_init(char *synth_name)
 
        mutex_lock(&spk_mutex);
        /* First, check if we already have it loaded. */
-       for (i = 0; synths[i] != NULL && i < MAXSYNTHS; i++)
+       for (i = 0; i < MAXSYNTHS && synths[i] != NULL; i++)
                if (strcmp(synths[i]->name, synth_name) == 0)
                        synth = synths[i];
 
@@ -423,7 +423,7 @@ int synth_add(struct spk_synth *in_synth)
        int i;
        int status = 0;
        mutex_lock(&spk_mutex);
-       for (i = 0; synths[i] != NULL && i < MAXSYNTHS; i++)
+       for (i = 0; i < MAXSYNTHS && synths[i] != NULL; i++)
                /* synth_remove() is responsible for rotating the array down */
                if (in_synth == synths[i]) {
                        mutex_unlock(&spk_mutex);
index 543a127c7d4d63e5b43de81151ec54a382cf03b8..b783bfa59b1cea42f943596f8ddce5c620a08835 100644 (file)
@@ -31,7 +31,7 @@
  * driver should read or write to PRM/CM registers directly; they
  * should rely on OMAP core code to do this.
  */
-#include <mach-omap2/cm2xxx_3xxx.h>
+#include <mach-omap2/cm3xxx.h>
 #include <mach-omap2/prm-regbits-34xx.h>
 #include <mach-omap2/cm-regbits-34xx.h>
 #include <dspbridge/devdefs.h>
index b647207928b14aca75a5e445cce94e5efc56b940..2f084e181d39de2131360677c65c9deb4ed3143f 100644 (file)
@@ -121,9 +121,13 @@ void dsp_clk_exit(void)
        for (i = 0; i < DM_TIMER_CLOCKS; i++)
                omap_dm_timer_free(timer[i]);
 
+       clk_unprepare(iva2_clk);
        clk_put(iva2_clk);
+       clk_unprepare(ssi.sst_fck);
        clk_put(ssi.sst_fck);
+       clk_unprepare(ssi.ssr_fck);
        clk_put(ssi.ssr_fck);
+       clk_unprepare(ssi.ick);
        clk_put(ssi.ick);
 }
 
@@ -145,14 +149,21 @@ void dsp_clk_init(void)
        iva2_clk = clk_get(&dspbridge_device.dev, "iva2_ck");
        if (IS_ERR(iva2_clk))
                dev_err(bridge, "failed to get iva2 clock %p\n", iva2_clk);
+       else
+               clk_prepare(iva2_clk);
 
        ssi.sst_fck = clk_get(&dspbridge_device.dev, "ssi_sst_fck");
        ssi.ssr_fck = clk_get(&dspbridge_device.dev, "ssi_ssr_fck");
        ssi.ick = clk_get(&dspbridge_device.dev, "ssi_ick");
 
-       if (IS_ERR(ssi.sst_fck) || IS_ERR(ssi.ssr_fck) || IS_ERR(ssi.ick))
+       if (IS_ERR(ssi.sst_fck) || IS_ERR(ssi.ssr_fck) || IS_ERR(ssi.ick)) {
                dev_err(bridge, "failed to get ssi: sst %p, ssr %p, ick %p\n",
                                        ssi.sst_fck, ssi.ssr_fck, ssi.ick);
+       } else {
+               clk_prepare(ssi.sst_fck);
+               clk_prepare(ssi.ssr_fck);
+               clk_prepare(ssi.ick);
+       }
 }
 
 /**
index 1dce36fb828f1d24ebcd8ea4d19c5c86d9587c88..7ff0e6c980395c80c9c83fe4355a6eef854a6a79 100644 (file)
@@ -63,11 +63,15 @@ int dsp_wdt_init(void)
        dsp_wdt.fclk = clk_get(NULL, "wdt3_fck");
 
        if (!IS_ERR(dsp_wdt.fclk)) {
+               clk_prepare(dsp_wdt.fclk);
+
                dsp_wdt.iclk = clk_get(NULL, "wdt3_ick");
                if (IS_ERR(dsp_wdt.iclk)) {
                        clk_put(dsp_wdt.fclk);
                        dsp_wdt.fclk = NULL;
                        ret = -EFAULT;
+               } else {
+                       clk_prepare(dsp_wdt.iclk);
                }
        } else
                ret = -EFAULT;
@@ -95,10 +99,14 @@ void dsp_wdt_exit(void)
        free_irq(INT_34XX_WDT3_IRQ, &dsp_wdt);
        tasklet_kill(&dsp_wdt.wdt3_tasklet);
 
-       if (dsp_wdt.fclk)
+       if (dsp_wdt.fclk) {
+               clk_unprepare(dsp_wdt.fclk);
                clk_put(dsp_wdt.fclk);
-       if (dsp_wdt.iclk)
+       }
+       if (dsp_wdt.iclk) {
+               clk_unprepare(dsp_wdt.iclk);
                clk_put(dsp_wdt.iclk);
+       }
 
        dsp_wdt.fclk = NULL;
        dsp_wdt.iclk = NULL;
index 0331178ca3b3c65d54da5a9ea0920118008e87f4..bf73ba26e88aee484b21dc5aeff7b661c07f0c90 100644 (file)
@@ -162,11 +162,9 @@ static struct vme_driver pio2_driver = {
 
 static int __init pio2_init(void)
 {
-       int retval = 0;
-
        if (bus_num == 0) {
                pr_err("No cards, skipping registration\n");
-               goto err_nocard;
+               return -ENODEV;
        }
 
        if (bus_num > PIO2_CARDS_MAX) {
@@ -176,15 +174,7 @@ static int __init pio2_init(void)
        }
 
        /* Register the PIO2 driver */
-       retval = vme_register_driver(&pio2_driver, bus_num);
-       if (retval != 0)
-               goto err_reg;
-
-       return retval;
-
-err_reg:
-err_nocard:
-       return retval;
+       return  vme_register_driver(&pio2_driver, bus_num);
 }
 
 static int pio2_match(struct vme_dev *vdev)
index 18c06a59c091b7bb1928cbac9038f5f0809a2288..1d31eab19d16b2d1ef5c2714162046da08c68500 100644 (file)
@@ -638,8 +638,8 @@ int prism2_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
 }
 
 
-int prism2_set_tx_power(struct wiphy *wiphy, enum nl80211_tx_power_setting type,
-                       int mbm)
+int prism2_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
+                       enum nl80211_tx_power_setting type, int mbm)
 {
        struct prism2_wiphy_private *priv = wiphy_priv(wiphy);
        wlandevice_t *wlandev = priv->wlandev;
@@ -665,7 +665,8 @@ exit:
        return err;
 }
 
-int prism2_get_tx_power(struct wiphy *wiphy, int *dbm)
+int prism2_get_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
+                       int *dbm)
 {
        struct prism2_wiphy_private *priv = wiphy_priv(wiphy);
        wlandevice_t *wlandev = priv->wlandev;
index fb4a7c94aed36f087cb41cc771f947b1d6776678..f2a73bd739fb94b750e66e1ee2c931e3c971a52a 100644 (file)
@@ -265,7 +265,7 @@ out_cleanup:
 static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
                           int offset)
 {
-       int ret;
+       int ret = 0;
        size_t clen;
        unsigned long handle;
        struct page *page;
@@ -286,10 +286,8 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
                        goto out;
                }
                ret = zram_decompress_page(zram, uncmem, index);
-               if (ret) {
-                       kfree(uncmem);
+               if (ret)
                        goto out;
-               }
        }
 
        /*
@@ -302,16 +300,18 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
 
        user_mem = kmap_atomic(page);
 
-       if (is_partial_io(bvec))
+       if (is_partial_io(bvec)) {
                memcpy(uncmem + offset, user_mem + bvec->bv_offset,
                       bvec->bv_len);
-       else
+               kunmap_atomic(user_mem);
+               user_mem = NULL;
+       } else {
                uncmem = user_mem;
+       }
 
        if (page_zero_filled(uncmem)) {
-               kunmap_atomic(user_mem);
-               if (is_partial_io(bvec))
-                       kfree(uncmem);
+               if (!is_partial_io(bvec))
+                       kunmap_atomic(user_mem);
                zram_stat_inc(&zram->stats.pages_zero);
                zram_set_flag(zram, index, ZRAM_ZERO);
                ret = 0;
@@ -321,9 +321,11 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
        ret = lzo1x_1_compress(uncmem, PAGE_SIZE, src, &clen,
                               zram->compress_workmem);
 
-       kunmap_atomic(user_mem);
-       if (is_partial_io(bvec))
-                       kfree(uncmem);
+       if (!is_partial_io(bvec)) {
+               kunmap_atomic(user_mem);
+               user_mem = NULL;
+               uncmem = NULL;
+       }
 
        if (unlikely(ret != LZO_E_OK)) {
                pr_err("Compression failed! err=%d\n", ret);
@@ -332,8 +334,10 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
 
        if (unlikely(clen > max_zpage_size)) {
                zram_stat_inc(&zram->stats.bad_compress);
-               src = uncmem;
                clen = PAGE_SIZE;
+               src = NULL;
+               if (is_partial_io(bvec))
+                       src = uncmem;
        }
 
        handle = zs_malloc(zram->mem_pool, clen);
@@ -345,7 +349,11 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
        }
        cmem = zs_map_object(zram->mem_pool, handle, ZS_MM_WO);
 
+       if ((clen == PAGE_SIZE) && !is_partial_io(bvec))
+               src = kmap_atomic(page);
        memcpy(cmem, src, clen);
+       if ((clen == PAGE_SIZE) && !is_partial_io(bvec))
+               kunmap_atomic(src);
 
        zs_unmap_object(zram->mem_pool, handle);
 
@@ -358,9 +366,10 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
        if (clen <= PAGE_SIZE / 2)
                zram_stat_inc(&zram->stats.good_compress);
 
-       return 0;
-
 out:
+       if (is_partial_io(bvec))
+               kfree(uncmem);
+
        if (ret)
                zram_stat64_inc(zram, &zram->stats.failed_writes);
        return ret;
index 7772d160376930ef417da581fc92482d93c01aec..224751e9f5ff3659448796da7d5323ec738f0770 100644 (file)
@@ -832,7 +832,7 @@ static inline struct  exynos_tmu_platform_data *exynos_get_driver_data(
        return (struct exynos_tmu_platform_data *)
                        platform_get_device_id(pdev)->driver_data;
 }
-static int __devinit exynos_tmu_probe(struct platform_device *pdev)
+static int exynos_tmu_probe(struct platform_device *pdev)
 {
        struct exynos_tmu_data *data;
        struct exynos_tmu_platform_data *pdata = pdev->dev.platform_data;
@@ -937,7 +937,7 @@ err_clk:
        return ret;
 }
 
-static int __devexit exynos_tmu_remove(struct platform_device *pdev)
+static int exynos_tmu_remove(struct platform_device *pdev)
 {
        struct exynos_tmu_data *data = platform_get_drvdata(pdev);
 
@@ -985,7 +985,7 @@ static struct platform_driver exynos_tmu_driver = {
                .of_match_table = exynos_tmu_match,
        },
        .probe = exynos_tmu_probe,
-       .remove = __devexit_p(exynos_tmu_remove),
+       .remove = exynos_tmu_remove,
        .id_table = exynos_tmu_driver_ids,
 };
 
index 4c90b510d0160c246f1fd5c6c280a88d091c80f8..640ae6c6d2d2ae67f504cb72582c40a8e85c9216 100644 (file)
@@ -37,6 +37,7 @@ config USB_ARCH_HAS_EHCI
        default y if ARCH_W90X900
        default y if ARCH_AT91
        default y if ARCH_MXC
+       default y if ARCH_MXS
        default y if ARCH_OMAP3
        default y if ARCH_CNS3XXX
        default y if ARCH_VT8500
index caecad9213f5cf14f3ef45827548c77e0648dfb9..8e9d31277c436ecce3fdd61ccb78031148a3e53e 100644 (file)
@@ -70,6 +70,9 @@ static int host_start(struct ci13xxx *ci)
        else
                ci->hcd = hcd;
 
+       if (ci->platdata->flags & CI13XXX_DISABLE_STREAMING)
+               hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS);
+
        return ret;
 }
 
index 8d809a811e169fac9ece6259c542c17c4b16f907..2d92cce260d7fd646d13d69e01f2152bbd43a487 100644 (file)
@@ -1602,6 +1602,9 @@ static const struct usb_device_id acm_ids[] = {
        { USB_DEVICE(0x0572, 0x1340), /* Conexant CX93010-2x UCMxx */
        .driver_info = NO_UNION_NORMAL,
        },
+       { USB_DEVICE(0x05f9, 0x4002), /* PSC Scanning, Magellan 800i */
+       .driver_info = NO_UNION_NORMAL,
+       },
        { USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */
        .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
        },
index a815fd2cc5e729287fe24b8a4b9bb4fc21082d6b..957ed2c41482706a4b9d1441815173e4deea2200 100644 (file)
@@ -877,6 +877,60 @@ static int hub_hub_status(struct usb_hub *hub,
        return ret;
 }
 
+static int hub_set_port_link_state(struct usb_hub *hub, int port1,
+                       unsigned int link_status)
+{
+       return set_port_feature(hub->hdev,
+                       port1 | (link_status << 3),
+                       USB_PORT_FEAT_LINK_STATE);
+}
+
+/*
+ * If USB 3.0 ports are placed into the Disabled state, they will no longer
+ * detect any device connects or disconnects.  This is generally not what the
+ * USB core wants, since it expects a disabled port to produce a port status
+ * change event when a new device connects.
+ *
+ * Instead, set the link state to Disabled, wait for the link to settle into
+ * that state, clear any change bits, and then put the port into the RxDetect
+ * state.
+ */
+static int hub_usb3_port_disable(struct usb_hub *hub, int port1)
+{
+       int ret;
+       int total_time;
+       u16 portchange, portstatus;
+
+       if (!hub_is_superspeed(hub->hdev))
+               return -EINVAL;
+
+       ret = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_SS_DISABLED);
+       if (ret) {
+               dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n",
+                               port1, ret);
+               return ret;
+       }
+
+       /* Wait for the link to enter the disabled state. */
+       for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) {
+               ret = hub_port_status(hub, port1, &portstatus, &portchange);
+               if (ret < 0)
+                       return ret;
+
+               if ((portstatus & USB_PORT_STAT_LINK_STATE) ==
+                               USB_SS_PORT_LS_SS_DISABLED)
+                       break;
+               if (total_time >= HUB_DEBOUNCE_TIMEOUT)
+                       break;
+               msleep(HUB_DEBOUNCE_STEP);
+       }
+       if (total_time >= HUB_DEBOUNCE_TIMEOUT)
+               dev_warn(hub->intfdev, "Could not disable port %d after %d ms\n",
+                               port1, total_time);
+
+       return hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_RX_DETECT);
+}
+
 static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
 {
        struct usb_device *hdev = hub->hdev;
@@ -885,8 +939,13 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
        if (hub->ports[port1 - 1]->child && set_state)
                usb_set_device_state(hub->ports[port1 - 1]->child,
                                USB_STATE_NOTATTACHED);
-       if (!hub->error && !hub_is_superspeed(hub->hdev))
-               ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE);
+       if (!hub->error) {
+               if (hub_is_superspeed(hub->hdev))
+                       ret = hub_usb3_port_disable(hub, port1);
+               else
+                       ret = clear_port_feature(hdev, port1,
+                                       USB_PORT_FEAT_ENABLE);
+       }
        if (ret)
                dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n",
                                port1, ret);
@@ -2440,7 +2499,7 @@ static unsigned hub_is_wusb(struct usb_hub *hub)
 #define HUB_SHORT_RESET_TIME   10
 #define HUB_BH_RESET_TIME      50
 #define HUB_LONG_RESET_TIME    200
-#define HUB_RESET_TIMEOUT      500
+#define HUB_RESET_TIMEOUT      800
 
 static int hub_port_reset(struct usb_hub *hub, int port1,
                        struct usb_device *udev, unsigned int delay, bool warm);
@@ -2475,6 +2534,10 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,
                if (ret < 0)
                        return ret;
 
+               /* The port state is unknown until the reset completes. */
+               if ((portstatus & USB_PORT_STAT_RESET))
+                       goto delay;
+
                /*
                 * Some buggy devices require a warm reset to be issued even
                 * when the port appears not to be connected.
@@ -2520,11 +2583,7 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,
                        if ((portchange & USB_PORT_STAT_C_CONNECTION))
                                return -ENOTCONN;
 
-                       /* if we`ve finished resetting, then break out of
-                        * the loop
-                        */
-                       if (!(portstatus & USB_PORT_STAT_RESET) &&
-                           (portstatus & USB_PORT_STAT_ENABLE)) {
+                       if ((portstatus & USB_PORT_STAT_ENABLE)) {
                                if (hub_is_wusb(hub))
                                        udev->speed = USB_SPEED_WIRELESS;
                                else if (hub_is_superspeed(hub->hdev))
@@ -2538,10 +2597,15 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,
                                return 0;
                        }
                } else {
-                       if (portchange & USB_PORT_STAT_C_BH_RESET)
-                               return 0;
+                       if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
+                                       hub_port_warm_reset_required(hub,
+                                               portstatus))
+                               return -ENOTCONN;
+
+                       return 0;
                }
 
+delay:
                /* switch to the long delay after two short delay failures */
                if (delay_time >= 2 * HUB_SHORT_RESET_TIME)
                        delay = HUB_LONG_RESET_TIME;
@@ -2565,14 +2629,11 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1,
                        msleep(10 + 40);
                        update_devnum(udev, 0);
                        hcd = bus_to_hcd(udev->bus);
-                       if (hcd->driver->reset_device) {
-                               *status = hcd->driver->reset_device(hcd, udev);
-                               if (*status < 0) {
-                                       dev_err(&udev->dev, "Cannot reset "
-                                                       "HCD device state\n");
-                                       break;
-                               }
-                       }
+                       /* The xHC may think the device is already reset,
+                        * so ignore the status.
+                        */
+                       if (hcd->driver->reset_device)
+                               hcd->driver->reset_device(hcd, udev);
                }
                /* FALL THROUGH */
        case -ENOTCONN:
@@ -2580,16 +2641,16 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1,
                clear_port_feature(hub->hdev,
                                port1, USB_PORT_FEAT_C_RESET);
                /* FIXME need disconnect() for NOTATTACHED device */
-               if (warm) {
+               if (hub_is_superspeed(hub->hdev)) {
                        clear_port_feature(hub->hdev, port1,
                                        USB_PORT_FEAT_C_BH_PORT_RESET);
                        clear_port_feature(hub->hdev, port1,
                                        USB_PORT_FEAT_C_PORT_LINK_STATE);
-               } else {
+               }
+               if (!warm)
                        usb_set_device_state(udev, *status
                                        ? USB_STATE_NOTATTACHED
                                        : USB_STATE_DEFAULT);
-               }
                break;
        }
 }
@@ -2939,7 +3000,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
 static int finish_port_resume(struct usb_device *udev)
 {
        int     status = 0;
-       u16     devstatus;
+       u16     devstatus = 0;
 
        /* caller owns the udev device lock */
        dev_dbg(&udev->dev, "%s\n",
@@ -2984,7 +3045,13 @@ static int finish_port_resume(struct usb_device *udev)
        if (status) {
                dev_dbg(&udev->dev, "gone after usb resume? status %d\n",
                                status);
-       } else if (udev->actconfig) {
+       /*
+        * There are a few quirky devices which violate the standard
+        * by claiming to have remote wakeup enabled after a reset,
+        * which crash if the feature is cleared, hence check for
+        * udev->reset_resume
+        */
+       } else if (udev->actconfig && !udev->reset_resume) {
                le16_to_cpus(&devstatus);
                if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) {
                        status = usb_control_msg(udev,
@@ -4638,9 +4705,14 @@ static void hub_events(void)
                         * SS.Inactive state.
                         */
                        if (hub_port_warm_reset_required(hub, portstatus)) {
+                               int status;
+
                                dev_dbg(hub_dev, "warm reset port %d\n", i);
-                               hub_port_reset(hub, i, NULL,
+                               status = hub_port_reset(hub, i, NULL,
                                                HUB_BH_RESET_TIME, true);
+                               if (status < 0)
+                                       hub_port_disable(hub, i, 1);
+                               connect_change = 0;
                        }
 
                        if (connect_change)
index fdefd9c7f7af089e54428b57625d394c70566561..3113c1d71442953d3f9659afff042064bca8a9b9 100644 (file)
@@ -43,6 +43,9 @@ static const struct usb_device_id usb_quirk_list[] = {
        /* Creative SB Audigy 2 NX */
        { USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME },
 
+       /* Microsoft LifeCam-VX700 v2.0 */
+       { USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME },
+
        /* Logitech Quickcam Fusion */
        { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME },
 
index 92604b4f9712630e83898c83df01b985e8b5a631..5945aadaa1c99a41df4edff373bbfbad080e34fe 100644 (file)
@@ -56,7 +56,7 @@
 #define dump_register(nm)                              \
 {                                                      \
        .name   = __stringify(nm),                      \
-       .offset = DWC3_ ##nm,                           \
+       .offset = DWC3_ ##nm - DWC3_GLOBALS_REGS_START, \
 }
 
 static const struct debugfs_reg32 dwc3_regs[] = {
index fc0ec5e0d58ef43a11f525148dca69d1cb442188..d9f6b9372491d487a817de021f8bfc660d04cd00 100644 (file)
@@ -3231,7 +3231,7 @@ static int udc_pci_probe(
        }
 
        if (!pdev->irq) {
-               dev_err(&dev->pdev->dev, "irq not set\n");
+               dev_err(&pdev->dev, "irq not set\n");
                kfree(dev);
                dev = NULL;
                retval = -ENODEV;
@@ -3250,7 +3250,7 @@ static int udc_pci_probe(
        dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR);
 
        if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) {
-               dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq);
+               dev_dbg(&pdev->dev, "request_irq(%d) fail\n", pdev->irq);
                kfree(dev);
                dev = NULL;
                retval = -EBUSY;
index 95d584dbed13b08516f23d90d83acb973d989a3a..8cf0c0f6fa1fb83bab5f26ab4d54a24e7bda3875 100644 (file)
@@ -130,10 +130,7 @@ static const char ep0name[] = "ep0";
 static const char *const ep_name[] = {
        ep0name,                                /* everyone has ep0 */
 
-       /* act like a net2280: high speed, six configurable endpoints */
-       "ep-a", "ep-b", "ep-c", "ep-d", "ep-e", "ep-f",
-
-       /* or like pxa250: fifteen fixed function endpoints */
+       /* act like a pxa250: fifteen fixed function endpoints */
        "ep1in-bulk", "ep2out-bulk", "ep3in-iso", "ep4out-iso", "ep5in-int",
        "ep6in-bulk", "ep7out-bulk", "ep8in-iso", "ep9out-iso", "ep10in-int",
        "ep11in-bulk", "ep12out-bulk", "ep13in-iso", "ep14out-iso",
@@ -141,6 +138,10 @@ static const char *const ep_name[] = {
 
        /* or like sa1100: two fixed function endpoints */
        "ep1out-bulk", "ep2in-bulk",
+
+       /* and now some generic EPs so we have enough in multi config */
+       "ep3out", "ep4in", "ep5out", "ep6out", "ep7in", "ep8out", "ep9in",
+       "ep10out", "ep11out", "ep12in", "ep13out", "ep14in", "ep15out",
 };
 #define DUMMY_ENDPOINTS        ARRAY_SIZE(ep_name)
 
index 379aac7b82fcf62d57b5ef41e1054c2b22e8ae71..6e8b1272ebceb3e1317e092ae7243e584c6eeda4 100644 (file)
@@ -1012,7 +1012,7 @@ static void udc_clock_enable(struct mv_udc *udc)
        unsigned int i;
 
        for (i = 0; i < udc->clknum; i++)
-               clk_enable(udc->clk[i]);
+               clk_prepare_enable(udc->clk[i]);
 }
 
 static void udc_clock_disable(struct mv_udc *udc)
@@ -1020,7 +1020,7 @@ static void udc_clock_disable(struct mv_udc *udc)
        unsigned int i;
 
        for (i = 0; i < udc->clknum; i++)
-               clk_disable(udc->clk[i]);
+               clk_disable_unprepare(udc->clk[i]);
 }
 
 static void udc_stop(struct mv_udc *udc)
index 141971d9051eab7d16dca79f0e652917171336e9..439c3f972f8c28d18fb34c691ab9cf8b51559098 100644 (file)
@@ -3477,12 +3477,11 @@ static void s3c_hsotg_delete_debug(struct s3c_hsotg *hsotg)
 /**
  * s3c_hsotg_release - release callback for hsotg device
  * @dev: Device to for which release is called
+ *
+ * Nothing to do as the resource is allocated using devm_ API.
  */
 static void s3c_hsotg_release(struct device *dev)
 {
-       struct s3c_hsotg *hsotg = dev_get_drvdata(dev);
-
-       kfree(hsotg);
 }
 
 /**
index 4f7f76f00c7452239067a5b5498a500d26093f50..7cacd6ae818e3ef957efe728eeb9641ccbf42071 100644 (file)
@@ -1794,9 +1794,10 @@ static int tcm_usbg_drop_nexus(struct usbg_tpg *tpg)
        tpg->tpg_nexus = NULL;
 
        kfree(tv_nexus);
+       ret = 0;
 out:
        mutex_unlock(&tpg->tpg_mutex);
-       return 0;
+       return ret;
 }
 
 static ssize_t tcm_usbg_tpg_store_nexus(
index d0f95482f40e8058a24f27b161f33beb55bb3c4d..598dcc1212f0bb231830f0022961f67e37b6b0fa 100644 (file)
@@ -887,7 +887,7 @@ static void gs_close(struct tty_struct *tty, struct file *file)
        pr_debug("gs_close: ttyGS%d (%p,%p) done!\n",
                        port->port_num, tty, file);
 
-       wake_up_interruptible(&port->port.close_wait);
+       wake_up(&port->port.close_wait);
 exit:
        spin_unlock_irq(&port->port_lock);
 }
index fd9b5424b860a20e7d04c54fe3cf4fc76ca3be2d..d81d2fcbff1894d79f0606d831d91b628c44f71e 100644 (file)
@@ -230,7 +230,7 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd,
 
        switch (phy_mode) {
        case FSL_USB2_PHY_ULPI:
-               if (pdata->controller_ver) {
+               if (pdata->have_sysif_regs && pdata->controller_ver) {
                        /* controller version 1.6 or above */
                        setbits32(non_ehci + FSL_SOC_USB_CTRL,
                                        ULPI_PHY_CLK_SEL);
@@ -251,7 +251,7 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd,
                portsc |= PORT_PTS_PTW;
                /* fall through */
        case FSL_USB2_PHY_UTMI:
-               if (pdata->controller_ver) {
+               if (pdata->have_sysif_regs && pdata->controller_ver) {
                        /* controller version 1.6 or above */
                        setbits32(non_ehci + FSL_SOC_USB_CTRL, UTMI_PHY_EN);
                        mdelay(FSL_UTMI_PHY_DLY);  /* Delay for UTMI PHY CLK to
@@ -267,7 +267,8 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd,
                break;
        }
 
-       if (pdata->controller_ver && (phy_mode == FSL_USB2_PHY_ULPI)) {
+       if (pdata->have_sysif_regs && pdata->controller_ver &&
+           (phy_mode == FSL_USB2_PHY_ULPI)) {
                /* check PHY_CLK_VALID to get phy clk valid */
                if (!spin_event_timeout(in_be32(non_ehci + FSL_SOC_USB_CTRL) &
                                PHY_CLK_VALID, FSL_USB_PHY_CLK_TIMEOUT, 0)) {
@@ -278,7 +279,7 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd,
 
        ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]);
 
-       if (phy_mode != FSL_USB2_PHY_ULPI)
+       if (phy_mode != FSL_USB2_PHY_ULPI && pdata->have_sysif_regs)
                setbits32(non_ehci + FSL_SOC_USB_CTRL, USB_CTRL_USB_EN);
 
        return 0;
index f7bfc0b898b97a90dfece792fe40ca16ef4a2f73..6c56297ea16b8f59bd887f9025cd68ca46a2be96 100644 (file)
@@ -43,7 +43,7 @@ static void ehci_clock_enable(struct ehci_hcd_mv *ehci_mv)
        unsigned int i;
 
        for (i = 0; i < ehci_mv->clknum; i++)
-               clk_enable(ehci_mv->clk[i]);
+               clk_prepare_enable(ehci_mv->clk[i]);
 }
 
 static void ehci_clock_disable(struct ehci_hcd_mv *ehci_mv)
@@ -51,7 +51,7 @@ static void ehci_clock_disable(struct ehci_hcd_mv *ehci_mv)
        unsigned int i;
 
        for (i = 0; i < ehci_mv->clknum; i++)
-               clk_disable(ehci_mv->clk[i]);
+               clk_disable_unprepare(ehci_mv->clk[i]);
 }
 
 static int mv_ehci_enable(struct ehci_hcd_mv *ehci_mv)
index a7d1f5b4c4eda4446d0fac523f72b7e068852d06..914a3ecfb5d361501a9a9e939d82388e34b795bc 100644 (file)
@@ -325,7 +325,7 @@ static int __exit ehci_orion_drv_remove(struct platform_device *pdev)
 
 MODULE_ALIAS("platform:orion-ehci");
 
-static const struct of_device_id ehci_orion_dt_ids[] __devinitdata = {
+static const struct of_device_id ehci_orion_dt_ids[] = {
        { .compatible = "marvell,orion-ehci", },
        {},
 };
index dabb20494826f1be237c9a08b6cea7569be46dd7..170b9399e09f34b42ec798b8e02985c5b0f71190 100644 (file)
@@ -200,6 +200,26 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
                break;
        }
 
+       /* optional debug port, normally in the first BAR */
+       temp = pci_find_capability(pdev, PCI_CAP_ID_DBG);
+       if (temp) {
+               pci_read_config_dword(pdev, temp, &temp);
+               temp >>= 16;
+               if (((temp >> 13) & 7) == 1) {
+                       u32 hcs_params = ehci_readl(ehci,
+                                                   &ehci->caps->hcs_params);
+
+                       temp &= 0x1fff;
+                       ehci->debug = hcd->regs + temp;
+                       temp = ehci_readl(ehci, &ehci->debug->control);
+                       ehci_info(ehci, "debug port %d%s\n",
+                                 HCS_DEBUG_PORT(hcs_params),
+                                 (temp & DBGP_ENABLED) ? " IN USE" : "");
+                       if (!(temp & DBGP_ENABLED))
+                               ehci->debug = NULL;
+               }
+       }
+
        retval = ehci_setup(hcd);
        if (retval)
                return retval;
@@ -228,25 +248,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
                break;
        }
 
-       /* optional debug port, normally in the first BAR */
-       temp = pci_find_capability(pdev, 0x0a);
-       if (temp) {
-               pci_read_config_dword(pdev, temp, &temp);
-               temp >>= 16;
-               if ((temp & (3 << 13)) == (1 << 13)) {
-                       temp &= 0x1fff;
-                       ehci->debug = hcd->regs + temp;
-                       temp = ehci_readl(ehci, &ehci->debug->control);
-                       ehci_info(ehci, "debug port %d%s\n",
-                               HCS_DEBUG_PORT(ehci->hcs_params),
-                               (temp & DBGP_ENABLED)
-                                       ? " IN USE"
-                                       : "");
-                       if (!(temp & DBGP_ENABLED))
-                               ehci->debug = NULL;
-               }
-       }
-
        /* at least the Genesys GL880S needs fixup here */
        temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
        temp &= 0x0f;
index 5105127c1d4b3e4c3ac06953c25ac959fdc24a6c..11e0b79ff9d52a8d703c3b2134b8960768123246 100644 (file)
@@ -142,6 +142,9 @@ static int usb_get_ver_info(struct device_node *np)
                        return ver;
        }
 
+       if (of_device_is_compatible(np, "fsl,mpc5121-usb2-dr"))
+               return FSL_USB_VER_OLD;
+
        if (of_device_is_compatible(np, "fsl-usb2-mph")) {
                if (of_device_is_compatible(np, "fsl-usb2-mph-v1.6"))
                        ver = FSL_USB_VER_1_6;
index bd6a7447ccc9efc41cd28e9a2c39b576c92fb6a3..f0ebe8e7c58b4dced4d50617b7a6235d90143cac 100644 (file)
@@ -58,6 +58,7 @@
 #include <linux/usb.h>
 #include <linux/usb/hcd.h>
 #include <linux/dma-mapping.h>
+#include <linux/module.h>
 
 #include "imx21-hcd.h"
 
index d370245a4ee22af7716983da3b48a9791251a4ff..5e3a6deb62b1e7d37b30f0f8a4f534f9e740fda9 100644 (file)
@@ -128,7 +128,8 @@ static void tmio_start_hc(struct platform_device *dev)
        tmio_iowrite8(2, tmio->ccr + CCR_INTC);
 
        dev_info(&dev->dev, "revision %d @ 0x%08llx, irq %d\n",
-                       tmio_ioread8(tmio->ccr + CCR_REVID), hcd->rsrc_start, hcd->irq);
+                       tmio_ioread8(tmio->ccr + CCR_REVID),
+                       (u64) hcd->rsrc_start, hcd->irq);
 }
 
 static int ohci_tmio_start(struct usb_hcd *hcd)
index a686cf4905bb80ae3e4c7b206c05d7cd2b960920..68914429482f30ff4afed47180aae563d07c5784 100644 (file)
@@ -761,12 +761,39 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
                        break;
                case USB_PORT_FEAT_LINK_STATE:
                        temp = xhci_readl(xhci, port_array[wIndex]);
+
+                       /* Disable port */
+                       if (link_state == USB_SS_PORT_LS_SS_DISABLED) {
+                               xhci_dbg(xhci, "Disable port %d\n", wIndex);
+                               temp = xhci_port_state_to_neutral(temp);
+                               /*
+                                * Clear all change bits, so that we get a new
+                                * connection event.
+                                */
+                               temp |= PORT_CSC | PORT_PEC | PORT_WRC |
+                                       PORT_OCC | PORT_RC | PORT_PLC |
+                                       PORT_CEC;
+                               xhci_writel(xhci, temp | PORT_PE,
+                                       port_array[wIndex]);
+                               temp = xhci_readl(xhci, port_array[wIndex]);
+                               break;
+                       }
+
+                       /* Put link in RxDetect (enable port) */
+                       if (link_state == USB_SS_PORT_LS_RX_DETECT) {
+                               xhci_dbg(xhci, "Enable port %d\n", wIndex);
+                               xhci_set_link_state(xhci, port_array, wIndex,
+                                               link_state);
+                               temp = xhci_readl(xhci, port_array[wIndex]);
+                               break;
+                       }
+
                        /* Software should not attempt to set
-                        * port link state above '5' (Rx.Detect) and the port
+                        * port link state above '3' (U3) and the port
                         * must be enabled.
                         */
                        if ((temp & PORT_PE) == 0 ||
-                               (link_state > USB_SS_PORT_LS_RX_DETECT)) {
+                               (link_state > USB_SS_PORT_LS_U3)) {
                                xhci_warn(xhci, "Cannot set link state.\n");
                                goto error;
                        }
@@ -957,6 +984,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
        int max_ports;
        __le32 __iomem **port_array;
        struct xhci_bus_state *bus_state;
+       bool reset_change = false;
 
        max_ports = xhci_get_ports(hcd, &port_array);
        bus_state = &xhci->bus_state[hcd_index(hcd)];
@@ -988,6 +1016,12 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
                        buf[(i + 1) / 8] |= 1 << (i + 1) % 8;
                        status = 1;
                }
+               if ((temp & PORT_RC))
+                       reset_change = true;
+       }
+       if (!status && !reset_change) {
+               xhci_dbg(xhci, "%s: stopping port polling.\n", __func__);
+               clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
        }
        spin_unlock_irqrestore(&xhci->lock, flags);
        return status ? retval : 0;
index fb51c7085ad0d19c7159afd9a069c82846afd405..35616ffbe3ae7435155bf29196d295f35a719b71 100644 (file)
@@ -1250,6 +1250,8 @@ static unsigned int xhci_microframes_to_exponent(struct usb_device *udev,
 static unsigned int xhci_parse_microframe_interval(struct usb_device *udev,
                struct usb_host_endpoint *ep)
 {
+       if (ep->desc.bInterval == 0)
+               return 0;
        return xhci_microframes_to_exponent(udev, ep,
                        ep->desc.bInterval, 0, 15);
 }
index cbb44b7b9d6553e01f9c2f45da23c8fad1b7fe92..59fb5c677dbe5cb899ef2f442a5a565bf0aa8dd6 100644 (file)
@@ -1725,6 +1725,15 @@ cleanup:
        if (bogus_port_status)
                return;
 
+       /*
+        * xHCI port-status-change events occur when the "or" of all the
+        * status-change bits in the portsc register changes from 0 to 1.
+        * New status changes won't cause an event if any other change
+        * bits are still set.  When an event occurs, switch over to
+        * polling to avoid losing status changes.
+        */
+       xhci_dbg(xhci, "%s: starting port polling.\n", __func__);
+       set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
        spin_unlock(&xhci->lock);
        /* Pass this up to the core */
        usb_hcd_poll_rh_status(hcd);
index 5c72c431bab18da941ec9a1a235c134086065482..f1f01a834ba792cee0935c5ffb9373d53fb368bd 100644 (file)
@@ -884,6 +884,11 @@ int xhci_suspend(struct xhci_hcd *xhci)
                        xhci->shared_hcd->state != HC_STATE_SUSPENDED)
                return -EINVAL;
 
+       /* Don't poll the roothubs on bus suspend. */
+       xhci_dbg(xhci, "%s: stopping port polling.\n", __func__);
+       clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
+       del_timer_sync(&hcd->rh_timer);
+
        spin_lock_irq(&xhci->lock);
        clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
        clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
@@ -1069,6 +1074,11 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
        if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
                compliance_mode_recovery_timer_init(xhci);
 
+       /* Re-enable port polling. */
+       xhci_dbg(xhci, "%s: starting port polling.\n", __func__);
+       set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
+       usb_hcd_poll_rh_status(hcd);
+
        return retval;
 }
 #endif /* CONFIG_PM */
index 7667b12f2ff5b0a0a32cd236d6d6e5d970e6cc47..268148de97147d7f77652914cd46660954c83525 100644 (file)
@@ -2179,7 +2179,7 @@ usbtest_ioctl(struct usb_interface *intf, unsigned int code, void *buf)
                if (dev->out_pipe == 0 || !param->length || param->sglen < 4)
                        break;
                retval = 0;
-               dev_info(&intf->dev, "TEST 17:  unlink from %d queues of "
+               dev_info(&intf->dev, "TEST 24:  unlink from %d queues of "
                                "%d %d-byte writes\n",
                                param->iterations, param->sglen, param->length);
                for (i = param->iterations; retval == 0 && i > 0; --i) {
index f1c6c5470b92550831cbe6551cf8cb090b2d491d..fd3486745e64bcdecd3aeea4843971e5e1795c22 100644 (file)
@@ -2298,10 +2298,7 @@ static int __init musb_init(void)
        if (usb_disabled())
                return 0;
 
-       pr_info("%s: version " MUSB_VERSION ", "
-               "?dma?"
-               ", "
-               "otg (peripheral+host)",
+       pr_info("%s: version " MUSB_VERSION ", ?dma?, otg (peripheral+host)\n",
                musb_driver_name);
        return platform_driver_register(&musb_driver);
 }
index e6f2ae8368bb8b046b34716698b553156df30a99..f7d764de6fdab988bde6124a8a9cd8657a0ea0ff 100644 (file)
@@ -134,6 +134,11 @@ static const resource_size_t dsps_control_module_phys[] = {
        DSPS_AM33XX_CONTROL_MODULE_PHYS_1,
 };
 
+#define USBPHY_CM_PWRDN                (1 << 0)
+#define USBPHY_OTG_PWRDN       (1 << 1)
+#define USBPHY_OTGVDET_EN      (1 << 19)
+#define USBPHY_OTGSESSEND_EN   (1 << 20)
+
 /**
  * musb_dsps_phy_control - phy on/off
  * @glue: struct dsps_glue *
index 6223062d5d1b5487534dc29724508d2e5df68793..37962c99ff1e9ace79bd89fdadfe4103649909e6 100644 (file)
@@ -110,7 +110,7 @@ config AB8500_USB
 
 config FSL_USB2_OTG
        bool "Freescale USB OTG Transceiver Driver"
-       depends on USB_EHCI_FSL && USB_GADGET_FSL_USB2 && USB_SUSPEND
+       depends on USB_EHCI_FSL && USB_FSL_USB2 && USB_SUSPEND
        select USB_OTG
        select USB_OTG_UTILS
        help
index 1dd57504186db5225b28b353527001b4e1914b2e..eace975991a873a938983da7c3dbb5abc2ce2df5 100644 (file)
@@ -240,7 +240,7 @@ static void otg_clock_enable(struct mv_otg *mvotg)
        unsigned int i;
 
        for (i = 0; i < mvotg->clknum; i++)
-               clk_enable(mvotg->clk[i]);
+               clk_prepare_enable(mvotg->clk[i]);
 }
 
 static void otg_clock_disable(struct mv_otg *mvotg)
@@ -248,7 +248,7 @@ static void otg_clock_disable(struct mv_otg *mvotg)
        unsigned int i;
 
        for (i = 0; i < mvotg->clknum; i++)
-               clk_disable(mvotg->clk[i]);
+               clk_disable_unprepare(mvotg->clk[i]);
 }
 
 static int mv_otg_enable_internal(struct mv_otg *mvotg)
index dd41f61893ef87484fbfc233dc338427bcfcede6..f2985cd88021c0bd52178ee48cc64c4c7c97bc00 100644 (file)
@@ -545,15 +545,6 @@ static int usbhsg_pipe_disable(struct usbhsg_uep *uep)
        return 0;
 }
 
-static void usbhsg_uep_init(struct usbhsg_gpriv *gpriv)
-{
-       int i;
-       struct usbhsg_uep *uep;
-
-       usbhsg_for_each_uep_with_dcp(uep, gpriv, i)
-               uep->pipe = NULL;
-}
-
 /*
  *
  *             usb_ep_ops
@@ -610,7 +601,12 @@ static int usbhsg_ep_disable(struct usb_ep *ep)
 {
        struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep);
 
-       return usbhsg_pipe_disable(uep);
+       usbhsg_pipe_disable(uep);
+
+       uep->pipe->mod_private  = NULL;
+       uep->pipe               = NULL;
+
+       return 0;
 }
 
 static struct usb_request *usbhsg_ep_alloc_request(struct usb_ep *ep,
@@ -761,9 +757,8 @@ static int usbhsg_try_start(struct usbhs_priv *priv, u32 status)
        usbhs_pipe_init(priv,
                        usbhsg_dma_map_ctrl);
        usbhs_fifo_init(priv);
-       usbhsg_uep_init(gpriv);
 
-       /* dcp init */
+       /* dcp init instead of usbhsg_ep_enable() */
        dcp->pipe               = usbhs_dcp_malloc(priv);
        dcp->pipe->mod_private  = dcp;
        usbhs_pipe_config_update(dcp->pipe, 0, 0, 64);
@@ -825,7 +820,7 @@ static int usbhsg_try_stop(struct usbhs_priv *priv, u32 status)
        usbhs_sys_set_test_mode(priv, 0);
        usbhs_sys_function_ctrl(priv, 0);
 
-       usbhsg_pipe_disable(dcp);
+       usbhsg_ep_disable(&dcp->ep);
 
        dev_dbg(dev, "stop gadget\n");
 
@@ -998,6 +993,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
         */
        usbhsg_for_each_uep_with_dcp(uep, gpriv, i) {
                uep->gpriv      = gpriv;
+               uep->pipe       = NULL;
                snprintf(uep->ep_name, EP_NAME_SIZE, "ep%d", i);
 
                uep->ep.name            = uep->ep_name;
index 3d3cd6ca2689894a497efefeb6ffc1edf6002cba..b86815421c8d4b6bbf86a54f39bd0e83c82d8bda 100644 (file)
@@ -661,9 +661,10 @@ static void usbhsh_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt)
                status = -ESHUTDOWN;
 
        urb->actual_length = pkt->actual;
-       usbhsh_ureq_free(hpriv, ureq);
 
        usbhsh_endpoint_sequence_save(hpriv, urb, pkt);
+       usbhsh_ureq_free(hpriv, ureq);
+
        usbhsh_pipe_detach(hpriv, usbhsh_ep_to_uep(urb->ep));
 
        usb_hcd_unlink_urb_from_ep(hcd, urb);
index 0a373b3ae96a77c5f43afbc316c5faaba82e0609..ba68835d06a6ba1a957aee83239346d62268dcc6 100644 (file)
@@ -875,6 +875,8 @@ static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
        { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
+       /* Crucible Devices */
+       { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
        { },                                    /* Optional parameter entry */
        { }                                     /* Terminating entry */
 };
index 049b6e715fa470921748a9d29a236946e148ec7a..fa5d560382763151a801ea4bde9de327b1ee1aa7 100644 (file)
  * ATI command output: Cinterion MC55i
  */
 #define FTDI_CINTERION_MC55I_PID       0xA951
+
+/*
+ * Product: Comet Caller ID decoder
+ * Manufacturer: Crucible Technologies
+ */
+#define FTDI_CT_COMET_PID      0x8e08
index e6f87b76c7156914dac281684e6130fde3b85ac0..478adcfcdf2652a7fcb8076687d853737ef38961 100644 (file)
@@ -288,6 +288,7 @@ static void option_instat_callback(struct urb *urb);
 #define ALCATEL_VENDOR_ID                      0x1bbb
 #define ALCATEL_PRODUCT_X060S_X200             0x0000
 #define ALCATEL_PRODUCT_X220_X500D             0x0017
+#define ALCATEL_PRODUCT_L100V                  0x011e
 
 #define PIRELLI_VENDOR_ID                      0x1266
 #define PIRELLI_PRODUCT_C100_1                 0x1002
@@ -429,9 +430,12 @@ static void option_instat_callback(struct urb *urb);
 #define MEDIATEK_VENDOR_ID                     0x0e8d
 #define MEDIATEK_PRODUCT_DC_1COM               0x00a0
 #define MEDIATEK_PRODUCT_DC_4COM               0x00a5
+#define MEDIATEK_PRODUCT_DC_4COM2              0x00a7
 #define MEDIATEK_PRODUCT_DC_5COM               0x00a4
 #define MEDIATEK_PRODUCT_7208_1COM             0x7101
 #define MEDIATEK_PRODUCT_7208_2COM             0x7102
+#define MEDIATEK_PRODUCT_7103_2COM             0x7103
+#define MEDIATEK_PRODUCT_7106_2COM             0x7106
 #define MEDIATEK_PRODUCT_FP_1COM               0x0003
 #define MEDIATEK_PRODUCT_FP_2COM               0x0023
 #define MEDIATEK_PRODUCT_FPDC_1COM             0x0043
@@ -441,6 +445,10 @@ static void option_instat_callback(struct urb *urb);
 #define CELLIENT_VENDOR_ID                     0x2692
 #define CELLIENT_PRODUCT_MEN200                        0x9005
 
+/* Hyundai Petatel Inc. products */
+#define PETATEL_VENDOR_ID                      0x1ff4
+#define PETATEL_PRODUCT_NP10T                  0x600e
+
 /* some devices interfaces need special handling due to a number of reasons */
 enum option_blacklist_reason {
                OPTION_BLACKLIST_NONE = 0,
@@ -923,7 +931,8 @@ static const struct usb_device_id option_ids[] = {
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */
          .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff) },
-       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff), /* ZTE MF880 */
+         .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0317, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff),
          .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
@@ -1190,6 +1199,8 @@ static const struct usb_device_id option_ids[] = {
          .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist
        },
        { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D) },
+       { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V),
+         .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
        { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) },
        { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) },
        { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14),
@@ -1294,7 +1305,12 @@ static const struct usb_device_id option_ids[] = {
        { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FP_2COM, 0x0a, 0x00, 0x00) },
        { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FPDC_1COM, 0x0a, 0x00, 0x00) },
        { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FPDC_2COM, 0x0a, 0x00, 0x00) },
+       { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_7103_2COM, 0xff, 0x00, 0x00) },
+       { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_7106_2COM, 0x02, 0x02, 0x01) },
+       { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x02, 0x01) },
+       { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x00, 0x00) },
        { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) },
+       { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) },
        { } /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, option_ids);
index b303f17150654a8a4d0237f41977421a29cd715b..6488a7351a6055adbe1c80c6cdc68390aa4c4d25 100644 (file)
@@ -66,7 +66,7 @@
  * have.  Allow 1% either way on the nominal for TVs.
  */
 #define NR_MONTYPES    6
-static struct fb_monspecs monspecs[NR_MONTYPES] __devinitdata = {
+static struct fb_monspecs monspecs[NR_MONTYPES] = {
        {       /* TV           */
                .hfmin  = 15469,
                .hfmax  = 15781,
@@ -874,7 +874,7 @@ static struct fb_ops acornfb_ops = {
 /*
  * Everything after here is initialisation!!!
  */
-static struct fb_videomode modedb[] __devinitdata = {
+static struct fb_videomode modedb[] = {
        {       /* 320x256 @ 50Hz */
                NULL, 50,  320,  256, 125000,  92,  62,  35, 19,  38, 2,
                FB_SYNC_COMP_HIGH_ACT,
@@ -926,7 +926,7 @@ static struct fb_videomode modedb[] __devinitdata = {
        }
 };
 
-static struct fb_videomode acornfb_default_mode __devinitdata = {
+static struct fb_videomode acornfb_default_mode = {
        .name =         NULL,
        .refresh =      60,
        .xres =         640,
@@ -942,7 +942,7 @@ static struct fb_videomode acornfb_default_mode __devinitdata = {
        .vmode =        FB_VMODE_NONINTERLACED
 };
 
-static void __devinit acornfb_init_fbinfo(void)
+static void acornfb_init_fbinfo(void)
 {
        static int first = 1;
 
@@ -1018,7 +1018,7 @@ static void __devinit acornfb_init_fbinfo(void)
  *     size can optionally be followed by 'M' or 'K' for
  *     MB or KB respectively.
  */
-static void __devinit acornfb_parse_mon(char *opt)
+static void acornfb_parse_mon(char *opt)
 {
        char *p = opt;
 
@@ -1065,7 +1065,7 @@ bad:
        current_par.montype = -1;
 }
 
-static void __devinit acornfb_parse_montype(char *opt)
+static void acornfb_parse_montype(char *opt)
 {
        current_par.montype = -2;
 
@@ -1106,7 +1106,7 @@ static void __devinit acornfb_parse_montype(char *opt)
        }
 }
 
-static void __devinit acornfb_parse_dram(char *opt)
+static void acornfb_parse_dram(char *opt)
 {
        unsigned int size;
 
@@ -1131,14 +1131,14 @@ static void __devinit acornfb_parse_dram(char *opt)
 static struct options {
        char *name;
        void (*parse)(char *opt);
-} opt_table[] __devinitdata = {
+} opt_table[] = {
        { "mon",     acornfb_parse_mon     },
        { "montype", acornfb_parse_montype },
        { "dram",    acornfb_parse_dram    },
        { NULL, NULL }
 };
 
-static int __devinit acornfb_setup(char *options)
+static int acornfb_setup(char *options)
 {
        struct options *optp;
        char *opt;
@@ -1175,7 +1175,7 @@ static int __devinit acornfb_setup(char *options)
  * Detect type of monitor connected
  *  For now, we just assume SVGA
  */
-static int __devinit acornfb_detect_monitortype(void)
+static int acornfb_detect_monitortype(void)
 {
        return 4;
 }
@@ -1216,7 +1216,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
        printk("acornfb: freed %dK memory\n", mb_freed);
 }
 
-static int __devinit acornfb_probe(struct platform_device *dev)
+static int acornfb_probe(struct platform_device *dev)
 {
        unsigned long size;
        u_int h_sync, v_sync;
index 4659d5da6ff88d2a59270b9b2db69aec0c14908d..e43401afdd03f56d8c5b57efe935b6bda19b0fff 100644 (file)
@@ -79,7 +79,7 @@ struct arcfb_par {
        spinlock_t lock;
 };
 
-static struct fb_fix_screeninfo arcfb_fix __devinitdata = {
+static struct fb_fix_screeninfo arcfb_fix = {
        .id =           "arcfb",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_MONO01,
@@ -89,7 +89,7 @@ static struct fb_fix_screeninfo arcfb_fix __devinitdata = {
        .accel =        FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo arcfb_var __devinitdata = {
+static struct fb_var_screeninfo arcfb_var = {
        .xres           = 128,
        .yres           = 64,
        .xres_virtual   = 128,
@@ -502,7 +502,7 @@ static struct fb_ops arcfb_ops = {
        .fb_ioctl       = arcfb_ioctl,
 };
 
-static int __devinit arcfb_probe(struct platform_device *dev)
+static int arcfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int retval = -ENOMEM;
@@ -587,7 +587,7 @@ err:
        return retval;
 }
 
-static int __devexit arcfb_remove(struct platform_device *dev)
+static int arcfb_remove(struct platform_device *dev)
 {
        struct fb_info *info = platform_get_drvdata(dev);
 
@@ -601,7 +601,7 @@ static int __devexit arcfb_remove(struct platform_device *dev)
 
 static struct platform_driver arcfb_driver = {
        .probe  = arcfb_probe,
-       .remove = __devexit_p(arcfb_remove),
+       .remove = arcfb_remove,
        .driver = {
                .name   = "arcfb",
        },
index 555dd4c64f5be24a1a13986f84fe19360f1d9102..94a51f1ef904d55515fb56d02570eb86502e3e01 100644 (file)
@@ -100,7 +100,7 @@ static const struct svga_timing_regs ark_timing_regs     = {
 
 /* Module parameters */
 
-static char *mode_option __devinitdata = "640x480-8@60";
+static char *mode_option = "640x480-8@60";
 
 #ifdef CONFIG_MTRR
 static int mtrr = 1;
@@ -950,7 +950,7 @@ static struct fb_ops arkfb_ops = {
 
 
 /* PCI probe */
-static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int ark_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct pci_bus_region bus_reg;
        struct resource vga_res;
@@ -1086,7 +1086,7 @@ err_enable_device:
 
 /* PCI remove */
 
-static void __devexit ark_pci_remove(struct pci_dev *dev)
+static void ark_pci_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
 
@@ -1184,7 +1184,7 @@ fail:
 
 /* List of boards that we are trying to support */
 
-static struct pci_device_id ark_devices[] __devinitdata = {
+static struct pci_device_id ark_devices[] = {
        {PCI_DEVICE(0xEDD8, 0xA099)},
        {0, 0, 0, 0, 0, 0, 0}
 };
@@ -1196,7 +1196,7 @@ static struct pci_driver arkfb_pci_driver = {
        .name           = "arkfb",
        .id_table       = ark_devices,
        .probe          = ark_pci_probe,
-       .remove         = __devexit_p(ark_pci_remove),
+       .remove         = ark_pci_remove,
        .suspend        = ark_pci_suspend,
        .resume         = ark_pci_resume,
 };
index 8cdf88e20b4b649136439aef85af97be7baf2d91..d5a37d62847bd934c5d0b6c56638da9482a1347b 100644 (file)
@@ -451,7 +451,7 @@ static struct chips_init_reg chips_init_xr[] =
        {0xd1, 0x01},
 };
 
-static void __devinit chips_hw_init(struct fb_info *p)
+static void chips_hw_init(struct fb_info *p)
 {
        int i;
 
@@ -474,7 +474,7 @@ static void __devinit chips_hw_init(struct fb_info *p)
                write_fr(chips_init_fr[i].addr, chips_init_fr[i].data);
 }
 
-static struct fb_fix_screeninfo asiliantfb_fix __devinitdata = {
+static struct fb_fix_screeninfo asiliantfb_fix = {
        .id =           "Asiliant 69000",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_PSEUDOCOLOR,
@@ -483,7 +483,7 @@ static struct fb_fix_screeninfo asiliantfb_fix __devinitdata = {
        .smem_len =     0x200000,       /* 2MB */
 };
 
-static struct fb_var_screeninfo asiliantfb_var __devinitdata = {
+static struct fb_var_screeninfo asiliantfb_var = {
        .xres           = 640,
        .yres           = 480,
        .xres_virtual   = 640,
@@ -504,7 +504,7 @@ static struct fb_var_screeninfo asiliantfb_var __devinitdata = {
        .vsync_len      = 2,
 };
 
-static int __devinit init_asiliant(struct fb_info *p, unsigned long addr)
+static int init_asiliant(struct fb_info *p, unsigned long addr)
 {
        int err;
 
@@ -535,8 +535,8 @@ static int __devinit init_asiliant(struct fb_info *p, unsigned long addr)
        return 0;
 }
 
-static int __devinit
-asiliantfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
+static int asiliantfb_pci_init(struct pci_dev *dp,
+                              const struct pci_device_id *ent)
 {
        unsigned long addr, size;
        struct fb_info *p;
@@ -581,7 +581,7 @@ asiliantfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
        return 0;
 }
 
-static void __devexit asiliantfb_remove(struct pci_dev *dp)
+static void asiliantfb_remove(struct pci_dev *dp)
 {
        struct fb_info *p = pci_get_drvdata(dp);
 
@@ -593,7 +593,7 @@ static void __devexit asiliantfb_remove(struct pci_dev *dp)
        framebuffer_release(p);
 }
 
-static struct pci_device_id asiliantfb_pci_tbl[] __devinitdata = {
+static struct pci_device_id asiliantfb_pci_tbl[] = {
        { PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69000, PCI_ANY_ID, PCI_ANY_ID },
        { 0 }
 };
@@ -604,7 +604,7 @@ static struct pci_driver asiliantfb_driver = {
        .name =         "asiliantfb",
        .id_table =     asiliantfb_pci_tbl,
        .probe =        asiliantfb_pci_init,
-       .remove =       __devexit_p(asiliantfb_remove),
+       .remove =       asiliantfb_remove,
 };
 
 static int __init asiliantfb_init(void)
index 0fefa84ed9aef06c8df664c289d42cbecc8dac76..8c55011313dc7c382a17f8e552ea3b4a536b3457 100644 (file)
@@ -98,7 +98,7 @@
 
 #ifndef CONFIG_PPC_PMAC
 /* default mode */
-static struct fb_var_screeninfo default_var __devinitdata = {
+static struct fb_var_screeninfo default_var = {
        /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */
        640, 480, 640, 480, 0, 0, 8, 0,
        {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
@@ -121,7 +121,7 @@ static struct fb_var_screeninfo default_var = {
 
 /* default modedb mode */
 /* 640x480, 60 Hz, Non-Interlaced (25.172 MHz dotclock) */
-static struct fb_videomode defaultmode __devinitdata = {
+static struct fb_videomode defaultmode = {
        .refresh =      60,
        .xres =         640,
        .yres =         480,
@@ -149,7 +149,7 @@ enum {
 };
 
 /* Must match above enum */
-static char * const r128_family[] __devinitconst = {
+static char * const r128_family[] = {
        "AGP",
        "PCI",
        "PRO AGP",
@@ -275,7 +275,7 @@ static struct pci_driver aty128fb_driver = {
        .name           = "aty128fb",
        .id_table       = aty128_pci_tbl,
        .probe          = aty128_probe,
-       .remove         = __devexit_p(aty128_remove),
+       .remove         = aty128_remove,
        .suspend        = aty128_pci_suspend,
        .resume         = aty128_pci_resume,
 };
@@ -333,7 +333,7 @@ static const struct aty128_meminfo sdr_sgram =
 static const struct aty128_meminfo ddr_sgram =
        { 4, 4, 3, 3, 2, 3, 1, 16, 31, 16, "64-bit DDR SGRAM" };
 
-static struct fb_fix_screeninfo aty128fb_fix __devinitdata = {
+static struct fb_fix_screeninfo aty128fb_fix = {
        .id             = "ATY Rage128",
        .type           = FB_TYPE_PACKED_PIXELS,
        .visual         = FB_VISUAL_PSEUDOCOLOR,
@@ -343,24 +343,24 @@ static struct fb_fix_screeninfo aty128fb_fix __devinitdata = {
        .accel          = FB_ACCEL_ATI_RAGE128,
 };
 
-static char *mode_option __devinitdata = NULL;
+static char *mode_option = NULL;
 
 #ifdef CONFIG_PPC_PMAC
-static int default_vmode __devinitdata = VMODE_1024_768_60;
-static int default_cmode __devinitdata = CMODE_8;
+static int default_vmode = VMODE_1024_768_60;
+static int default_cmode = CMODE_8;
 #endif
 
-static int default_crt_on __devinitdata = 0;
-static int default_lcd_on __devinitdata = 1;
+static int default_crt_on = 0;
+static int default_lcd_on = 1;
 
 #ifdef CONFIG_MTRR
 static bool mtrr = true;
 #endif
 
 #ifdef CONFIG_PMAC_BACKLIGHT
-static int backlight __devinitdata = 1;
+static int backlight = 1;
 #else
-static int backlight __devinitdata = 0;
+static int backlight = 0;
 #endif
 
 /* PLL constants */
@@ -449,10 +449,9 @@ static int aty128_encode_var(struct fb_var_screeninfo *var,
 static int aty128_decode_var(struct fb_var_screeninfo *var,
                              struct aty128fb_par *par);
 #if 0
-static void __devinit aty128_get_pllinfo(struct aty128fb_par *par,
-                                        void __iomem *bios);
-static void __devinit __iomem *aty128_map_ROM(struct pci_dev *pdev,
-                                             const struct aty128fb_par *par);
+static void aty128_get_pllinfo(struct aty128fb_par *par, void __iomem *bios);
+static void __iomem *aty128_map_ROM(struct pci_dev *pdev,
+                                   const struct aty128fb_par *par);
 #endif
 static void aty128_timings(struct aty128fb_par *par);
 static void aty128_init_engine(struct aty128fb_par *par);
@@ -582,7 +581,7 @@ static void aty_pll_writeupdate(const struct aty128fb_par *par)
 
 
 /* write to the scratch register to test r/w functionality */
-static int __devinit register_test(const struct aty128fb_par *par)
+static int register_test(const struct aty128fb_par *par)
 {
        u32 val;
        int flag = 0;
@@ -781,8 +780,8 @@ static u32 depth_to_dst(u32 depth)
 
 
 #ifndef __sparc__
-static void __iomem * __devinit aty128_map_ROM(const struct aty128fb_par *par,
-                                              struct pci_dev *dev)
+static void __iomem *aty128_map_ROM(const struct aty128fb_par *par,
+                                   struct pci_dev *dev)
 {
        u16 dptr;
        u8 rom_type;
@@ -868,8 +867,8 @@ static void __iomem * __devinit aty128_map_ROM(const struct aty128fb_par *par,
        return NULL;
 }
 
-static void __devinit aty128_get_pllinfo(struct aty128fb_par *par,
-                                        unsigned char __iomem *bios)
+static void aty128_get_pllinfo(struct aty128fb_par *par,
+                              unsigned char __iomem *bios)
 {
        unsigned int bios_hdr;
        unsigned int bios_pll;
@@ -891,7 +890,7 @@ static void __devinit aty128_get_pllinfo(struct aty128fb_par *par,
 }           
 
 #ifdef CONFIG_X86
-static void __iomem *  __devinit aty128_find_mem_vbios(struct aty128fb_par *par)
+static void __iomem *aty128_find_mem_vbios(struct aty128fb_par *par)
 {
        /* I simplified this code as we used to miss the signatures in
         * a lot of case. It's now closer to XFree, we just don't check
@@ -916,7 +915,7 @@ static void __iomem *  __devinit aty128_find_mem_vbios(struct aty128fb_par *par)
 #endif /* ndef(__sparc__) */
 
 /* fill in known card constants if pll_block is not available */
-static void __devinit aty128_timings(struct aty128fb_par *par)
+static void aty128_timings(struct aty128fb_par *par)
 {
 #ifdef CONFIG_PPC_OF
        /* instead of a table lookup, assume OF has properly
@@ -1658,7 +1657,7 @@ static int aty128fb_sync(struct fb_info *info)
 }
 
 #ifndef MODULE
-static int __devinit aty128fb_setup(char *options)
+static int aty128fb_setup(char *options)
 {
        char *this_opt;
 
@@ -1888,8 +1887,7 @@ static void aty128_early_resume(void *data)
 }
 #endif /* CONFIG_PPC_PMAC */
 
-static int __devinit aty128_init(struct pci_dev *pdev,
-                                const struct pci_device_id *ent)
+static int aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct aty128fb_par *par = info->par;
@@ -2039,8 +2037,7 @@ static int __devinit aty128_init(struct pci_dev *pdev,
 
 #ifdef CONFIG_PCI
 /* register a card    ++ajoshi */
-static int __devinit aty128_probe(struct pci_dev *pdev,
-                                 const struct pci_device_id *ent)
+static int aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        unsigned long fb_addr, reg_addr;
        struct aty128fb_par *par;
@@ -2156,7 +2153,7 @@ err_free_fb:
        return -ENODEV;
 }
 
-static void __devexit aty128_remove(struct pci_dev *pdev)
+static void aty128_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct aty128fb_par *par;
@@ -2558,7 +2555,7 @@ static int aty128_pci_resume(struct pci_dev *pdev)
 }
 
 
-static int __devinit aty128fb_init(void)
+static int aty128fb_init(void)
 {
 #ifndef MODULE
        char *option = NULL;
index 868932f904ef21b85e12b4de1b260bed1c662065..4f27fdc58d8463650fec54d9020496c89810b9bc 100644 (file)
@@ -214,7 +214,7 @@ struct pci_mmap_map {
        unsigned long prot_mask;
 };
 
-static struct fb_fix_screeninfo atyfb_fix __devinitdata = {
+static struct fb_fix_screeninfo atyfb_fix = {
        .id             = "ATY Mach64",
        .type           = FB_TYPE_PACKED_PIXELS,
        .visual         = FB_VISUAL_PSEUDOCOLOR,
@@ -309,18 +309,18 @@ static int vram;
 static int pll;
 static int mclk;
 static int xclk;
-static int comp_sync __devinitdata = -1;
+static int comp_sync = -1;
 static char *mode;
 
 #ifdef CONFIG_PMAC_BACKLIGHT
-static int backlight __devinitdata = 1;
+static int backlight = 1;
 #else
-static int backlight __devinitdata = 0;
+static int backlight = 0;
 #endif
 
 #ifdef CONFIG_PPC
-static int default_vmode __devinitdata = VMODE_CHOOSE;
-static int default_cmode __devinitdata = CMODE_CHOOSE;
+static int default_vmode = VMODE_CHOOSE;
+static int default_cmode = CMODE_CHOOSE;
 
 module_param_named(vmode, default_vmode, int, 0);
 MODULE_PARM_DESC(vmode, "int: video mode for mac");
@@ -329,10 +329,10 @@ MODULE_PARM_DESC(cmode, "int: color mode for mac");
 #endif
 
 #ifdef CONFIG_ATARI
-static unsigned int mach64_count __devinitdata = 0;
-static unsigned long phys_vmembase[FB_MAX] __devinitdata = { 0, };
-static unsigned long phys_size[FB_MAX] __devinitdata = { 0, };
-static unsigned long phys_guiregbase[FB_MAX] __devinitdata = { 0, };
+static unsigned int mach64_count = 0;
+static unsigned long phys_vmembase[FB_MAX] = { 0, };
+static unsigned long phys_size[FB_MAX] = { 0, };
+static unsigned long phys_guiregbase[FB_MAX] = { 0, };
 #endif
 
 /* top -> down is an evolution of mach64 chipset, any corrections? */
@@ -371,7 +371,7 @@ static struct {
        const char *name;
        int pll, mclk, xclk, ecp_max;
        u32 features;
-} aty_chips[] __devinitdata = {
+} aty_chips[] = {
 #ifdef CONFIG_FB_ATY_GX
        /* Mach64 GX */
        { PCI_CHIP_MACH64GX, "ATI888GX00 (Mach64 GX)", 135, 50, 50, 0, ATI_CHIP_88800GX },
@@ -426,7 +426,7 @@ static struct {
 #endif /* CONFIG_FB_ATY_CT */
 };
 
-static int __devinit correct_chipset(struct atyfb_par *par)
+static int correct_chipset(struct atyfb_par *par)
 {
        u8 rev;
        u16 type;
@@ -531,34 +531,34 @@ static int __devinit correct_chipset(struct atyfb_par *par)
        return 0;
 }
 
-static char ram_dram[] __devinitdata = "DRAM";
-static char ram_resv[] __devinitdata = "RESV";
+static char ram_dram[] = "DRAM";
+static char ram_resv[] = "RESV";
 #ifdef CONFIG_FB_ATY_GX
-static char ram_vram[] __devinitdata = "VRAM";
+static char ram_vram[] = "VRAM";
 #endif /* CONFIG_FB_ATY_GX */
 #ifdef CONFIG_FB_ATY_CT
-static char ram_edo[] __devinitdata = "EDO";
-static char ram_sdram[] __devinitdata = "SDRAM (1:1)";
-static char ram_sgram[] __devinitdata = "SGRAM (1:1)";
-static char ram_sdram32[] __devinitdata = "SDRAM (2:1) (32-bit)";
-static char ram_wram[] __devinitdata = "WRAM";
-static char ram_off[] __devinitdata = "OFF";
+static char ram_edo[] = "EDO";
+static char ram_sdram[] = "SDRAM (1:1)";
+static char ram_sgram[] = "SGRAM (1:1)";
+static char ram_sdram32[] = "SDRAM (2:1) (32-bit)";
+static char ram_wram[] = "WRAM";
+static char ram_off[] = "OFF";
 #endif /* CONFIG_FB_ATY_CT */
 
 
 #ifdef CONFIG_FB_ATY_GX
-static char *aty_gx_ram[8] __devinitdata = {
+static char *aty_gx_ram[8] = {
        ram_dram, ram_vram, ram_vram, ram_dram,
        ram_dram, ram_vram, ram_vram, ram_resv
 };
 #endif /* CONFIG_FB_ATY_GX */
 
 #ifdef CONFIG_FB_ATY_CT
-static char *aty_ct_ram[8] __devinitdata = {
+static char *aty_ct_ram[8] = {
        ram_off, ram_dram, ram_edo, ram_edo,
        ram_sdram, ram_sgram, ram_wram, ram_resv
 };
-static char *aty_xl_ram[8] __devinitdata = {
+static char *aty_xl_ram[8] = {
        ram_off, ram_dram, ram_edo, ram_edo,
        ram_sdram, ram_sgram, ram_sdram32, ram_resv
 };
@@ -588,7 +588,7 @@ static u32 atyfb_get_pixclock(struct fb_var_screeninfo *var,
  * Apple monitor sense
  */
 
-static int __devinit read_aty_sense(const struct atyfb_par *par)
+static int read_aty_sense(const struct atyfb_par *par)
 {
        int sense, i;
 
@@ -2273,7 +2273,7 @@ static void aty_bl_exit(struct backlight_device *bd)
 
 #endif /* CONFIG_FB_ATY_BACKLIGHT */
 
-static void __devinit aty_calc_mem_refresh(struct atyfb_par *par, int xclk)
+static void aty_calc_mem_refresh(struct atyfb_par *par, int xclk)
 {
        const int ragepro_tbl[] = {
                44, 50, 55, 66, 75, 80, 100
@@ -2307,8 +2307,8 @@ static void __devinit aty_calc_mem_refresh(struct atyfb_par *par, int xclk)
 static struct fb_info *fb_list = NULL;
 
 #if defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD)
-static int __devinit atyfb_get_timings_from_lcd(struct atyfb_par *par,
-                                               struct fb_var_screeninfo *var)
+static int atyfb_get_timings_from_lcd(struct atyfb_par *par,
+                                     struct fb_var_screeninfo *var)
 {
        int ret = -EINVAL;
 
@@ -2333,7 +2333,7 @@ static int __devinit atyfb_get_timings_from_lcd(struct atyfb_par *par,
 }
 #endif /* defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD) */
 
-static int __devinit aty_init(struct fb_info *info)
+static int aty_init(struct fb_info *info)
 {
        struct atyfb_par *par = (struct atyfb_par *) info->par;
        const char *ramname = NULL, *xtal;
@@ -2787,7 +2787,7 @@ aty_init_exit:
 }
 
 #if defined(CONFIG_ATARI) && !defined(MODULE)
-static int __devinit store_video_par(char *video_str, unsigned char m64_num)
+static int store_video_par(char *video_str, unsigned char m64_num)
 {
        char *p;
        unsigned long vmembase, size, guiregbase;
@@ -2961,9 +2961,8 @@ static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
 
 #ifdef __sparc__
 
-static int __devinit atyfb_setup_sparc(struct pci_dev *pdev,
-                                      struct fb_info *info,
-                                      unsigned long addr)
+static int atyfb_setup_sparc(struct pci_dev *pdev, struct fb_info *info,
+                            unsigned long addr)
 {
        struct atyfb_par *par = info->par;
        struct device_node *dp;
@@ -3161,7 +3160,7 @@ static int __devinit atyfb_setup_sparc(struct pci_dev *pdev,
 
 #ifdef __i386__
 #ifdef CONFIG_FB_ATY_GENERIC_LCD
-static void __devinit aty_init_lcd(struct atyfb_par *par, u32 bios_base)
+static void aty_init_lcd(struct atyfb_par *par, u32 bios_base)
 {
        u32 driv_inf_tab, sig;
        u16 lcd_ofs;
@@ -3392,7 +3391,7 @@ static void __devinit aty_init_lcd(struct atyfb_par *par, u32 bios_base)
 }
 #endif /* CONFIG_FB_ATY_GENERIC_LCD */
 
-static int __devinit init_from_bios(struct atyfb_par *par)
+static int init_from_bios(struct atyfb_par *par)
 {
        u32 bios_base, rom_addr;
        int ret;
@@ -3445,9 +3444,8 @@ static int __devinit init_from_bios(struct atyfb_par *par)
 }
 #endif /* __i386__ */
 
-static int __devinit atyfb_setup_generic(struct pci_dev *pdev,
-                                        struct fb_info *info,
-                                        unsigned long addr)
+static int atyfb_setup_generic(struct pci_dev *pdev, struct fb_info *info,
+                              unsigned long addr)
 {
        struct atyfb_par *par = info->par;
        u16 tmp;
@@ -3525,8 +3523,8 @@ atyfb_setup_generic_fail:
 
 #endif /* !__sparc__ */
 
-static int __devinit atyfb_pci_probe(struct pci_dev *pdev,
-                                    const struct pci_device_id *ent)
+static int atyfb_pci_probe(struct pci_dev *pdev,
+                          const struct pci_device_id *ent)
 {
        unsigned long addr, res_start, res_size;
        struct fb_info *info;
@@ -3714,7 +3712,7 @@ static int __init atyfb_atari_probe(void)
 
 #ifdef CONFIG_PCI
 
-static void __devexit atyfb_remove(struct fb_info *info)
+static void atyfb_remove(struct fb_info *info)
 {
        struct atyfb_par *par = (struct atyfb_par *) info->par;
 
@@ -3762,7 +3760,7 @@ static void __devexit atyfb_remove(struct fb_info *info)
 }
 
 
-static void __devexit atyfb_pci_remove(struct pci_dev *pdev)
+static void atyfb_pci_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
 
@@ -3834,7 +3832,7 @@ static struct pci_driver atyfb_driver = {
        .name           = "atyfb",
        .id_table       = atyfb_pci_tbl,
        .probe          = atyfb_pci_probe,
-       .remove         = __devexit_p(atyfb_pci_remove),
+       .remove         = atyfb_pci_remove,
 #ifdef CONFIG_PM
        .suspend        = atyfb_pci_suspend,
        .resume         = atyfb_pci_resume,
index 2745b853948529415b885a91a5104c3d6e3ad026..51f29d627cebce988e18b8a535c12db82fe4e09c 100644 (file)
@@ -373,8 +373,7 @@ void aty_set_pll_ct(const struct fb_info *info, const union aty_pll *pll)
 #endif
 }
 
-static void __devinit aty_get_pll_ct(const struct fb_info *info,
-                                    union aty_pll *pll)
+static void aty_get_pll_ct(const struct fb_info *info, union aty_pll *pll)
 {
        struct atyfb_par *par = (struct atyfb_par *) info->par;
        u8 tmp, clock;
@@ -397,8 +396,7 @@ static void __devinit aty_get_pll_ct(const struct fb_info *info,
        }
 }
 
-static int __devinit aty_init_pll_ct(const struct fb_info *info,
-                                    union aty_pll *pll)
+static int aty_init_pll_ct(const struct fb_info *info, union aty_pll *pll)
 {
        struct atyfb_par *par = (struct atyfb_par *) info->par;
        u8 mpost_div, xpost_div, sclk_post_div_real;
index 46f72ed5351065dadcce9703e012ae92ea1e7d23..95ec042ddbf8ee4f93eda9592ee55f0f6a3c6063 100644 (file)
@@ -183,7 +183,7 @@ static int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
        return 0;
 }
 
-int __devinit aty_init_cursor(struct fb_info *info)
+int aty_init_cursor(struct fb_info *info)
 {
        unsigned long addr;
 
index 9e279ee38da8e976ac1e70a8555fa04f16950212..1e30b2b3e79f3f0cf939272f9d43ce00d692b1d0 100644 (file)
@@ -293,7 +293,7 @@ static void radeon_unmap_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
        pci_unmap_rom(dev, rinfo->bios_seg);
 }
 
-static int __devinit radeon_map_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
+static int radeon_map_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
 {
        void __iomem *rom;
        u16 dptr;
@@ -388,7 +388,7 @@ static int __devinit radeon_map_ROM(struct radeonfb_info *rinfo, struct pci_dev
 }
 
 #ifdef CONFIG_X86
-static int  __devinit radeon_find_mem_vbios(struct radeonfb_info *rinfo)
+static int  radeon_find_mem_vbios(struct radeonfb_info *rinfo)
 {
        /* I simplified this code as we used to miss the signatures in
         * a lot of case. It's now closer to XFree, we just don't check
@@ -423,7 +423,7 @@ static int  __devinit radeon_find_mem_vbios(struct radeonfb_info *rinfo)
  * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
  * tree. Hopefully, ATI OF driver is kind enough to fill these
  */
-static int __devinit radeon_read_xtal_OF (struct radeonfb_info *rinfo)
+static int radeon_read_xtal_OF(struct radeonfb_info *rinfo)
 {
        struct device_node *dp = rinfo->of_node;
        const u32 *val;
@@ -453,7 +453,7 @@ static int __devinit radeon_read_xtal_OF (struct radeonfb_info *rinfo)
 /*
  * Read PLL infos from chip registers
  */
-static int __devinit radeon_probe_pll_params(struct radeonfb_info *rinfo)
+static int radeon_probe_pll_params(struct radeonfb_info *rinfo)
 {
        unsigned char ppll_div_sel;
        unsigned Ns, Nm, M;
@@ -591,7 +591,7 @@ static int __devinit radeon_probe_pll_params(struct radeonfb_info *rinfo)
 /*
  * Retrieve PLL infos by different means (BIOS, Open Firmware, register probing...)
  */
-static void __devinit radeon_get_pllinfo(struct radeonfb_info *rinfo)
+static void radeon_get_pllinfo(struct radeonfb_info *rinfo)
 {
        /*
         * In the case nothing works, these are defaults; they are mostly
@@ -1868,7 +1868,7 @@ static struct fb_ops radeonfb_ops = {
 };
 
 
-static int __devinit radeon_set_fbinfo (struct radeonfb_info *rinfo)
+static int radeon_set_fbinfo(struct radeonfb_info *rinfo)
 {
        struct fb_info *info = rinfo->info;
 
@@ -2143,8 +2143,8 @@ static struct bin_attribute edid2_attr = {
 };
 
 
-static int __devinit radeonfb_pci_register (struct pci_dev *pdev,
-                                 const struct pci_device_id *ent)
+static int radeonfb_pci_register(struct pci_dev *pdev,
+                                const struct pci_device_id *ent)
 {
        struct fb_info *info;
        struct radeonfb_info *rinfo;
@@ -2407,7 +2407,7 @@ err_out:
 
 
 
-static void __devexit radeonfb_pci_unregister (struct pci_dev *pdev)
+static void radeonfb_pci_unregister(struct pci_dev *pdev)
 {
         struct fb_info *info = pci_get_drvdata(pdev);
         struct radeonfb_info *rinfo = info->par;
@@ -2465,7 +2465,7 @@ static struct pci_driver radeonfb_driver = {
        .name           = "radeonfb",
        .id_table       = radeonfb_pci_table,
        .probe          = radeonfb_pci_register,
-       .remove         = __devexit_p(radeonfb_pci_unregister),
+       .remove         = radeonfb_pci_unregister,
 #ifdef CONFIG_PM
        .suspend        = radeonfb_pci_suspend,
        .resume         = radeonfb_pci_resume,
index 5c23eac0eb9afe185b27ee871df22db61e78aa3b..bc078d50d8f1b8dd11e8621a9437f9537e55cc67 100644 (file)
@@ -62,8 +62,8 @@ static char *radeon_get_mon_name(int type)
  * models with broken OF probing by hard-coding known EDIDs for some Mac
  * laptops internal LVDS panel. (XXX: not done yet)
  */
-static int __devinit radeon_parse_montype_prop(struct device_node *dp, u8 **out_EDID,
-                                              int hdno)
+static int radeon_parse_montype_prop(struct device_node *dp, u8 **out_EDID,
+                                    int hdno)
 {
         static char *propnames[] = { "DFP,EDID", "LCD,EDID", "EDID",
                                     "EDID1", "EDID2",  NULL };
@@ -115,8 +115,8 @@ static int __devinit radeon_parse_montype_prop(struct device_node *dp, u8 **out_
        return mt;
 }
 
-static int __devinit radeon_probe_OF_head(struct radeonfb_info *rinfo, int head_no,
-                                         u8 **out_EDID)
+static int radeon_probe_OF_head(struct radeonfb_info *rinfo, int head_no,
+                               u8 **out_EDID)
 {
         struct device_node *dp;
 
@@ -163,7 +163,7 @@ static int __devinit radeon_probe_OF_head(struct radeonfb_info *rinfo, int head_
 #endif /* CONFIG_PPC_OF || CONFIG_SPARC */
 
 
-static int __devinit radeon_get_panel_info_BIOS(struct radeonfb_info *rinfo)
+static int radeon_get_panel_info_BIOS(struct radeonfb_info *rinfo)
 {
        unsigned long tmp, tmp0;
        char stmp[30];
@@ -251,7 +251,7 @@ static int __devinit radeon_get_panel_info_BIOS(struct radeonfb_info *rinfo)
  * doesn't quite work yet, but it's output is still useful for
  * debugging
  */
-static void __devinit radeon_parse_connector_info(struct radeonfb_info *rinfo)
+static void radeon_parse_connector_info(struct radeonfb_info *rinfo)
 {
        int offset, chips, connectors, tmp, i, conn, type;
 
@@ -297,7 +297,7 @@ static void __devinit radeon_parse_connector_info(struct radeonfb_info *rinfo)
  * as well and currently is only implemented for the CRT DAC, the
  * code for the TVDAC is commented out in XFree as "non working"
  */
-static int __devinit radeon_crt_is_connected(struct radeonfb_info *rinfo, int is_crt_dac)
+static int radeon_crt_is_connected(struct radeonfb_info *rinfo, int is_crt_dac)
 {
     int                  connected = 0;
 
@@ -369,8 +369,8 @@ static int __devinit radeon_crt_is_connected(struct radeonfb_info *rinfo, int is
  * Parse the "monitor_layout" string if any. This code is mostly
  * copied from XFree's radeon driver
  */
-static int __devinit radeon_parse_monitor_layout(struct radeonfb_info *rinfo,
-                                                const char *monitor_layout)
+static int radeon_parse_monitor_layout(struct radeonfb_info *rinfo,
+                                      const char *monitor_layout)
 {
        char s1[5], s2[5];
        int i = 0, second = 0;
@@ -433,8 +433,8 @@ static int __devinit radeon_parse_monitor_layout(struct radeonfb_info *rinfo,
  * try to retrieve EDID. The algorithm here comes from XFree's radeon
  * driver
  */
-void __devinit radeon_probe_screens(struct radeonfb_info *rinfo,
-                                   const char *monitor_layout, int ignore_edid)
+void radeon_probe_screens(struct radeonfb_info *rinfo,
+                         const char *monitor_layout, int ignore_edid)
 {
 #ifdef CONFIG_FB_RADEON_I2C
        int ddc_crt2_used = 0;  
@@ -753,7 +753,7 @@ static int is_powerblade(const char *model)
  * Build the modedb for head 1 (head 2 will come later), check panel infos
  * from either BIOS or EDID, and pick up the default mode
  */
-void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_option)
+void radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_option)
 {
        struct fb_info * info = rinfo->info;
        int has_default_mode = 0;
index fe3b6ec87122eefb6f2b8d1d36ed3303a6d754e3..ddabaa867b0dc38e24ab090d6e62108c88a02a2c 100644 (file)
@@ -83,7 +83,7 @@ struct fb_bitfield rgb_bitfields[][4] =
        { { 8, 4, 0 },  { 4, 4, 0 }, { 0, 4, 0 }, { 0, 0, 0 } },
 };
 
-static struct fb_fix_screeninfo au1100fb_fix __devinitdata = {
+static struct fb_fix_screeninfo au1100fb_fix = {
        .id             = "AU1100 FB",
        .xpanstep       = 1,
        .ypanstep       = 1,
@@ -91,7 +91,7 @@ static struct fb_fix_screeninfo au1100fb_fix __devinitdata = {
        .accel          = FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo au1100fb_var __devinitdata = {
+static struct fb_var_screeninfo au1100fb_var = {
        .activate       = FB_ACTIVATE_NOW,
        .height         = -1,
        .width          = -1,
@@ -469,7 +469,7 @@ static int au1100fb_setup(struct au1100fb_device *fbdev)
        return 0;
 }
 
-static int __devinit au1100fb_drv_probe(struct platform_device *dev)
+static int au1100fb_drv_probe(struct platform_device *dev)
 {
        struct au1100fb_device *fbdev = NULL;
        struct resource *regs_res;
index 7ca79f02056ebc9d967af326800687529dae37a8..1b59054fc6a4ccb5b2c2c12ca9ceb6070ed53bd2 100644 (file)
@@ -1673,7 +1673,7 @@ out:
 }
 
 /* AU1200 LCD controller device driver */
-static int __devinit au1200fb_drv_probe(struct platform_device *dev)
+static int au1200fb_drv_probe(struct platform_device *dev)
 {
        struct au1200fb_device *fbdev;
        struct au1200fb_platdata *pd;
@@ -1798,7 +1798,7 @@ failed:
        return ret;
 }
 
-static int __devexit au1200fb_drv_remove(struct platform_device *dev)
+static int au1200fb_drv_remove(struct platform_device *dev)
 {
        struct au1200fb_platdata *pd = platform_get_drvdata(dev);
        struct au1200fb_device *fbdev;
@@ -1876,7 +1876,7 @@ static struct platform_driver au1200fb_driver = {
                .pm     = AU1200FB_PMOPS,
        },
        .probe          = au1200fb_drv_probe,
-       .remove         = __devexit_p(au1200fb_drv_remove),
+       .remove         = au1200fb_drv_remove,
 };
 
 /*-------------------------------------------------------------------------*/
index c36cf961dcb2df0bf555dc0729aca43263db0d09..1a9ac6e1f4b3657101834736ca24c80543a067fb 100644 (file)
@@ -156,7 +156,7 @@ static bool auok1900fb_need_refresh(struct auok190xfb_par *par)
        return (par->update_cnt > 10);
 }
 
-static int __devinit auok1900fb_probe(struct platform_device *pdev)
+static int auok1900fb_probe(struct platform_device *pdev)
 {
        struct auok190x_init_data init;
        struct auok190x_board *board;
@@ -177,14 +177,14 @@ static int __devinit auok1900fb_probe(struct platform_device *pdev)
        return auok190x_common_probe(pdev, &init);
 }
 
-static int __devexit auok1900fb_remove(struct platform_device *pdev)
+static int auok1900fb_remove(struct platform_device *pdev)
 {
        return auok190x_common_remove(pdev);
 }
 
 static struct platform_driver auok1900fb_driver = {
        .probe  = auok1900fb_probe,
-       .remove = __devexit_p(auok1900fb_remove),
+       .remove = auok1900fb_remove,
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "auo_k1900fb",
index 1c054c18616e38c6fc55cca8bd9679c017b1170a..d1db1653cd88546bb0855786093c367ad3887c37 100644 (file)
@@ -209,7 +209,7 @@ static bool auok1901fb_need_refresh(struct auok190xfb_par *par)
        return (par->update_cnt > 10);
 }
 
-static int __devinit auok1901fb_probe(struct platform_device *pdev)
+static int auok1901fb_probe(struct platform_device *pdev)
 {
        struct auok190x_init_data init;
        struct auok190x_board *board;
@@ -230,14 +230,14 @@ static int __devinit auok1901fb_probe(struct platform_device *pdev)
        return auok190x_common_probe(pdev, &init);
 }
 
-static int __devexit auok1901fb_remove(struct platform_device *pdev)
+static int auok1901fb_remove(struct platform_device *pdev)
 {
        return auok190x_common_remove(pdev);
 }
 
 static struct platform_driver auok1901fb_driver = {
        .probe  = auok1901fb_probe,
-       .remove = __devexit_p(auok1901fb_remove),
+       .remove = auok1901fb_remove,
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "auo_k1901fb",
index c03ecdd31e4c6133f31a54c143038682c694dc87..97f79356141e535de24886dbae9e2873da0f4095 100644 (file)
@@ -773,8 +773,8 @@ EXPORT_SYMBOL_GPL(auok190x_pm);
  * Common probe and remove code
  */
 
-int __devinit auok190x_common_probe(struct platform_device *pdev,
-                                   struct auok190x_init_data *init)
+int auok190x_common_probe(struct platform_device *pdev,
+                         struct auok190x_init_data *init)
 {
        struct auok190x_board *board = init->board;
        struct auok190xfb_par *par;
@@ -1006,7 +1006,7 @@ err_reg:
 }
 EXPORT_SYMBOL_GPL(auok190x_common_probe);
 
-int  __devexit auok190x_common_remove(struct platform_device *pdev)
+int  auok190x_common_remove(struct platform_device *pdev)
 {
        struct fb_info *info = platform_get_drvdata(pdev);
        struct auok190xfb_par *par = info->par;
index 7347aa1e5e4ac1e9957510b19889d1d3446784e0..a82d2578d976e9ad67b862ab66ddef64cb46029e 100644 (file)
@@ -87,8 +87,8 @@ static void set_vcomm(void)
                pr_err("i2c_smbus_write_byte_data fail: %d\n", nr);
 }
 
-static int __devinit ad5280_probe(struct i2c_client *client,
-                                 const struct i2c_device_id *id)
+static int ad5280_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
 {
        int ret;
        if (!i2c_check_functionality(client->adapter,
@@ -108,7 +108,7 @@ static int __devinit ad5280_probe(struct i2c_client *client,
        return 0;
 }
 
-static int __devexit ad5280_remove(struct i2c_client *client)
+static int ad5280_remove(struct i2c_client *client)
 {
        ad5280_client = NULL;
        return 0;
@@ -126,7 +126,7 @@ static struct i2c_driver ad5280_driver = {
                .name = "bf537-lq035-ad5280",
        },
        .probe = ad5280_probe,
-       .remove = __devexit_p(ad5280_remove),
+       .remove = ad5280_remove,
        .id_table = ad5280_id,
 };
 
@@ -360,7 +360,7 @@ static int config_dma(void)
        return 0;
 }
 
-static int __devinit request_ports(void)
+static int request_ports(void)
 {
        u16 tmr_req[] = TIMERS;
 
@@ -443,7 +443,7 @@ static struct fb_var_screeninfo bfin_lq035_fb_defined = {
        .transp         = {0, 0, 0},
 };
 
-static struct fb_fix_screeninfo bfin_lq035_fb_fix __devinitdata = {
+static struct fb_fix_screeninfo bfin_lq035_fb_fix = {
        .id             = KBUILD_MODNAME,
        .smem_len       = ACTIVE_VIDEO_MEM_SIZE,
        .type           = FB_TYPE_PACKED_PIXELS,
@@ -686,7 +686,7 @@ static struct lcd_ops bfin_lcd_ops = {
 
 static struct lcd_device *lcd_dev;
 
-static int __devinit bfin_lq035_probe(struct platform_device *pdev)
+static int bfin_lq035_probe(struct platform_device *pdev)
 {
        struct backlight_properties props;
        dma_addr_t dma_handle;
@@ -816,7 +816,7 @@ out_ports:
        return ret;
 }
 
-static int __devexit bfin_lq035_remove(struct platform_device *pdev)
+static int bfin_lq035_remove(struct platform_device *pdev)
 {
        if (fb_buffer != NULL)
                dma_free_coherent(NULL, TOTAL_VIDEO_MEM_SIZE, fb_buffer, 0);
@@ -889,7 +889,7 @@ static int bfin_lq035_resume(struct platform_device *pdev)
 
 static struct platform_driver bfin_lq035_driver = {
        .probe = bfin_lq035_probe,
-       .remove = __devexit_p(bfin_lq035_remove),
+       .remove = bfin_lq035_remove,
        .suspend = bfin_lq035_suspend,
        .resume = bfin_lq035_resume,
        .driver = {
index ff5663f5c64f5d1dbb97448b27658c8f3ea62272..2726a5b6674129ef8b16938f669577929572ba8e 100644 (file)
@@ -497,7 +497,7 @@ static irqreturn_t bfin_bf54x_irq_error(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit bfin_bf54x_probe(struct platform_device *pdev)
+static int bfin_bf54x_probe(struct platform_device *pdev)
 {
 #ifndef NO_BL_SUPPORT
        struct backlight_properties props;
@@ -686,7 +686,7 @@ out1:
        return ret;
 }
 
-static int __devexit bfin_bf54x_remove(struct platform_device *pdev)
+static int bfin_bf54x_remove(struct platform_device *pdev)
 {
 
        struct fb_info *fbinfo = platform_get_drvdata(pdev);
@@ -754,7 +754,7 @@ static int bfin_bf54x_resume(struct platform_device *pdev)
 
 static struct platform_driver bfin_bf54x_driver = {
        .probe = bfin_bf54x_probe,
-       .remove = __devexit_p(bfin_bf54x_remove),
+       .remove = bfin_bf54x_remove,
        .suspend = bfin_bf54x_suspend,
        .resume = bfin_bf54x_resume,
        .driver = {
index 6fbc75c2f0a10bc77c8176e5bd05e6eb1dfc940c..29d8c0443a1f618203e70e65402f5557d679a000 100644 (file)
@@ -137,7 +137,7 @@ static int lq035q1_control(struct spi_device *spi, unsigned char reg, unsigned s
        return ret;
 }
 
-static int __devinit lq035q1_spidev_probe(struct spi_device *spi)
+static int lq035q1_spidev_probe(struct spi_device *spi)
 {
        int ret;
        struct spi_control *ctl;
@@ -358,8 +358,8 @@ static inline void bfin_lq035q1_free_ports(unsigned ppi16)
                gpio_free(P_IDENT(P_PPI0_FS3));
 }
 
-static int __devinit bfin_lq035q1_request_ports(struct platform_device *pdev,
-                                               unsigned ppi16)
+static int bfin_lq035q1_request_ports(struct platform_device *pdev,
+                                     unsigned ppi16)
 {
        int ret;
        /* ANOMALY_05000400 - PPI Does Not Start Properly In Specific Mode:
@@ -555,7 +555,7 @@ static irqreturn_t bfin_lq035q1_irq_error(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit bfin_lq035q1_probe(struct platform_device *pdev)
+static int bfin_lq035q1_probe(struct platform_device *pdev)
 {
        struct bfin_lq035q1fb_info *info;
        struct fb_info *fbinfo;
@@ -706,7 +706,7 @@ static int __devinit bfin_lq035q1_probe(struct platform_device *pdev)
 
        info->spidrv.driver.name = DRIVER_NAME"-spi";
        info->spidrv.probe    = lq035q1_spidev_probe;
-       info->spidrv.remove   = __devexit_p(lq035q1_spidev_remove);
+       info->spidrv.remove   = lq035q1_spidev_remove;
        info->spidrv.shutdown = lq035q1_spidev_shutdown;
        info->spidrv.suspend  = lq035q1_spidev_suspend;
        info->spidrv.resume   = lq035q1_spidev_resume;
@@ -764,7 +764,7 @@ static int __devinit bfin_lq035q1_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int __devexit bfin_lq035q1_remove(struct platform_device *pdev)
+static int bfin_lq035q1_remove(struct platform_device *pdev)
 {
        struct fb_info *fbinfo = platform_get_drvdata(pdev);
        struct bfin_lq035q1fb_info *info = fbinfo->par;
@@ -845,7 +845,7 @@ static struct dev_pm_ops bfin_lq035q1_dev_pm_ops = {
 
 static struct platform_driver bfin_lq035q1_driver = {
        .probe   = bfin_lq035q1_probe,
-       .remove  = __devexit_p(bfin_lq035q1_remove),
+       .remove  = bfin_lq035q1_remove,
        .driver = {
                .name = DRIVER_NAME,
 #ifdef CONFIG_PM
index ae0fb24b8b4330a6228db62081faf52b0cf8fad6..d46da01c31ae5536ddf10dfa3b0b443c2ff6dc2f 100644 (file)
@@ -418,7 +418,7 @@ static irqreturn_t bfin_t350mcqb_irq_error(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev)
+static int bfin_t350mcqb_probe(struct platform_device *pdev)
 {
 #ifndef NO_BL_SUPPORT
        struct backlight_properties props;
@@ -583,7 +583,7 @@ out1:
        return ret;
 }
 
-static int __devexit bfin_t350mcqb_remove(struct platform_device *pdev)
+static int bfin_t350mcqb_remove(struct platform_device *pdev)
 {
 
        struct fb_info *fbinfo = platform_get_drvdata(pdev);
@@ -658,7 +658,7 @@ static int bfin_t350mcqb_resume(struct platform_device *pdev)
 
 static struct platform_driver bfin_t350mcqb_driver = {
        .probe = bfin_t350mcqb_probe,
-       .remove = __devexit_p(bfin_t350mcqb_remove),
+       .remove = bfin_t350mcqb_remove,
        .suspend = bfin_t350mcqb_suspend,
        .resume = bfin_t350mcqb_resume,
        .driver = {
index d0f121bd8b25d113567751cee8d562cd4bfa58f7..8d411a3c9966763a84ad4d1f4025b94593481f70 100644 (file)
@@ -88,7 +88,7 @@ static struct fb_var_screeninfo bfin_adv7393_fb_defined = {
        .transp = {0, 0, 0},
 };
 
-static struct fb_fix_screeninfo bfin_adv7393_fb_fix __devinitdata = {
+static struct fb_fix_screeninfo bfin_adv7393_fb_fix = {
        .id = "BFIN ADV7393",
        .smem_len = 720 * 480 * 2,
        .type = FB_TYPE_PACKED_PIXELS,
@@ -368,8 +368,8 @@ adv7393_write_proc(struct file *file, const char __user * buffer,
        return count;
 }
 
-static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client,
-                                          const struct i2c_device_id *id)
+static int bfin_adv7393_fb_probe(struct i2c_client *client,
+                                const struct i2c_device_id *id)
 {
        int ret = 0;
        struct proc_dir_entry *entry;
@@ -719,7 +719,7 @@ static int bfin_adv7393_fb_setcolreg(u_int regno, u_int red, u_int green,
        return 0;
 }
 
-static int __devexit bfin_adv7393_fb_remove(struct i2c_client *client)
+static int bfin_adv7393_fb_remove(struct i2c_client *client)
 {
        struct adv7393fb_device *fbdev = i2c_get_clientdata(client);
 
@@ -794,7 +794,7 @@ static struct i2c_driver bfin_adv7393_fb_driver = {
 #endif
        },
        .probe = bfin_adv7393_fb_probe,
-       .remove = __devexit_p(bfin_adv7393_fb_remove),
+       .remove = bfin_adv7393_fb_remove,
        .id_table = bfin_adv7393_id,
 };
 
index c95b417d0d41ae037cbcb4a01ff01c575e1b0aab..b09701c7943272abc934afd7c6821620d319ac51 100644 (file)
@@ -91,7 +91,7 @@ static struct panel_info panel_table[] = {
 #define DPY_W 800
 #define DPY_H 600
 
-static struct fb_fix_screeninfo broadsheetfb_fix __devinitdata = {
+static struct fb_fix_screeninfo broadsheetfb_fix = {
        .id =           "broadsheetfb",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_STATIC_PSEUDOCOLOR,
@@ -102,7 +102,7 @@ static struct fb_fix_screeninfo broadsheetfb_fix __devinitdata = {
        .accel =        FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo broadsheetfb_var __devinitdata = {
+static struct fb_var_screeninfo broadsheetfb_var = {
        .xres           = DPY_W,
        .yres           = DPY_H,
        .xres_virtual   = DPY_W,
@@ -774,7 +774,7 @@ static DEVICE_ATTR(loadstore_waveform, S_IWUSR, NULL,
                        broadsheet_loadstore_waveform);
 
 /* upper level functions that manipulate the display and other stuff */
-static void __devinit broadsheet_init_display(struct broadsheetfb_par *par)
+static void broadsheet_init_display(struct broadsheetfb_par *par)
 {
        u16 args[5];
        int xres = par->info->var.xres;
@@ -834,7 +834,7 @@ static void __devinit broadsheet_init_display(struct broadsheetfb_par *par)
        par->board->wait_for_rdy(par);
 }
 
-static void __devinit broadsheet_identify(struct broadsheetfb_par *par)
+static void broadsheet_identify(struct broadsheetfb_par *par)
 {
        u16 rev, prc;
        struct device *dev = par->info->device;
@@ -849,7 +849,7 @@ static void __devinit broadsheet_identify(struct broadsheetfb_par *par)
                dev_warn(dev, "Unrecognized Broadsheet Revision\n");
 }
 
-static void __devinit broadsheet_init(struct broadsheetfb_par *par)
+static void broadsheet_init(struct broadsheetfb_par *par)
 {
        broadsheet_send_command(par, BS_CMD_INIT_SYS_RUN);
        /* the controller needs a second */
@@ -1058,7 +1058,7 @@ static struct fb_deferred_io broadsheetfb_defio = {
        .deferred_io    = broadsheetfb_dpy_deferred_io,
 };
 
-static int __devinit broadsheetfb_probe(struct platform_device *dev)
+static int broadsheetfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct broadsheet_board *board;
@@ -1190,7 +1190,7 @@ err:
 
 }
 
-static int __devexit broadsheetfb_remove(struct platform_device *dev)
+static int broadsheetfb_remove(struct platform_device *dev)
 {
        struct fb_info *info = platform_get_drvdata(dev);
 
@@ -1211,7 +1211,7 @@ static int __devexit broadsheetfb_remove(struct platform_device *dev)
 
 static struct platform_driver broadsheetfb_driver = {
        .probe  = broadsheetfb_probe,
-       .remove = __devexit_p(broadsheetfb_remove),
+       .remove = broadsheetfb_remove,
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "broadsheetfb",
index 6bea9a9367989f314aaf389ca07d9d5ef24d0833..60017fc634b57462a92f388f531dbb17efeda235 100644 (file)
@@ -179,7 +179,7 @@ static int bw2_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
  *  Initialisation
  */
 
-static void __devinit bw2_init_fix(struct fb_info *info, int linebytes)
+static void bw2_init_fix(struct fb_info *info, int linebytes)
 {
        strlcpy(info->fix.id, "bwtwo", sizeof(info->fix.id));
 
@@ -191,44 +191,43 @@ static void __devinit bw2_init_fix(struct fb_info *info, int linebytes)
        info->fix.accel = FB_ACCEL_SUN_BWTWO;
 }
 
-static u8 bw2regs_1600[] __devinitdata = {
+static u8 bw2regs_1600[] = {
        0x14, 0x8b,     0x15, 0x28,     0x16, 0x03,     0x17, 0x13,
        0x18, 0x7b,     0x19, 0x05,     0x1a, 0x34,     0x1b, 0x2e,
        0x1c, 0x00,     0x1d, 0x0a,     0x1e, 0xff,     0x1f, 0x01,
        0x10, 0x21,     0
 };
 
-static u8 bw2regs_ecl[] __devinitdata = {
+static u8 bw2regs_ecl[] = {
        0x14, 0x65,     0x15, 0x1e,     0x16, 0x04,     0x17, 0x0c,
        0x18, 0x5e,     0x19, 0x03,     0x1a, 0xa7,     0x1b, 0x23,
        0x1c, 0x00,     0x1d, 0x08,     0x1e, 0xff,     0x1f, 0x01,
        0x10, 0x20,     0
 };
 
-static u8 bw2regs_analog[] __devinitdata = {
+static u8 bw2regs_analog[] = {
        0x14, 0xbb,     0x15, 0x2b,     0x16, 0x03,     0x17, 0x13,
        0x18, 0xb0,     0x19, 0x03,     0x1a, 0xa6,     0x1b, 0x22,
        0x1c, 0x01,     0x1d, 0x05,     0x1e, 0xff,     0x1f, 0x01,
        0x10, 0x20,     0
 };
 
-static u8 bw2regs_76hz[] __devinitdata = {
+static u8 bw2regs_76hz[] = {
        0x14, 0xb7,     0x15, 0x27,     0x16, 0x03,     0x17, 0x0f,
        0x18, 0xae,     0x19, 0x03,     0x1a, 0xae,     0x1b, 0x2a,
        0x1c, 0x01,     0x1d, 0x09,     0x1e, 0xff,     0x1f, 0x01,
        0x10, 0x24,     0
 };
 
-static u8 bw2regs_66hz[] __devinitdata = {
+static u8 bw2regs_66hz[] = {
        0x14, 0xbb,     0x15, 0x2b,     0x16, 0x04,     0x17, 0x14,
        0x18, 0xae,     0x19, 0x03,     0x1a, 0xa8,     0x1b, 0x24,
        0x1c, 0x01,     0x1d, 0x05,     0x1e, 0xff,     0x1f, 0x01,
        0x10, 0x20,     0
 };
 
-static int __devinit bw2_do_default_mode(struct bw2_par *par,
-                                        struct fb_info *info,
-                                        int *linebytes)
+static int bw2_do_default_mode(struct bw2_par *par, struct fb_info *info,
+                              int *linebytes)
 {
        u8 status, mon;
        u8 *p;
@@ -273,7 +272,7 @@ static int __devinit bw2_do_default_mode(struct bw2_par *par,
        return 0;
 }
 
-static int __devinit bw2_probe(struct platform_device *op)
+static int bw2_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct fb_info *info;
@@ -352,7 +351,7 @@ out_err:
        return err;
 }
 
-static int __devexit bw2_remove(struct platform_device *op)
+static int bw2_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct bw2_par *par = info->par;
@@ -384,7 +383,7 @@ static struct platform_driver bw2_driver = {
                .of_match_table = bw2_match,
        },
        .probe          = bw2_probe,
-       .remove         = __devexit_p(bw2_remove),
+       .remove         = bw2_remove,
 };
 
 static int __init bw2_init(void)
index 2c76fdf23f2ac5347989e1783beed7789872aac0..153dd65b0ae80c32ebcbe857cb43fb768820ffb8 100644 (file)
@@ -78,7 +78,7 @@ struct carmine_fb {
        u32 pseudo_palette[16];
 };
 
-static struct fb_fix_screeninfo carminefb_fix __devinitdata = {
+static struct fb_fix_screeninfo carminefb_fix = {
        .id = "Carmine",
        .type = FB_TYPE_PACKED_PIXELS,
        .visual = FB_VISUAL_TRUECOLOR,
@@ -537,8 +537,9 @@ static struct fb_ops carminefb_ops = {
        .fb_setcolreg   = carmine_setcolreg,
 };
 
-static int __devinit alloc_carmine_fb(void __iomem *regs, void __iomem *smem_base,
-               int smem_offset, struct device *device, struct fb_info **rinfo)
+static int alloc_carmine_fb(void __iomem *regs, void __iomem *smem_base,
+                           int smem_offset, struct device *device,
+                           struct fb_info **rinfo)
 {
        int ret;
        struct fb_info *info;
@@ -606,8 +607,7 @@ static void cleanup_fb_device(struct fb_info *info)
        }
 }
 
-static int __devinit carminefb_probe(struct pci_dev *dev,
-               const struct pci_device_id *ent)
+static int carminefb_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 {
        struct carmine_hw *hw;
        struct device *device = &dev->dev;
@@ -721,7 +721,7 @@ err_enable_pci:
        return ret;
 }
 
-static void __devexit carminefb_remove(struct pci_dev *dev)
+static void carminefb_remove(struct pci_dev *dev)
 {
        struct carmine_hw *hw = pci_get_drvdata(dev);
        struct fb_fix_screeninfo fix;
@@ -752,7 +752,7 @@ static void __devexit carminefb_remove(struct pci_dev *dev)
 }
 
 #define PCI_VENDOR_ID_FUJITU_LIMITED 0x10cf
-static struct pci_device_id carmine_devices[] __devinitdata = {
+static struct pci_device_id carmine_devices[] = {
 {
        PCI_DEVICE(PCI_VENDOR_ID_FUJITU_LIMITED, 0x202b)},
        {0, 0, 0, 0, 0, 0, 0}
@@ -764,7 +764,7 @@ static struct pci_driver carmine_pci_driver = {
        .name           = "carminefb",
        .id_table       = carmine_devices,
        .probe          = carminefb_probe,
-       .remove         = __devexit_p(carminefb_remove),
+       .remove         = carminefb_remove,
 };
 
 static int __init carminefb_init(void)
index f1889500662757d337d066648964e685d53e7f78..ed3b8891e0068e25cf0ba7a22b416536b8ff91ee 100644 (file)
@@ -352,8 +352,8 @@ static int cg14_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
  *  Initialisation
  */
 
-static void __devinit cg14_init_fix(struct fb_info *info, int linebytes,
-                                   struct device_node *dp)
+static void cg14_init_fix(struct fb_info *info, int linebytes,
+                         struct device_node *dp)
 {
        const char *name = dp->name;
 
@@ -367,7 +367,7 @@ static void __devinit cg14_init_fix(struct fb_info *info, int linebytes,
        info->fix.accel = FB_ACCEL_SUN_CG14;
 }
 
-static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __devinitdata = {
+static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] = {
        {
                .voff   = CG14_REGS,
                .poff   = 0x80000000,
@@ -463,7 +463,7 @@ static void cg14_unmap_regs(struct platform_device *op, struct fb_info *info,
                           info->screen_base, info->fix.smem_len);
 }
 
-static int __devinit cg14_probe(struct platform_device *op)
+static int cg14_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct fb_info *info;
@@ -571,7 +571,7 @@ out_err:
        return err;
 }
 
-static int __devexit cg14_remove(struct platform_device *op)
+static int cg14_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct cg14_par *par = info->par;
@@ -603,7 +603,7 @@ static struct platform_driver cg14_driver = {
                .of_match_table = cg14_match,
        },
        .probe          = cg14_probe,
-       .remove         = __devexit_p(cg14_remove),
+       .remove         = cg14_remove,
 };
 
 static int __init cg14_init(void)
index c5e7612ff8760609152eea65fc6f7bb6e6db872c..9f63507ded373621cfa74524fd0f27ddd205cacc 100644 (file)
@@ -243,8 +243,8 @@ static int cg3_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
  *  Initialisation
  */
 
-static void __devinit cg3_init_fix(struct fb_info *info, int linebytes,
-                                  struct device_node *dp)
+static void cg3_init_fix(struct fb_info *info, int linebytes,
+                        struct device_node *dp)
 {
        strlcpy(info->fix.id, dp->name, sizeof(info->fix.id));
 
@@ -256,8 +256,8 @@ static void __devinit cg3_init_fix(struct fb_info *info, int linebytes,
        info->fix.accel = FB_ACCEL_SUN_CGTHREE;
 }
 
-static void __devinit cg3_rdi_maybe_fixup_var(struct fb_var_screeninfo *var,
-                                             struct device_node *dp)
+static void cg3_rdi_maybe_fixup_var(struct fb_var_screeninfo *var,
+                                   struct device_node *dp)
 {
        const char *params;
        char *p;
@@ -279,36 +279,36 @@ static void __devinit cg3_rdi_maybe_fixup_var(struct fb_var_screeninfo *var,
        }
 }
 
-static u8 cg3regvals_66hz[] __devinitdata = {  /* 1152 x 900, 66 Hz */
+static u8 cg3regvals_66hz[] = {        /* 1152 x 900, 66 Hz */
        0x14, 0xbb,     0x15, 0x2b,     0x16, 0x04,     0x17, 0x14,
        0x18, 0xae,     0x19, 0x03,     0x1a, 0xa8,     0x1b, 0x24,
        0x1c, 0x01,     0x1d, 0x05,     0x1e, 0xff,     0x1f, 0x01,
        0x10, 0x20,     0
 };
 
-static u8 cg3regvals_76hz[] __devinitdata = {  /* 1152 x 900, 76 Hz */
+static u8 cg3regvals_76hz[] = {        /* 1152 x 900, 76 Hz */
        0x14, 0xb7,     0x15, 0x27,     0x16, 0x03,     0x17, 0x0f,
        0x18, 0xae,     0x19, 0x03,     0x1a, 0xae,     0x1b, 0x2a,
        0x1c, 0x01,     0x1d, 0x09,     0x1e, 0xff,     0x1f, 0x01,
        0x10, 0x24,     0
 };
 
-static u8 cg3regvals_rdi[] __devinitdata = {   /* 640 x 480, cgRDI */
+static u8 cg3regvals_rdi[] = { /* 640 x 480, cgRDI */
        0x14, 0x70,     0x15, 0x20,     0x16, 0x08,     0x17, 0x10,
        0x18, 0x06,     0x19, 0x02,     0x1a, 0x31,     0x1b, 0x51,
        0x1c, 0x06,     0x1d, 0x0c,     0x1e, 0xff,     0x1f, 0x01,
        0x10, 0x22,     0
 };
 
-static u8 *cg3_regvals[] __devinitdata = {
+static u8 *cg3_regvals[] = {
        cg3regvals_66hz, cg3regvals_76hz, cg3regvals_rdi
 };
 
-static u_char cg3_dacvals[] __devinitdata = {
+static u_char cg3_dacvals[] = {
        4, 0xff,        5, 0x00,        6, 0x70,        7, 0x00,        0
 };
 
-static int __devinit cg3_do_default_mode(struct cg3_par *par)
+static int cg3_do_default_mode(struct cg3_par *par)
 {
        enum cg3_type type;
        u8 *p;
@@ -346,7 +346,7 @@ static int __devinit cg3_do_default_mode(struct cg3_par *par)
        return 0;
 }
 
-static int __devinit cg3_probe(struct platform_device *op)
+static int cg3_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct fb_info *info;
@@ -433,7 +433,7 @@ out_err:
        return err;
 }
 
-static int __devexit cg3_remove(struct platform_device *op)
+static int cg3_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct cg3_par *par = info->par;
@@ -469,7 +469,7 @@ static struct platform_driver cg3_driver = {
                .of_match_table = cg3_match,
        },
        .probe          = cg3_probe,
-       .remove         = __devexit_p(cg3_remove),
+       .remove         = cg3_remove,
 };
 
 static int __init cg3_init(void)
index 179e96cdb323fa9e91f22f42be016f55a32993ea..3545decc748528b4cec5c16369da88a0f6e4469a 100644 (file)
@@ -607,7 +607,7 @@ static int cg6_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
  *  Initialisation
  */
 
-static void __devinit cg6_init_fix(struct fb_info *info, int linebytes)
+static void cg6_init_fix(struct fb_info *info, int linebytes)
 {
        struct cg6_par *par = (struct cg6_par *)info->par;
        const char *cg6_cpu_name, *cg6_card_name;
@@ -649,7 +649,7 @@ static void __devinit cg6_init_fix(struct fb_info *info, int linebytes)
 }
 
 /* Initialize Brooktree DAC */
-static void __devinit cg6_bt_init(struct cg6_par *par)
+static void cg6_bt_init(struct cg6_par *par)
 {
        struct bt_regs __iomem *bt = par->bt;
 
@@ -663,7 +663,7 @@ static void __devinit cg6_bt_init(struct cg6_par *par)
        sbus_writel(0x00 << 24, &bt->control);
 }
 
-static void __devinit cg6_chip_init(struct fb_info *info)
+static void cg6_chip_init(struct fb_info *info)
 {
        struct cg6_par *par = (struct cg6_par *)info->par;
        struct cg6_tec __iomem *tec = par->tec;
@@ -737,7 +737,7 @@ static void cg6_unmap_regs(struct platform_device *op, struct fb_info *info,
                           info->fix.smem_len);
 }
 
-static int __devinit cg6_probe(struct platform_device *op)
+static int cg6_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct fb_info *info;
@@ -827,7 +827,7 @@ out_err:
        return err;
 }
 
-static int __devexit cg6_remove(struct platform_device *op)
+static int cg6_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct cg6_par *par = info->par;
@@ -862,7 +862,7 @@ static struct platform_driver cg6_driver = {
                .of_match_table = cg6_match,
        },
        .probe          = cg6_probe,
-       .remove         = __devexit_p(cg6_remove),
+       .remove         = cg6_remove,
 };
 
 static int __init cg6_init(void)
index cff742abdc5d4ce998e9e7819487cee271761f80..206a66b61072f5d1bd97c6d21453b0a9e6f99f18 100644 (file)
@@ -292,7 +292,7 @@ static void __init chips_hw_init(void)
                write_fr(chips_init_fr[i].addr, chips_init_fr[i].data);
 }
 
-static struct fb_fix_screeninfo chipsfb_fix __devinitdata = {
+static struct fb_fix_screeninfo chipsfb_fix = {
        .id =           "C&T 65550",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_PSEUDOCOLOR,
@@ -309,7 +309,7 @@ static struct fb_fix_screeninfo chipsfb_fix __devinitdata = {
        .smem_len =     0x100000,       /* 1MB */
 };
 
-static struct fb_var_screeninfo chipsfb_var __devinitdata = {
+static struct fb_var_screeninfo chipsfb_var = {
        .xres = 800,
        .yres = 600,
        .xres_virtual = 800,
@@ -330,7 +330,7 @@ static struct fb_var_screeninfo chipsfb_var __devinitdata = {
        .vsync_len = 8,
 };
 
-static void __devinit init_chips(struct fb_info *p, unsigned long addr)
+static void init_chips(struct fb_info *p, unsigned long addr)
 {
        memset(p->screen_base, 0, 0x100000);
 
@@ -347,8 +347,7 @@ static void __devinit init_chips(struct fb_info *p, unsigned long addr)
        chips_hw_init();
 }
 
-static int __devinit
-chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
+static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
 {
        struct fb_info *p;
        unsigned long addr, size;
@@ -438,7 +437,7 @@ chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
        return rc;
 }
 
-static void __devexit chipsfb_remove(struct pci_dev *dp)
+static void chipsfb_remove(struct pci_dev *dp)
 {
        struct fb_info *p = pci_get_drvdata(dp);
 
@@ -495,7 +494,7 @@ static struct pci_driver chipsfb_driver = {
        .name =         "chipsfb",
        .id_table =     chipsfb_pci_tbl,
        .probe =        chipsfb_pci_init,
-       .remove =       __devexit_p(chipsfb_remove),
+       .remove =       chipsfb_remove,
 #ifdef CONFIG_PM
        .suspend =      chipsfb_pci_suspend,
        .resume =       chipsfb_pci_resume,
index bc67d05cad60f0d31b34548f17a1176891710bf2..c3dbbe6e3acf42f9353fe6d79e6eee929acc3560 100644 (file)
@@ -290,34 +290,34 @@ struct zorrocl {
        zorro_id ramid2;        /* Zorro ID of optional second RAM device */
 };
 
-static const struct zorrocl zcl_sd64 __devinitconst = {
+static const struct zorrocl zcl_sd64 = {
        .type           = BT_SD64,
        .ramid          = ZORRO_PROD_HELFRICH_SD64_RAM,
 };
 
-static const struct zorrocl zcl_piccolo __devinitconst = {
+static const struct zorrocl zcl_piccolo = {
        .type           = BT_PICCOLO,
        .ramid          = ZORRO_PROD_HELFRICH_PICCOLO_RAM,
 };
 
-static const struct zorrocl zcl_picasso __devinitconst = {
+static const struct zorrocl zcl_picasso = {
        .type           = BT_PICASSO,
        .ramid          = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_II_II_PLUS_RAM,
 };
 
-static const struct zorrocl zcl_spectrum __devinitconst = {
+static const struct zorrocl zcl_spectrum = {
        .type           = BT_SPECTRUM,
        .ramid          = ZORRO_PROD_GVP_EGS_28_24_SPECTRUM_RAM,
 };
 
-static const struct zorrocl zcl_picasso4_z3 __devinitconst = {
+static const struct zorrocl zcl_picasso4_z3 = {
        .type           = BT_PICASSO4,
        .regoffset      = 0x00600000,
        .ramsize        = 4 * MB_,
        .ramoffset      = 0x01000000,   /* 0x02000000 for 64 MiB boards */
 };
 
-static const struct zorrocl zcl_picasso4_z2 __devinitconst = {
+static const struct zorrocl zcl_picasso4_z2 = {
        .type           = BT_PICASSO4,
        .regoffset      = 0x10000,
        .ramid          = ZORRO_PROD_VILLAGE_TRONIC_PICASSO_IV_Z2_RAM1,
@@ -325,7 +325,7 @@ static const struct zorrocl zcl_picasso4_z2 __devinitconst = {
 };
 
 
-static const struct zorro_device_id cirrusfb_zorro_table[] __devinitconst = {
+static const struct zorro_device_id cirrusfb_zorro_table[] = {
        {
                .id             = ZORRO_PROD_HELFRICH_SD64_REG,
                .driver_data    = (unsigned long)&zcl_sd64,
@@ -372,8 +372,8 @@ struct cirrusfb_info {
        void (*unmap)(struct fb_info *info);
 };
 
-static bool noaccel __devinitdata;
-static char *mode_option __devinitdata = "640x480@60";
+static bool noaccel;
+static char *mode_option = "640x480@60";
 
 /****************************************************************************/
 /**** BEGIN PROTOTYPES ******************************************************/
@@ -1892,8 +1892,8 @@ static int release_io_ports;
  * based on the DRAM bandwidth bit and DRAM bank switching bit.  This
  * works with 1MB, 2MB and 4MB configurations (which the Motorola boards
  * seem to have. */
-static unsigned int __devinit cirrusfb_get_memsize(struct fb_info *info,
-                                                  u8 __iomem *regbase)
+static unsigned int cirrusfb_get_memsize(struct fb_info *info,
+                                        u8 __iomem *regbase)
 {
        unsigned long mem;
        struct cirrusfb_info *cinfo = info->par;
@@ -2003,7 +2003,7 @@ static struct fb_ops cirrusfb_ops = {
        .fb_imageblit   = cirrusfb_imageblit,
 };
 
-static int __devinit cirrusfb_set_fbinfo(struct fb_info *info)
+static int cirrusfb_set_fbinfo(struct fb_info *info)
 {
        struct cirrusfb_info *cinfo = info->par;
        struct fb_var_screeninfo *var = &info->var;
@@ -2052,7 +2052,7 @@ static int __devinit cirrusfb_set_fbinfo(struct fb_info *info)
        return 0;
 }
 
-static int __devinit cirrusfb_register(struct fb_info *info)
+static int cirrusfb_register(struct fb_info *info)
 {
        struct cirrusfb_info *cinfo = info->par;
        int err;
@@ -2096,7 +2096,7 @@ err_dealloc_cmap:
        return err;
 }
 
-static void __devexit cirrusfb_cleanup(struct fb_info *info)
+static void cirrusfb_cleanup(struct fb_info *info)
 {
        struct cirrusfb_info *cinfo = info->par;
 
@@ -2109,8 +2109,8 @@ static void __devexit cirrusfb_cleanup(struct fb_info *info)
 }
 
 #ifdef CONFIG_PCI
-static int __devinit cirrusfb_pci_register(struct pci_dev *pdev,
-                                          const struct pci_device_id *ent)
+static int cirrusfb_pci_register(struct pci_dev *pdev,
+                                const struct pci_device_id *ent)
 {
        struct cirrusfb_info *cinfo;
        struct fb_info *info;
@@ -2215,7 +2215,7 @@ err_out:
        return ret;
 }
 
-static void __devexit cirrusfb_pci_unregister(struct pci_dev *pdev)
+static void cirrusfb_pci_unregister(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
 
@@ -2226,7 +2226,7 @@ static struct pci_driver cirrusfb_pci_driver = {
        .name           = "cirrusfb",
        .id_table       = cirrusfb_pci_table,
        .probe          = cirrusfb_pci_register,
-       .remove         = __devexit_p(cirrusfb_pci_unregister),
+       .remove         = cirrusfb_pci_unregister,
 #ifdef CONFIG_PM
 #if 0
        .suspend        = cirrusfb_pci_suspend,
@@ -2237,8 +2237,8 @@ static struct pci_driver cirrusfb_pci_driver = {
 #endif /* CONFIG_PCI */
 
 #ifdef CONFIG_ZORRO
-static int __devinit cirrusfb_zorro_register(struct zorro_dev *z,
-                                            const struct zorro_device_id *ent)
+static int cirrusfb_zorro_register(struct zorro_dev *z,
+                                  const struct zorro_device_id *ent)
 {
        struct fb_info *info;
        int error;
@@ -2352,7 +2352,7 @@ err_release_fb:
        return error;
 }
 
-void __devexit cirrusfb_zorro_unregister(struct zorro_dev *z)
+void cirrusfb_zorro_unregister(struct zorro_dev *z)
 {
        struct fb_info *info = zorro_get_drvdata(z);
 
@@ -2364,7 +2364,7 @@ static struct zorro_driver cirrusfb_zorro_driver = {
        .name           = "cirrusfb",
        .id_table       = cirrusfb_zorro_table,
        .probe          = cirrusfb_zorro_register,
-       .remove         = __devexit_p(cirrusfb_zorro_unregister),
+       .remove         = cirrusfb_zorro_unregister,
 };
 #endif /* CONFIG_ZORRO */
 
index 63ecdf8f7baf185fd863ef1c0c64acc291cbcb43..5a7af0deced2607383200118cb7c66d89b6219af 100644 (file)
@@ -178,7 +178,7 @@ static struct fb_ops clps7111fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static void __devinit clps711x_guess_lcd_params(struct fb_info *info)
+static void clps711x_guess_lcd_params(struct fb_info *info)
 {
        unsigned int lcdcon, syscon, size;
        unsigned long phys_base = PAGE_OFFSET;
@@ -266,7 +266,7 @@ static void __devinit clps711x_guess_lcd_params(struct fb_info *info)
        info->fix.type       = FB_TYPE_PACKED_PIXELS;
 }
 
-static int __devinit clps711x_fb_probe(struct platform_device *pdev)
+static int clps711x_fb_probe(struct platform_device *pdev)
 {
        int err = -ENOMEM;
 
@@ -291,7 +291,7 @@ static int __devinit clps711x_fb_probe(struct platform_device *pdev)
 out:   return err;
 }
 
-static int __devexit clps711x_fb_remove(struct platform_device *pdev)
+static int clps711x_fb_remove(struct platform_device *pdev)
 {
        unregister_framebuffer(cfb);
        kfree(cfb);
@@ -305,7 +305,7 @@ static struct platform_driver clps711x_fb_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = clps711x_fb_probe,
-       .remove = __devexit_p(clps711x_fb_remove),
+       .remove = clps711x_fb_remove,
 };
 module_platform_driver(clps711x_fb_driver);
 
index 01a4ee7cc6b1b069be59593fa9baef0ec37c3176..a9031498e10c9f38b45b39bdfa848a528bd58128 100644 (file)
@@ -167,7 +167,7 @@ static void lcd_clear(struct fb_info *info)
        lcd_write_control(info, LCD_RESET);
 }
 
-static struct fb_fix_screeninfo cobalt_lcdfb_fix __devinitdata = {
+static struct fb_fix_screeninfo cobalt_lcdfb_fix = {
        .id             = "cobalt-lcd",
        .type           = FB_TYPE_TEXT,
        .type_aux       = FB_AUX_TEXT_MDA,
@@ -331,7 +331,7 @@ static struct fb_ops cobalt_lcd_fbops = {
        .fb_cursor      = cobalt_lcdfb_cursor,
 };
 
-static int __devinit cobalt_lcdfb_probe(struct platform_device *dev)
+static int cobalt_lcdfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct resource *res;
@@ -374,7 +374,7 @@ static int __devinit cobalt_lcdfb_probe(struct platform_device *dev)
        return 0;
 }
 
-static int __devexit cobalt_lcdfb_remove(struct platform_device *dev)
+static int cobalt_lcdfb_remove(struct platform_device *dev)
 {
        struct fb_info *info;
 
@@ -389,7 +389,7 @@ static int __devexit cobalt_lcdfb_remove(struct platform_device *dev)
 
 static struct platform_driver cobalt_lcdfb_driver = {
        .probe  = cobalt_lcdfb_probe,
-       .remove = __devexit_p(cobalt_lcdfb_remove),
+       .remove = cobalt_lcdfb_remove,
        .driver = {
                .name   = "cobalt-lcd",
                .owner  = THIS_MODULE,
index 39571f9e01628fb697a171c55b57558fac504a20..35687fd56456a82318b631e4ffc3df81b74759ca 100644 (file)
@@ -238,8 +238,7 @@ static void sti_flush(unsigned long start, unsigned long end)
        flush_icache_range(start, end);
 }
 
-static void __devinit sti_rom_copy(unsigned long base, unsigned long count,
-                                  void *dest)
+static void sti_rom_copy(unsigned long base, unsigned long count, void *dest)
 {
        unsigned long dest_start = (unsigned long) dest;
 
@@ -266,7 +265,7 @@ static void __devinit sti_rom_copy(unsigned long base, unsigned long count,
 static char default_sti_path[21] __read_mostly;
 
 #ifndef MODULE
-static int __devinit sti_setup(char *str)
+static int sti_setup(char *str)
 {
        if (str)
                strlcpy (default_sti_path, str, sizeof (default_sti_path));
@@ -285,12 +284,12 @@ __setup("sti=", sti_setup);
 
 
 
-static char __devinitdata      *font_name[MAX_STI_ROMS] = { "VGA8x16", };
-static int __devinitdata       font_index[MAX_STI_ROMS],
-                               font_height[MAX_STI_ROMS],
-                               font_width[MAX_STI_ROMS];
+static char *font_name[MAX_STI_ROMS] = { "VGA8x16", };
+static int font_index[MAX_STI_ROMS],
+          font_height[MAX_STI_ROMS],
+          font_width[MAX_STI_ROMS];
 #ifndef MODULE
-static int __devinit sti_font_setup(char *str)
+static int sti_font_setup(char *str)
 {
        char *x;
        int i = 0;
@@ -343,8 +342,8 @@ __setup("sti_font=", sti_font_setup);
 
 
        
-static void __devinit
-sti_dump_globcfg(struct sti_glob_cfg *glob_cfg, unsigned int sti_mem_request)
+static void sti_dump_globcfg(struct sti_glob_cfg *glob_cfg,
+                            unsigned int sti_mem_request)
 {
        struct sti_glob_cfg_ext *cfg;
        
@@ -383,8 +382,7 @@ sti_dump_globcfg(struct sti_glob_cfg *glob_cfg, unsigned int sti_mem_request)
                cfg->sti_mem_addr, sti_mem_request));
 }
 
-static void __devinit
-sti_dump_outptr(struct sti_struct *sti)
+static void sti_dump_outptr(struct sti_struct *sti)
 {
        DPRINTK((KERN_INFO
                "%d bits per pixel\n"
@@ -397,9 +395,8 @@ sti_dump_outptr(struct sti_struct *sti)
                 sti->outptr.attributes));
 }
 
-static int __devinit
-sti_init_glob_cfg(struct sti_struct *sti,
-           unsigned long rom_address, unsigned long hpa)
+static int sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address,
+                            unsigned long hpa)
 {
        struct sti_glob_cfg *glob_cfg;
        struct sti_glob_cfg_ext *glob_cfg_ext;
@@ -479,8 +476,8 @@ sti_init_glob_cfg(struct sti_struct *sti,
 }
 
 #ifdef CONFIG_FB
-static struct sti_cooked_font __devinit
-*sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
+static struct sti_cooked_font *
+sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
 {
        const struct font_desc *fbfont;
        unsigned int size, bpc;
@@ -535,16 +532,15 @@ static struct sti_cooked_font __devinit
        return cooked_font;
 }
 #else
-static struct sti_cooked_font __devinit
-*sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
+static struct sti_cooked_font *
+sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
 {
        return NULL;
 }
 #endif
 
-static struct sti_cooked_font __devinit
-*sti_select_font(struct sti_cooked_rom *rom,
-                int (*search_font_fnc)(struct sti_cooked_rom *, int, int))
+static struct sti_cooked_font *sti_select_font(struct sti_cooked_rom *rom,
+               int (*search_font_fnc)(struct sti_cooked_rom *, int, int))
 {
        struct sti_cooked_font *font;
        int i;
@@ -569,8 +565,7 @@ static struct sti_cooked_font __devinit
 }
 
 
-static void __devinit
-sti_dump_rom(struct sti_rom *rom)
+static void sti_dump_rom(struct sti_rom *rom)
 {
        printk(KERN_INFO "    id %04x-%04x, conforms to spec rev. %d.%02x\n",
                rom->graphics_id[0], 
@@ -587,9 +582,8 @@ sti_dump_rom(struct sti_rom *rom)
 }
 
 
-static int __devinit
-sti_cook_fonts(struct sti_cooked_rom *cooked_rom,
-                       struct sti_rom *raw_rom)
+static int sti_cook_fonts(struct sti_cooked_rom *cooked_rom,
+                         struct sti_rom *raw_rom)
 {
        struct sti_rom_font *raw_font, *font_start;
        struct sti_cooked_font *cooked_font;
@@ -622,8 +616,7 @@ sti_cook_fonts(struct sti_cooked_rom *cooked_rom,
 }
 
 
-static int __devinit
-sti_search_font(struct sti_cooked_rom *rom, int height, int width)
+static int sti_search_font(struct sti_cooked_rom *rom, int height, int width)
 {
        struct sti_cooked_font *font;
        int i = 0;
@@ -639,8 +632,7 @@ sti_search_font(struct sti_cooked_rom *rom, int height, int width)
 #define BMODE_RELOCATE(offset)         offset = (offset) / 4;
 #define BMODE_LAST_ADDR_OFFS           0x50
 
-static void * __devinit
-sti_bmode_font_raw(struct sti_cooked_font *f)
+static void *sti_bmode_font_raw(struct sti_cooked_font *f)
 {
        unsigned char *n, *p, *q;
        int size = f->raw->bytes_per_char*256+sizeof(struct sti_rom_font);
@@ -657,8 +649,8 @@ sti_bmode_font_raw(struct sti_cooked_font *f)
        return n + 3;
 }
 
-static void __devinit
-sti_bmode_rom_copy(unsigned long base, unsigned long count, void *dest)
+static void sti_bmode_rom_copy(unsigned long base, unsigned long count,
+                              void *dest)
 {
        unsigned long dest_start = (unsigned long) dest;
 
@@ -672,8 +664,7 @@ sti_bmode_rom_copy(unsigned long base, unsigned long count, void *dest)
        sti_flush(dest_start, (unsigned long)dest);
 }
 
-static struct sti_rom * __devinit
-sti_get_bmode_rom (unsigned long address)
+static struct sti_rom *sti_get_bmode_rom (unsigned long address)
 {
        struct sti_rom *raw;
        u32 size;
@@ -708,7 +699,7 @@ sti_get_bmode_rom (unsigned long address)
        return raw;
 }
 
-static struct sti_rom __devinit *sti_get_wmode_rom(unsigned long address)
+static struct sti_rom *sti_get_wmode_rom(unsigned long address)
 {
        struct sti_rom *raw;
        unsigned long size;
@@ -723,8 +714,8 @@ static struct sti_rom __devinit *sti_get_wmode_rom(unsigned long address)
        return raw;
 }
 
-static int __devinit sti_read_rom(int wordmode, struct sti_struct *sti,
-                                 unsigned long address)
+static int sti_read_rom(int wordmode, struct sti_struct *sti,
+                       unsigned long address)
 {
        struct sti_cooked_rom *cooked;
        struct sti_rom *raw = NULL;
@@ -806,8 +797,9 @@ out_err:
        return 0;
 }
 
-static struct sti_struct * __devinit
-sti_try_rom_generic(unsigned long address, unsigned long hpa, struct pci_dev *pd)
+static struct sti_struct *sti_try_rom_generic(unsigned long address,
+                                             unsigned long hpa,
+                                             struct pci_dev *pd)
 {
        struct sti_struct *sti;
        int ok;
@@ -921,7 +913,7 @@ out_err:
        return NULL;
 }
 
-static void __devinit sticore_check_for_default_sti(struct sti_struct *sti, char *path)
+static void sticore_check_for_default_sti(struct sti_struct *sti, char *path)
 {
        if (strcmp (path, default_sti_path) == 0)
                default_sti = sti;
@@ -932,7 +924,7 @@ static void __devinit sticore_check_for_default_sti(struct sti_struct *sti, char
  * in the additional address field addr[1] while on
  * older Systems the PDC stores it in page0->proc_sti 
  */
-static int __devinit sticore_pa_init(struct parisc_device *dev)
+static int sticore_pa_init(struct parisc_device *dev)
 {
        char pa_path[21];
        struct sti_struct *sti = NULL;
@@ -953,8 +945,7 @@ static int __devinit sticore_pa_init(struct parisc_device *dev)
 }
 
 
-static int __devinit sticore_pci_init(struct pci_dev *pd,
-               const struct pci_device_id *ent)
+static int sticore_pci_init(struct pci_dev *pd, const struct pci_device_id *ent)
 {
 #ifdef CONFIG_PCI
        unsigned long fb_base, rom_base;
@@ -1001,7 +992,7 @@ static int __devinit sticore_pci_init(struct pci_dev *pd,
 }
 
 
-static void __devexit sticore_pci_remove(struct pci_dev *pd)
+static void sticore_pci_remove(struct pci_dev *pd)
 {
        BUG();
 }
@@ -1043,7 +1034,7 @@ static struct parisc_driver pa_sti_driver = {
 
 static int sticore_initialized __read_mostly;
 
-static void __devinit sti_init_roms(void)
+static void sti_init_roms(void)
 {
        if (sticore_initialized)
                return;
index e40125cb313e95080e49abdcad344195707c4232..57886787ead020687d1f05d40230d62c1db096fa 100644 (file)
@@ -1230,7 +1230,7 @@ static int cyber2000fb_ddc_getsda(void *data)
        return retval;
 }
 
-static int __devinit cyber2000fb_setup_ddc_bus(struct cfb_info *cfb)
+static int cyber2000fb_setup_ddc_bus(struct cfb_info *cfb)
 {
        strlcpy(cfb->ddc_adapter.name, cfb->fb.fix.id,
                sizeof(cfb->ddc_adapter.name));
@@ -1305,7 +1305,7 @@ static int cyber2000fb_i2c_getscl(void *data)
        return ret;
 }
 
-static int __devinit cyber2000fb_i2c_register(struct cfb_info *cfb)
+static int cyber2000fb_i2c_register(struct cfb_info *cfb)
 {
        strlcpy(cfb->i2c_adapter.name, cfb->fb.fix.id,
                sizeof(cfb->i2c_adapter.name));
@@ -1336,7 +1336,7 @@ static void cyber2000fb_i2c_unregister(struct cfb_info *cfb)
  * These parameters give
  * 640x480, hsync 31.5kHz, vsync 60Hz
  */
-static struct fb_videomode __devinitdata cyber2000fb_default_mode = {
+static struct fb_videomode cyber2000fb_default_mode = {
        .refresh        = 60,
        .xres           = 640,
        .yres           = 480,
@@ -1404,8 +1404,7 @@ static void cyberpro_init_hw(struct cfb_info *cfb)
        }
 }
 
-static struct cfb_info __devinit *cyberpro_alloc_fb_info(unsigned int id,
-                                                        char *name)
+static struct cfb_info *cyberpro_alloc_fb_info(unsigned int id, char *name)
 {
        struct cfb_info *cfb;
 
@@ -1524,7 +1523,7 @@ static int cyber2000fb_setup(char *options)
  *  - memory mapped access to the registers
  *  - initialised mem_ctl1 and mem_ctl2 appropriately.
  */
-static int __devinit cyberpro_common_probe(struct cfb_info *cfb)
+static int cyberpro_common_probe(struct cfb_info *cfb)
 {
        u_long smem_size;
        u_int h_sync, v_sync;
@@ -1615,7 +1614,7 @@ failed:
        return err;
 }
 
-static void __devexit cyberpro_common_remove(struct cfb_info *cfb)
+static void cyberpro_common_remove(struct cfb_info *cfb)
 {
        unregister_framebuffer(&cfb->fb);
 #ifdef CONFIG_FB_CYBER2000_DDC
@@ -1646,7 +1645,7 @@ static void cyberpro_common_resume(struct cfb_info *cfb)
 
 #include <mach/framebuffer.h>
 
-static int __devinit cyberpro_vl_probe(void)
+static int cyberpro_vl_probe(void)
 {
        struct cfb_info *cfb;
        int err = -ENOMEM;
@@ -1780,8 +1779,8 @@ static int cyberpro_pci_enable_mmio(struct cfb_info *cfb)
        return 0;
 }
 
-static int __devinit
-cyberpro_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int cyberpro_pci_probe(struct pci_dev *dev,
+                             const struct pci_device_id *id)
 {
        struct cfb_info *cfb;
        char name[16];
@@ -1863,7 +1862,7 @@ failed_release:
        return err;
 }
 
-static void __devexit cyberpro_pci_remove(struct pci_dev *dev)
+static void cyberpro_pci_remove(struct pci_dev *dev)
 {
        struct cfb_info *cfb = pci_get_drvdata(dev);
 
@@ -1923,7 +1922,7 @@ MODULE_DEVICE_TABLE(pci, cyberpro_pci_table);
 static struct pci_driver cyberpro_driver = {
        .name           = "CyberPro",
        .probe          = cyberpro_pci_probe,
-       .remove         = __devexit_p(cyberpro_pci_remove),
+       .remove         = cyberpro_pci_remove,
        .suspend        = cyberpro_pci_suspend,
        .resume         = cyberpro_pci_resume,
        .id_table       = cyberpro_pci_table
index 46534e00fe01eb575ae565fb5930b1c2d36ffa20..0810939936f4137037bbdc975967111b5b4cc9ca 100644 (file)
@@ -185,7 +185,7 @@ struct da8xx_fb_par {
 };
 
 /* Variable Screen Information */
-static struct fb_var_screeninfo da8xx_fb_var __devinitdata = {
+static struct fb_var_screeninfo da8xx_fb_var = {
        .xoffset = 0,
        .yoffset = 0,
        .transp = {0, 0, 0},
@@ -202,7 +202,7 @@ static struct fb_var_screeninfo da8xx_fb_var __devinitdata = {
        .vmode = FB_VMODE_NONINTERLACED
 };
 
-static struct fb_fix_screeninfo da8xx_fb_fix __devinitdata = {
+static struct fb_fix_screeninfo da8xx_fb_fix = {
        .id = "DA8xx FB Drv",
        .type = FB_TYPE_PACKED_PIXELS,
        .type_aux = 0,
@@ -993,7 +993,7 @@ static inline void lcd_da8xx_cpufreq_deregister(struct da8xx_fb_par *par)
 }
 #endif
 
-static int __devexit fb_remove(struct platform_device *dev)
+static int fb_remove(struct platform_device *dev)
 {
        struct fb_info *info = dev_get_drvdata(&dev->dev);
 
@@ -1211,7 +1211,7 @@ static unsigned int da8xxfb_pixel_clk_period(struct da8xx_fb_par *par)
        return pix_clk_period_picosec;
 }
 
-static int __devinit fb_probe(struct platform_device *device)
+static int fb_probe(struct platform_device *device)
 {
        struct da8xx_lcdc_platform_data *fb_pdata =
                                                device->dev.platform_data;
@@ -1580,7 +1580,7 @@ static int fb_resume(struct platform_device *dev)
 
 static struct platform_driver da8xx_fb_driver = {
        .probe = fb_probe,
-       .remove = __devexit_p(fb_remove),
+       .remove = fb_remove,
        .suspend = fb_suspend,
        .resume = fb_resume,
        .driver = {
index 49e3dda1a361f72344a051bc7725dd3eebfc53b0..3526899da61b93e2c40532b6edb337cc5be53300 100644 (file)
@@ -115,7 +115,7 @@ static struct fb_ops dn_fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-struct fb_var_screeninfo dnfb_var __devinitdata = {
+struct fb_var_screeninfo dnfb_var = {
        .xres           = 1280,
        .yres           = 1024,
        .xres_virtual   = 2048,
@@ -126,7 +126,7 @@ struct fb_var_screeninfo dnfb_var __devinitdata = {
        .vmode          = FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_fix_screeninfo dnfb_fix __devinitdata = {
+static struct fb_fix_screeninfo dnfb_fix = {
        .id             = "Apollo Mono",
        .smem_start     = (FRAME_BUFFER_START + IO_BASE),
        .smem_len       = FRAME_BUFFER_LEN,
@@ -224,7 +224,7 @@ void dnfb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
  * Initialization
  */
 
-static int __devinit dnfb_probe(struct platform_device *dev)
+static int dnfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int err = 0;
index 932abaa58a89af3bc63f03fc3a2f80c078b3eeaa..50fe668c617277cccadd5330af318bfb51e9d18b 100644 (file)
@@ -20,7 +20,7 @@ static bool request_mem_succeeded = false;
 
 static struct pci_dev *default_vga;
 
-static struct fb_var_screeninfo efifb_defined __devinitdata = {
+static struct fb_var_screeninfo efifb_defined = {
        .activate               = FB_ACTIVATE_NOW,
        .height                 = -1,
        .width                  = -1,
@@ -31,7 +31,7 @@ static struct fb_var_screeninfo efifb_defined __devinitdata = {
        .vmode                  = FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_fix_screeninfo efifb_fix __devinitdata = {
+static struct fb_fix_screeninfo efifb_fix = {
        .id                     = "EFI VGA",
        .type                   = FB_TYPE_PACKED_PIXELS,
        .accel                  = FB_ACCEL_NONE,
index 755ef3e65caf4c980b8791cdfb2603dc3b576942..3f2519d3071574bd42dbe646afbf24dd1ba3d034 100644 (file)
@@ -484,7 +484,7 @@ static void ep93xxfb_dealloc_videomem(struct fb_info *info)
                                  info->screen_base, info->fix.smem_start);
 }
 
-static int __devinit ep93xxfb_probe(struct platform_device *pdev)
+static int ep93xxfb_probe(struct platform_device *pdev)
 {
        struct ep93xxfb_mach_info *mach_info = pdev->dev.platform_data;
        struct fb_info *info;
@@ -599,7 +599,7 @@ failed_cmap:
        return err;
 }
 
-static int __devexit ep93xxfb_remove(struct platform_device *pdev)
+static int ep93xxfb_remove(struct platform_device *pdev)
 {
        struct fb_info *info = platform_get_drvdata(pdev);
        struct ep93xx_fbi *fbi = info->par;
@@ -620,14 +620,14 @@ static int __devexit ep93xxfb_remove(struct platform_device *pdev)
 
 static struct platform_driver ep93xxfb_driver = {
        .probe          = ep93xxfb_probe,
-       .remove         = __devexit_p(ep93xxfb_remove),
+       .remove         = ep93xxfb_remove,
        .driver = {
                .name   = "ep93xx-fb",
                .owner  = THIS_MODULE,
        },
 };
 
-static int __devinit ep93xxfb_init(void)
+static int ep93xxfb_init(void)
 {
        return platform_driver_register(&ep93xxfb_driver);
 }
index 28fd686c6b8199429b98ca7d7c6014fc7225cf1b..4ef18e2e90ccc41ffd89bc1d4c5dc1abf8626f1d 100644 (file)
@@ -1033,7 +1033,7 @@ static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
 }
 #endif /* CONFIG_OF */
 
-static int __devinit exynos_dp_probe(struct platform_device *pdev)
+static int exynos_dp_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct exynos_dp_device *dp;
@@ -1114,7 +1114,7 @@ static int __devinit exynos_dp_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit exynos_dp_remove(struct platform_device *pdev)
+static int exynos_dp_remove(struct platform_device *pdev)
 {
        struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
        struct exynos_dp_device *dp = platform_get_drvdata(pdev);
@@ -1195,7 +1195,7 @@ MODULE_DEVICE_TABLE(of, exynos_dp_match);
 
 static struct platform_driver exynos_dp_driver = {
        .probe          = exynos_dp_probe,
-       .remove         = __devexit_p(exynos_dp_remove),
+       .remove         = exynos_dp_remove,
        .driver         = {
                .name   = "exynos-dp",
                .owner  = THIS_MODULE,
index 07d70a3a628bfc987018131538281b1b6484ed17..4a17cdccef3466f616178688436b39a856ded206 100644 (file)
@@ -490,7 +490,7 @@ err_platform_get_irq:
        return ret;
 }
 
-static int __devexit exynos_mipi_dsi_remove(struct platform_device *pdev)
+static int exynos_mipi_dsi_remove(struct platform_device *pdev)
 {
        struct mipi_dsim_device *dsim = platform_get_drvdata(pdev);
        struct mipi_dsim_ddi *dsim_ddi, *next;
@@ -595,7 +595,7 @@ static const struct dev_pm_ops exynos_mipi_dsi_pm_ops = {
 
 static struct platform_driver exynos_mipi_dsi_driver = {
        .probe = exynos_mipi_dsi_probe,
-       .remove = __devexit_p(exynos_mipi_dsi_remove),
+       .remove = exynos_mipi_dsi_remove,
        .driver = {
                   .name = "exynos-mipi-dsim",
                   .owner = THIS_MODULE,
index 14102a3f70f5cc69bd19963919bad3522a2cda06..6d2744794dd13f779ab6c6b2a6f02595c2017451 100644 (file)
@@ -893,7 +893,7 @@ static void ffb_init_fix(struct fb_info *info)
        info->fix.accel = FB_ACCEL_SUN_CREATOR;
 }
 
-static int __devinit ffb_probe(struct platform_device *op)
+static int ffb_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct ffb_fbc __iomem *fbc;
@@ -1022,7 +1022,7 @@ out_err:
        return err;
 }
 
-static int __devexit ffb_remove(struct platform_device *op)
+static int ffb_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct ffb_par *par = info->par;
@@ -1058,7 +1058,7 @@ static struct platform_driver ffb_driver = {
                .of_match_table = ffb_match,
        },
        .probe          = ffb_probe,
-       .remove         = __devexit_p(ffb_remove),
+       .remove         = ffb_remove,
 };
 
 static int __init ffb_init(void)
index d0533b7aad79908f600232677166ee042201fe05..c99c9671302ba8998a94f9ba39c43c1ff730565f 100644 (file)
 
 static volatile unsigned char *fm2fb_reg;
 
-static struct fb_fix_screeninfo fb_fix __devinitdata = {
+static struct fb_fix_screeninfo fb_fix = {
        .smem_len =     FRAMEMASTER_REG,
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_TRUECOLOR,
@@ -136,12 +136,12 @@ static struct fb_fix_screeninfo fb_fix __devinitdata = {
        .accel =        FB_ACCEL_NONE,
 };
 
-static int fm2fb_mode __devinitdata = -1;
+static int fm2fb_mode = -1;
 
 #define FM2FB_MODE_PAL 0
 #define FM2FB_MODE_NTSC        1
 
-static struct fb_var_screeninfo fb_var_modes[] __devinitdata = {
+static struct fb_var_screeninfo fb_var_modes[] = {
     {
        /* 768 x 576, 32 bpp (PAL) */
        768, 576, 768, 576, 0, 0, 32, 0,
@@ -211,10 +211,9 @@ static int fm2fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
      *  Initialisation
      */
 
-static int __devinit fm2fb_probe(struct zorro_dev *z,
-                                const struct zorro_device_id *id);
+static int fm2fb_probe(struct zorro_dev *z, const struct zorro_device_id *id);
 
-static struct zorro_device_id fm2fb_devices[] __devinitdata = {
+static struct zorro_device_id fm2fb_devices[] = {
        { ZORRO_PROD_BSC_FRAMEMASTER_II },
        { ZORRO_PROD_HELFRICH_RAINBOW_II },
        { 0 }
@@ -227,8 +226,7 @@ static struct zorro_driver fm2fb_driver = {
        .probe          = fm2fb_probe,
 };
 
-static int __devinit fm2fb_probe(struct zorro_dev *z,
-                                const struct zorro_device_id *id)
+static int fm2fb_probe(struct zorro_dev *z, const struct zorro_device_id *id)
 {
        struct fb_info *info;
        unsigned long *ptr;
index d3fc92eaee8939bc0f35981342fbc6f5e2a47a28..19cfd7a925638f305c7e349490ade67cf6dd425c 100644 (file)
@@ -55,7 +55,7 @@
  * order if increasing resolution and frequency.  The 320x240-60 mode is
  * the initial AOI for the second and third planes.
  */
-static struct fb_videomode __devinitdata fsl_diu_mode_db[] = {
+static struct fb_videomode fsl_diu_mode_db[] = {
        {
                .refresh        = 60,
                .xres           = 1024,
@@ -1307,7 +1307,7 @@ static struct fb_ops fsl_diu_ops = {
        .fb_release = fsl_diu_release,
 };
 
-static int __devinit install_fb(struct fb_info *info)
+static int install_fb(struct fb_info *info)
 {
        int rc;
        struct mfb_info *mfbi = info->par;
@@ -1518,7 +1518,7 @@ static ssize_t show_monitor(struct device *device,
        return 0;
 }
 
-static int __devinit fsl_diu_probe(struct platform_device *pdev)
+static int fsl_diu_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct mfb_info *mfbi;
index 3dad31975db8cceaf8fe16963d3ca1d37180b85e..bda5e3941510fa1c415667a873fc684b928a91e8 100644 (file)
@@ -91,10 +91,10 @@ static uint32_t pseudo_palette[16];
 static uint32_t gbe_cmap[256];
 static int gbe_turned_on; /* 0 turned off, 1 turned on */
 
-static char *mode_option __devinitdata = NULL;
+static char *mode_option = NULL;
 
 /* default CRT mode */
-static struct fb_var_screeninfo default_var_CRT __devinitdata = {
+static struct fb_var_screeninfo default_var_CRT = {
        /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */
        .xres           = 640,
        .yres           = 480,
@@ -125,7 +125,7 @@ static struct fb_var_screeninfo default_var_CRT __devinitdata = {
 };
 
 /* default LCD mode */
-static struct fb_var_screeninfo default_var_LCD __devinitdata = {
+static struct fb_var_screeninfo default_var_LCD = {
        /* 1600x1024, 8 bpp */
        .xres           = 1600,
        .yres           = 1024,
@@ -157,7 +157,7 @@ static struct fb_var_screeninfo default_var_LCD __devinitdata = {
 
 /* default modedb mode */
 /* 640x480, 60 Hz, Non-Interlaced (25.172 MHz dotclock) */
-static struct fb_videomode default_mode_CRT __devinitdata = {
+static struct fb_videomode default_mode_CRT = {
        .refresh        = 60,
        .xres           = 640,
        .yres           = 480,
@@ -172,7 +172,7 @@ static struct fb_videomode default_mode_CRT __devinitdata = {
        .vmode          = FB_VMODE_NONINTERLACED,
 };
 /* 1600x1024 SGI flatpanel 1600sw */
-static struct fb_videomode default_mode_LCD __devinitdata = {
+static struct fb_videomode default_mode_LCD = {
        /* 1600x1024, 8 bpp */
        .xres           = 1600,
        .yres           = 1024,
@@ -186,8 +186,8 @@ static struct fb_videomode default_mode_LCD __devinitdata = {
        .vmode          = FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_videomode *default_mode __devinitdata = &default_mode_CRT;
-static struct fb_var_screeninfo *default_var __devinitdata = &default_var_CRT;
+static struct fb_videomode *default_mode = &default_mode_CRT;
+static struct fb_var_screeninfo *default_var = &default_var_CRT;
 
 static int flat_panel_enabled = 0;
 
@@ -1082,7 +1082,7 @@ static ssize_t gbefb_show_rev(struct device *device, struct device_attribute *at
 
 static DEVICE_ATTR(revision, S_IRUGO, gbefb_show_rev, NULL);
 
-static void __devexit gbefb_remove_sysfs(struct device *dev)
+static void gbefb_remove_sysfs(struct device *dev)
 {
        device_remove_file(dev, &dev_attr_size);
        device_remove_file(dev, &dev_attr_revision);
@@ -1098,7 +1098,7 @@ static void gbefb_create_sysfs(struct device *dev)
  * Initialization
  */
 
-static int __devinit gbefb_setup(char *options)
+static int gbefb_setup(char *options)
 {
        char *this_opt;
 
@@ -1129,7 +1129,7 @@ static int __devinit gbefb_setup(char *options)
        return 0;
 }
 
-static int __devinit gbefb_probe(struct platform_device *p_dev)
+static int gbefb_probe(struct platform_device *p_dev)
 {
        int i, ret = 0;
        struct fb_info *info;
@@ -1254,7 +1254,7 @@ out_release_framebuffer:
        return ret;
 }
 
-static int __devexit gbefb_remove(struct platform_device* p_dev)
+static int gbefb_remove(struct platform_device* p_dev)
 {
        struct fb_info *info = platform_get_drvdata(p_dev);
 
@@ -1273,7 +1273,7 @@ static int __devexit gbefb_remove(struct platform_device* p_dev)
 
 static struct platform_driver gbefb_driver = {
        .probe = gbefb_probe,
-       .remove = __devexit_p(gbefb_remove),
+       .remove = gbefb_remove,
        .driver = {
                .name = "gbefb",
        },
index 265c5ed59adea8824f9a9fe225704cd877ec4924..ebbaada7b94154c88650575f2f63253da096a387 100644 (file)
@@ -29,7 +29,7 @@ static int  crt_option = 1;
 static char panel_option[32] = "";
 
 /* Modes relevant to the GX1 (taken from modedb.c) */
-static const struct fb_videomode __devinitconst gx1_modedb[] = {
+static const struct fb_videomode gx1_modedb[] = {
        /* 640x480-60 VESA */
        { NULL, 60, 640, 480, 39682,  48, 16, 33, 10, 96, 2,
          0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
@@ -195,7 +195,7 @@ static int gx1fb_blank(int blank_mode, struct fb_info *info)
        return par->vid_ops->blank_display(info, blank_mode);
 }
 
-static int __devinit gx1fb_map_video_memory(struct fb_info *info, struct pci_dev *dev)
+static int gx1fb_map_video_memory(struct fb_info *info, struct pci_dev *dev)
 {
        struct geodefb_par *par = info->par;
        unsigned gx_base;
@@ -268,7 +268,7 @@ static struct fb_ops gx1fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static struct fb_info * __devinit gx1fb_init_fbinfo(struct device *dev)
+static struct fb_info *gx1fb_init_fbinfo(struct device *dev)
 {
        struct geodefb_par *par;
        struct fb_info *info;
@@ -318,7 +318,7 @@ static struct fb_info * __devinit gx1fb_init_fbinfo(struct device *dev)
        return info;
 }
 
-static int __devinit gx1fb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+static int gx1fb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct geodefb_par *par;
        struct fb_info *info;
@@ -382,7 +382,7 @@ static int __devinit gx1fb_probe(struct pci_dev *pdev, const struct pci_device_i
        return ret;
 }
 
-static void __devexit gx1fb_remove(struct pci_dev *pdev)
+static void gx1fb_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct geodefb_par *par = info->par;
@@ -441,7 +441,7 @@ static struct pci_driver gx1fb_driver = {
        .name           = "gx1fb",
        .id_table       = gx1fb_id_table,
        .probe          = gx1fb_probe,
-       .remove         = __devexit_p(gx1fb_remove),
+       .remove         = gx1fb_remove,
 };
 
 static int __init gx1fb_init(void)
@@ -456,7 +456,7 @@ static int __init gx1fb_init(void)
        return pci_register_driver(&gx1fb_driver);
 }
 
-static void __devexit gx1fb_cleanup(void)
+static void gx1fb_cleanup(void)
 {
        pci_unregister_driver(&gx1fb_driver);
 }
index b4f19db9bb542ddfb453298498ca5e96413fe2a5..19f0c1add747fa23b8db96160b7ec1765fa75a01 100644 (file)
@@ -40,7 +40,7 @@ static int vram;
 static int vt_switch;
 
 /* Modes relevant to the GX (taken from modedb.c) */
-static struct fb_videomode gx_modedb[] __devinitdata = {
+static struct fb_videomode gx_modedb[] = {
        /* 640x480-60 VESA */
        { NULL, 60, 640, 480, 39682,  48, 16, 33, 10, 96, 2,
          0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
@@ -110,15 +110,14 @@ static struct fb_videomode gx_modedb[] __devinitdata = {
 #ifdef CONFIG_OLPC
 #include <asm/olpc.h>
 
-static struct fb_videomode gx_dcon_modedb[] __devinitdata = {
+static struct fb_videomode gx_dcon_modedb[] = {
        /* The only mode the DCON has is 1200x900 */
        { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3,
          FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
          FB_VMODE_NONINTERLACED, 0 }
 };
 
-static void __devinit get_modedb(struct fb_videomode **modedb,
-               unsigned int *size)
+static void get_modedb(struct fb_videomode **modedb, unsigned int *size)
 {
        if (olpc_has_dcon()) {
                *modedb = (struct fb_videomode *) gx_dcon_modedb;
@@ -130,8 +129,7 @@ static void __devinit get_modedb(struct fb_videomode **modedb,
 }
 
 #else
-static void __devinit get_modedb(struct fb_videomode **modedb,
-               unsigned int *size)
+static void get_modedb(struct fb_videomode **modedb, unsigned int *size)
 {
        *modedb = (struct fb_videomode *) gx_modedb;
        *size = ARRAY_SIZE(gx_modedb);
@@ -228,8 +226,7 @@ static int gxfb_blank(int blank_mode, struct fb_info *info)
        return gx_blank_display(info, blank_mode);
 }
 
-static int __devinit gxfb_map_video_memory(struct fb_info *info,
-               struct pci_dev *dev)
+static int gxfb_map_video_memory(struct fb_info *info, struct pci_dev *dev)
 {
        struct gxfb_par *par = info->par;
        int ret;
@@ -293,7 +290,7 @@ static struct fb_ops gxfb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static struct fb_info *__devinit gxfb_init_fbinfo(struct device *dev)
+static struct fb_info *gxfb_init_fbinfo(struct device *dev)
 {
        struct gxfb_par *par;
        struct fb_info *info;
@@ -374,8 +371,7 @@ static int gxfb_resume(struct pci_dev *pdev)
 }
 #endif
 
-static int __devinit gxfb_probe(struct pci_dev *pdev,
-               const struct pci_device_id *id)
+static int gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct gxfb_par *par;
        struct fb_info *info;
@@ -455,7 +451,7 @@ static int __devinit gxfb_probe(struct pci_dev *pdev,
        return ret;
 }
 
-static void __devexit gxfb_remove(struct pci_dev *pdev)
+static void gxfb_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct gxfb_par *par = info->par;
index 416851ca8754bec70bb54108c0a7c9cb663dde47..4dd7b5566962b59be9061480f80e373bd1bd7233 100644 (file)
@@ -35,7 +35,7 @@ static int vt_switch;
  * we try to make it something sane - 640x480-60 is sane
  */
 
-static struct fb_videomode geode_modedb[] __devinitdata = {
+static struct fb_videomode geode_modedb[] = {
        /* 640x480-60 */
        { NULL, 60, 640, 480, 39682, 48, 8, 25, 2, 88, 2,
          FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
@@ -219,15 +219,14 @@ static struct fb_videomode geode_modedb[] __devinitdata = {
 #ifdef CONFIG_OLPC
 #include <asm/olpc.h>
 
-static struct fb_videomode olpc_dcon_modedb[] __devinitdata = {
+static struct fb_videomode olpc_dcon_modedb[] = {
        /* The only mode the DCON has is 1200x900 */
        { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3,
          FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
          FB_VMODE_NONINTERLACED, 0 }
 };
 
-static void __devinit get_modedb(struct fb_videomode **modedb,
-               unsigned int *size)
+static void get_modedb(struct fb_videomode **modedb, unsigned int *size)
 {
        if (olpc_has_dcon()) {
                *modedb = (struct fb_videomode *) olpc_dcon_modedb;
@@ -239,8 +238,7 @@ static void __devinit get_modedb(struct fb_videomode **modedb,
 }
 
 #else
-static void __devinit get_modedb(struct fb_videomode **modedb,
-               unsigned int *size)
+static void get_modedb(struct fb_videomode **modedb, unsigned int *size)
 {
        *modedb = (struct fb_videomode *) geode_modedb;
        *size = ARRAY_SIZE(geode_modedb);
@@ -336,8 +334,7 @@ static int lxfb_blank(int blank_mode, struct fb_info *info)
 }
 
 
-static int __devinit lxfb_map_video_memory(struct fb_info *info,
-                                       struct pci_dev *dev)
+static int lxfb_map_video_memory(struct fb_info *info, struct pci_dev *dev)
 {
        struct lxfb_par *par = info->par;
        int ret;
@@ -414,7 +411,7 @@ static struct fb_ops lxfb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static struct fb_info * __devinit lxfb_init_fbinfo(struct device *dev)
+static struct fb_info *lxfb_init_fbinfo(struct device *dev)
 {
        struct lxfb_par *par;
        struct fb_info *info;
@@ -498,8 +495,7 @@ static int lxfb_resume(struct pci_dev *pdev)
 #define lxfb_resume NULL
 #endif
 
-static int __devinit lxfb_probe(struct pci_dev *pdev,
-                            const struct pci_device_id *id)
+static int lxfb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct lxfb_par *par;
        struct fb_info *info;
@@ -590,7 +586,7 @@ err:
        return ret;
 }
 
-static void __devexit lxfb_remove(struct pci_dev *pdev)
+static void lxfb_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct lxfb_par *par = info->par;
index 5245f9a71892e75ad08c8cc0439a030910abfc71..861109e7de1b574d6d9880ee5b845346299de7a2 100644 (file)
@@ -70,7 +70,7 @@ static const struct fb_videomode grvga_modedb[] = {
     }
  };
 
-static struct fb_fix_screeninfo grvga_fix __devinitdata = {
+static struct fb_fix_screeninfo grvga_fix = {
        .id =           "AG SVGACTRL",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_PSEUDOCOLOR,
@@ -267,8 +267,8 @@ static struct fb_ops grvga_ops = {
        .fb_imageblit   = cfb_imageblit
 };
 
-static int __devinit grvga_parse_custom(char *options,
-                                    struct fb_var_screeninfo *screendata)
+static int grvga_parse_custom(char *options,
+                             struct fb_var_screeninfo *screendata)
 {
        char *this_opt;
        int count = 0;
@@ -329,7 +329,7 @@ static int __devinit grvga_parse_custom(char *options,
        return 0;
 }
 
-static int __devinit grvga_probe(struct platform_device *dev)
+static int grvga_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int retval = -ENOMEM;
@@ -512,7 +512,7 @@ free_fb:
        return retval;
 }
 
-static int __devexit grvga_remove(struct platform_device *device)
+static int grvga_remove(struct platform_device *device)
 {
        struct fb_info *info = dev_get_drvdata(&device->dev);
        struct grvga_par *par = info->par;
@@ -554,7 +554,7 @@ static struct platform_driver grvga_driver = {
                .of_match_table = svgactrl_of_match,
        },
        .probe          = grvga_probe,
-       .remove         = __devexit_p(grvga_remove),
+       .remove         = grvga_remove,
 };
 
 
index 4bdea6e9bd5590dfb5b42d47ac9c570d56699da5..c35663f6a54a10231e05e9a00e973ad856cd5a00 100644 (file)
@@ -159,7 +159,7 @@ struct gxt4500_par {
 static char *mode_option;
 
 /* default mode: 1280x1024 @ 60 Hz, 8 bpp */
-static const struct fb_videomode defaultmode __devinitconst = {
+static const struct fb_videomode defaultmode = {
        .refresh = 60,
        .xres = 1280,
        .yres = 1024,
@@ -588,7 +588,7 @@ static int gxt4500_blank(int blank, struct fb_info *info)
        return 0;
 }
 
-static const struct fb_fix_screeninfo gxt4500_fix __devinitconst = {
+static const struct fb_fix_screeninfo gxt4500_fix = {
        .id = "IBM GXT4500P",
        .type = FB_TYPE_PACKED_PIXELS,
        .visual = FB_VISUAL_PSEUDOCOLOR,
@@ -610,8 +610,7 @@ static struct fb_ops gxt4500_ops = {
 };
 
 /* PCI functions */
-static int __devinit gxt4500_probe(struct pci_dev *pdev,
-                                  const struct pci_device_id *ent)
+static int gxt4500_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int err;
        unsigned long reg_phys, fb_phys;
@@ -720,7 +719,7 @@ static int __devinit gxt4500_probe(struct pci_dev *pdev,
        return -ENODEV;
 }
 
-static void __devexit gxt4500_remove(struct pci_dev *pdev)
+static void gxt4500_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct gxt4500_par *par;
@@ -758,10 +757,10 @@ static struct pci_driver gxt4500_driver = {
        .name = "gxt4500",
        .id_table = gxt4500_pci_tbl,
        .probe = gxt4500_probe,
-       .remove = __devexit_p(gxt4500_remove),
+       .remove = gxt4500_remove,
 };
 
-static int __devinit gxt4500_init(void)
+static int gxt4500_init(void)
 {
 #ifndef MODULE
        if (fb_get_options("gxt4500", &mode_option))
index 614251a9af912953e867802e2ddbd9a495fdee86..59d23181fdb0f768c927fb38d7a60a257471331e 100644 (file)
@@ -47,7 +47,7 @@
 #define DPY_W 600
 #define DPY_H 800
 
-static struct fb_fix_screeninfo hecubafb_fix __devinitdata = {
+static struct fb_fix_screeninfo hecubafb_fix = {
        .id =           "hecubafb",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_MONO01,
@@ -58,7 +58,7 @@ static struct fb_fix_screeninfo hecubafb_fix __devinitdata = {
        .accel =        FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo hecubafb_var __devinitdata = {
+static struct fb_var_screeninfo hecubafb_var = {
        .xres           = DPY_W,
        .yres           = DPY_H,
        .xres_virtual   = DPY_W,
@@ -211,7 +211,7 @@ static struct fb_deferred_io hecubafb_defio = {
        .deferred_io    = hecubafb_dpy_deferred_io,
 };
 
-static int __devinit hecubafb_probe(struct platform_device *dev)
+static int hecubafb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct hecuba_board *board;
@@ -280,7 +280,7 @@ err_videomem_alloc:
        return retval;
 }
 
-static int __devexit hecubafb_remove(struct platform_device *dev)
+static int hecubafb_remove(struct platform_device *dev)
 {
        struct fb_info *info = platform_get_drvdata(dev);
 
@@ -299,7 +299,7 @@ static int __devexit hecubafb_remove(struct platform_device *dev)
 
 static struct platform_driver hecubafb_driver = {
        .probe  = hecubafb_probe,
-       .remove = __devexit_p(hecubafb_remove),
+       .remove = hecubafb_remove,
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "hecubafb",
index c645f928265001dc5bb5485a25a1a2012aafc2d4..1e9e2d819d1f13dd26f43fe2c0718bca9e5d9ae6 100644 (file)
@@ -106,7 +106,7 @@ static DEFINE_SPINLOCK(hga_reg_lock);
 
 /* Framebuffer driver structures */
 
-static struct fb_var_screeninfo hga_default_var __devinitdata = {
+static struct fb_var_screeninfo hga_default_var = {
        .xres           = 720,
        .yres           = 348,
        .xres_virtual   = 720,
@@ -120,7 +120,7 @@ static struct fb_var_screeninfo hga_default_var __devinitdata = {
        .width          = -1,
 };
 
-static struct fb_fix_screeninfo hga_fix __devinitdata = {
+static struct fb_fix_screeninfo hga_fix = {
        .id             = "HGA",
        .type           = FB_TYPE_PACKED_PIXELS,        /* (not sure) */
        .visual         = FB_VISUAL_MONO10,
@@ -276,7 +276,7 @@ static void hga_blank(int blank_mode)
        spin_unlock_irqrestore(&hga_reg_lock, flags);
 }
 
-static int __devinit hga_card_detect(void)
+static int hga_card_detect(void)
 {
        int count = 0;
        void __iomem *p, *q;
@@ -546,7 +546,7 @@ static struct fb_ops hgafb_ops = {
         *  Initialization
         */
 
-static int __devinit hgafb_probe(struct platform_device *pdev)
+static int hgafb_probe(struct platform_device *pdev)
 {
        struct fb_info *info;
 
@@ -592,7 +592,7 @@ static int __devinit hgafb_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit hgafb_remove(struct platform_device *pdev)
+static int hgafb_remove(struct platform_device *pdev)
 {
        struct fb_info *info = platform_get_drvdata(pdev);
 
@@ -617,7 +617,7 @@ static int __devexit hgafb_remove(struct platform_device *pdev)
 
 static struct platform_driver hgafb_driver = {
        .probe = hgafb_probe,
-       .remove = __devexit_p(hgafb_remove),
+       .remove = hgafb_remove,
        .driver = {
                .name = "hgafb",
        },
index cfb8d6451014e06ca1f6b3775e65569ade4fdc8d..c2414d6ab646f3c75569f85c61165bcb2769ca3f 100644 (file)
 
 #define        WIDTH 640
 
-static struct fb_var_screeninfo hitfb_var __devinitdata = {
+static struct fb_var_screeninfo hitfb_var = {
        .activate       = FB_ACTIVATE_NOW,
        .height         = -1,
        .width          = -1,
        .vmode          = FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_fix_screeninfo hitfb_fix __devinitdata = {
+static struct fb_fix_screeninfo hitfb_fix = {
        .id             = "Hitachi HD64461",
        .type           = FB_TYPE_PACKED_PIXELS,
        .accel          = FB_ACCEL_NONE,
@@ -324,7 +324,7 @@ static struct fb_ops hitfb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __devinit hitfb_probe(struct platform_device *dev)
+static int hitfb_probe(struct platform_device *dev)
 {
        unsigned short lcdclor, ldr3, ldvndr;
        struct fb_info *info;
@@ -417,7 +417,7 @@ err_fb:
        return ret;
 }
 
-static int __devexit hitfb_remove(struct platform_device *dev)
+static int hitfb_remove(struct platform_device *dev)
 {
        struct fb_info *info = platform_get_drvdata(dev);
 
@@ -462,7 +462,7 @@ static const struct dev_pm_ops hitfb_dev_pm_ops = {
 
 static struct platform_driver hitfb_driver = {
        .probe          = hitfb_probe,
-       .remove         = __devexit_p(hitfb_remove),
+       .remove         = hitfb_remove,
        .driver         = {
                .name   = "hitfb",
                .owner  = THIS_MODULE,
index 7324865f965f4c5c1d9c5fe4639dbb8f66f39808..b802f93cef5d285e55448c2bf10d859d0dadfb79 100644 (file)
@@ -206,8 +206,7 @@ static struct fb_ops hpfb_ops = {
 #define HPFB_FBOMSB    0x5d    /* Frame buffer offset          */
 #define HPFB_FBOLSB    0x5f
 
-static int __devinit hpfb_init_one(unsigned long phys_base,
-                                  unsigned long virt_base)
+static int hpfb_init_one(unsigned long phys_base, unsigned long virt_base)
 {
        unsigned long fboff, fb_width, fb_height, fb_start;
        int ret;
@@ -327,7 +326,7 @@ unmap_screen_base:
 /* 
  * Initialise the framebuffer
  */
-static int __devinit hpfb_dio_probe(struct dio_dev * d, const struct dio_device_id * ent)
+static int hpfb_dio_probe(struct dio_dev *d, const struct dio_device_id *ent)
 {
        unsigned long paddr, vaddr;
 
@@ -350,7 +349,7 @@ static int __devinit hpfb_dio_probe(struct dio_dev * d, const struct dio_device_
        return 0;
 }
 
-static void __devexit hpfb_remove_one(struct dio_dev *d)
+static void hpfb_remove_one(struct dio_dev *d)
 {
        unregister_framebuffer(&fb_info);
        if (d->scode >= DIOII_SCBASE)
@@ -373,7 +372,7 @@ static struct dio_driver hpfb_driver = {
     .name      = "hpfb",
     .id_table  = hpfb_dio_tbl,
     .probe     = hpfb_dio_probe,
-    .remove    = __devexit_p(hpfb_remove_one),
+    .remove    = hpfb_remove_one,
 };
 
 int __init hpfb_init(void)
index ff3f8808e4e9ed24a1d3defcca0cb6c11259ce93..cfd0c52e8f737fb60a6279c668c90bf35a3ce24f 100644 (file)
 
 #include "i740_reg.h"
 
-static char *mode_option __devinitdata;
+static char *mode_option;
 
 #ifdef CONFIG_MTRR
-static int mtrr __devinitdata = 1;
+static int mtrr = 1;
 #endif
 
 struct i740fb_par {
@@ -91,7 +91,7 @@ struct i740fb_par {
 #define DACSPEED24_SD  128
 #define DACSPEED32     86
 
-static struct fb_fix_screeninfo i740fb_fix __devinitdata = {
+static struct fb_fix_screeninfo i740fb_fix = {
        .id =           "i740fb",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_TRUECOLOR,
@@ -163,7 +163,7 @@ static int i740fb_ddc_getsda(void *data)
        return !!(i740inreg(par, XRX, REG_DDC_STATE) & DDC_SDA);
 }
 
-static int __devinit i740fb_setup_ddc_bus(struct fb_info *info)
+static int i740fb_setup_ddc_bus(struct fb_info *info)
 {
        struct i740fb_par *par = info->par;
 
@@ -1007,8 +1007,7 @@ static struct fb_ops i740fb_ops = {
 
 /* ------------------------------------------------------------------------- */
 
-static int __devinit i740fb_probe(struct pci_dev *dev,
-                                 const struct pci_device_id *ent)
+static int i740fb_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 {
        struct fb_info *info;
        struct i740fb_par *par;
@@ -1174,7 +1173,7 @@ err_enable_device:
        return ret;
 }
 
-static void __devexit i740fb_remove(struct pci_dev *dev)
+static void i740fb_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
 
@@ -1275,7 +1274,7 @@ static struct pci_driver i740fb_driver = {
        .name           = "i740fb",
        .id_table       = i740fb_id_table,
        .probe          = i740fb_probe,
-       .remove         = __devexit_p(i740fb_remove),
+       .remove         = i740fb_remove,
        .suspend        = i740fb_suspend,
        .resume         = i740fb_resume,
 };
index 5c067816a81d82210177ae569768504ef2d3b8e5..4ce3438ade6f31fc8bac432a468f719d777e7cea 100644 (file)
  *
  * Experiment with v_offset to find out which works best for you.
  */
-static u32 v_offset_default __devinitdata; /* For 32 MiB Aper size, 8 should be the default */
-static u32 voffset          __devinitdata;
+static u32 v_offset_default; /* For 32 MiB Aper size, 8 should be the default */
+static u32 voffset;
 
 static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor);
-static int  __devinit i810fb_init_pci (struct pci_dev *dev,
-                                      const struct pci_device_id *entry);
+static int i810fb_init_pci(struct pci_dev *dev,
+                          const struct pci_device_id *entry);
 static void __exit i810fb_remove_pci(struct pci_dev *dev);
 static int i810fb_resume(struct pci_dev *dev);
 static int i810fb_suspend(struct pci_dev *dev, pm_message_t state);
@@ -97,7 +97,7 @@ static int i810fb_blank      (int blank_mode, struct fb_info *info);
 static void i810fb_release_resource       (struct fb_info *info, struct i810fb_par *par);
 
 /* PCI */
-static const char * const i810_pci_list[] __devinitconst = {
+static const char * const i810_pci_list[] = {
        "Intel(R) 810 Framebuffer Device"                                 ,
        "Intel(R) 810-DC100 Framebuffer Device"                           ,
        "Intel(R) 810E Framebuffer Device"                                ,
@@ -132,22 +132,22 @@ static struct pci_driver i810fb_driver = {
        .resume   =     i810fb_resume,
 };
 
-static char *mode_option __devinitdata = NULL;
-static int vram       __devinitdata = 4;
-static int bpp        __devinitdata = 8;
-static bool mtrr      __devinitdata;
-static bool accel     __devinitdata;
-static int hsync1     __devinitdata;
-static int hsync2     __devinitdata;
-static int vsync1     __devinitdata;
-static int vsync2     __devinitdata;
-static int xres       __devinitdata;
+static char *mode_option = NULL;
+static int vram = 4;
+static int bpp = 8;
+static bool mtrr;
+static bool accel;
+static int hsync1;
+static int hsync2;
+static int vsync1;
+static int vsync2;
+static int xres;
 static int yres;
-static int vyres      __devinitdata;
-static bool sync      __devinitdata;
-static bool extvga    __devinitdata;
-static bool dcolor    __devinitdata;
-static bool ddc3      __devinitdata;
+static int vyres;
+static bool sync;
+static bool extvga;
+static bool dcolor;
+static bool ddc3;
 
 /*------------------------------------------------------------*/
 
@@ -1541,7 +1541,7 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
        return 0;
 }
 
-static struct fb_ops i810fb_ops __devinitdata = {
+static struct fb_ops i810fb_ops = {
        .owner =             THIS_MODULE,
        .fb_open =           i810fb_open,
        .fb_release =        i810fb_release,
@@ -1628,7 +1628,7 @@ fail:
  *                  AGP resource allocation                            *
  ***********************************************************************/
   
-static void __devinit i810_fix_pointers(struct i810fb_par *par)
+static void i810_fix_pointers(struct i810fb_par *par)
 {
        par->fb.physical = par->aperture.physical+(par->fb.offset << 12);
        par->fb.virtual = par->aperture.virtual+(par->fb.offset << 12);
@@ -1640,7 +1640,7 @@ static void __devinit i810_fix_pointers(struct i810fb_par *par)
                (par->cursor_heap.offset << 12);
 }
 
-static void __devinit i810_fix_offsets(struct i810fb_par *par)
+static void i810_fix_offsets(struct i810fb_par *par)
 {
        if (vram + 1 > par->aperture.size >> 20)
                vram = (par->aperture.size >> 20) - 1;
@@ -1660,7 +1660,7 @@ static void __devinit i810_fix_offsets(struct i810fb_par *par)
        par->cursor_heap.size = 4096;
 }
 
-static int __devinit i810_alloc_agp_mem(struct fb_info *info)
+static int i810_alloc_agp_mem(struct fb_info *info)
 {
        struct i810fb_par *par = info->par;
        int size;
@@ -1723,7 +1723,7 @@ static int __devinit i810_alloc_agp_mem(struct fb_info *info)
  * Sets the user monitor's horizontal and vertical
  * frequency limits
  */
-static void __devinit i810_init_monspecs(struct fb_info *info)
+static void i810_init_monspecs(struct fb_info *info)
 {
        if (!hsync1)
                hsync1 = HFMIN;
@@ -1755,8 +1755,7 @@ static void __devinit i810_init_monspecs(struct fb_info *info)
  * @par: pointer to i810fb_par structure
  * @info: pointer to current fb_info structure
  */
-static void __devinit i810_init_defaults(struct i810fb_par *par, 
-                                     struct fb_info *info)
+static void i810_init_defaults(struct i810fb_par *par, struct fb_info *info)
 {
        mutex_init(&par->open_lock);
 
@@ -1812,7 +1811,7 @@ static void __devinit i810_init_defaults(struct i810fb_par *par,
  * i810_init_device - initialize device
  * @par: pointer to i810fb_par structure
  */
-static void __devinit i810_init_device(struct i810fb_par *par)
+static void i810_init_device(struct i810fb_par *par)
 {
        u8 reg;
        u8 __iomem *mmio = par->mmio_start_virtual;
@@ -1833,9 +1832,8 @@ static void __devinit i810_init_device(struct i810fb_par *par)
 
 }
 
-static int __devinit 
-i810_allocate_pci_resource(struct i810fb_par *par, 
-                          const struct pci_device_id *entry)
+static int i810_allocate_pci_resource(struct i810fb_par *par,
+                                     const struct pci_device_id *entry)
 {
        int err;
 
@@ -1892,7 +1890,7 @@ i810_allocate_pci_resource(struct i810fb_par *par,
        return 0;
 }
 
-static void __devinit i810fb_find_init_mode(struct fb_info *info)
+static void i810fb_find_init_mode(struct fb_info *info)
 {
        struct fb_videomode mode;
        struct fb_var_screeninfo var;
@@ -1956,7 +1954,7 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info)
 }
 
 #ifndef MODULE
-static int __devinit i810fb_setup(char *options)
+static int i810fb_setup(char *options)
 {
        char *this_opt, *suffix = NULL;
 
@@ -2007,8 +2005,8 @@ static int __devinit i810fb_setup(char *options)
 }
 #endif
 
-static int __devinit i810fb_init_pci (struct pci_dev *dev, 
-                                  const struct pci_device_id *entry)
+static int i810fb_init_pci(struct pci_dev *dev,
+                          const struct pci_device_id *entry)
 {
        struct fb_info    *info;
        struct i810fb_par *par = NULL;
@@ -2136,7 +2134,7 @@ static void __exit i810fb_remove_pci(struct pci_dev *dev)
 }                                                      
 
 #ifndef MODULE
-static int __devinit i810fb_init(void)
+static int i810fb_init(void)
 {
        char *option = NULL;
 
@@ -2154,7 +2152,7 @@ static int __devinit i810fb_init(void)
 
 #ifdef MODULE
 
-static int __devinit i810fb_init(void)
+static int i810fb_init(void)
 {
        hsync1 *= 1000;
        hsync2 *= 1000;
index 51d4f3d4116dda55e130360b89cc02e06cdfa984..a25afaa534baa3264925b86a503eb2fb39f0d41a 100644 (file)
@@ -64,7 +64,7 @@ static inline void flush_cache(void)
 
 #include <asm/mtrr.h>
 
-static inline void __devinit set_mtrr(struct i810fb_par *par)
+static inline void set_mtrr(struct i810fb_par *par)
 {
        par->mtrr_reg = mtrr_add((u32) par->aperture.physical, 
                 par->aperture.size, MTRR_TYPE_WRCOMB, 1);
index 2d97752f79a516a049f749eb4f82034078d7aabd..79cbfa7d1a9be0703a167c63e515cf3b6ab2fe86 100644 (file)
@@ -571,7 +571,7 @@ static int __init igafb_setup(char *options)
 
 module_init(igafb_init);
 MODULE_LICENSE("GPL");
-static struct pci_device_id igafb_pci_tbl[] __devinitdata = {
+static struct pci_device_id igafb_pci_tbl[] = {
        { PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_1682,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { }
index 8149356471e443af26d5a4e2cb97c818bfaf9c7f..d5220cc90e932b67657bded0a2bb5b4a9d05bfa0 100644 (file)
@@ -225,7 +225,7 @@ struct initvalues {
        __u8 addr, value;
 };
 
-static struct initvalues ibm_initregs[] __devinitdata = {
+static struct initvalues ibm_initregs[] = {
        { CLKCTL,       0x21 },
        { SYNCCTL,      0x00 },
        { HSYNCPOS,     0x00 },
@@ -272,7 +272,7 @@ static struct initvalues ibm_initregs[] __devinitdata = {
        { KEYCTL,       0x00 }
 };
 
-static struct initvalues tvp_initregs[] __devinitdata = {
+static struct initvalues tvp_initregs[] = {
        { TVPIRICC,     0x00 },
        { TVPIRBRC,     0xe4 },
        { TVPIRLAC,     0x06 },
@@ -336,7 +336,7 @@ enum {
 static int inverse = 0;
 static char fontname[40] __initdata = { 0 };
 #if defined(CONFIG_PPC)
-static signed char init_vmode __devinitdata = -1, init_cmode __devinitdata = -1;
+static signed char init_vmode = -1, init_cmode = -1;
 #endif
 
 static struct imstt_regvals tvp_reg_init_2 = {
@@ -1333,7 +1333,7 @@ static struct pci_driver imsttfb_pci_driver = {
        .name =         "imsttfb",
        .id_table =     imsttfb_pci_tbl,
        .probe =        imsttfb_probe,
-       .remove =       __devexit_p(imsttfb_remove),
+       .remove =       imsttfb_remove,
 };
 
 static struct fb_ops imsttfb_ops = {
@@ -1349,8 +1349,7 @@ static struct fb_ops imsttfb_ops = {
        .fb_ioctl       = imsttfb_ioctl,
 };
 
-static void __devinit
-init_imstt(struct fb_info *info)
+static void init_imstt(struct fb_info *info)
 {
        struct imstt_par *par = info->par;
        __u32 i, tmp, *ip, *end;
@@ -1466,8 +1465,7 @@ init_imstt(struct fb_info *info)
                info->node, info->fix.id, info->fix.smem_len >> 20, tmp);
 }
 
-static int __devinit
-imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        unsigned long addr, size;
        struct imstt_par *par;
@@ -1534,8 +1532,7 @@ imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        return 0;
 }
 
-static void __devexit
-imsttfb_remove(struct pci_dev *pdev)
+static void imsttfb_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct imstt_par *par = info->par;
index e501dbc966b3b2a3976d17956fc9bd9f387cec29..12526787a7c741e3b4eb2601dc9f2f4b008d251b 100644 (file)
@@ -917,7 +917,7 @@ failed_init:
        return ret;
 }
 
-static int __devexit imxfb_remove(struct platform_device *pdev)
+static int imxfb_remove(struct platform_device *pdev)
 {
        struct imx_fb_platform_data *pdata;
        struct fb_info *info = platform_get_drvdata(pdev);
@@ -959,7 +959,7 @@ void  imxfb_shutdown(struct platform_device * dev)
 static struct platform_driver imxfb_driver = {
        .suspend        = imxfb_suspend,
        .resume         = imxfb_resume,
-       .remove         = __devexit_p(imxfb_remove),
+       .remove         = imxfb_remove,
        .shutdown       = imxfb_shutdown,
        .driver         = {
                .name   = DRIVER_NAME,
index bdcbfbae277741e85b52f300f756d37bf3773a6c..8209e46c5d2875e9cda0de1bb3942212d0b211f9 100644 (file)
 #include "intelfbhw.h"
 #include "../edid.h"
 
-static void __devinit get_initial_mode(struct intelfb_info *dinfo);
+static void get_initial_mode(struct intelfb_info *dinfo);
 static void update_dinfo(struct intelfb_info *dinfo,
                         struct fb_var_screeninfo *var);
 static int intelfb_open(struct fb_info *info, int user);
@@ -162,10 +162,10 @@ static int intelfb_sync(struct fb_info *info);
 static int intelfb_ioctl(struct fb_info *info,
                         unsigned int cmd, unsigned long arg);
 
-static int __devinit intelfb_pci_register(struct pci_dev *pdev,
-                                         const struct pci_device_id *ent);
-static void __devexit intelfb_pci_unregister(struct pci_dev *pdev);
-static int __devinit intelfb_set_fbinfo(struct intelfb_info *dinfo);
+static int intelfb_pci_register(struct pci_dev *pdev,
+                               const struct pci_device_id *ent);
+static void intelfb_pci_unregister(struct pci_dev *pdev);
+static int intelfb_set_fbinfo(struct intelfb_info *dinfo);
 
 /*
  * Limiting the class to PCI_CLASS_DISPLAY_VGA prevents function 1 of the
@@ -177,7 +177,7 @@ static int __devinit intelfb_set_fbinfo(struct intelfb_info *dinfo);
 #define INTELFB_CLASS_MASK 0
 #endif
 
-static struct pci_device_id intelfb_pci_table[] __devinitdata = {
+static struct pci_device_id intelfb_pci_table[] = {
        { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_830M, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK, INTEL_830M },
        { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_845G, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK, INTEL_845G },
        { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_85XGM, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, INTELFB_CLASS_MASK, INTEL_85XGM },
@@ -219,7 +219,7 @@ static struct pci_driver intelfb_driver = {
        .name =         "intelfb",
        .id_table =     intelfb_pci_table,
        .probe =        intelfb_pci_register,
-       .remove =       __devexit_p(intelfb_pci_unregister)
+       .remove =       intelfb_pci_unregister,
 };
 
 /* Module description/parameters */
@@ -415,7 +415,7 @@ module_exit(intelfb_exit);
  ***************************************************************/
 
 #ifdef CONFIG_MTRR
-static inline void __devinit set_mtrr(struct intelfb_info *dinfo)
+static inline void set_mtrr(struct intelfb_info *dinfo)
 {
        dinfo->mtrr_reg = mtrr_add(dinfo->aperture.physical,
                                   dinfo->aperture.size, MTRR_TYPE_WRCOMB, 1);
@@ -497,8 +497,8 @@ static void cleanup(struct intelfb_info *dinfo)
 } while (0)
 
 
-static int __devinit intelfb_pci_register(struct pci_dev *pdev,
-                                         const struct pci_device_id *ent)
+static int intelfb_pci_register(struct pci_dev *pdev,
+                               const struct pci_device_id *ent)
 {
        struct fb_info *info;
        struct intelfb_info *dinfo;
@@ -921,8 +921,7 @@ err_out_cmap:
        return -ENODEV;
 }
 
-static void __devexit
-intelfb_pci_unregister(struct pci_dev *pdev)
+static void intelfb_pci_unregister(struct pci_dev *pdev)
 {
        struct intelfb_info *dinfo = pci_get_drvdata(pdev);
 
@@ -970,7 +969,7 @@ static __inline__ int var_to_refresh(const struct fb_var_screeninfo *var)
  *                Various intialisation functions              *
  ***************************************************************/
 
-static void __devinit get_initial_mode(struct intelfb_info *dinfo)
+static void get_initial_mode(struct intelfb_info *dinfo)
 {
        struct fb_var_screeninfo *var;
        int xtot, ytot;
@@ -1037,7 +1036,7 @@ static void __devinit get_initial_mode(struct intelfb_info *dinfo)
        }
 }
 
-static int __devinit intelfb_init_var(struct intelfb_info *dinfo)
+static int intelfb_init_var(struct intelfb_info *dinfo)
 {
        struct fb_var_screeninfo *var;
        int msrc = 0;
@@ -1118,7 +1117,7 @@ static int __devinit intelfb_init_var(struct intelfb_info *dinfo)
        return 0;
 }
 
-static int __devinit intelfb_set_fbinfo(struct intelfb_info *dinfo)
+static int intelfb_set_fbinfo(struct intelfb_info *dinfo)
 {
        struct fb_info *info = dinfo->info;
 
index 4d25711b99829926c9033d77240265025efecaa7..d999bb5e04851bf857dc396c318dbead0de1bb15 100644 (file)
@@ -136,7 +136,7 @@ struct jzfb {
        uint32_t pseudo_palette[16];
 };
 
-static const struct fb_fix_screeninfo jzfb_fix __devinitconst = {
+static const struct fb_fix_screeninfo jzfb_fix = {
        .id             = "JZ4740 FB",
        .type           = FB_TYPE_PACKED_PIXELS,
        .visual         = FB_VISUAL_TRUECOLOR,
@@ -619,7 +619,7 @@ static struct  fb_ops jzfb_ops = {
        .fb_setcolreg = jzfb_setcolreg,
 };
 
-static int __devinit jzfb_probe(struct platform_device *pdev)
+static int jzfb_probe(struct platform_device *pdev)
 {
        int ret;
        struct jzfb *jzfb;
@@ -725,7 +725,7 @@ err_framebuffer_release:
        return ret;
 }
 
-static int __devexit jzfb_remove(struct platform_device *pdev)
+static int jzfb_remove(struct platform_device *pdev)
 {
        struct jzfb *jzfb = platform_get_drvdata(pdev);
 
@@ -794,7 +794,7 @@ static const struct dev_pm_ops jzfb_pm_ops = {
 
 static struct platform_driver jzfb_driver = {
        .probe = jzfb_probe,
-       .remove = __devexit_p(jzfb_remove),
+       .remove = jzfb_remove,
        .driver = {
                .name = "jz4740-fb",
                .pm = JZFB_PM_OPS,
index acb9370fdb147277e733df39934706eabb8a0645..6157f74ac600529d66f8d71fa8f6d3d5d95a5e5a 100644 (file)
 #define KHZ2PICOS(a) (1000000000UL/(a))
 
 /****************************************************************************/
-static struct fb_fix_screeninfo kyro_fix __devinitdata = {
+static struct fb_fix_screeninfo kyro_fix = {
        .id             = "ST Kyro",
        .type           = FB_TYPE_PACKED_PIXELS,
        .visual         = FB_VISUAL_TRUECOLOR,
        .accel          = FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo kyro_var __devinitdata = {
+static struct fb_var_screeninfo kyro_var = {
        /* 640x480, 16bpp @ 60 Hz */
        .xres           = 640,
        .yres           = 480,
@@ -81,18 +81,18 @@ typedef struct {
 /* global graphics card info structure (one per card) */
 static device_info_t deviceInfo;
 
-static char *mode_option __devinitdata = NULL;
-static int nopan __devinitdata = 0;
-static int nowrap __devinitdata = 1;
+static char *mode_option = NULL;
+static int nopan = 0;
+static int nowrap = 1;
 #ifdef CONFIG_MTRR
-static int nomtrr __devinitdata = 0;
+static int nomtrr = 0;
 #endif
 
 /* PCI driver prototypes */
 static int kyrofb_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
 static void kyrofb_remove(struct pci_dev *pdev);
 
-static struct fb_videomode kyro_modedb[] __devinitdata = {
+static struct fb_videomode kyro_modedb[] = {
        {
                /* 640x350 @ 85Hz */
                NULL, 85, 640, 350, KHZ2PICOS(31500),
@@ -653,7 +653,7 @@ static struct pci_driver kyrofb_pci_driver = {
        .name           = "kyrofb",
        .id_table       = kyrofb_pci_tbl,
        .probe          = kyrofb_probe,
-       .remove         = __devexit_p(kyrofb_remove),
+       .remove         = kyrofb_remove,
 };
 
 static struct fb_ops kyrofb_ops = {
@@ -667,8 +667,7 @@ static struct fb_ops kyrofb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __devinit kyrofb_probe(struct pci_dev *pdev,
-                                 const struct pci_device_id *ent)
+static int kyrofb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct fb_info *info;
        struct kyrofb_info *currentpar;
@@ -754,7 +753,7 @@ out_unmap:
        return -EINVAL;
 }
 
-static void __devexit kyrofb_remove(struct pci_dev *pdev)
+static void kyrofb_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct kyrofb_info *par = info->par;
index 9e946e2c1da91fd67e1a3f5198f340f109f79ead..b17f5009a4363dab5546c57891c4d2564814737c 100644 (file)
@@ -547,7 +547,7 @@ static void leo_unmap_regs(struct platform_device *op, struct fb_info *info,
                of_iounmap(&op->resource[0], info->screen_base, 0x800000);
 }
 
-static int __devinit leo_probe(struct platform_device *op)
+static int leo_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct fb_info *info;
@@ -636,7 +636,7 @@ out_err:
        return err;
 }
 
-static int __devexit leo_remove(struct platform_device *op)
+static int leo_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct leo_par *par = info->par;
@@ -668,7 +668,7 @@ static struct platform_driver leo_driver = {
                .of_match_table = leo_match,
        },
        .probe          = leo_probe,
-       .remove         = __devexit_p(leo_remove),
+       .remove         = leo_remove,
 };
 
 static int __init leo_init(void)
index d68e332aa21c39d963b37bc3e7f5039a01c8c85c..91c59c9fb082be72d2862aeb88ab47129902aa57 100644 (file)
@@ -668,7 +668,7 @@ static int mb862xx_gdc_init(struct mb862xxfb_par *par)
        return 0;
 }
 
-static int __devinit of_platform_mb862xx_probe(struct platform_device *ofdev)
+static int of_platform_mb862xx_probe(struct platform_device *ofdev)
 {
        struct device_node *np = ofdev->dev.of_node;
        struct device *dev = &ofdev->dev;
@@ -786,7 +786,7 @@ fbrel:
        return ret;
 }
 
-static int __devexit of_platform_mb862xx_remove(struct platform_device *ofdev)
+static int of_platform_mb862xx_remove(struct platform_device *ofdev)
 {
        struct fb_info *fbi = dev_get_drvdata(&ofdev->dev);
        struct mb862xxfb_par *par = fbi->par;
@@ -823,7 +823,7 @@ static int __devexit of_platform_mb862xx_remove(struct platform_device *ofdev)
 /*
  * common types
  */
-static struct of_device_id __devinitdata of_platform_mb862xx_tbl[] = {
+static struct of_device_id of_platform_mb862xx_tbl[] = {
        { .compatible = "fujitsu,MB86276", },
        { .compatible = "fujitsu,lime", },
        { .compatible = "fujitsu,MB86277", },
@@ -841,7 +841,7 @@ static struct platform_driver of_platform_mb862xxfb_driver = {
                .of_match_table = of_platform_mb862xx_tbl,
        },
        .probe          = of_platform_mb862xx_probe,
-       .remove         = __devexit_p(of_platform_mb862xx_remove),
+       .remove         = of_platform_mb862xx_remove,
 };
 #endif
 
@@ -984,7 +984,7 @@ static inline int mb862xx_pci_gdc_init(struct mb862xxfb_par *par)
 #define CHIP_ID(id)    \
        { PCI_DEVICE(PCI_VENDOR_ID_FUJITSU_LIMITED, id) }
 
-static struct pci_device_id mb862xx_pci_tbl[] __devinitdata = {
+static struct pci_device_id mb862xx_pci_tbl[] = {
        /* MB86295/MB86296 */
        CHIP_ID(PCI_DEVICE_ID_FUJITSU_CORALP),
        CHIP_ID(PCI_DEVICE_ID_FUJITSU_CORALPA),
@@ -995,8 +995,8 @@ static struct pci_device_id mb862xx_pci_tbl[] __devinitdata = {
 
 MODULE_DEVICE_TABLE(pci, mb862xx_pci_tbl);
 
-static int __devinit mb862xx_pci_probe(struct pci_dev *pdev,
-                                      const struct pci_device_id *ent)
+static int mb862xx_pci_probe(struct pci_dev *pdev,
+                            const struct pci_device_id *ent)
 {
        struct mb862xxfb_par *par;
        struct fb_info *info;
@@ -1133,7 +1133,7 @@ out:
        return ret;
 }
 
-static void __devexit mb862xx_pci_remove(struct pci_dev *pdev)
+static void mb862xx_pci_remove(struct pci_dev *pdev)
 {
        struct fb_info *fbi = pci_get_drvdata(pdev);
        struct mb862xxfb_par *par = fbi->par;
@@ -1174,11 +1174,11 @@ static struct pci_driver mb862xxfb_pci_driver = {
        .name           = DRV_NAME,
        .id_table       = mb862xx_pci_tbl,
        .probe          = mb862xx_pci_probe,
-       .remove         = __devexit_p(mb862xx_pci_remove),
+       .remove         = mb862xx_pci_remove,
 };
 #endif
 
-static int __devinit mb862xxfb_init(void)
+static int mb862xxfb_init(void)
 {
        int ret = -ENODEV;
 
index 12dec7634c5548b4c10c5ba88c0c1d0acb1fa4d5..4449f249b0e7cefce685cd8e9f30152df76ca479 100644 (file)
@@ -213,7 +213,7 @@ static const struct file_operations misc_fops = {
        .llseek = default_llseek,
 };
 
-static void __devinit mbxfb_debugfs_init(struct fb_info *fbi)
+static void mbxfb_debugfs_init(struct fb_info *fbi)
 {
        struct mbxfb_info *mfbi = fbi->par;
        struct mbxfb_debugfs_data *dbg;
@@ -236,7 +236,7 @@ static void __devinit mbxfb_debugfs_init(struct fb_info *fbi)
                                        fbi, &misc_fops);
 }
 
-static void __devexit mbxfb_debugfs_remove(struct fb_info *fbi)
+static void mbxfb_debugfs_remove(struct fb_info *fbi)
 {
        struct mbxfb_info *mfbi = fbi->par;
        struct mbxfb_debugfs_data *dbg = mfbi->debugfs_data;
index 6563e50413c1c01dde5e703281ee47cac459f4b6..0c1a874ffd2bfd100be9e8f0b77bd6c0a30e90de 100644 (file)
@@ -79,7 +79,7 @@ struct mbxfb_info {
 
 };
 
-static struct fb_var_screeninfo mbxfb_default __devinitdata = {
+static struct fb_var_screeninfo mbxfb_default = {
        .xres = 640,
        .yres = 480,
        .xres_virtual = 640,
@@ -102,7 +102,7 @@ static struct fb_var_screeninfo mbxfb_default __devinitdata = {
        .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
 };
 
-static struct fb_fix_screeninfo mbxfb_fix  __devinitdata = {
+static struct fb_fix_screeninfo mbxfb_fix = {
        .id = "MBX",
        .type = FB_TYPE_PACKED_PIXELS,
        .visual = FB_VISUAL_TRUECOLOR,
@@ -687,7 +687,7 @@ static struct fb_ops mbxfb_ops = {
   Enable external SDRAM controller. Assume that all clocks are active
   by now.
 */
-static void __devinit setup_memc(struct fb_info *fbi)
+static void setup_memc(struct fb_info *fbi)
 {
        unsigned long tmp;
        int i;
@@ -747,7 +747,7 @@ static void enable_clocks(struct fb_info *fbi)
        write_reg_dly(0x00000001, PIXCLKDIV);
 }
 
-static void __devinit setup_graphics(struct fb_info *fbi)
+static void setup_graphics(struct fb_info *fbi)
 {
        unsigned long gsctrl;
        unsigned long vscadr;
@@ -781,7 +781,7 @@ static void __devinit setup_graphics(struct fb_info *fbi)
        write_reg_dly(vscadr, VSCADR);
 }
 
-static void __devinit setup_display(struct fb_info *fbi)
+static void setup_display(struct fb_info *fbi)
 {
        unsigned long dsctrl = 0;
 
@@ -795,7 +795,7 @@ static void __devinit setup_display(struct fb_info *fbi)
        write_reg_dly((readl(DSCTRL) | DSCTRL_SYNCGEN_EN), DSCTRL);
 }
 
-static void __devinit enable_controller(struct fb_info *fbi)
+static void enable_controller(struct fb_info *fbi)
 {
        u32 svctrl, shctrl;
 
@@ -881,7 +881,7 @@ static int mbxfb_resume(struct platform_device *dev)
 
 #define res_size(_r) (((_r)->end - (_r)->start) + 1)
 
-static int __devinit mbxfb_probe(struct platform_device *dev)
+static int mbxfb_probe(struct platform_device *dev)
 {
        int ret;
        struct fb_info *fbi;
@@ -1006,7 +1006,7 @@ err1:
        return ret;
 }
 
-static int __devexit mbxfb_remove(struct platform_device *dev)
+static int mbxfb_remove(struct platform_device *dev)
 {
        struct fb_info *fbi = platform_get_drvdata(dev);
 
@@ -1038,7 +1038,7 @@ static int __devexit mbxfb_remove(struct platform_device *dev)
 
 static struct platform_driver mbxfb_driver = {
        .probe = mbxfb_probe,
-       .remove = __devexit_p(mbxfb_remove),
+       .remove = mbxfb_remove,
        .suspend = mbxfb_suspend,
        .resume = mbxfb_resume,
        .driver = {
index 97d45e5115e254647454d7c5b7598053944c7273..f30150d71be90bdd31aadbcd87beded46b8ae101 100644 (file)
@@ -99,7 +99,7 @@ static struct epd_frame epd_frame_table[] = {
        },
 };
 
-static struct fb_fix_screeninfo metronomefb_fix __devinitdata = {
+static struct fb_fix_screeninfo metronomefb_fix = {
        .id =           "metronomefb",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_STATIC_PSEUDOCOLOR,
@@ -110,7 +110,7 @@ static struct fb_fix_screeninfo metronomefb_fix __devinitdata = {
        .accel =        FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo metronomefb_var __devinitdata = {
+static struct fb_var_screeninfo metronomefb_var = {
        .xres           = DPY_W,
        .yres           = DPY_H,
        .xres_virtual   = DPY_W,
@@ -167,8 +167,8 @@ static u16 calc_img_cksum(u16 *start, int length)
 }
 
 /* here we decode the incoming waveform file and populate metromem */
-static int __devinit load_waveform(u8 *mem, size_t size, int m, int t,
-                               struct metronomefb_par *par)
+static int load_waveform(u8 *mem, size_t size, int m, int t,
+                        struct metronomefb_par *par)
 {
        int tta;
        int wmta;
@@ -338,7 +338,7 @@ static int metronome_display_cmd(struct metronomefb_par *par)
        return par->board->met_wait_event_intr(par);
 }
 
-static int __devinit metronome_powerup_cmd(struct metronomefb_par *par)
+static int metronome_powerup_cmd(struct metronomefb_par *par)
 {
        int i;
        u16 cs;
@@ -367,7 +367,7 @@ static int __devinit metronome_powerup_cmd(struct metronomefb_par *par)
        return par->board->met_wait_event(par);
 }
 
-static int __devinit metronome_config_cmd(struct metronomefb_par *par)
+static int metronome_config_cmd(struct metronomefb_par *par)
 {
        /* setup config command
        we can't immediately set the opcode since the controller
@@ -385,7 +385,7 @@ static int __devinit metronome_config_cmd(struct metronomefb_par *par)
        return par->board->met_wait_event(par);
 }
 
-static int __devinit metronome_init_cmd(struct metronomefb_par *par)
+static int metronome_init_cmd(struct metronomefb_par *par)
 {
        int i;
        u16 cs;
@@ -411,7 +411,7 @@ static int __devinit metronome_init_cmd(struct metronomefb_par *par)
        return par->board->met_wait_event(par);
 }
 
-static int __devinit metronome_init_regs(struct metronomefb_par *par)
+static int metronome_init_regs(struct metronomefb_par *par)
 {
        int res;
 
@@ -569,7 +569,7 @@ static struct fb_deferred_io metronomefb_defio = {
        .deferred_io    = metronomefb_dpy_deferred_io,
 };
 
-static int __devinit metronomefb_probe(struct platform_device *dev)
+static int metronomefb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct metronome_board *board;
@@ -741,7 +741,7 @@ err:
        return retval;
 }
 
-static int __devexit metronomefb_remove(struct platform_device *dev)
+static int metronomefb_remove(struct platform_device *dev)
 {
        struct fb_info *info = platform_get_drvdata(dev);
 
@@ -763,7 +763,7 @@ static int __devexit metronomefb_remove(struct platform_device *dev)
 
 static struct platform_driver metronomefb_driver = {
        .probe  = metronomefb_probe,
-       .remove = __devexit_p(metronomefb_remove),
+       .remove = metronomefb_remove,
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "metronomefb",
index 35ac9e8bee63f13a30133382dca3a8f43aa7a25d..e0f8011a3c4bd1b26a2fd80a1a782ecc62ea2cad 100644 (file)
@@ -417,7 +417,7 @@ static void mddi_resume(struct msm_mddi_client_data *cdata)
        mddi_set_auto_hibernate(&mddi->client_data, 1);
 }
 
-static int __devinit mddi_get_client_caps(struct mddi_info *mddi)
+static int mddi_get_client_caps(struct mddi_info *mddi)
 {
        int i, j;
 
@@ -619,9 +619,8 @@ uint32_t mddi_remote_read(struct msm_mddi_client_data *cdata, uint32_t reg)
 
 static struct mddi_info mddi_info[2];
 
-static int __devinit mddi_clk_setup(struct platform_device *pdev,
-                                   struct mddi_info *mddi,
-                                   unsigned long clk_rate)
+static int mddi_clk_setup(struct platform_device *pdev, struct mddi_info *mddi,
+                         unsigned long clk_rate)
 {
        int ret;
 
@@ -664,7 +663,7 @@ static int __init mddi_rev_data_setup(struct mddi_info *mddi)
        return 0;
 }
 
-static int __devinit mddi_probe(struct platform_device *pdev)
+static int mddi_probe(struct platform_device *pdev)
 {
        struct msm_mddi_platform_data *pdata = pdev->dev.platform_data;
        struct mddi_info *mddi = &mddi_info[pdev->id];
index 49619b4415000efc1ef87756d09667017a682244..755556ca5b2d988ec68b8cc3c1f9bbe7aadf6a34 100644 (file)
@@ -369,7 +369,8 @@ static void mxsfb_disable_controller(struct fb_info *fb_info)
                loop--;
        }
 
-       writel(VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4 + REG_CLR);
+       reg = readl(host->base + LCDC_VDCTRL4);
+       writel(reg & ~VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4);
 
        clk_disable_unprepare(host->clk);
 
@@ -586,7 +587,7 @@ static struct fb_ops mxsfb_ops = {
        .fb_imageblit = cfb_imageblit,
 };
 
-static int __devinit mxsfb_restore_mode(struct mxsfb_info *host)
+static int mxsfb_restore_mode(struct mxsfb_info *host)
 {
        struct fb_info *fb_info = &host->fb_info;
        unsigned line_count;
@@ -677,7 +678,7 @@ static int __devinit mxsfb_restore_mode(struct mxsfb_info *host)
        return 0;
 }
 
-static int __devinit mxsfb_init_fbinfo(struct mxsfb_info *host)
+static int mxsfb_init_fbinfo(struct mxsfb_info *host)
 {
        struct fb_info *fb_info = &host->fb_info;
        struct fb_var_screeninfo *var = &fb_info->var;
@@ -739,7 +740,7 @@ static int __devinit mxsfb_init_fbinfo(struct mxsfb_info *host)
        return 0;
 }
 
-static void __devexit mxsfb_free_videomem(struct mxsfb_info *host)
+static void mxsfb_free_videomem(struct mxsfb_info *host)
 {
        struct fb_info *fb_info = &host->fb_info;
 
@@ -772,7 +773,7 @@ static const struct of_device_id mxsfb_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, mxsfb_dt_ids);
 
-static int __devinit mxsfb_probe(struct platform_device *pdev)
+static int mxsfb_probe(struct platform_device *pdev)
 {
        const struct of_device_id *of_id =
                        of_match_device(mxsfb_dt_ids, &pdev->dev);
@@ -912,7 +913,7 @@ error_alloc_info:
        return ret;
 }
 
-static int __devexit mxsfb_remove(struct platform_device *pdev)
+static int mxsfb_remove(struct platform_device *pdev)
 {
        struct fb_info *fb_info = platform_get_drvdata(pdev);
        struct mxsfb_info *host = to_imxfb_host(fb_info);
@@ -949,7 +950,7 @@ static void mxsfb_shutdown(struct platform_device *pdev)
 
 static struct platform_driver mxsfb_driver = {
        .probe = mxsfb_probe,
-       .remove = __devexit_p(mxsfb_remove),
+       .remove = mxsfb_remove,
        .shutdown = mxsfb_shutdown,
        .id_table = mxsfb_devtype,
        .driver = {
index afc9521173effee7fbc5f5814194e25807e98db7..7ef079c146e7242c9edee33cc43bc0cd3c850ce1 100644 (file)
@@ -88,7 +88,7 @@ static bool external;
 static bool libretto;
 static bool nostretch;
 static bool nopciburst;
-static char *mode_option __devinitdata = NULL;
+static char *mode_option = NULL;
 
 #ifdef MODULE
 
@@ -1632,7 +1632,7 @@ static struct fb_ops neofb_ops = {
 
 /* --------------------------------------------------------------------- */
 
-static struct fb_videomode __devinitdata mode800x480 = {
+static struct fb_videomode mode800x480 = {
        .xres           = 800,
        .yres           = 480,
        .pixclock       = 25000,
@@ -1646,8 +1646,7 @@ static struct fb_videomode __devinitdata mode800x480 = {
        .vmode          = FB_VMODE_NONINTERLACED
 };
 
-static int __devinit neo_map_mmio(struct fb_info *info,
-                                 struct pci_dev *dev)
+static int neo_map_mmio(struct fb_info *info, struct pci_dev *dev)
 {
        struct neofb_par *par = info->par;
 
@@ -1707,8 +1706,8 @@ static void neo_unmap_mmio(struct fb_info *info)
                           info->fix.mmio_len);
 }
 
-static int __devinit neo_map_video(struct fb_info *info,
-                                  struct pci_dev *dev, int video_len)
+static int neo_map_video(struct fb_info *info, struct pci_dev *dev,
+                        int video_len)
 {
        //unsigned long addr;
 
@@ -1772,7 +1771,7 @@ static void neo_unmap_video(struct fb_info *info)
                           info->fix.smem_len);
 }
 
-static int __devinit neo_scan_monitor(struct fb_info *info)
+static int neo_scan_monitor(struct fb_info *info)
 {
        struct neofb_par *par = info->par;
        unsigned char type, display;
@@ -1851,7 +1850,7 @@ static int __devinit neo_scan_monitor(struct fb_info *info)
        return 0;
 }
 
-static int __devinit neo_init_hw(struct fb_info *info)
+static int neo_init_hw(struct fb_info *info)
 {
        struct neofb_par *par = info->par;
        int videoRam = 896;
@@ -1939,8 +1938,8 @@ static int __devinit neo_init_hw(struct fb_info *info)
 }
 
 
-static struct fb_info *__devinit neo_alloc_fb_info(struct pci_dev *dev, const struct
-                                                  pci_device_id *id)
+static struct fb_info *neo_alloc_fb_info(struct pci_dev *dev,
+                                        const struct pci_device_id *id)
 {
        struct fb_info *info;
        struct neofb_par *par;
@@ -2038,8 +2037,7 @@ static void neo_free_fb_info(struct fb_info *info)
 
 /* --------------------------------------------------------------------- */
 
-static int __devinit neofb_probe(struct pci_dev *dev,
-                                const struct pci_device_id *id)
+static int neofb_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct fb_info *info;
        u_int h_sync, v_sync;
@@ -2128,7 +2126,7 @@ err_map_mmio:
        return err;
 }
 
-static void __devexit neofb_remove(struct pci_dev *dev)
+static void neofb_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
 
@@ -2194,7 +2192,7 @@ static struct pci_driver neofb_driver = {
        .name =         "neofb",
        .id_table =     neofb_devices,
        .probe =        neofb_probe,
-       .remove =       __devexit_p(neofb_remove)
+       .remove =       neofb_remove,
 };
 
 /* ************************* init in-kernel code ************************** */
index 475dfee82c4a1207e7ce1107e6a94fd6b49f1a46..32581c72ad097f8eebb75a140b0389897708f284 100644 (file)
@@ -387,7 +387,7 @@ static int nuc900fb_init_registers(struct fb_info *info)
  *    The buffer should be a non-cached, non-buffered, memory region
  *    to allow palette and pixel writes without flushing the cache.
  */
-static int __devinit nuc900fb_map_video_memory(struct fb_info *info)
+static int nuc900fb_map_video_memory(struct fb_info *info)
 {
        struct nuc900fb_info *fbi = info->par;
        dma_addr_t map_dma;
@@ -499,7 +499,7 @@ static inline void nuc900fb_cpufreq_deregister(struct nuc900fb_info *info)
 
 static char driver_name[] = "nuc900fb";
 
-static int __devinit nuc900fb_probe(struct platform_device *pdev)
+static int nuc900fb_probe(struct platform_device *pdev)
 {
        struct nuc900fb_info *fbi;
        struct nuc900fb_display *display;
index fe13ac567d545b9408bc6e00bb108cf7b0c0d69f..ff228713425ebb31e079d9e9eeea5d581a8ba756 100644 (file)
@@ -70,34 +70,34 @@ static struct pci_device_id nvidiafb_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci, nvidiafb_pci_tbl);
 
 /* command line data, set in nvidiafb_setup() */
-static int flatpanel __devinitdata = -1;       /* Autodetect later */
-static int fpdither __devinitdata = -1;
-static int forceCRTC __devinitdata = -1;
-static int hwcur __devinitdata = 0;
-static int noaccel __devinitdata = 0;
-static int noscale __devinitdata = 0;
-static int paneltweak __devinitdata = 0;
-static int vram __devinitdata = 0;
-static int bpp __devinitdata = 8;
-static int reverse_i2c __devinitdata;
+static int flatpanel = -1;     /* Autodetect later */
+static int fpdither = -1;
+static int forceCRTC = -1;
+static int hwcur = 0;
+static int noaccel = 0;
+static int noscale = 0;
+static int paneltweak = 0;
+static int vram = 0;
+static int bpp = 8;
+static int reverse_i2c;
 #ifdef CONFIG_MTRR
-static bool nomtrr __devinitdata = false;
+static bool nomtrr = false;
 #endif
 #ifdef CONFIG_PMAC_BACKLIGHT
-static int backlight __devinitdata = 1;
+static int backlight = 1;
 #else
-static int backlight __devinitdata = 0;
+static int backlight = 0;
 #endif
 
-static char *mode_option __devinitdata = NULL;
+static char *mode_option = NULL;
 
-static struct fb_fix_screeninfo __devinitdata nvidiafb_fix = {
+static struct fb_fix_screeninfo nvidiafb_fix = {
        .type = FB_TYPE_PACKED_PIXELS,
        .xpanstep = 8,
        .ypanstep = 1,
 };
 
-static struct fb_var_screeninfo __devinitdata nvidiafb_default_var = {
+static struct fb_var_screeninfo nvidiafb_default_var = {
        .xres = 640,
        .yres = 480,
        .xres_virtual = 640,
@@ -1105,7 +1105,7 @@ fail:
 #define nvidiafb_resume NULL
 #endif
 
-static int __devinit nvidia_set_fbinfo(struct fb_info *info)
+static int nvidia_set_fbinfo(struct fb_info *info)
 {
        struct fb_monspecs *specs = &info->monspecs;
        struct fb_videomode modedb;
@@ -1201,7 +1201,7 @@ static int __devinit nvidia_set_fbinfo(struct fb_info *info)
        return nvidiafb_check_var(&info->var, info);
 }
 
-static u32 __devinit nvidia_get_chipset(struct fb_info *info)
+static u32 nvidia_get_chipset(struct fb_info *info)
 {
        struct nvidia_par *par = info->par;
        u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
@@ -1224,7 +1224,7 @@ static u32 __devinit nvidia_get_chipset(struct fb_info *info)
        return id;
 }
 
-static u32 __devinit nvidia_get_arch(struct fb_info *info)
+static u32 nvidia_get_arch(struct fb_info *info)
 {
        struct nvidia_par *par = info->par;
        u32 arch = 0;
@@ -1276,8 +1276,7 @@ static u32 __devinit nvidia_get_arch(struct fb_info *info)
        return arch;
 }
 
-static int __devinit nvidiafb_probe(struct pci_dev *pd,
-                                   const struct pci_device_id *ent)
+static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 {
        struct nvidia_par *par;
        struct fb_info *info;
@@ -1438,7 +1437,7 @@ err_out:
        return -ENODEV;
 }
 
-static void __devexit nvidiafb_remove(struct pci_dev *pd)
+static void nvidiafb_remove(struct pci_dev *pd)
 {
        struct fb_info *info = pci_get_drvdata(pd);
        struct nvidia_par *par = info->par;
@@ -1473,7 +1472,7 @@ static void __devexit nvidiafb_remove(struct pci_dev *pd)
  * ------------------------------------------------------------------------- */
 
 #ifndef MODULE
-static int __devinit nvidiafb_setup(char *options)
+static int nvidiafb_setup(char *options)
 {
        char *this_opt;
 
@@ -1529,7 +1528,7 @@ static struct pci_driver nvidiafb_driver = {
        .probe    = nvidiafb_probe,
        .suspend  = nvidiafb_suspend,
        .resume   = nvidiafb_resume,
-       .remove   = __devexit_p(nvidiafb_remove),
+       .remove   = nvidiafb_remove,
 };
 
 /* ------------------------------------------------------------------------- *
@@ -1538,7 +1537,7 @@ static struct pci_driver nvidiafb_driver = {
  *
  * ------------------------------------------------------------------------- */
 
-static int __devinit nvidiafb_init(void)
+static int nvidiafb_init(void)
 {
 #ifndef MODULE
        char *option = NULL;
index b739600c51ac3aff71fab4ee197660f59b47c33f..803fee618d57dbf31db2138b0ea6fd6ca346e084 100644 (file)
@@ -606,7 +606,7 @@ static struct spi_driver mipid_spi_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = mipid_spi_probe,
-       .remove = __devexit_p(mipid_spi_remove),
+       .remove = mipid_spi_remove,
 };
 
 module_spi_driver(mipid_spi_driver);
index 65eb76c840a113765ba6afdae85428c2f24e478f..72699f88c00215bc41f5f775f17caf8399dc1e23 100644 (file)
@@ -777,7 +777,7 @@ static struct spi_driver acx565akm_spi_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = acx565akm_spi_probe,
-       .remove = __devexit_p(acx565akm_spi_remove),
+       .remove = acx565akm_spi_remove,
 };
 
 module_spi_driver(acx565akm_spi_driver);
index ace419b801eb6c302fadb26757ffcde8f78fba09..6e5abe8fd2ddbe9f94dcd384c9235c56de1dd3d6 100644 (file)
@@ -216,13 +216,13 @@ static void init_lb035q02_panel(struct spi_device *spi)
        lb035q02_write_reg(spi, 0x3b, 0x0806);
 }
 
-static int __devinit lb035q02_panel_spi_probe(struct spi_device *spi)
+static int lb035q02_panel_spi_probe(struct spi_device *spi)
 {
        init_lb035q02_panel(spi);
        return omap_dss_register_driver(&lb035q02_driver);
 }
 
-static int __devexit lb035q02_panel_spi_remove(struct spi_device *spi)
+static int lb035q02_panel_spi_remove(struct spi_device *spi)
 {
        omap_dss_unregister_driver(&lb035q02_driver);
        return 0;
@@ -234,7 +234,7 @@ static struct spi_driver lb035q02_spi_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = lb035q02_panel_spi_probe,
-       .remove         = __devexit_p(lb035q02_panel_spi_remove),
+       .remove         = lb035q02_panel_spi_remove,
 };
 
 module_spi_driver(lb035q02_spi_driver);
index d1cb722fcdbcea123247b6530d296d5539e3cc9e..dd129475080297de33f239dfc903bb990fd373c5 100644 (file)
@@ -680,7 +680,7 @@ static struct spi_driver mipid_spi_driver = {
                .owner  = THIS_MODULE,
        },
        .probe  = mipid_spi_probe,
-       .remove = __devexit_p(mipid_spi_remove),
+       .remove = mipid_spi_remove,
 };
 module_spi_driver(mipid_spi_driver);
 
index 2a79c283bebe471b3b9410b2649857b6ec2fe0d0..c4e9c2b1b465c135e6ddb2c33d01161e41f737a8 100644 (file)
@@ -323,7 +323,7 @@ static int nec_8048_spi_resume(struct spi_device *spi)
 
 static struct spi_driver nec_8048_spi_driver = {
        .probe          = nec_8048_spi_probe,
-       .remove         = __devexit_p(nec_8048_spi_remove),
+       .remove         = nec_8048_spi_remove,
        .suspend        = nec_8048_spi_suspend,
        .resume         = nec_8048_spi_resume,
        .driver         = {
index 316b3da6d2cb99e356332b3ef218cf3f822c7ab0..6b6643911d296c707e7eaa29c30412081378cc5f 100644 (file)
@@ -528,7 +528,7 @@ static int tpo_td043_spi_probe(struct spi_device *spi)
        return 0;
 }
 
-static int __devexit tpo_td043_spi_remove(struct spi_device *spi)
+static int tpo_td043_spi_remove(struct spi_device *spi)
 {
        struct tpo_td043_device *tpo_td043 = dev_get_drvdata(&spi->dev);
 
@@ -580,7 +580,7 @@ static struct spi_driver tpo_td043_spi_driver = {
                .pm     = &tpo_td043_spi_pm,
        },
        .probe  = tpo_td043_spi_probe,
-       .remove = __devexit_p(tpo_td043_spi_remove),
+       .remove = tpo_td043_spi_remove,
 };
 
 module_spi_driver(tpo_td043_spi_driver);
index d57cc58c5168c8948b6c62d01800fa40503f6638..4b23af6e5c2890b41f47fd38a9e88ce2de3ebc9c 100644 (file)
@@ -249,7 +249,7 @@ static void p9100_init_fix(struct fb_info *info, int linebytes, struct device_no
        info->fix.accel = FB_ACCEL_SUN_CGTHREE;
 }
 
-static int __devinit p9100_probe(struct platform_device *op)
+static int p9100_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct fb_info *info;
@@ -326,7 +326,7 @@ out_err:
        return err;
 }
 
-static int __devexit p9100_remove(struct platform_device *op)
+static int p9100_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct p9100_par *par = info->par;
@@ -359,7 +359,7 @@ static struct platform_driver p9100_driver = {
                .of_match_table = p9100_match,
        },
        .probe          = p9100_probe,
-       .remove         = __devexit_p(p9100_remove),
+       .remove         = p9100_remove,
 };
 
 static int __init p9100_init(void)
index ae3caa6755c2f63adf6144bec61c121854cebbb9..3d86bac62d3e62214564bf1f336488d6ee819eeb 100644 (file)
@@ -313,7 +313,8 @@ static void platinum_set_hardware(struct fb_info_platinum *pinfo)
 /*
  * Set misc info vars for this driver
  */
-static void __devinit platinum_init_info(struct fb_info *info, struct fb_info_platinum *pinfo)
+static void platinum_init_info(struct fb_info *info,
+                              struct fb_info_platinum *pinfo)
 {
        /* Fill fb_info */
        info->fbops = &platinumfb_ops;
@@ -338,7 +339,7 @@ static void __devinit platinum_init_info(struct fb_info *info, struct fb_info_pl
 }
 
 
-static int __devinit platinum_init_fb(struct fb_info *info)
+static int platinum_init_fb(struct fb_info *info)
 {
        struct fb_info_platinum *pinfo = info->par;
        struct fb_var_screeninfo var;
@@ -533,7 +534,7 @@ static int __init platinumfb_setup(char *options)
 #define invalidate_cache(addr)
 #endif
 
-static int __devinit platinumfb_probe(struct platform_device* odev)
+static int platinumfb_probe(struct platform_device* odev)
 {
        struct device_node      *dp = odev->dev.of_node;
        struct fb_info          *info;
@@ -645,7 +646,7 @@ static int __devinit platinumfb_probe(struct platform_device* odev)
        return rc;
 }
 
-static int __devexit platinumfb_remove(struct platform_device* odev)
+static int platinumfb_remove(struct platform_device* odev)
 {
        struct fb_info          *info = dev_get_drvdata(&odev->dev);
        struct fb_info_platinum *pinfo = info->par;
@@ -683,7 +684,7 @@ static struct platform_driver platinum_driver =
                .of_match_table = platinumfb_match,
        },
        .probe          = platinumfb_probe,
-       .remove         = __devexit_p(platinumfb_remove),
+       .remove         = platinumfb_remove,
 };
 
 static int __init platinumfb_init(void)
index df31a24a5026e9af75a56c0e3b66ad8718a27703..81354eeab0214e106ae89e1e5ad321afbbf000ce 100644 (file)
@@ -67,7 +67,7 @@
  * Driver data
  */
 static int hwcursor = 1;
-static char *mode_option __devinitdata;
+static char *mode_option;
 
 /*
  * The XFree GLINT driver will (I think to implement hardware cursor
@@ -80,10 +80,10 @@ static char *mode_option __devinitdata;
  */
 static bool lowhsync;
 static bool lowvsync;
-static bool noaccel __devinitdata;
+static bool noaccel;
 /* mtrr option */
 #ifdef CONFIG_MTRR
-static bool nomtrr __devinitdata;
+static bool nomtrr;
 #endif
 
 /*
@@ -107,7 +107,7 @@ struct pm2fb_par
  * Here we define the default structs fb_fix_screeninfo and fb_var_screeninfo
  * if we don't use modedb.
  */
-static struct fb_fix_screeninfo pm2fb_fix __devinitdata = {
+static struct fb_fix_screeninfo pm2fb_fix = {
        .id =           "",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_PSEUDOCOLOR,
@@ -120,7 +120,7 @@ static struct fb_fix_screeninfo pm2fb_fix __devinitdata = {
 /*
  * Default video mode. In case the modedb doesn't work.
  */
-static struct fb_var_screeninfo pm2fb_var __devinitdata = {
+static struct fb_var_screeninfo pm2fb_var = {
        /* "640x480, 8 bpp @ 60 Hz */
        .xres =                 640,
        .yres =                 480,
@@ -1515,8 +1515,7 @@ static struct fb_ops pm2fb_ops = {
  * @param      pdev    PCI device.
  * @param      id      PCI device ID.
  */
-static int __devinit pm2fb_probe(struct pci_dev *pdev,
-                                const struct pci_device_id *id)
+static int pm2fb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct pm2fb_par *default_par;
        struct fb_info *info;
@@ -1727,7 +1726,7 @@ static int __devinit pm2fb_probe(struct pci_dev *pdev,
  *
  * @param      pdev    PCI device to clean up.
  */
-static void __devexit pm2fb_remove(struct pci_dev *pdev)
+static void pm2fb_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct fb_fix_screeninfo *fix = &info->fix;
@@ -1765,7 +1764,7 @@ static struct pci_driver pm2fb_driver = {
        .name           = "pm2fb",
        .id_table       = pm2fb_id_table,
        .probe          = pm2fb_probe,
-       .remove         = __devexit_p(pm2fb_remove),
+       .remove         = pm2fb_remove,
 };
 
 MODULE_DEVICE_TABLE(pci, pm2fb_id_table);
index 055e527a8e4510383f6ebb7f0d4bd4838f3bcfce..7718faa4a73b751d37525d5e775f21e32d4dca64 100644 (file)
  * Driver data
  */
 static int hwcursor = 1;
-static char *mode_option __devinitdata;
-static bool noaccel __devinitdata;
+static char *mode_option;
+static bool noaccel;
 
 /* mtrr option */
 #ifdef CONFIG_MTRR
-static bool nomtrr __devinitdata;
+static bool nomtrr;
 #endif
 
 /*
@@ -84,7 +84,7 @@ struct pm3_par {
  * if we don't use modedb. If we do use modedb see pm3fb_init how to use it
  * to get a fb_var_screeninfo. Otherwise define a default var as well.
  */
-static struct fb_fix_screeninfo pm3fb_fix __devinitdata = {
+static struct fb_fix_screeninfo pm3fb_fix = {
        .id =           "Permedia3",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_PSEUDOCOLOR,
@@ -1229,7 +1229,7 @@ static struct fb_ops pm3fb_ops = {
 
 /* mmio register are already mapped when this function is called */
 /* the pm3fb_fix.smem_start is also set */
-static unsigned long __devinit pm3fb_size_memory(struct pm3_par *par)
+static unsigned long pm3fb_size_memory(struct pm3_par *par)
 {
        unsigned long   memsize = 0;
        unsigned long   tempBypass, i, temp1, temp2;
@@ -1314,8 +1314,7 @@ static unsigned long __devinit pm3fb_size_memory(struct pm3_par *par)
        return memsize;
 }
 
-static int __devinit pm3fb_probe(struct pci_dev *dev,
-                                 const struct pci_device_id *ent)
+static int pm3fb_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 {
        struct fb_info *info;
        struct pm3_par *par;
@@ -1469,7 +1468,7 @@ static int __devinit pm3fb_probe(struct pci_dev *dev,
        /*
         *  Cleanup
         */
-static void __devexit pm3fb_remove(struct pci_dev *dev)
+static void pm3fb_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
 
@@ -1507,7 +1506,7 @@ static struct pci_driver pm3fb_driver = {
        .name =         "pm3fb",
        .id_table =     pm3fb_id_table,
        .probe =        pm3fb_probe,
-       .remove =       __devexit_p(pm3fb_remove),
+       .remove =       pm3fb_remove,
 };
 
 MODULE_DEVICE_TABLE(pci, pm3fb_id_table);
index 9b4a60b52a4ca9cf403f22a172e2bc5e3a93c270..d1e46cedb1f721b7219ca0cbe37014c0e6296092 100644 (file)
@@ -43,7 +43,7 @@ struct pmagbafb_par {
 };
 
 
-static struct fb_var_screeninfo pmagbafb_defined __devinitdata = {
+static struct fb_var_screeninfo pmagbafb_defined = {
        .xres           = 1024,
        .yres           = 864,
        .xres_virtual   = 1024,
@@ -67,7 +67,7 @@ static struct fb_var_screeninfo pmagbafb_defined __devinitdata = {
        .vmode          = FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_fix_screeninfo pmagbafb_fix __devinitdata = {
+static struct fb_fix_screeninfo pmagbafb_fix = {
        .id             = "PMAG-BA",
        .smem_len       = (1024 * 1024),
        .type           = FB_TYPE_PACKED_PIXELS,
@@ -141,7 +141,7 @@ static void __init pmagbafb_erase_cursor(struct fb_info *info)
 }
 
 
-static int __devinit pmagbafb_probe(struct device *dev)
+static int pmagbafb_probe(struct device *dev)
 {
        struct tc_dev *tdev = to_tc_dev(dev);
        resource_size_t start, len;
index 4e7a9c46e1122a460957e0a3c22f6cf04b9d8961..0e1317400328c6860b542a763e282ef21572b62b 100644 (file)
@@ -44,7 +44,7 @@ struct pmagbbfb_par {
 };
 
 
-static struct fb_var_screeninfo pmagbbfb_defined __devinitdata = {
+static struct fb_var_screeninfo pmagbbfb_defined = {
        .bits_per_pixel = 8,
        .red.length     = 8,
        .green.length   = 8,
@@ -57,7 +57,7 @@ static struct fb_var_screeninfo pmagbbfb_defined __devinitdata = {
        .vmode          = FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_fix_screeninfo pmagbbfb_fix __devinitdata = {
+static struct fb_fix_screeninfo pmagbbfb_fix = {
        .id             = "PMAGB-BA",
        .smem_len       = (2048 * 1024),
        .type           = FB_TYPE_PACKED_PIXELS,
@@ -147,7 +147,7 @@ static void __init pmagbbfb_erase_cursor(struct fb_info *info)
 /*
  * Set up screen parameters.
  */
-static void __devinit pmagbbfb_screen_setup(struct fb_info *info)
+static void pmagbbfb_screen_setup(struct fb_info *info)
 {
        struct pmagbbfb_par *par = info->par;
 
@@ -179,9 +179,9 @@ static void __devinit pmagbbfb_screen_setup(struct fb_info *info)
 /*
  * Determine oscillator configuration.
  */
-static void __devinit pmagbbfb_osc_setup(struct fb_info *info)
+static void pmagbbfb_osc_setup(struct fb_info *info)
 {
-       static unsigned int pmagbbfb_freqs[] __devinitdata = {
+       static unsigned int pmagbbfb_freqs[] = {
                130808, 119843, 104000, 92980, 74370, 72800,
                69197, 66000, 65000, 50350, 36000, 32000, 25175
        };
@@ -246,7 +246,7 @@ static void __devinit pmagbbfb_osc_setup(struct fb_info *info)
 };
 
 
-static int __devinit pmagbbfb_probe(struct device *dev)
+static int pmagbbfb_probe(struct device *dev)
 {
        struct tc_dev *tdev = to_tc_dev(dev);
        resource_size_t start, len;
index 0b340d6ff8a4cab05eb4843f5d5ecff38700fbf9..920c27bf3947edeb05540bcce3ac11b8c2bddbf4 100644 (file)
@@ -259,7 +259,7 @@ static const struct fb_videomode ps3fb_modedb[] = {
 static int ps3fb_mode;
 module_param(ps3fb_mode, int, 0);
 
-static char *mode_option __devinitdata;
+static char *mode_option;
 
 static int ps3fb_cmp_mode(const struct fb_videomode *vmode,
                          const struct fb_var_screeninfo *var)
@@ -965,7 +965,7 @@ static struct fb_fix_screeninfo ps3fb_fix __initdata = {
        .accel =        FB_ACCEL_NONE,
 };
 
-static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
+static int ps3fb_probe(struct ps3_system_bus_device *dev)
 {
        struct fb_info *info;
        struct ps3fb_par *par;
index bcd44c32a2ed501474925b9c373af1cb9b50aee4..df07860563e63df4f24a82c2dea8ddc773b603d3 100644 (file)
@@ -112,11 +112,11 @@ enum { VO_PAL, VO_NTSC, VO_VGA };
 enum { PAL_ARGB1555, PAL_RGB565, PAL_ARGB4444, PAL_ARGB8888 };
 
 struct pvr2_params { unsigned int val; char *name; };
-static struct pvr2_params cables[] __devinitdata = {
+static struct pvr2_params cables[] = {
        { CT_VGA, "VGA" }, { CT_RGB, "RGB" }, { CT_COMPOSITE, "COMPOSITE" },
 };
 
-static struct pvr2_params outputs[] __devinitdata = {
+static struct pvr2_params outputs[] = {
        { VO_PAL, "PAL" }, { VO_NTSC, "NTSC" }, { VO_VGA, "VGA" },
 };
 
@@ -145,7 +145,7 @@ static struct pvr2fb_par {
 
 static struct fb_info *fb_info;
 
-static struct fb_fix_screeninfo pvr2_fix __devinitdata = {
+static struct fb_fix_screeninfo pvr2_fix = {
        .id =           "NEC PowerVR2",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_TRUECOLOR,
@@ -154,7 +154,7 @@ static struct fb_fix_screeninfo pvr2_fix __devinitdata = {
        .accel =        FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo pvr2_var __devinitdata = {
+static struct fb_var_screeninfo pvr2_var = {
        .xres =         640,
        .yres =         480,
        .xres_virtual = 640,
@@ -226,7 +226,7 @@ static struct fb_ops pvr2fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static struct fb_videomode pvr2_modedb[] __devinitdata = {
+static struct fb_videomode pvr2_modedb[] = {
     /*
      * Broadcast video modes (PAL and NTSC).  I'm unfamiliar with
      * PAL-M and PAL-N, but from what I've read both modes parallel PAL and
@@ -256,7 +256,7 @@ static struct fb_videomode pvr2_modedb[] __devinitdata = {
 #define DEFMODE_VGA    2
 
 static int defmode = DEFMODE_NTSC;
-static char *mode_option __devinitdata = NULL;
+static char *mode_option = NULL;
 
 static inline void pvr2fb_set_pal_type(unsigned int type)
 {
@@ -763,7 +763,7 @@ out_unmap:
  * in for flexibility anyways. Who knows, maybe someone has tv-out on a
  * PCI-based version of these things ;-)
  */
-static int __devinit pvr2fb_common_init(void)
+static int pvr2fb_common_init(void)
 {
        struct pvr2fb_par *par = currentpar;
        unsigned long modememused, rev;
@@ -922,8 +922,8 @@ static void __exit pvr2fb_dc_exit(void)
 #endif /* CONFIG_SH_DREAMCAST */
 
 #ifdef CONFIG_PCI
-static int __devinit pvr2fb_pci_probe(struct pci_dev *pdev,
-                                     const struct pci_device_id *ent)
+static int pvr2fb_pci_probe(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        int ret;
 
@@ -953,7 +953,7 @@ static int __devinit pvr2fb_pci_probe(struct pci_dev *pdev,
        return pvr2fb_common_init();
 }
 
-static void __devexit pvr2fb_pci_remove(struct pci_dev *pdev)
+static void pvr2fb_pci_remove(struct pci_dev *pdev)
 {
        if (fb_info->screen_base) {
                iounmap(fb_info->screen_base);
@@ -967,7 +967,7 @@ static void __devexit pvr2fb_pci_remove(struct pci_dev *pdev)
        pci_release_regions(pdev);
 }
 
-static struct pci_device_id pvr2fb_pci_tbl[] __devinitdata = {
+static struct pci_device_id pvr2fb_pci_tbl[] = {
        { PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_NEON250,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
        { 0, },
@@ -979,7 +979,7 @@ static struct pci_driver pvr2fb_pci_driver = {
        .name           = "pvr2fb",
        .id_table       = pvr2fb_pci_tbl,
        .probe          = pvr2fb_pci_probe,
-       .remove         = __devexit_p(pvr2fb_pci_remove),
+       .remove         = pvr2fb_pci_remove,
 };
 
 static int __init pvr2fb_pci_init(void)
@@ -993,8 +993,8 @@ static void __exit pvr2fb_pci_exit(void)
 }
 #endif /* CONFIG_PCI */
 
-static int __devinit pvr2_get_param(const struct pvr2_params *p, const char *s,
-                                   int val, int size)
+static int pvr2_get_param(const struct pvr2_params *p, const char *s, int val,
+                         int size)
 {
        int i;
 
index f146089261f4df312a00464d1f5fc50a890dc939..aa9bd1f76d60641d4a242829dc5ed89b4e393976 100644 (file)
@@ -560,7 +560,7 @@ static struct fb_ops pxa168fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __devinit pxa168fb_init_mode(struct fb_info *info,
+static int pxa168fb_init_mode(struct fb_info *info,
                              struct pxa168fb_mach_info *mi)
 {
        struct pxa168fb_info *fbi = info->par;
@@ -600,7 +600,7 @@ static int __devinit pxa168fb_init_mode(struct fb_info *info,
        return ret;
 }
 
-static int __devinit pxa168fb_probe(struct platform_device *pdev)
+static int pxa168fb_probe(struct platform_device *pdev)
 {
        struct pxa168fb_mach_info *mi;
        struct fb_info *info = 0;
@@ -783,7 +783,7 @@ failed_put_clk:
        return ret;
 }
 
-static int __devexit pxa168fb_remove(struct platform_device *pdev)
+static int pxa168fb_remove(struct platform_device *pdev)
 {
        struct pxa168fb_info *fbi = platform_get_drvdata(pdev);
        struct fb_info *info;
@@ -826,7 +826,7 @@ static struct platform_driver pxa168fb_driver = {
                .owner  = THIS_MODULE,
        },
        .probe          = pxa168fb_probe,
-       .remove         = __devexit_p(pxa168fb_remove),
+       .remove         = pxa168fb_remove,
 };
 
 module_platform_driver(pxa168fb_driver);
index 0b4ae0cebedaf7c0a6b9c8f3d262d7917ecf8911..6c984eacc7e350bf87a8a6078cb7f4fadc845d8c 100644 (file)
@@ -574,8 +574,7 @@ free_buffers(struct platform_device *dev,
        priv->free = NULL;
 }
 
-static int __devinit
-pxa3xx_gcu_probe(struct platform_device *dev)
+static int pxa3xx_gcu_probe(struct platform_device *dev)
 {
        int i, ret, irq;
        struct resource *r;
@@ -714,8 +713,7 @@ err_free_priv:
        return ret;
 }
 
-static int __devexit
-pxa3xx_gcu_remove(struct platform_device *dev)
+static int pxa3xx_gcu_remove(struct platform_device *dev)
 {
        struct pxa3xx_gcu_priv *priv = platform_get_drvdata(dev);
        struct resource *r = priv->resource_mem;
@@ -737,7 +735,7 @@ pxa3xx_gcu_remove(struct platform_device *dev)
 
 static struct platform_driver pxa3xx_gcu_driver = {
        .probe    = pxa3xx_gcu_probe,
-       .remove  = __devexit_p(pxa3xx_gcu_remove),
+       .remove  = pxa3xx_gcu_remove,
        .driver  = {
                .owner  = THIS_MODULE,
                .name   = DRV_NAME,
index 4fa2ad43fd97ae28f1cf98ebe1a4fea76904d220..580f80cc586fc7a0030cbe2f8ce57b8df4896727 100644 (file)
@@ -869,8 +869,8 @@ static struct fb_ops overlay_fb_ops = {
        .fb_set_par             = overlayfb_set_par,
 };
 
-static void __devinit init_pxafb_overlay(struct pxafb_info *fbi,
-                                        struct pxafb_layer *ofb, int id)
+static void init_pxafb_overlay(struct pxafb_info *fbi, struct pxafb_layer *ofb,
+                              int id)
 {
        sprintf(ofb->fb.fix.id, "overlay%d", id + 1);
 
@@ -903,8 +903,8 @@ static inline int pxafb_overlay_supported(void)
        return 0;
 }
 
-static int __devinit pxafb_overlay_map_video_memory(struct pxafb_info *pxafb,
-       struct pxafb_layer *ofb)
+static int pxafb_overlay_map_video_memory(struct pxafb_info *pxafb,
+                                         struct pxafb_layer *ofb)
 {
        /* We assume that user will use at most video_mem_size for overlay fb,
         * anyway, it's useless to use 16bpp main plane and 24bpp overlay
@@ -927,7 +927,7 @@ static int __devinit pxafb_overlay_map_video_memory(struct pxafb_info *pxafb,
        return 0;
 }
 
-static void __devinit pxafb_overlay_init(struct pxafb_info *fbi)
+static void pxafb_overlay_init(struct pxafb_info *fbi)
 {
        int i, ret;
 
@@ -959,7 +959,7 @@ static void __devinit pxafb_overlay_init(struct pxafb_info *fbi)
        pr_info("PXA Overlay driver loaded successfully!\n");
 }
 
-static void __devexit pxafb_overlay_exit(struct pxafb_info *fbi)
+static void pxafb_overlay_exit(struct pxafb_info *fbi)
 {
        int i;
 
@@ -1706,7 +1706,7 @@ static const struct dev_pm_ops pxafb_pm_ops = {
 };
 #endif
 
-static int __devinit pxafb_init_video_memory(struct pxafb_info *fbi)
+static int pxafb_init_video_memory(struct pxafb_info *fbi)
 {
        int size = PAGE_ALIGN(fbi->video_mem_size);
 
@@ -1789,7 +1789,7 @@ decode_mode:
                fbi->video_mem_size = video_mem_size;
 }
 
-static struct pxafb_info * __devinit pxafb_init_fbinfo(struct device *dev)
+static struct pxafb_info *pxafb_init_fbinfo(struct device *dev)
 {
        struct pxafb_info *fbi;
        void *addr;
@@ -1853,7 +1853,7 @@ static struct pxafb_info * __devinit pxafb_init_fbinfo(struct device *dev)
 }
 
 #ifdef CONFIG_FB_PXA_PARAMETERS
-static int __devinit parse_opt_mode(struct device *dev, const char *this_opt)
+static int parse_opt_mode(struct device *dev, const char *this_opt)
 {
        struct pxafb_mach_info *inf = dev->platform_data;
 
@@ -1912,7 +1912,7 @@ done:
        return 0;
 }
 
-static int __devinit parse_opt(struct device *dev, char *this_opt)
+static int parse_opt(struct device *dev, char *this_opt)
 {
        struct pxafb_mach_info *inf = dev->platform_data;
        struct pxafb_mode_info *mode = &inf->modes[0];
@@ -2012,7 +2012,7 @@ static int __devinit parse_opt(struct device *dev, char *this_opt)
        return 0;
 }
 
-static int __devinit pxafb_parse_options(struct device *dev, char *options)
+static int pxafb_parse_options(struct device *dev, char *options)
 {
        char *this_opt;
        int ret;
@@ -2031,7 +2031,7 @@ static int __devinit pxafb_parse_options(struct device *dev, char *options)
        return 0;
 }
 
-static char g_options[256] __devinitdata = "";
+static char g_options[256] = "";
 
 #ifndef MODULE
 static int __init pxafb_setup_options(void)
@@ -2061,8 +2061,7 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)");
 #ifdef DEBUG_VAR
 /* Check for various illegal bit-combinations. Currently only
  * a warning is given. */
-static void __devinit pxafb_check_options(struct device *dev,
-                                         struct pxafb_mach_info *inf)
+static void pxafb_check_options(struct device *dev, struct pxafb_mach_info *inf)
 {
        if (inf->lcd_conn)
                return;
@@ -2094,7 +2093,7 @@ static void __devinit pxafb_check_options(struct device *dev,
 #define pxafb_check_options(...)       do {} while (0)
 #endif
 
-static int __devinit pxafb_probe(struct platform_device *dev)
+static int pxafb_probe(struct platform_device *dev)
 {
        struct pxafb_info *fbi;
        struct pxafb_mach_info *inf;
@@ -2263,7 +2262,7 @@ failed:
        return ret;
 }
 
-static int __devexit pxafb_remove(struct platform_device *dev)
+static int pxafb_remove(struct platform_device *dev)
 {
        struct pxafb_info *fbi = platform_get_drvdata(dev);
        struct resource *r;
@@ -2304,7 +2303,7 @@ static int __devexit pxafb_remove(struct platform_device *dev)
 
 static struct platform_driver pxafb_driver = {
        .probe          = pxafb_probe,
-       .remove         = __devexit_p(pxafb_remove),
+       .remove         = pxafb_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "pxa2xx-fb",
index a104e8cd2f54872cc4cb48f6d9f52acf26f08402..d44c7351de0f6dc0e2350cd1cd9ab67fa1457f3e 100644 (file)
@@ -27,7 +27,7 @@
 
 #define Q40_PHYS_SCREEN_ADDR 0xFE800000
 
-static struct fb_fix_screeninfo q40fb_fix __devinitdata = {
+static struct fb_fix_screeninfo q40fb_fix = {
        .id             = "Q40",
        .smem_len       = 1024*1024,
        .type           = FB_TYPE_PACKED_PIXELS,
@@ -36,7 +36,7 @@ static struct fb_fix_screeninfo q40fb_fix __devinitdata = {
        .accel          = FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo q40fb_var __devinitdata = {
+static struct fb_var_screeninfo q40fb_var = {
        .xres           = 1024,
        .yres           = 512,
        .xres_virtual   = 1024,
@@ -83,7 +83,7 @@ static struct fb_ops q40fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __devinit q40fb_probe(struct platform_device *dev)
+static int q40fb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
 
index 90df1a60bd16a5e338fddd3cc81772e2b97bd8b6..9536715b5a1b90f1828451300016e45b90ecb1a9 100644 (file)
@@ -205,28 +205,28 @@ MODULE_DEVICE_TABLE(pci, rivafb_pci_tbl);
  * ------------------------------------------------------------------------- */
 
 /* command line data, set in rivafb_setup() */
-static int flatpanel __devinitdata = -1; /* Autodetect later */
-static int forceCRTC __devinitdata = -1;
-static bool noaccel  __devinitdata = 0;
+static int flatpanel = -1; /* Autodetect later */
+static int forceCRTC = -1;
+static bool noaccel  = 0;
 #ifdef CONFIG_MTRR
-static bool nomtrr __devinitdata = 0;
+static bool nomtrr = 0;
 #endif
 #ifdef CONFIG_PMAC_BACKLIGHT
-static int backlight __devinitdata = 1;
+static int backlight = 1;
 #else
-static int backlight __devinitdata = 0;
+static int backlight = 0;
 #endif
 
-static char *mode_option __devinitdata = NULL;
+static char *mode_option = NULL;
 static bool strictmode       = 0;
 
-static struct fb_fix_screeninfo __devinitdata rivafb_fix = {
+static struct fb_fix_screeninfo rivafb_fix = {
        .type           = FB_TYPE_PACKED_PIXELS,
        .xpanstep       = 1,
        .ypanstep       = 1,
 };
 
-static struct fb_var_screeninfo __devinitdata rivafb_default_var = {
+static struct fb_var_screeninfo rivafb_default_var = {
        .xres           = 640,
        .yres           = 480,
        .xres_virtual   = 640,
@@ -1709,7 +1709,7 @@ static struct fb_ops riva_fb_ops = {
        .fb_sync        = rivafb_sync,
 };
 
-static int __devinit riva_set_fbinfo(struct fb_info *info)
+static int riva_set_fbinfo(struct fb_info *info)
 {
        unsigned int cmap_len;
        struct riva_par *par = info->par;
@@ -1747,7 +1747,7 @@ static int __devinit riva_set_fbinfo(struct fb_info *info)
 }
 
 #ifdef CONFIG_PPC_OF
-static int __devinit riva_get_EDID_OF(struct fb_info *info, struct pci_dev *pd)
+static int riva_get_EDID_OF(struct fb_info *info, struct pci_dev *pd)
 {
        struct riva_par *par = info->par;
        struct device_node *dp;
@@ -1780,7 +1780,7 @@ static int __devinit riva_get_EDID_OF(struct fb_info *info, struct pci_dev *pd)
 #endif /* CONFIG_PPC_OF */
 
 #if defined(CONFIG_FB_RIVA_I2C) && !defined(CONFIG_PPC_OF)
-static int __devinit riva_get_EDID_i2c(struct fb_info *info)
+static int riva_get_EDID_i2c(struct fb_info *info)
 {
        struct riva_par *par = info->par;
        struct fb_var_screeninfo var;
@@ -1803,8 +1803,8 @@ static int __devinit riva_get_EDID_i2c(struct fb_info *info)
 }
 #endif /* CONFIG_FB_RIVA_I2C */
 
-static void __devinit riva_update_default_var(struct fb_var_screeninfo *var,
-                                             struct fb_info *info)
+static void riva_update_default_var(struct fb_var_screeninfo *var,
+                                   struct fb_info *info)
 {
        struct fb_monspecs *specs = &info->monspecs;
        struct fb_videomode modedb;
@@ -1836,7 +1836,7 @@ static void __devinit riva_update_default_var(struct fb_var_screeninfo *var,
 }
 
 
-static void __devinit riva_get_EDID(struct fb_info *info, struct pci_dev *pdev)
+static void riva_get_EDID(struct fb_info *info, struct pci_dev *pdev)
 {
        NVTRACE_ENTER();
 #ifdef CONFIG_PPC_OF
@@ -1850,7 +1850,7 @@ static void __devinit riva_get_EDID(struct fb_info *info, struct pci_dev *pdev)
 }
 
 
-static void __devinit riva_get_edidinfo(struct fb_info *info)
+static void riva_get_edidinfo(struct fb_info *info)
 {
        struct fb_var_screeninfo *var = &rivafb_default_var;
        struct riva_par *par = info->par;
@@ -1871,7 +1871,7 @@ static void __devinit riva_get_edidinfo(struct fb_info *info)
  *
  * ------------------------------------------------------------------------- */
 
-static u32 __devinit riva_get_arch(struct pci_dev *pd)
+static u32 riva_get_arch(struct pci_dev *pd)
 {
        u32 arch = 0;
 
@@ -1909,8 +1909,7 @@ static u32 __devinit riva_get_arch(struct pci_dev *pd)
        return arch;
 }
 
-static int __devinit rivafb_probe(struct pci_dev *pd,
-                               const struct pci_device_id *ent)
+static int rivafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 {
        struct riva_par *default_par;
        struct fb_info *info;
@@ -2105,7 +2104,7 @@ err_ret:
        return ret;
 }
 
-static void __devexit rivafb_remove(struct pci_dev *pd)
+static void rivafb_remove(struct pci_dev *pd)
 {
        struct fb_info *info = pci_get_drvdata(pd);
        struct riva_par *par = info->par;
@@ -2145,7 +2144,7 @@ static void __devexit rivafb_remove(struct pci_dev *pd)
  * ------------------------------------------------------------------------- */
 
 #ifndef MODULE
-static int __devinit rivafb_setup(char *options)
+static int rivafb_setup(char *options)
 {
        char *this_opt;
 
@@ -2186,7 +2185,7 @@ static struct pci_driver rivafb_driver = {
        .name           = "rivafb",
        .id_table       = rivafb_pci_tbl,
        .probe          = rivafb_probe,
-       .remove         = __devexit_p(rivafb_remove),
+       .remove         = rivafb_remove,
 };
 
 
@@ -2197,7 +2196,7 @@ static struct pci_driver rivafb_driver = {
  *
  * ------------------------------------------------------------------------- */
 
-static int __devinit rivafb_init(void)
+static int rivafb_init(void)
 {
 #ifndef MODULE
        char *option = NULL;
index 167400e2a18204f359edc38b6cfe2499e7992aa5..6a183375ced1a01d637d560b852a2aa6be309fba 100644 (file)
@@ -86,9 +86,8 @@ static int riva_gpio_getsda(void* data)
        return val;
 }
 
-static int __devinit riva_setup_i2c_bus(struct riva_i2c_chan *chan,
-                                       const char *name,
-                                       unsigned int i2c_class)
+static int riva_setup_i2c_bus(struct riva_i2c_chan *chan, const char *name,
+                             unsigned int i2c_class)
 {
        int rc;
 
@@ -124,7 +123,7 @@ static int __devinit riva_setup_i2c_bus(struct riva_i2c_chan *chan,
        return rc;
 }
 
-void __devinit riva_create_i2c_busses(struct riva_par *par)
+void riva_create_i2c_busses(struct riva_par *par)
 {
        par->chan[0].par        = par;
        par->chan[1].par        = par;
@@ -150,7 +149,7 @@ void riva_delete_i2c_busses(struct riva_par *par)
        }
 }
 
-int __devinit riva_probe_i2c_connector(struct riva_par *par, int conn, u8 **out_edid)
+int riva_probe_i2c_connector(struct riva_par *par, int conn, u8 **out_edid)
 {
        u8 *edid = NULL;
 
index 28b1c6c3d8ac98054ca2aad04021d4107cd01662..76d9053d88c136bb65dd36562cc697361db7a35b 100644 (file)
@@ -84,7 +84,7 @@ static const char *s1d13xxxfb_prod_names[] = {
 /*
  * here we define the default struct fb_fix_screeninfo
  */
-static struct fb_fix_screeninfo __devinitdata s1d13xxxfb_fix = {
+static struct fb_fix_screeninfo s1d13xxxfb_fix = {
        .id             = S1D_FBID,
        .type           = FB_TYPE_PACKED_PIXELS,
        .visual         = FB_VISUAL_PSEUDOCOLOR,
@@ -622,7 +622,7 @@ static struct fb_ops s1d13xxxfb_fbops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int s1d13xxxfb_width_tab[2][4] __devinitdata = {
+static int s1d13xxxfb_width_tab[2][4] = {
        {4, 8, 16, -1},
        {9, 12, 18, -1},
 };
@@ -642,8 +642,7 @@ static int s1d13xxxfb_width_tab[2][4] __devinitdata = {
  *     Note: some of the hardcoded values here might need some love to
  *     work on various chips, and might need to no longer be hardcoded.
  */
-static void __devinit
-s1d13xxxfb_fetch_hw_state(struct fb_info *info)
+static void s1d13xxxfb_fetch_hw_state(struct fb_info *info)
 {
        struct fb_var_screeninfo *var = &info->var;
        struct fb_fix_screeninfo *fix = &info->fix;
@@ -764,8 +763,7 @@ s1d13xxxfb_remove(struct platform_device *pdev)
        return 0;
 }
 
-static int __devinit
-s1d13xxxfb_probe(struct platform_device *pdev)
+static int s1d13xxxfb_probe(struct platform_device *pdev)
 {
        struct s1d13xxxfb_par *default_par;
        struct fb_info *info;
index 1a00ad241edd3dcd10ac83e22d03a50c079920c6..9b57a235c9bcb921c7eadd17e6ed08abf01b41b0 100644 (file)
@@ -1081,8 +1081,7 @@ static void s3c_fb_missing_pixclock(struct fb_videomode *mode)
  *
  * Allocate memory for the given framebuffer.
  */
-static int __devinit s3c_fb_alloc_memory(struct s3c_fb *sfb,
-                                        struct s3c_fb_win *win)
+static int s3c_fb_alloc_memory(struct s3c_fb *sfb, struct s3c_fb_win *win)
 {
        struct s3c_fb_pd_win *windata = win->windata;
        unsigned int real_size, virt_size, size;
@@ -1172,9 +1171,9 @@ static void s3c_fb_release_win(struct s3c_fb *sfb, struct s3c_fb_win *win)
  * Allocate and do the basic initialisation for one of the hardware's graphics
  * windows.
  */
-static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
-                                     struct s3c_fb_win_variant *variant,
-                                     struct s3c_fb_win **res)
+static int s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
+                           struct s3c_fb_win_variant *variant,
+                           struct s3c_fb_win **res)
 {
        struct fb_var_screeninfo *var;
        struct fb_videomode initmode;
@@ -1360,7 +1359,7 @@ static void s3c_fb_clear_win(struct s3c_fb *sfb, int win)
        }
 }
 
-static int __devinit s3c_fb_probe(struct platform_device *pdev)
+static int s3c_fb_probe(struct platform_device *pdev)
 {
        const struct platform_device_id *platid;
        struct s3c_fb_driverdata *fbdrv;
@@ -1521,7 +1520,7 @@ err_bus_clk:
  * Shutdown and then release all the resources that the driver allocated
  * on initialisation.
  */
-static int __devexit s3c_fb_remove(struct platform_device *pdev)
+static int s3c_fb_remove(struct platform_device *pdev)
 {
        struct s3c_fb *sfb = platform_get_drvdata(pdev);
        int win;
@@ -2035,7 +2034,7 @@ static const struct dev_pm_ops s3cfb_pm_ops = {
 
 static struct platform_driver s3c_fb_driver = {
        .probe          = s3c_fb_probe,
-       .remove         = __devexit_p(s3c_fb_remove),
+       .remove         = s3c_fb_remove,
        .id_table       = s3c_fb_driver_ids,
        .driver         = {
                .name   = "s3c-fb",
index 1083bb9469eec5911727856cba5623d157c273fe..76a0e7fbd69297d96a755a111d53597a439fe24f 100644 (file)
@@ -637,7 +637,7 @@ static struct fb_ops s3c2410fb_ops = {
  *     cache.  Once this area is remapped, all virtual memory
  *     access to the video memory should occur at the new region.
  */
-static int __devinit s3c2410fb_map_video_memory(struct fb_info *info)
+static int s3c2410fb_map_video_memory(struct fb_info *info)
 {
        struct s3c2410fb_info *fbi = info->par;
        dma_addr_t map_dma;
@@ -819,8 +819,8 @@ static inline void s3c2410fb_cpufreq_deregister(struct s3c2410fb_info *info)
 
 static const char driver_name[] = "s3c2410fb";
 
-static int __devinit s3c24xxfb_probe(struct platform_device *pdev,
-                                 enum s3c_drv_type drv_type)
+static int s3c24xxfb_probe(struct platform_device *pdev,
+                          enum s3c_drv_type drv_type)
 {
        struct s3c2410fb_info *info;
        struct s3c2410fb_display *display;
@@ -1010,12 +1010,12 @@ dealloc_fb:
        return ret;
 }
 
-static int __devinit s3c2410fb_probe(struct platform_device *pdev)
+static int s3c2410fb_probe(struct platform_device *pdev)
 {
        return s3c24xxfb_probe(pdev, DRV_S3C2410);
 }
 
-static int __devinit s3c2412fb_probe(struct platform_device *pdev)
+static int s3c2412fb_probe(struct platform_device *pdev)
 {
        return s3c24xxfb_probe(pdev, DRV_S3C2412);
 }
@@ -1024,7 +1024,7 @@ static int __devinit s3c2412fb_probe(struct platform_device *pdev)
 /*
  *  Cleanup
  */
-static int __devexit s3c2410fb_remove(struct platform_device *pdev)
+static int s3c2410fb_remove(struct platform_device *pdev)
 {
        struct fb_info *fbinfo = platform_get_drvdata(pdev);
        struct s3c2410fb_info *info = fbinfo->par;
@@ -1101,7 +1101,7 @@ static int s3c2410fb_resume(struct platform_device *dev)
 
 static struct platform_driver s3c2410fb_driver = {
        .probe          = s3c2410fb_probe,
-       .remove         = __devexit_p(s3c2410fb_remove),
+       .remove         = s3c2410fb_remove,
        .suspend        = s3c2410fb_suspend,
        .resume         = s3c2410fb_resume,
        .driver         = {
@@ -1112,7 +1112,7 @@ static struct platform_driver s3c2410fb_driver = {
 
 static struct platform_driver s3c2412fb_driver = {
        .probe          = s3c2412fb_probe,
-       .remove         = __devexit_p(s3c2410fb_remove),
+       .remove         = s3c2410fb_remove,
        .suspend        = s3c2410fb_suspend,
        .resume         = s3c2410fb_resume,
        .driver         = {
index 1d007366b9173d1a9af73b5f0735c0730464ae63..47ca86c5c6c0b3d1d609a001210e5eb132616076 100644 (file)
@@ -153,10 +153,10 @@ static const struct svga_timing_regs s3_timing_regs     = {
 /* Module parameters */
 
 
-static char *mode_option __devinitdata;
+static char *mode_option;
 
 #ifdef CONFIG_MTRR
-static int mtrr __devinitdata = 1;
+static int mtrr = 1;
 #endif
 
 static int fasttext = 1;
@@ -255,7 +255,7 @@ static int s3fb_ddc_getsda(void *data)
        return !!(s3fb_ddc_read(par) & DDC_SDA_IN);
 }
 
-static int __devinit s3fb_setup_ddc_bus(struct fb_info *info)
+static int s3fb_setup_ddc_bus(struct fb_info *info)
 {
        struct s3fb_info *par = info->par;
 
@@ -1066,7 +1066,7 @@ static struct fb_ops s3fb_ops = {
 
 /* ------------------------------------------------------------------------- */
 
-static int __devinit s3_identification(struct s3fb_info *par)
+static int s3_identification(struct s3fb_info *par)
 {
        int chip = par->chip;
 
@@ -1122,7 +1122,7 @@ static int __devinit s3_identification(struct s3fb_info *par)
 
 /* PCI probe */
 
-static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int s3_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct pci_bus_region bus_reg;
        struct resource vga_res;
@@ -1403,7 +1403,7 @@ err_enable_device:
 
 /* PCI remove */
 
-static void __devexit s3_pci_remove(struct pci_dev *dev)
+static void s3_pci_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
        struct s3fb_info __maybe_unused *par = info->par;
@@ -1509,7 +1509,7 @@ static int s3_pci_resume(struct pci_dev* dev)
 
 /* List of boards that we are trying to support */
 
-static struct pci_device_id s3_devices[] __devinitdata = {
+static struct pci_device_id s3_devices[] = {
        {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8810), .driver_data = CHIP_XXX_TRIO},
        {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8811), .driver_data = CHIP_XXX_TRIO},
        {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8812), .driver_data = CHIP_M65_AURORA64VP},
@@ -1537,7 +1537,7 @@ static struct pci_driver s3fb_pci_driver = {
        .name           = "s3fb",
        .id_table       = s3_devices,
        .probe          = s3_pci_probe,
-       .remove         = __devexit_p(s3_pci_remove),
+       .remove         = s3_pci_remove,
        .suspend        = s3_pci_suspend,
        .resume         = s3_pci_resume,
 };
index b6325848ad614f6beb1d1c49cc72b09b2652e0df..cfbde5e85cbf9a77495e09f1be14fc4c90e1101f 100644 (file)
@@ -1090,7 +1090,7 @@ static int sa1100fb_resume(struct platform_device *dev)
  *      cache.  Once this area is remapped, all virtual memory
  *      access to the video memory should occur at the new region.
  */
-static int __devinit sa1100fb_map_video_memory(struct sa1100fb_info *fbi)
+static int sa1100fb_map_video_memory(struct sa1100fb_info *fbi)
 {
        /*
         * We reserve one page for the palette, plus the size
@@ -1116,7 +1116,7 @@ static int __devinit sa1100fb_map_video_memory(struct sa1100fb_info *fbi)
 }
 
 /* Fake monspecs to fill in fbinfo structure */
-static struct fb_monspecs monspecs __devinitdata = {
+static struct fb_monspecs monspecs = {
        .hfmin  = 30000,
        .hfmax  = 70000,
        .vfmin  = 50,
@@ -1124,7 +1124,7 @@ static struct fb_monspecs monspecs __devinitdata = {
 };
 
 
-static struct sa1100fb_info * __devinit sa1100fb_init_fbinfo(struct device *dev)
+static struct sa1100fb_info *sa1100fb_init_fbinfo(struct device *dev)
 {
        struct sa1100fb_mach_info *inf = dev->platform_data;
        struct sa1100fb_info *fbi;
@@ -1205,7 +1205,7 @@ static struct sa1100fb_info * __devinit sa1100fb_init_fbinfo(struct device *dev)
        return fbi;
 }
 
-static int __devinit sa1100fb_probe(struct platform_device *pdev)
+static int sa1100fb_probe(struct platform_device *pdev)
 {
        struct sa1100fb_info *fbi;
        struct resource *res;
index f4f53b082d0546b9e7c5ff21df2be606991a4152..741b2395d01e483eb347e398549fbcc3881368d7 100644 (file)
@@ -69,7 +69,7 @@
 /* --------------------------------------------------------------------- */
 
 
-static char *mode_option __devinitdata = NULL;
+static char *mode_option = NULL;
 
 #ifdef MODULE
 
@@ -1664,7 +1664,7 @@ static struct fb_ops savagefb_ops = {
 
 /* --------------------------------------------------------------------- */
 
-static struct fb_var_screeninfo __devinitdata savagefb_var800x600x8 = {
+static struct fb_var_screeninfo savagefb_var800x600x8 = {
        .accel_flags =  FB_ACCELF_TEXT,
        .xres =         800,
        .yres =         600,
@@ -1715,7 +1715,7 @@ static void savage_disable_mmio(struct savagefb_par *par)
 }
 
 
-static int __devinit savage_map_mmio(struct fb_info *info)
+static int savage_map_mmio(struct fb_info *info)
 {
        struct savagefb_par *par = info->par;
        DBG("savage_map_mmio");
@@ -1761,8 +1761,7 @@ static void savage_unmap_mmio(struct fb_info *info)
        }
 }
 
-static int __devinit savage_map_video(struct fb_info *info,
-                                     int video_len)
+static int savage_map_video(struct fb_info *info, int video_len)
 {
        struct savagefb_par *par = info->par;
        int resource;
@@ -2052,9 +2051,8 @@ static int savage_init_hw(struct savagefb_par *par)
        return videoRambytes;
 }
 
-static int __devinit savage_init_fb_info(struct fb_info *info,
-                                        struct pci_dev *dev,
-                                        const struct pci_device_id *id)
+static int savage_init_fb_info(struct fb_info *info, struct pci_dev *dev,
+                              const struct pci_device_id *id)
 {
        struct savagefb_par *par = info->par;
        int err = 0;
@@ -2178,8 +2176,7 @@ static int __devinit savage_init_fb_info(struct fb_info *info,
 
 /* --------------------------------------------------------------------- */
 
-static int __devinit savagefb_probe(struct pci_dev* dev,
-                                   const struct pci_device_id* id)
+static int savagefb_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct fb_info *info;
        struct savagefb_par *par;
@@ -2340,7 +2337,7 @@ static int __devinit savagefb_probe(struct pci_dev* dev,
        return err;
 }
 
-static void __devexit savagefb_remove(struct pci_dev *dev)
+static void savagefb_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
 
@@ -2449,7 +2446,7 @@ static int savagefb_resume(struct pci_dev* dev)
 }
 
 
-static struct pci_device_id savagefb_devices[] __devinitdata = {
+static struct pci_device_id savagefb_devices[] = {
        {PCI_VENDOR_ID_S3, PCI_CHIP_SUPSAV_MX128,
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, FB_ACCEL_SUPERSAVAGE},
 
@@ -2530,7 +2527,7 @@ static struct pci_driver savagefb_driver = {
        .probe =    savagefb_probe,
        .suspend =  savagefb_suspend,
        .resume =   savagefb_resume,
-       .remove =   __devexit_p(savagefb_remove)
+       .remove =   savagefb_remove,
 };
 
 /* **************************** exit-time only **************************** */
index 53455f2955107a1dd2072c90503d8047ff3dc49e..2331fadc272bee53d265f1338c9bcbe648e3e685 100644 (file)
@@ -47,7 +47,7 @@ static int ywrap = 0;
 
 static int flatpanel_id = -1;
 
-static struct fb_fix_screeninfo sgivwfb_fix __devinitdata = {
+static struct fb_fix_screeninfo sgivwfb_fix = {
        .id             = "SGI Vis WS FB",
        .type           = FB_TYPE_PACKED_PIXELS,
         .visual                = FB_VISUAL_PSEUDOCOLOR,
@@ -57,7 +57,7 @@ static struct fb_fix_screeninfo sgivwfb_fix __devinitdata = {
        .line_length    = 640,
 };
 
-static struct fb_var_screeninfo sgivwfb_var __devinitdata = {
+static struct fb_var_screeninfo sgivwfb_var = {
        /* 640x480, 8 bpp */
        .xres           = 640,
        .yres           = 480,
@@ -79,7 +79,7 @@ static struct fb_var_screeninfo sgivwfb_var __devinitdata = {
        .vmode          = FB_VMODE_NONINTERLACED
 };
 
-static struct fb_var_screeninfo sgivwfb_var1600sw __devinitdata = {
+static struct fb_var_screeninfo sgivwfb_var1600sw = {
        /* 1600x1024, 8 bpp */
        .xres           = 1600,
        .yres           = 1024,
@@ -745,7 +745,7 @@ int __init sgivwfb_setup(char *options)
 /*
  *  Initialisation
  */
-static int __devinit sgivwfb_probe(struct platform_device *dev)
+static int sgivwfb_probe(struct platform_device *dev)
 {
        struct sgivw_par *par;
        struct fb_info *info;
@@ -825,7 +825,7 @@ fail_ioremap_regs:
        return -ENXIO;
 }
 
-static int __devexit sgivwfb_remove(struct platform_device *dev)
+static int sgivwfb_remove(struct platform_device *dev)
 {
        struct fb_info *info = platform_get_drvdata(dev);
 
@@ -845,7 +845,7 @@ static int __devexit sgivwfb_remove(struct platform_device *dev)
 
 static struct platform_driver sgivwfb_driver = {
        .probe  = sgivwfb_probe,
-       .remove = __devexit_p(sgivwfb_remove),
+       .remove = sgivwfb_remove,
        .driver = {
                .name   = "sgivwfb",
        },
index 83b16e237a0e2f4fcf4d2438ea2f3439851129c8..5fbb0c7ab0c8e54071c3d463511882a146fb7034 100644 (file)
@@ -431,7 +431,7 @@ static int sh7760fb_alloc_mem(struct fb_info *info)
        return 0;
 }
 
-static int __devinit sh7760fb_probe(struct platform_device *pdev)
+static int sh7760fb_probe(struct platform_device *pdev)
 {
        struct fb_info *info;
        struct resource *res;
@@ -557,7 +557,7 @@ out_fb:
        return ret;
 }
 
-static int __devexit sh7760fb_remove(struct platform_device *dev)
+static int sh7760fb_remove(struct platform_device *dev)
 {
        struct fb_info *info = platform_get_drvdata(dev);
        struct sh7760fb_par *par = info->par;
@@ -582,7 +582,7 @@ static struct platform_driver sh7760_lcdc_driver = {
                   .owner = THIS_MODULE,
                   },
        .probe = sh7760fb_probe,
-       .remove = __devexit_p(sh7760fb_remove),
+       .remove = sh7760fb_remove,
 };
 
 module_platform_driver(sh7760_lcdc_driver);
index f4962292792c6fd305af02d70709c5b43e203027..701b461cf8a953b602c676bd50d1e164267deb98 100644 (file)
@@ -533,7 +533,7 @@ efindslot:
        return ret;
 }
 
-static int __devexit sh_mipi_remove(struct platform_device *pdev)
+static int sh_mipi_remove(struct platform_device *pdev)
 {
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        struct resource *res2 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
@@ -574,7 +574,7 @@ static int __devexit sh_mipi_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver sh_mipi_driver = {
-       .remove         = __devexit_p(sh_mipi_remove),
+       .remove         = sh_mipi_remove,
        .shutdown       = sh_mipi_shutdown,
        .driver = {
                .name   = "sh-mipi-dsi",
index e78fe4bc15249c21612020b858273b0c8884f3da..63203acef812211cb17788454116fcbe77debdd7 100644 (file)
@@ -1649,7 +1649,7 @@ sh_mobile_lcdc_overlay_fb_unregister(struct sh_mobile_lcdc_overlay *ovl)
        unregister_framebuffer(ovl->info);
 }
 
-static int __devinit
+static int
 sh_mobile_lcdc_overlay_fb_register(struct sh_mobile_lcdc_overlay *ovl)
 {
        struct sh_mobile_lcdc_priv *lcdc = ovl->channel->lcdc;
@@ -1688,7 +1688,7 @@ sh_mobile_lcdc_overlay_fb_cleanup(struct sh_mobile_lcdc_overlay *ovl)
        framebuffer_release(info);
 }
 
-static int __devinit
+static int
 sh_mobile_lcdc_overlay_fb_init(struct sh_mobile_lcdc_overlay *ovl)
 {
        struct sh_mobile_lcdc_priv *priv = ovl->channel->lcdc;
@@ -2137,7 +2137,7 @@ sh_mobile_lcdc_channel_fb_unregister(struct sh_mobile_lcdc_chan *ch)
                unregister_framebuffer(ch->info);
 }
 
-static int __devinit
+static int
 sh_mobile_lcdc_channel_fb_register(struct sh_mobile_lcdc_chan *ch)
 {
        struct fb_info *info = ch->info;
@@ -2185,7 +2185,7 @@ sh_mobile_lcdc_channel_fb_cleanup(struct sh_mobile_lcdc_chan *ch)
        framebuffer_release(info);
 }
 
-static int __devinit
+static int
 sh_mobile_lcdc_channel_fb_init(struct sh_mobile_lcdc_chan *ch,
                               const struct fb_videomode *modes,
                               unsigned int num_modes)
@@ -2417,7 +2417,7 @@ static int sh_mobile_lcdc_notify(struct notifier_block *nb,
  * Probe/remove and driver init/exit
  */
 
-static const struct fb_videomode default_720p __devinitconst = {
+static const struct fb_videomode default_720p = {
        .name = "HDMI 720p",
        .xres = 1280,
        .yres = 720,
@@ -2496,7 +2496,7 @@ static int sh_mobile_lcdc_remove(struct platform_device *pdev)
        return 0;
 }
 
-static int __devinit sh_mobile_lcdc_check_interface(struct sh_mobile_lcdc_chan *ch)
+static int sh_mobile_lcdc_check_interface(struct sh_mobile_lcdc_chan *ch)
 {
        int interface_type = ch->cfg->interface_type;
 
@@ -2536,7 +2536,7 @@ static int __devinit sh_mobile_lcdc_check_interface(struct sh_mobile_lcdc_chan *
        return 0;
 }
 
-static int __devinit
+static int
 sh_mobile_lcdc_overlay_init(struct sh_mobile_lcdc_overlay *ovl)
 {
        const struct sh_mobile_lcdc_format_info *format;
@@ -2591,7 +2591,7 @@ sh_mobile_lcdc_overlay_init(struct sh_mobile_lcdc_overlay *ovl)
        return 0;
 }
 
-static int __devinit
+static int
 sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_chan *ch)
 {
        const struct sh_mobile_lcdc_format_info *format;
@@ -2695,7 +2695,7 @@ sh_mobile_lcdc_channel_init(struct sh_mobile_lcdc_chan *ch)
        return sh_mobile_lcdc_channel_fb_init(ch, mode, num_modes);
 }
 
-static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev)
+static int sh_mobile_lcdc_probe(struct platform_device *pdev)
 {
        struct sh_mobile_lcdc_info *pdata = pdev->dev.platform_data;
        struct sh_mobile_lcdc_priv *priv;
index 7a0ba8bb3fbebed167711a7dd6a29d6a9e9e92a0..e0f098562a74b87eee790de505a8483a8a2024b7 100644 (file)
@@ -620,7 +620,7 @@ static UNIVERSAL_DEV_PM_OPS(sh_mobile_meram_dev_pm_ops,
  * Probe/remove and driver init/exit
  */
 
-static int __devinit sh_mobile_meram_probe(struct platform_device *pdev)
+static int sh_mobile_meram_probe(struct platform_device *pdev)
 {
        struct sh_mobile_meram_priv *priv;
        struct sh_mobile_meram_info *pdata = pdev->dev.platform_data;
index a7a48db64ce20d0cdad34635da4848bc0410dec1..977e27927a211ab0fffcd37087f90e0c0fa86e9f 100644 (file)
@@ -106,8 +106,7 @@ sisfb_setdefaultparms(void)
 
 /* ------------- Parameter parsing -------------- */
 
-static void __devinit
-sisfb_search_vesamode(unsigned int vesamode, bool quiet)
+static void sisfb_search_vesamode(unsigned int vesamode, bool quiet)
 {
        int i = 0, j = 0;
 
@@ -146,8 +145,7 @@ sisfb_search_vesamode(unsigned int vesamode, bool quiet)
                printk(KERN_ERR "sisfb: Invalid VESA mode 0x%x'\n", vesamode);
 }
 
-static void __devinit
-sisfb_search_mode(char *name, bool quiet)
+static void sisfb_search_mode(char *name, bool quiet)
 {
        unsigned int j = 0, xres = 0, yres = 0, depth = 0, rate = 0;
        int i = 0;
@@ -225,8 +223,7 @@ sisfb_search_mode(char *name, bool quiet)
 }
 
 #ifndef MODULE
-static void __devinit
-sisfb_get_vga_mode_from_kernel(void)
+static void sisfb_get_vga_mode_from_kernel(void)
 {
 #ifdef CONFIG_X86
        char mymode[32];
@@ -345,8 +342,7 @@ sisfb_search_specialtiming(const char *name)
 
 /* ----------- Various detection routines ----------- */
 
-static void __devinit
-sisfb_detect_custom_timing(struct sis_video_info *ivideo)
+static void sisfb_detect_custom_timing(struct sis_video_info *ivideo)
 {
        unsigned char *biosver = NULL;
        unsigned char *biosdate = NULL;
@@ -403,8 +399,7 @@ sisfb_detect_custom_timing(struct sis_video_info *ivideo)
        } while(mycustomttable[i].chipID);
 }
 
-static bool __devinit
-sisfb_interpret_edid(struct sisfb_monitor *monitor, u8 *buffer)
+static bool sisfb_interpret_edid(struct sisfb_monitor *monitor, u8 *buffer)
 {
        int i, j, xres, yres, refresh, index;
        u32 emodes;
@@ -505,8 +500,8 @@ sisfb_interpret_edid(struct sisfb_monitor *monitor, u8 *buffer)
        return monitor->datavalid;
 }
 
-static void __devinit
-sisfb_handle_ddc(struct sis_video_info *ivideo, struct sisfb_monitor *monitor, int crtno)
+static void sisfb_handle_ddc(struct sis_video_info *ivideo,
+                            struct sisfb_monitor *monitor, int crtno)
 {
        unsigned short temp, i, realcrtno = crtno;
        unsigned char  buffer[256];
@@ -1898,8 +1893,7 @@ static struct fb_ops sisfb_ops = {
 
 /* ---------------- Chip generation dependent routines ---------------- */
 
-static struct pci_dev * __devinit
-sisfb_get_northbridge(int basechipid)
+static struct pci_dev *sisfb_get_northbridge(int basechipid)
 {
        struct pci_dev *pdev = NULL;
        int nbridgenum, nbridgeidx, i;
@@ -1938,8 +1932,7 @@ sisfb_get_northbridge(int basechipid)
        return pdev;
 }
 
-static int __devinit
-sisfb_get_dram_size(struct sis_video_info *ivideo)
+static int sisfb_get_dram_size(struct sis_video_info *ivideo)
 {
 #if defined(CONFIG_FB_SIS_300) || defined(CONFIG_FB_SIS_315)
        u8 reg;
@@ -2038,8 +2031,7 @@ sisfb_get_dram_size(struct sis_video_info *ivideo)
 
 /* -------------- video bridge device detection --------------- */
 
-static void __devinit
-sisfb_detect_VB_connect(struct sis_video_info *ivideo)
+static void sisfb_detect_VB_connect(struct sis_video_info *ivideo)
 {
        u8 cr32, temp;
 
@@ -2164,8 +2156,7 @@ sisfb_detect_VB_connect(struct sis_video_info *ivideo)
 
 /* ------------------ Sensing routines ------------------ */
 
-static bool __devinit
-sisfb_test_DDC1(struct sis_video_info *ivideo)
+static bool sisfb_test_DDC1(struct sis_video_info *ivideo)
 {
     unsigned short old;
     int count = 48;
@@ -2177,8 +2168,7 @@ sisfb_test_DDC1(struct sis_video_info *ivideo)
     return (count != -1);
 }
 
-static void __devinit
-sisfb_sense_crt1(struct sis_video_info *ivideo)
+static void sisfb_sense_crt1(struct sis_video_info *ivideo)
 {
     bool mustwait = false;
     u8  sr1F, cr17;
@@ -2259,8 +2249,7 @@ sisfb_sense_crt1(struct sis_video_info *ivideo)
 }
 
 /* Determine and detect attached devices on SiS30x */
-static void __devinit
-SiS_SenseLCD(struct sis_video_info *ivideo)
+static void SiS_SenseLCD(struct sis_video_info *ivideo)
 {
        unsigned char buffer[256];
        unsigned short temp, realcrtno, i;
@@ -2347,8 +2336,7 @@ SiS_SenseLCD(struct sis_video_info *ivideo)
        ivideo->SiS_Pr.PanelSelfDetected = true;
 }
 
-static int __devinit
-SISDoSense(struct sis_video_info *ivideo, u16 type, u16 test)
+static int SISDoSense(struct sis_video_info *ivideo, u16 type, u16 test)
 {
     int temp, mytest, result, i, j;
 
@@ -2377,8 +2365,7 @@ SISDoSense(struct sis_video_info *ivideo, u16 type, u16 test)
     return result;
 }
 
-static void __devinit
-SiS_Sense30x(struct sis_video_info *ivideo)
+static void SiS_Sense30x(struct sis_video_info *ivideo)
 {
     u8  backupP4_0d,backupP2_00,backupP2_4d,backupSR_1e,biosflag=0;
     u16 svhs=0, svhs_c=0;
@@ -2518,8 +2505,7 @@ SiS_Sense30x(struct sis_video_info *ivideo)
 }
 
 /* Determine and detect attached TV's on Chrontel */
-static void __devinit
-SiS_SenseCh(struct sis_video_info *ivideo)
+static void SiS_SenseCh(struct sis_video_info *ivideo)
 {
 #if defined(CONFIG_FB_SIS_300) || defined(CONFIG_FB_SIS_315)
     u8 temp1, temp2;
@@ -2643,8 +2629,7 @@ SiS_SenseCh(struct sis_video_info *ivideo)
     }
 }
 
-static void __devinit
-sisfb_get_VB_type(struct sis_video_info *ivideo)
+static void sisfb_get_VB_type(struct sis_video_info *ivideo)
 {
        char stdstr[]    = "sisfb: Detected";
        char bridgestr[] = "video bridge";
@@ -2906,8 +2891,7 @@ sisfb_engine_init(struct sis_video_info *ivideo)
        ivideo->engineok = 1;
 }
 
-static void __devinit
-sisfb_detect_lcd_type(struct sis_video_info *ivideo)
+static void sisfb_detect_lcd_type(struct sis_video_info *ivideo)
 {
        u8 reg;
        int i;
@@ -2962,8 +2946,7 @@ sisfb_detect_lcd_type(struct sis_video_info *ivideo)
                        ivideo->lcdxres, ivideo->lcdyres);
 }
 
-static void __devinit
-sisfb_save_pdc_emi(struct sis_video_info *ivideo)
+static void sisfb_save_pdc_emi(struct sis_video_info *ivideo)
 {
 #ifdef CONFIG_FB_SIS_300
        /* Save the current PanelDelayCompensation if the LCD is currently used */
@@ -3081,8 +3064,7 @@ sisfb_save_pdc_emi(struct sis_video_info *ivideo)
 
 /* -------------------- Memory manager routines ---------------------- */
 
-static u32 __devinit
-sisfb_getheapstart(struct sis_video_info *ivideo)
+static u32 sisfb_getheapstart(struct sis_video_info *ivideo)
 {
        u32 ret = ivideo->sisfb_parm_mem * 1024;
        u32 maxoffs = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize;
@@ -3128,8 +3110,7 @@ sisfb_getheapstart(struct sis_video_info *ivideo)
        return ret;
 }
 
-static u32 __devinit
-sisfb_getheapsize(struct sis_video_info *ivideo)
+static u32 sisfb_getheapsize(struct sis_video_info *ivideo)
 {
        u32 max = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize;
        u32 ret = 0;
@@ -3154,8 +3135,7 @@ sisfb_getheapsize(struct sis_video_info *ivideo)
        return ret;
 }
 
-static int __devinit
-sisfb_heap_init(struct sis_video_info *ivideo)
+static int sisfb_heap_init(struct sis_video_info *ivideo)
 {
        struct SIS_OH *poh;
 
@@ -4061,8 +4041,8 @@ static int __init sisfb_setup(char *options)
 }
 #endif
 
-static int __devinit
-sisfb_check_rom(void __iomem *rom_base, struct sis_video_info *ivideo)
+static int sisfb_check_rom(void __iomem *rom_base,
+                          struct sis_video_info *ivideo)
 {
        void __iomem *rom;
        int romptr;
@@ -4089,8 +4069,7 @@ sisfb_check_rom(void __iomem *rom_base, struct sis_video_info *ivideo)
        return 1;
 }
 
-static unsigned char * __devinit
-sisfb_find_rom(struct pci_dev *pdev)
+static unsigned char *sisfb_find_rom(struct pci_dev *pdev)
 {
        struct sis_video_info *ivideo = pci_get_drvdata(pdev);
        void __iomem *rom_base;
@@ -4149,9 +4128,8 @@ sisfb_find_rom(struct pci_dev *pdev)
        return myrombase;
 }
 
-static void __devinit
-sisfb_post_map_vram(struct sis_video_info *ivideo, unsigned int *mapsize,
-                       unsigned int min)
+static void sisfb_post_map_vram(struct sis_video_info *ivideo,
+                               unsigned int *mapsize, unsigned int min)
 {
        if (*mapsize < (min << 20))
                return;
@@ -4176,8 +4154,7 @@ sisfb_post_map_vram(struct sis_video_info *ivideo, unsigned int *mapsize,
 }
 
 #ifdef CONFIG_FB_SIS_300
-static int __devinit
-sisfb_post_300_buswidth(struct sis_video_info *ivideo)
+static int sisfb_post_300_buswidth(struct sis_video_info *ivideo)
 {
        void __iomem *FBAddress = ivideo->video_vbase;
        unsigned short temp;
@@ -4222,7 +4199,7 @@ sisfb_post_300_buswidth(struct sis_video_info *ivideo)
        return 1;                       /* 32bit */
 }
 
-static const unsigned short __devinitconst SiS_DRAMType[17][5] = {
+static const unsigned short SiS_DRAMType[17][5] = {
        {0x0C,0x0A,0x02,0x40,0x39},
        {0x0D,0x0A,0x01,0x40,0x48},
        {0x0C,0x09,0x02,0x20,0x35},
@@ -4242,10 +4219,9 @@ static const unsigned short __devinitconst SiS_DRAMType[17][5] = {
        {0x09,0x08,0x01,0x01,0x00}
 };
 
-static int __devinit
-sisfb_post_300_rwtest(struct sis_video_info *ivideo, int iteration, int buswidth,
-                       int PseudoRankCapacity, int PseudoAdrPinCount,
-                       unsigned int mapsize)
+static int sisfb_post_300_rwtest(struct sis_video_info *ivideo, int iteration,
+                                int buswidth, int PseudoRankCapacity,
+                                int PseudoAdrPinCount, unsigned int mapsize)
 {
        void __iomem *FBAddr = ivideo->video_vbase;
        unsigned short sr14;
@@ -4309,8 +4285,7 @@ sisfb_post_300_rwtest(struct sis_video_info *ivideo, int iteration, int buswidth
        return 0;
 }
 
-static void __devinit
-sisfb_post_300_ramsize(struct pci_dev *pdev, unsigned int mapsize)
+static void sisfb_post_300_ramsize(struct pci_dev *pdev, unsigned int mapsize)
 {
        struct  sis_video_info *ivideo = pci_get_drvdata(pdev);
        int     i, j, buswidth;
@@ -4335,8 +4310,7 @@ sisfb_post_300_ramsize(struct pci_dev *pdev, unsigned int mapsize)
        }
 }
 
-static void __devinit
-sisfb_post_sis300(struct pci_dev *pdev)
+static void sisfb_post_sis300(struct pci_dev *pdev)
 {
        struct sis_video_info *ivideo = pci_get_drvdata(pdev);
        unsigned char *bios = ivideo->SiS_Pr.VirtualRomBase;
@@ -4547,8 +4521,7 @@ sisfb_post_sis300(struct pci_dev *pdev)
 
 #ifdef CONFIG_FB_SIS_315
 #if 0
-static void __devinit
-sisfb_post_sis315330(struct pci_dev *pdev)
+static void sisfb_post_sis315330(struct pci_dev *pdev)
 {
        /* TODO */
 }
@@ -4559,8 +4532,7 @@ static inline int sisfb_xgi_is21(struct sis_video_info *ivideo)
        return ivideo->chip_real_id == XGI_21;
 }
 
-static void __devinit
-sisfb_post_xgi_delay(struct sis_video_info *ivideo, int delay)
+static void sisfb_post_xgi_delay(struct sis_video_info *ivideo, int delay)
 {
        unsigned int i;
        u8 reg;
@@ -4571,9 +4543,9 @@ sisfb_post_xgi_delay(struct sis_video_info *ivideo, int delay)
        }
 }
 
-static int __devinit
-sisfb_find_host_bridge(struct sis_video_info *ivideo, struct pci_dev *mypdev,
-                               unsigned short pcivendor)
+static int sisfb_find_host_bridge(struct sis_video_info *ivideo,
+                                 struct pci_dev *mypdev,
+                                 unsigned short pcivendor)
 {
        struct pci_dev *pdev = NULL;
        unsigned short temp;
@@ -4591,9 +4563,8 @@ sisfb_find_host_bridge(struct sis_video_info *ivideo, struct pci_dev *mypdev,
        return ret;
 }
 
-static int __devinit
-sisfb_post_xgi_rwtest(struct sis_video_info *ivideo, int starta,
-                       unsigned int enda, unsigned int mapsize)
+static int sisfb_post_xgi_rwtest(struct sis_video_info *ivideo, int starta,
+                                unsigned int enda, unsigned int mapsize)
 {
        unsigned int pos;
        int i;
@@ -4623,8 +4594,7 @@ sisfb_post_xgi_rwtest(struct sis_video_info *ivideo, int starta,
        return 1;
 }
 
-static int __devinit
-sisfb_post_xgi_ramsize(struct sis_video_info *ivideo)
+static int sisfb_post_xgi_ramsize(struct sis_video_info *ivideo)
 {
        unsigned int buswidth, ranksize, channelab, mapsize;
        int i, j, k, l, status;
@@ -4876,8 +4846,7 @@ bail_out:
        return status;
 }
 
-static void __devinit
-sisfb_post_xgi_setclocks(struct sis_video_info *ivideo, u8 regb)
+static void sisfb_post_xgi_setclocks(struct sis_video_info *ivideo, u8 regb)
 {
        u8 v1, v2, v3;
        int index;
@@ -4932,8 +4901,8 @@ sisfb_post_xgi_setclocks(struct sis_video_info *ivideo, u8 regb)
        sisfb_post_xgi_delay(ivideo, 0x43);
 }
 
-static void __devinit
-sisfb_post_xgi_ddr2_mrs_default(struct sis_video_info *ivideo, u8 regb)
+static void sisfb_post_xgi_ddr2_mrs_default(struct sis_video_info *ivideo,
+                                           u8 regb)
 {
        unsigned char *bios = ivideo->bios_abase;
        u8 v1;
@@ -4973,8 +4942,7 @@ sisfb_post_xgi_ddr2_mrs_default(struct sis_video_info *ivideo, u8 regb)
        sisfb_post_xgi_delay(ivideo, 1);
 }
 
-static void __devinit
-sisfb_post_xgi_ddr2_mrs_xg21(struct sis_video_info *ivideo)
+static void sisfb_post_xgi_ddr2_mrs_xg21(struct sis_video_info *ivideo)
 {
        sisfb_post_xgi_setclocks(ivideo, 1);
 
@@ -5015,8 +4983,7 @@ sisfb_post_xgi_ddr2_mrs_xg21(struct sis_video_info *ivideo)
        sisfb_post_xgi_delay(ivideo, 1);
 }
 
-static void __devinit
-sisfb_post_xgi_ddr2(struct sis_video_info *ivideo, u8 regb)
+static void sisfb_post_xgi_ddr2(struct sis_video_info *ivideo, u8 regb)
 {
        unsigned char *bios = ivideo->bios_abase;
        static const u8 cs158[8] = {
@@ -5061,8 +5028,7 @@ sisfb_post_xgi_ddr2(struct sis_video_info *ivideo, u8 regb)
                sisfb_post_xgi_ddr2_mrs_default(ivideo, regb);
 }
 
-static u8 __devinit
-sisfb_post_xgi_ramtype(struct sis_video_info *ivideo)
+static u8 sisfb_post_xgi_ramtype(struct sis_video_info *ivideo)
 {
        unsigned char *bios = ivideo->bios_abase;
        u8 ramtype;
@@ -5101,8 +5067,7 @@ sisfb_post_xgi_ramtype(struct sis_video_info *ivideo)
        return ramtype;
 }
 
-static int __devinit
-sisfb_post_xgi(struct pci_dev *pdev)
+static int sisfb_post_xgi(struct pci_dev *pdev)
 {
        struct sis_video_info *ivideo = pci_get_drvdata(pdev);
        unsigned char *bios = ivideo->bios_abase;
@@ -5839,8 +5804,7 @@ sisfb_post_xgi(struct pci_dev *pdev)
 }
 #endif
 
-static int __devinit
-sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct sisfb_chip_info  *chipinfo = &sisfb_chip_info[ent->driver_data];
        struct sis_video_info   *ivideo = NULL;
@@ -6530,7 +6494,7 @@ error_3:  vfree(ivideo->bios_abase);
 /*                PCI DEVICE HANDLING                */
 /*****************************************************/
 
-static void __devexit sisfb_remove(struct pci_dev *pdev)
+static void sisfb_remove(struct pci_dev *pdev)
 {
        struct sis_video_info   *ivideo = pci_get_drvdata(pdev);
        struct fb_info          *sis_fb_info = ivideo->memyselfandi;
@@ -6591,7 +6555,7 @@ static struct pci_driver sisfb_driver = {
        .name           = "sisfb",
        .id_table       = sisfb_pci_table,
        .probe          = sisfb_probe,
-       .remove         = __devexit_p(sisfb_remove)
+       .remove         = sisfb_remove,
 };
 
 static int __init sisfb_init(void)
index 9540e977270e3932c1d536990546541cefa4258d..32e23c20943056ec221c10f338cbdae964421742 100644 (file)
@@ -98,7 +98,7 @@ static struct sisfb_chip_info {
        int             hwcursor_size;
        int             CRT2_write_enable;
        const char      *chip_name;
-} sisfb_chip_info[] __devinitdata = {
+} sisfb_chip_info[] = {
        { SIS_300,    SIS_300_VGA, 0, HW_CURSOR_AREA_SIZE_300 * 2, SIS_CRT2_WENABLE_300, "SiS 300/305" },
        { SIS_540,    SIS_300_VGA, 0, HW_CURSOR_AREA_SIZE_300 * 2, SIS_CRT2_WENABLE_300, "SiS 540" },
        { SIS_630,    SIS_300_VGA, 0, HW_CURSOR_AREA_SIZE_300 * 2, SIS_CRT2_WENABLE_300, "SiS 630" },
@@ -113,7 +113,7 @@ static struct sisfb_chip_info {
        { XGI_40,     SIS_315_VGA, 1, HW_CURSOR_AREA_SIZE_315 * 4, SIS_CRT2_WENABLE_315, "XGI V3XT/V5/V8" },
 };
 
-static struct pci_device_id __devinitdata sisfb_pci_table[] = {
+static struct pci_device_id sisfb_pci_table[] = {
 #ifdef CONFIG_FB_SIS_300
        { PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_300,     PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_540_VGA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
@@ -317,7 +317,7 @@ static struct _sis_lcd_data {
        u16 xres;
        u16 yres;
        u8  default_mode_idx;
-} sis_lcd_data[] __devinitdata = {
+} sis_lcd_data[] = {
        { LCD_640x480,    640,  480,  23 },
        { LCD_800x600,    800,  600,  43 },
        { LCD_1024x600,  1024,  600,  67 },
@@ -339,21 +339,21 @@ static struct _sis_lcd_data {
 };
 
 /* CR36 evaluation */
-static unsigned short sis300paneltype[] __devinitdata = {
+static unsigned short sis300paneltype[] = {
        LCD_UNKNOWN,   LCD_800x600,   LCD_1024x768,  LCD_1280x1024,
        LCD_1280x960,  LCD_640x480,   LCD_1024x600,  LCD_1152x768,
        LCD_UNKNOWN,   LCD_UNKNOWN,   LCD_UNKNOWN,   LCD_UNKNOWN,
        LCD_UNKNOWN,   LCD_UNKNOWN,   LCD_UNKNOWN,   LCD_UNKNOWN
 };
 
-static unsigned short sis310paneltype[] __devinitdata = {
+static unsigned short sis310paneltype[] = {
        LCD_UNKNOWN,   LCD_800x600,   LCD_1024x768,  LCD_1280x1024,
        LCD_640x480,   LCD_1024x600,  LCD_1152x864,  LCD_1280x960,
        LCD_1152x768,  LCD_1400x1050, LCD_1280x768,  LCD_1600x1200,
        LCD_320x240_2, LCD_320x240_3, LCD_UNKNOWN,   LCD_UNKNOWN
 };
 
-static unsigned short sis661paneltype[] __devinitdata = {
+static unsigned short sis661paneltype[] = {
        LCD_UNKNOWN,   LCD_800x600,   LCD_1024x768,  LCD_1280x1024,
        LCD_640x480,   LCD_1024x600,  LCD_1152x864,  LCD_1280x960,
        LCD_1280x854,  LCD_1400x1050, LCD_1280x768,  LCD_1600x1200,
@@ -466,7 +466,7 @@ static struct _sisfbddcsmodes {
        u16 h;
        u16 v;
        u32 d;
-} sisfb_ddcsmodes[] __devinitdata = {
+} sisfb_ddcsmodes[] = {
        { 0x10000, 67, 75, 108000},
        { 0x08000, 48, 72,  50000},
        { 0x04000, 46, 75,  49500},
@@ -488,7 +488,7 @@ static struct _sisfbddcfmodes {
        u16 v;
        u16 h;
        u32 d;
-} sisfb_ddcfmodes[] __devinitdata = {
+} sisfb_ddcfmodes[] = {
        { 1280, 1024, 85, 92, 157500},
        { 1600, 1200, 60, 75, 162000},
        { 1600, 1200, 65, 82, 175500},
@@ -505,7 +505,7 @@ static struct _chswtable {
        u16  subsysCard;
        char *vendorName;
        char *cardName;
-} mychswtable[] __devinitdata = {
+} mychswtable[] = {
        { 0x1631, 0x1002, "Mitachi", "0x1002" },
        { 0x1071, 0x7521, "Mitac"  , "7521P"  },
        { 0,      0,      ""       , ""       }
@@ -525,7 +525,7 @@ static struct _customttable {
        char  *cardName;
        u32   SpecialID;
        char  *optionName;
-} mycustomttable[] __devinitdata = {
+} mycustomttable[] = {
        { SIS_630, "2.00.07", "09/27/2002-13:38:25",
          0x3240A8,
          { 0x220, 0x227, 0x228, 0x229, 0x0ee },
index 5b6abc6de84ba0a823a80806f0d84c6675f0b5c0..2d4694c6b9e0f207338fe79a4a47b4846b0438cf 100644 (file)
@@ -63,7 +63,7 @@
 /*
  * Driver data
  */
-static char *mode_option __devinitdata;
+static char *mode_option;
 
 /*
  *  If your driver supports multiple boards, you should make the  
@@ -84,7 +84,7 @@ struct xxx_par;
  * if we don't use modedb. If we do use modedb see xxxfb_init how to use it
  * to get a fb_var_screeninfo. Otherwise define a default var as well. 
  */
-static struct fb_fix_screeninfo xxxfb_fix __devinitdata = {
+static struct fb_fix_screeninfo xxxfb_fix = {
        .id =           "FB's name", 
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_PSEUDOCOLOR,
@@ -678,8 +678,7 @@ static struct fb_ops xxxfb_ops = {
      */
 
 /* static int __init xxfb_probe (struct platform_device *pdev) -- for platform devs */
-static int __devinit xxxfb_probe(struct pci_dev *dev,
-                             const struct pci_device_id *ent)
+static int xxxfb_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 {
     struct fb_info *info;
     struct xxx_par *par;
@@ -705,9 +704,7 @@ static int __devinit xxxfb_probe(struct pci_dev *dev,
      */
     info->screen_base = framebuffer_virtual_memory;
     info->fbops = &xxxfb_ops;
-    info->fix = xxxfb_fix; /* this will be the only time xxxfb_fix will be
-                           * used, so mark it as __devinitdata
-                           */
+    info->fix = xxxfb_fix;
     info->pseudo_palette = pseudo_palette; /* The pseudopalette is an
                                            * 16-member array
                                            */
@@ -836,8 +833,8 @@ static int __devinit xxxfb_probe(struct pci_dev *dev,
     /*
      *  Cleanup
      */
-/* static void __devexit xxxfb_remove(struct platform_device *pdev) */
-static void __devexit xxxfb_remove(struct pci_dev *dev)
+/* static void xxxfb_remove(struct platform_device *pdev) */
+static void xxxfb_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
        /* or platform_get_drvdata(pdev); */
@@ -899,7 +896,7 @@ static struct pci_driver xxxfb_driver = {
        .name =         "xxxfb",
        .id_table =     xxxfb_id_table,
        .probe =        xxxfb_probe,
-       .remove =       __devexit_p(xxxfb_remove),
+       .remove =       xxxfb_remove,
        .suspend =      xxxfb_suspend, /* optional but recommended */
        .resume =       xxxfb_resume,  /* optional but recommended */
 };
index 3690effbedccc2bf552c66e997ca5257b1b4c20a..1501979099dce08b1b17cff6d0dc281135a9dcb0 100644 (file)
@@ -46,7 +46,7 @@
 static char *fb_mode = "640x480-16@60";
 static unsigned long default_bpp = 16;
 
-static struct fb_videomode __devinitdata sm501_default_mode = {
+static struct fb_videomode sm501_default_mode = {
        .refresh        = 60,
        .xres           = 640,
        .yres           = 480,
@@ -1664,8 +1664,7 @@ static void sm501fb_stop(struct sm501fb_info *info)
                           resource_size(info->regs_res));
 }
 
-static int __devinit sm501fb_init_fb(struct fb_info *fb,
-                          enum sm501_controller head,
+static int sm501fb_init_fb(struct fb_info *fb, enum sm501_controller head,
                           const char *fbname)
 {
        struct sm501_platdata_fbsub *pd;
@@ -1850,8 +1849,8 @@ static struct sm501_platdata_fb sm501fb_def_pdata = {
 static char driver_name_crt[] = "sm501fb-crt";
 static char driver_name_pnl[] = "sm501fb-panel";
 
-static int __devinit sm501fb_probe_one(struct sm501fb_info *info,
-                                      enum sm501_controller head)
+static int sm501fb_probe_one(struct sm501fb_info *info,
+                            enum sm501_controller head)
 {
        unsigned char *name = (head == HEAD_CRT) ? "crt" : "panel";
        struct sm501_platdata_fbsub *pd;
@@ -1892,9 +1891,8 @@ static void sm501_free_init_fb(struct sm501fb_info *info,
        fb_dealloc_cmap(&fbi->cmap);
 }
 
-static int __devinit sm501fb_start_one(struct sm501fb_info *info,
-                                      enum sm501_controller head,
-                                      const char *drvname)
+static int sm501fb_start_one(struct sm501fb_info *info,
+                            enum sm501_controller head, const char *drvname)
 {
        struct fb_info *fbi = info->fb[head];
        int ret;
@@ -1922,7 +1920,7 @@ static int __devinit sm501fb_start_one(struct sm501fb_info *info,
        return 0;
 }
 
-static int __devinit sm501fb_probe(struct platform_device *pdev)
+static int sm501fb_probe(struct platform_device *pdev)
 {
        struct sm501fb_info *info;
        struct device *dev = &pdev->dev;
index 6101f5c2f62f5ce3b2d32e40ea2dc346831f9d49..395cb6a8d8f3a86e3507be05686218ebee6f7d6f 100644 (file)
@@ -36,7 +36,7 @@ struct ssd1307fb_par {
        int reset;
 };
 
-static struct fb_fix_screeninfo ssd1307fb_fix __devinitdata = {
+static struct fb_fix_screeninfo ssd1307fb_fix = {
        .id             = "Solomon SSD1307",
        .type           = FB_TYPE_PACKED_PIXELS,
        .visual         = FB_VISUAL_MONO10,
@@ -47,7 +47,7 @@ static struct fb_fix_screeninfo ssd1307fb_fix __devinitdata = {
        .accel          = FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo ssd1307fb_var __devinitdata = {
+static struct fb_var_screeninfo ssd1307fb_var = {
        .xres           = SSD1307FB_WIDTH,
        .yres           = SSD1307FB_HEIGHT,
        .xres_virtual   = SSD1307FB_WIDTH,
@@ -145,8 +145,8 @@ static void ssd1307fb_update_display(struct ssd1307fb_par *par)
                                u32 page_length = SSD1307FB_WIDTH * i;
                                u32 index = page_length + (SSD1307FB_WIDTH * k + j) / 8;
                                u8 byte = *(vmem + index);
-                               u8 bit = byte & (1 << (7 - (j % 8)));
-                               bit = bit >> (7 - (j % 8));
+                               u8 bit = byte & (1 << (j % 8));
+                               bit = bit >> (j % 8);
                                buf |= bit << k;
                        }
                        ssd1307fb_write_data(par->client, buf);
@@ -227,7 +227,8 @@ static struct fb_deferred_io ssd1307fb_defio = {
        .deferred_io    = ssd1307fb_deferred_io,
 };
 
-static int __devinit ssd1307fb_probe(struct i2c_client *client, const struct i2c_device_id *id)
+static int ssd1307fb_probe(struct i2c_client *client,
+                          const struct i2c_device_id *id)
 {
        struct fb_info *info;
        u32 vmem_size = SSD1307FB_WIDTH * SSD1307FB_HEIGHT / 8;
@@ -352,7 +353,7 @@ fb_alloc_error:
        return ret;
 }
 
-static int __devexit ssd1307fb_remove(struct i2c_client *client)
+static int ssd1307fb_remove(struct i2c_client *client)
 {
        struct fb_info *info = i2c_get_clientdata(client);
        struct ssd1307fb_par *par = info->par;
@@ -380,7 +381,7 @@ MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
 
 static struct i2c_driver ssd1307fb_driver = {
        .probe = ssd1307fb_probe,
-       .remove = __devexit_p(ssd1307fb_remove),
+       .remove = ssd1307fb_remove,
        .id_table = ssd1307fb_i2c_id,
        .driver = {
                .name = "ssd1307fb",
index 111fb32e87695c4343db204cc5b8dd703d725e30..9c00026e3ae24ea652aefab4b2127f6953789d33 100644 (file)
@@ -104,7 +104,7 @@ static bool slowpci;                /* slow PCI settings */
 */
 #define DEFAULT_VIDEO_MODE "640x480@60"
 
-static char *mode_option __devinitdata = DEFAULT_VIDEO_MODE;
+static char *mode_option = DEFAULT_VIDEO_MODE;
 
 enum {
        ID_VOODOO1 = 0,
@@ -113,7 +113,7 @@ enum {
 
 #define IS_VOODOO2(par) ((par)->type == ID_VOODOO2)
 
-static struct sst_spec voodoo_spec[] __devinitdata = {
+static struct sst_spec voodoo_spec[] = {
  { .name = "Voodoo Graphics", .default_gfx_clock = 50000, .max_gfxclk = 60 },
  { .name = "Voodoo2",        .default_gfx_clock = 75000, .max_gfxclk = 85 },
 };
@@ -822,7 +822,7 @@ static void sstfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
 /* 
  * get lfb size 
  */
-static int __devinit sst_get_memsize(struct fb_info *info, __u32 *memsize)
+static int sst_get_memsize(struct fb_info *info, __u32 *memsize)
 {
        u8 __iomem *fbbase_virt = info->screen_base;
 
@@ -865,7 +865,7 @@ static int __devinit sst_get_memsize(struct fb_info *info, __u32 *memsize)
 /* fbi should be idle, and fifo emty and mem disabled */
 /* supposed to detect AT&T ATT20C409 and Ti TVP3409 ramdacs */
 
-static int __devinit sst_detect_att(struct fb_info *info)
+static int sst_detect_att(struct fb_info *info)
 {
        struct sstfb_par *par = info->par;
        int i, mir, dir;
@@ -890,7 +890,7 @@ static int __devinit sst_detect_att(struct fb_info *info)
        return 0;
 }
 
-static int __devinit sst_detect_ti(struct fb_info *info)
+static int sst_detect_ti(struct fb_info *info)
 {
        struct sstfb_par *par = info->par;
        int i, mir, dir;
@@ -926,7 +926,7 @@ static int __devinit sst_detect_ti(struct fb_info *info)
  * touched...
  * is it really safe ? how can i reset this ramdac ? geee...
  */
-static int __devinit sst_detect_ics(struct fb_info *info)
+static int sst_detect_ics(struct fb_info *info)
 {
        struct sstfb_par *par = info->par;
        int m_clk0_1, m_clk0_7, m_clk1_b;
@@ -1105,7 +1105,7 @@ static void sst_set_vidmod_ics(struct fb_info *info, const int bpp)
  */
 
 
-static struct dac_switch dacs[] __devinitdata = {
+static struct dac_switch dacs[] = {
        {       .name           = "TI TVP3409",
                .detect         = sst_detect_ti,
                .set_pll        = sst_set_pll_att_ti,
@@ -1121,7 +1121,7 @@ static struct dac_switch dacs[] __devinitdata = {
                .set_vidmod     = sst_set_vidmod_ics },
 };
 
-static int __devinit sst_detect_dactype(struct fb_info *info, struct sstfb_par *par)
+static int sst_detect_dactype(struct fb_info *info, struct sstfb_par *par)
 {
        int i, ret = 0;
 
@@ -1140,7 +1140,7 @@ static int __devinit sst_detect_dactype(struct fb_info *info, struct sstfb_par *
 /*
  * Internal Routines
  */
-static int __devinit sst_init(struct fb_info *info, struct sstfb_par *par)
+static int sst_init(struct fb_info *info, struct sstfb_par *par)
 {
        u32 fbiinit0, fbiinit1, fbiinit4;
        struct pci_dev *dev = par->dev;
@@ -1239,7 +1239,7 @@ static int __devinit sst_init(struct fb_info *info, struct sstfb_par *par)
        return 1;
 }
 
-static void  __devexit sst_shutdown(struct fb_info *info)
+static void sst_shutdown(struct fb_info *info)
 {
        struct sstfb_par *par = info->par;
        struct pci_dev *dev = par->dev;
@@ -1271,7 +1271,7 @@ static void  __devexit sst_shutdown(struct fb_info *info)
 /*
  * Interface to the world
  */
-static int  __devinit sstfb_setup(char *options)
+static int sstfb_setup(char *options)
 {
        char *this_opt;
 
@@ -1317,8 +1317,7 @@ static struct fb_ops sstfb_ops = {
        .fb_ioctl       = sstfb_ioctl,
 };
 
-static int __devinit sstfb_probe(struct pci_dev *pdev,
-                       const struct pci_device_id *id)
+static int sstfb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct fb_info *info;
        struct fb_fix_screeninfo *fix;
@@ -1458,7 +1457,7 @@ fail_mmio_mem:
        return -ENXIO;  /* no voodoo detected */
 }
 
-static void __devexit sstfb_remove(struct pci_dev *pdev)
+static void sstfb_remove(struct pci_dev *pdev)
 {
        struct sstfb_par *par;
        struct fb_info *info;
@@ -1490,11 +1489,11 @@ static struct pci_driver sstfb_driver = {
        .name           = "sstfb",
        .id_table       = sstfb_id_tbl,
        .probe          = sstfb_probe,
-       .remove         = __devexit_p(sstfb_remove),
+       .remove         = sstfb_remove,
 };
 
 
-static int __devinit sstfb_init(void)
+static int sstfb_init(void)
 {
        char *option = NULL;
 
@@ -1505,7 +1504,7 @@ static int __devinit sstfb_init(void)
        return pci_register_driver(&sstfb_driver);
 }
 
-static void __devexit sstfb_exit(void)
+static void sstfb_exit(void)
 {
        pci_unregister_driver(&sstfb_driver);
 }
index 729a50722bdfb05138983fbf50c0e74145a97f6d..cc6f48bba36be34f167710f0be7ed7e50da601fa 100644 (file)
@@ -25,7 +25,7 @@ struct gfb_info {
        u32                     pseudo_palette[16];
 };
 
-static int __devinit gfb_get_props(struct gfb_info *gp)
+static int gfb_get_props(struct gfb_info *gp)
 {
        gp->width = of_getintprop_default(gp->of_node, "width", 0);
        gp->height = of_getintprop_default(gp->of_node, "height", 0);
@@ -66,7 +66,7 @@ static struct fb_ops gfb_ops = {
        .fb_imageblit           = cfb_imageblit,
 };
 
-static int __devinit gfb_set_fbinfo(struct gfb_info *gp)
+static int gfb_set_fbinfo(struct gfb_info *gp)
 {
        struct fb_info *info = gp->info;
        struct fb_var_screeninfo *var = &info->var;
@@ -111,7 +111,7 @@ static int __devinit gfb_set_fbinfo(struct gfb_info *gp)
         return 0;
 }
 
-static int __devinit gfb_probe(struct platform_device *op)
+static int gfb_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct fb_info *info;
@@ -173,7 +173,7 @@ err_out:
        return err;
 }
 
-static int __devexit gfb_remove(struct platform_device *op)
+static int gfb_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct gfb_info *gp = info->par;
@@ -201,7 +201,7 @@ MODULE_DEVICE_TABLE(of, ffb_match);
 
 static struct platform_driver gfb_driver = {
        .probe          = gfb_probe,
-       .remove         = __devexit_p(gfb_remove),
+       .remove         = gfb_remove,
        .driver = {
                .name           = "gfb",
                .owner          = THIS_MODULE,
index 7fbcba86d1a223c185069297b9a96033d70deded..843b6bab0483bb60d357f38129638cc61411121f 100644 (file)
@@ -29,7 +29,7 @@ struct s3d_info {
        u32                     pseudo_palette[16];
 };
 
-static int __devinit s3d_get_props(struct s3d_info *sp)
+static int s3d_get_props(struct s3d_info *sp)
 {
        sp->width = of_getintprop_default(sp->of_node, "width", 0);
        sp->height = of_getintprop_default(sp->of_node, "height", 0);
@@ -70,7 +70,7 @@ static struct fb_ops s3d_ops = {
        .fb_imageblit           = cfb_imageblit,
 };
 
-static int __devinit s3d_set_fbinfo(struct s3d_info *sp)
+static int s3d_set_fbinfo(struct s3d_info *sp)
 {
        struct fb_info *info = sp->info;
        struct fb_var_screeninfo *var = &info->var;
@@ -115,8 +115,8 @@ static int __devinit s3d_set_fbinfo(struct s3d_info *sp)
         return 0;
 }
 
-static int __devinit s3d_pci_register(struct pci_dev *pdev,
-                                     const struct pci_device_id *ent)
+static int s3d_pci_register(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        struct fb_info *info;
        struct s3d_info *sp;
@@ -219,7 +219,7 @@ err_out:
        return err;
 }
 
-static void __devexit s3d_pci_unregister(struct pci_dev *pdev)
+static void s3d_pci_unregister(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct s3d_info *sp = info->par;
@@ -251,7 +251,7 @@ static struct pci_driver s3d_driver = {
        .name           = "s3d",
        .id_table       = s3d_pci_table,
        .probe          = s3d_pci_register,
-       .remove         = __devexit_p(s3d_pci_unregister),
+       .remove         = s3d_pci_unregister,
 };
 
 static int __init s3d_init(void)
index 6c71b1b44477322eb1a45b312aa8a0b780e3f9ad..387350d004df7caa1ec5d566c905e2c231a95dc8 100644 (file)
@@ -51,7 +51,7 @@ struct e3d_info {
        u32                     pseudo_palette[16];
 };
 
-static int __devinit e3d_get_props(struct e3d_info *ep)
+static int e3d_get_props(struct e3d_info *ep)
 {
        ep->width = of_getintprop_default(ep->of_node, "width", 0);
        ep->height = of_getintprop_default(ep->of_node, "height", 0);
@@ -193,7 +193,7 @@ static struct fb_ops e3d_ops = {
        .fb_imageblit           = e3d_imageblit,
 };
 
-static int __devinit e3d_set_fbinfo(struct e3d_info *ep)
+static int e3d_set_fbinfo(struct e3d_info *ep)
 {
        struct fb_info *info = ep->info;
        struct fb_var_screeninfo *var = &info->var;
@@ -238,8 +238,8 @@ static int __devinit e3d_set_fbinfo(struct e3d_info *ep)
         return 0;
 }
 
-static int __devinit e3d_pci_register(struct pci_dev *pdev,
-                                     const struct pci_device_id *ent)
+static int e3d_pci_register(struct pci_dev *pdev,
+                           const struct pci_device_id *ent)
 {
        struct device_node *of_node;
        const char *device_type;
@@ -392,7 +392,7 @@ err_out:
        return err;
 }
 
-static void __devexit e3d_pci_unregister(struct pci_dev *pdev)
+static void e3d_pci_unregister(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct e3d_info *ep = info->par;
@@ -437,7 +437,7 @@ static struct pci_driver e3d_driver = {
        .name           = "e3d",
        .id_table       = e3d_pci_table,
        .probe          = e3d_pci_register,
-       .remove         = __devexit_p(e3d_pci_unregister),
+       .remove         = e3d_pci_unregister,
 };
 
 static int __init e3d_init(void)
index 07c66e9466343bec9b9f7cd0741698903d44e1e5..c000852500aa06822f19bb713b5f0b27c94359ab 100644 (file)
@@ -362,7 +362,7 @@ static void tcx_unmap_regs(struct platform_device *op, struct fb_info *info,
                           info->screen_base, info->fix.smem_len);
 }
 
-static int __devinit tcx_probe(struct platform_device *op)
+static int tcx_probe(struct platform_device *op)
 {
        struct device_node *dp = op->dev.of_node;
        struct fb_info *info;
@@ -486,7 +486,7 @@ out_err:
        return err;
 }
 
-static int __devexit tcx_remove(struct platform_device *op)
+static int tcx_remove(struct platform_device *op)
 {
        struct fb_info *info = dev_get_drvdata(&op->dev);
        struct tcx_par *par = info->par;
@@ -518,7 +518,7 @@ static struct platform_driver tcx_driver = {
                .of_match_table = tcx_match,
        },
        .probe          = tcx_probe,
-       .remove         = __devexit_p(tcx_remove),
+       .remove         = tcx_remove,
 };
 
 static int __init tcx_init(void)
index e026724a3a56528a3782e87f9615109bdcd1811f..64bc28ba40375cdca47cd3219bba3e61b4a89d70 100644 (file)
@@ -100,7 +100,7 @@ static inline int mtrr_del(int reg, unsigned long base,
 #define VOODOO3_MAX_PIXCLOCK 300000
 #define VOODOO5_MAX_PIXCLOCK 350000
 
-static struct fb_fix_screeninfo tdfx_fix __devinitdata = {
+static struct fb_fix_screeninfo tdfx_fix = {
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_PSEUDOCOLOR,
        .ypanstep =     1,
@@ -108,7 +108,7 @@ static struct fb_fix_screeninfo tdfx_fix __devinitdata = {
        .accel =        FB_ACCEL_3DFX_BANSHEE
 };
 
-static struct fb_var_screeninfo tdfx_var __devinitdata = {
+static struct fb_var_screeninfo tdfx_var = {
        /* "640x480, 8 bpp @ 60 Hz */
        .xres =         640,
        .yres =         480,
@@ -135,9 +135,8 @@ static struct fb_var_screeninfo tdfx_var __devinitdata = {
 /*
  * PCI driver prototypes
  */
-static int __devinit tdfxfb_probe(struct pci_dev *pdev,
-                                 const struct pci_device_id *id);
-static void __devexit tdfxfb_remove(struct pci_dev *pdev);
+static int tdfxfb_probe(struct pci_dev *pdev, const struct pci_device_id *id);
+static void tdfxfb_remove(struct pci_dev *pdev);
 
 static struct pci_device_id tdfxfb_id_table[] = {
        { PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE,
@@ -156,7 +155,7 @@ static struct pci_driver tdfxfb_driver = {
        .name           = "tdfxfb",
        .id_table       = tdfxfb_id_table,
        .probe          = tdfxfb_probe,
-       .remove         = __devexit_p(tdfxfb_remove),
+       .remove         = tdfxfb_remove,
 };
 
 MODULE_DEVICE_TABLE(pci, tdfxfb_id_table);
@@ -167,9 +166,9 @@ MODULE_DEVICE_TABLE(pci, tdfxfb_id_table);
 static int nopan;
 static int nowrap = 1;      /* not implemented (yet) */
 static int hwcursor = 1;
-static char *mode_option __devinitdata;
+static char *mode_option;
 /* mtrr option */
-static bool nomtrr __devinitdata;
+static bool nomtrr;
 
 /* -------------------------------------------------------------------------
  *                     Hardware-specific funcions
@@ -1279,8 +1278,8 @@ static int tdfxfb_ddc_getsda(void *data)
        return (0 != (tdfx_inl(par, VIDSERPARPORT) & DDC_SDA_IN));
 }
 
-static int __devinit tdfxfb_setup_ddc_bus(struct tdfxfb_i2c_chan *chan,
-                                         const char *name, struct device *dev)
+static int tdfxfb_setup_ddc_bus(struct tdfxfb_i2c_chan *chan, const char *name,
+                               struct device *dev)
 {
        int rc;
 
@@ -1308,8 +1307,8 @@ static int __devinit tdfxfb_setup_ddc_bus(struct tdfxfb_i2c_chan *chan,
        return rc;
 }
 
-static int __devinit tdfxfb_setup_i2c_bus(struct tdfxfb_i2c_chan *chan,
-                                         const char *name, struct device *dev)
+static int tdfxfb_setup_i2c_bus(struct tdfxfb_i2c_chan *chan, const char *name,
+                               struct device *dev)
 {
        int rc;
 
@@ -1336,7 +1335,7 @@ static int __devinit tdfxfb_setup_i2c_bus(struct tdfxfb_i2c_chan *chan,
        return rc;
 }
 
-static void __devinit tdfxfb_create_i2c_busses(struct fb_info *info)
+static void tdfxfb_create_i2c_busses(struct fb_info *info)
 {
        struct tdfx_par *par = info->par;
 
@@ -1388,8 +1387,7 @@ static int tdfxfb_probe_i2c_connector(struct tdfx_par *par,
  *      Initializes and allocates resources for PCI device @pdev.
  *
  */
-static int __devinit tdfxfb_probe(struct pci_dev *pdev,
-                                 const struct pci_device_id *id)
+static int tdfxfb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct tdfx_par *default_par;
        struct fb_info *info;
@@ -1626,7 +1624,7 @@ static void __init tdfxfb_setup(char *options)
  *      lifetime for the PCI device @pdev.
  *
  */
-static void __devexit tdfxfb_remove(struct pci_dev *pdev)
+static void tdfxfb_remove(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
        struct tdfx_par *par = info->par;
index aba7686b1a32fe76c7259fa48e3d3cad5c6369b9..c9c8e5a1fdeef75e7b5a38039514f68f8abebec1 100644 (file)
@@ -61,8 +61,8 @@ static void tgafb_fillrect(struct fb_info *, const struct fb_fillrect *);
 static void tgafb_copyarea(struct fb_info *, const struct fb_copyarea *);
 static int tgafb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info);
 
-static int __devinit tgafb_register(struct device *dev);
-static void __devexit tgafb_unregister(struct device *dev);
+static int tgafb_register(struct device *dev);
+static void tgafb_unregister(struct device *dev);
 
 static const char *mode_option;
 static const char *mode_option_pci = "640x480@60";
@@ -93,9 +93,8 @@ static struct fb_ops tgafb_ops = {
 /*
  *  PCI registration operations
  */
-static int __devinit tgafb_pci_register(struct pci_dev *,
-                                       const struct pci_device_id *);
-static void __devexit tgafb_pci_unregister(struct pci_dev *);
+static int tgafb_pci_register(struct pci_dev *, const struct pci_device_id *);
+static void tgafb_pci_unregister(struct pci_dev *);
 
 static struct pci_device_id const tgafb_pci_table[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA) },
@@ -107,17 +106,16 @@ static struct pci_driver tgafb_pci_driver = {
        .name                   = "tgafb",
        .id_table               = tgafb_pci_table,
        .probe                  = tgafb_pci_register,
-       .remove                 = __devexit_p(tgafb_pci_unregister),
+       .remove                 = tgafb_pci_unregister,
 };
 
-static int __devinit
-tgafb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int tgafb_pci_register(struct pci_dev *pdev,
+                             const struct pci_device_id *ent)
 {
        return tgafb_register(&pdev->dev);
 }
 
-static void __devexit
-tgafb_pci_unregister(struct pci_dev *pdev)
+static void tgafb_pci_unregister(struct pci_dev *pdev)
 {
        tgafb_unregister(&pdev->dev);
 }
@@ -127,8 +125,8 @@ tgafb_pci_unregister(struct pci_dev *pdev)
 /*
  *  TC registration operations
  */
-static int __devinit tgafb_tc_register(struct device *);
-static int __devexit tgafb_tc_unregister(struct device *);
+static int tgafb_tc_register(struct device *);
+static int tgafb_tc_unregister(struct device *);
 
 static struct tc_device_id const tgafb_tc_table[] = {
        { "DEC     ", "PMAGD-AA" },
@@ -143,12 +141,11 @@ static struct tc_driver tgafb_tc_driver = {
                .name           = "tgafb",
                .bus            = &tc_bus_type,
                .probe          = tgafb_tc_register,
-               .remove         = __devexit_p(tgafb_tc_unregister),
+               .remove         = tgafb_tc_unregister,
        },
 };
 
-static int __devinit
-tgafb_tc_register(struct device *dev)
+static int tgafb_tc_register(struct device *dev)
 {
        int status = tgafb_register(dev);
        if (!status)
@@ -156,8 +153,7 @@ tgafb_tc_register(struct device *dev)
        return status;
 }
 
-static int __devexit
-tgafb_tc_unregister(struct device *dev)
+static int tgafb_tc_unregister(struct device *dev)
 {
        put_device(dev);
        tgafb_unregister(dev);
@@ -1546,8 +1542,7 @@ static int tgafb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info
        return 0;
 }
 
-static int __devinit
-tgafb_register(struct device *dev)
+static int tgafb_register(struct device *dev)
 {
        static const struct fb_videomode modedb_tc = {
                /* 1280x1024 @ 72 Hz, 76.8 kHz hsync */
@@ -1692,8 +1687,7 @@ tgafb_register(struct device *dev)
        return ret;
 }
 
-static void __devexit
-tgafb_unregister(struct device *dev)
+static void tgafb_unregister(struct device *dev)
 {
        resource_size_t bar0_start = 0, bar0_len = 0;
        int tga_bus_pci = TGA_BUS_PCI(dev);
@@ -1721,16 +1715,14 @@ tgafb_unregister(struct device *dev)
        framebuffer_release(info);
 }
 
-static void __devexit
-tgafb_exit(void)
+static void tgafb_exit(void)
 {
        tc_unregister_driver(&tgafb_tc_driver);
        pci_unregister_driver(&tgafb_pci_driver);
 }
 
 #ifndef MODULE
-static int __devinit
-tgafb_setup(char *arg)
+static int tgafb_setup(char *arg)
 {
        char *this_opt;
 
@@ -1751,8 +1743,7 @@ tgafb_setup(char *arg)
 }
 #endif /* !MODULE */
 
-static int __devinit
-tgafb_init(void)
+static int tgafb_init(void)
 {
        int status;
 #ifndef MODULE
index b244f060f1511554491522889c138fc43cd864ba..dc4fb862015605738fba8ca7eb07aac1ca0a5b9e 100644 (file)
 #define LCR_VCLKHW             0x1b4 /* VCLK High Width                */
 #define LCR_OC                 0x1b6 /* Output Control                 */
 
-static char *mode_option __devinitdata;
+static char *mode_option;
 
 struct tmiofb_par {
        u32                             pseudo_palette[16];
@@ -675,7 +675,7 @@ static struct fb_ops tmiofb_ops = {
 
 /*--------------------------------------------------------------------------*/
 
-static int __devinit tmiofb_probe(struct platform_device *dev)
+static int tmiofb_probe(struct platform_device *dev)
 {
        const struct mfd_cell *cell = mfd_get_cell(dev);
        struct tmio_fb_data *data = dev->dev.platform_data;
@@ -807,7 +807,7 @@ err_ioremap_ccr:
        return retval;
 }
 
-static int __devexit tmiofb_remove(struct platform_device *dev)
+static int tmiofb_remove(struct platform_device *dev)
 {
        const struct mfd_cell *cell = mfd_get_cell(dev);
        struct fb_info *info = platform_get_drvdata(dev);
@@ -1002,7 +1002,7 @@ static struct platform_driver tmiofb_driver = {
        .driver.name    = "tmio-fb",
        .driver.owner   = THIS_MODULE,
        .probe          = tmiofb_probe,
-       .remove         = __devexit_p(tmiofb_remove),
+       .remove         = tmiofb_remove,
        .suspend        = tmiofb_suspend,
        .resume         = tmiofb_resume,
 };
index 34cf019bba44b64dc9c5a09ec4683efac8ff262c..ab57d387d6b5ffc093407ad9b2a0d55ddb8fe50e 100644 (file)
@@ -53,19 +53,19 @@ static struct fb_fix_screeninfo tridentfb_fix = {
 /* defaults which are normally overriden by user values */
 
 /* video mode */
-static char *mode_option __devinitdata = "640x480-8@60";
-static int bpp __devinitdata = 8;
+static char *mode_option = "640x480-8@60";
+static int bpp = 8;
 
-static int noaccel __devinitdata;
+static int noaccel;
 
 static int center;
 static int stretch;
 
-static int fp __devinitdata;
-static int crt __devinitdata;
+static int fp;
+static int crt;
 
-static int memsize __devinitdata;
-static int memdiff __devinitdata;
+static int memsize;
+static int memdiff;
 static int nativex;
 
 module_param(mode_option, charp, 0);
@@ -637,7 +637,7 @@ static inline void crtc_unlock(struct tridentfb_par *par)
 }
 
 /*  Return flat panel's maximum x resolution */
-static int __devinit get_nativex(struct tridentfb_par *par)
+static int get_nativex(struct tridentfb_par *par)
 {
        int x, y, tmp;
 
@@ -771,7 +771,7 @@ static void set_number_of_lines(struct tridentfb_par *par, int lines)
  * If we see that FP is active we assume we have one.
  * Otherwise we have a CRT display. User can override.
  */
-static int __devinit is_flatpanel(struct tridentfb_par *par)
+static int is_flatpanel(struct tridentfb_par *par)
 {
        if (fp)
                return 1;
@@ -781,7 +781,7 @@ static int __devinit is_flatpanel(struct tridentfb_par *par)
 }
 
 /* Try detecting the video memory size */
-static unsigned int __devinit get_memsize(struct tridentfb_par *par)
+static unsigned int get_memsize(struct tridentfb_par *par)
 {
        unsigned char tmp, tmp2;
        unsigned int k;
@@ -1331,8 +1331,8 @@ static struct fb_ops tridentfb_ops = {
        .fb_sync = tridentfb_sync,
 };
 
-static int __devinit trident_pci_probe(struct pci_dev *dev,
-                                      const struct pci_device_id *id)
+static int trident_pci_probe(struct pci_dev *dev,
+                            const struct pci_device_id *id)
 {
        int err;
        unsigned char revision;
@@ -1543,7 +1543,7 @@ out_unmap1:
        return err;
 }
 
-static void __devexit trident_pci_remove(struct pci_dev *dev)
+static void trident_pci_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
        struct tridentfb_par *par = info->par;
@@ -1591,7 +1591,7 @@ static struct pci_driver tridentfb_pci_driver = {
        .name = "tridentfb",
        .id_table = trident_devices,
        .probe = trident_pci_probe,
-       .remove = __devexit_p(trident_pci_remove)
+       .remove = trident_pci_remove,
 };
 
 /*
index 2f8f82d874a15995b375a7250d5eb259711d9a69..b75db01864883e5fea61f63cc95e3df35e749ea2 100644 (file)
@@ -36,26 +36,26 @@ static struct cb_id uvesafb_cn_id = {
 static char v86d_path[PATH_MAX] = "/sbin/v86d";
 static char v86d_started;      /* has v86d been started by uvesafb? */
 
-static struct fb_fix_screeninfo uvesafb_fix __devinitdata = {
+static struct fb_fix_screeninfo uvesafb_fix = {
        .id     = "VESA VGA",
        .type   = FB_TYPE_PACKED_PIXELS,
        .accel  = FB_ACCEL_NONE,
        .visual = FB_VISUAL_TRUECOLOR,
 };
 
-static int mtrr                __devinitdata = 3; /* enable mtrr by default */
-static bool blank      = 1;               /* enable blanking by default */
-static int ypan                = 1;             /* 0: scroll, 1: ypan, 2: ywrap */
-static bool pmi_setpal __devinitdata = true; /* use PMI for palette changes */
-static bool nocrtc     __devinitdata; /* ignore CRTC settings */
-static bool noedid     __devinitdata; /* don't try DDC transfers */
-static int vram_remap  __devinitdata; /* set amt. of memory to be used */
-static int vram_total  __devinitdata; /* set total amount of memory */
-static u16 maxclk      __devinitdata; /* maximum pixel clock */
-static u16 maxvf       __devinitdata; /* maximum vertical frequency */
-static u16 maxhf       __devinitdata; /* maximum horizontal frequency */
-static u16 vbemode     __devinitdata; /* force use of a specific VBE mode */
-static char *mode_option __devinitdata;
+static int mtrr                = 3;    /* enable mtrr by default */
+static bool blank      = 1;    /* enable blanking by default */
+static int ypan                = 1;    /* 0: scroll, 1: ypan, 2: ywrap */
+static bool pmi_setpal = true; /* use PMI for palette changes */
+static bool nocrtc;            /* ignore CRTC settings */
+static bool noedid;            /* don't try DDC transfers */
+static int vram_remap;         /* set amt. of memory to be used */
+static int vram_total;         /* set total amount of memory */
+static u16 maxclk;             /* maximum pixel clock */
+static u16 maxvf;              /* maximum vertical frequency */
+static u16 maxhf;              /* maximum horizontal frequency */
+static u16 vbemode;            /* force use of a specific VBE mode */
+static char *mode_option;
 static u8  dac_width   = 6;
 
 static struct uvesafb_ktask *uvfb_tasks[UVESAFB_TASKS_MAX];
@@ -418,8 +418,8 @@ static void uvesafb_vbe_state_restore(struct uvesafb_par *par, u8 *state_buf)
        uvesafb_free(task);
 }
 
-static int __devinit uvesafb_vbe_getinfo(struct uvesafb_ktask *task,
-               struct uvesafb_par *par)
+static int uvesafb_vbe_getinfo(struct uvesafb_ktask *task,
+                              struct uvesafb_par *par)
 {
        int err;
 
@@ -477,8 +477,8 @@ static int __devinit uvesafb_vbe_getinfo(struct uvesafb_ktask *task,
        return 0;
 }
 
-static int __devinit uvesafb_vbe_getmodes(struct uvesafb_ktask *task,
-               struct uvesafb_par *par)
+static int uvesafb_vbe_getmodes(struct uvesafb_ktask *task,
+                               struct uvesafb_par *par)
 {
        int off = 0, err;
        u16 *mode;
@@ -556,8 +556,8 @@ static int __devinit uvesafb_vbe_getmodes(struct uvesafb_ktask *task,
  * x86 and not x86_64.
  */
 #ifdef CONFIG_X86_32
-static int __devinit uvesafb_vbe_getpmi(struct uvesafb_ktask *task,
-               struct uvesafb_par *par)
+static int uvesafb_vbe_getpmi(struct uvesafb_ktask *task,
+                             struct uvesafb_par *par)
 {
        int i, err;
 
@@ -602,8 +602,8 @@ static int __devinit uvesafb_vbe_getpmi(struct uvesafb_ktask *task,
  * Check whether a video mode is supported by the Video BIOS and is
  * compatible with the monitor limits.
  */
-static int __devinit uvesafb_is_valid_mode(struct fb_videomode *mode,
-               struct fb_info *info)
+static int uvesafb_is_valid_mode(struct fb_videomode *mode,
+                                struct fb_info *info)
 {
        if (info->monspecs.gtf) {
                fb_videomode_to_var(&info->var, mode);
@@ -618,8 +618,7 @@ static int __devinit uvesafb_is_valid_mode(struct fb_videomode *mode,
        return 1;
 }
 
-static int __devinit uvesafb_vbe_getedid(struct uvesafb_ktask *task,
-               struct fb_info *info)
+static int uvesafb_vbe_getedid(struct uvesafb_ktask *task, struct fb_info *info)
 {
        struct uvesafb_par *par = info->par;
        int err = 0;
@@ -684,8 +683,8 @@ static int __devinit uvesafb_vbe_getedid(struct uvesafb_ktask *task,
        return err;
 }
 
-static void __devinit uvesafb_vbe_getmonspecs(struct uvesafb_ktask *task,
-               struct fb_info *info)
+static void uvesafb_vbe_getmonspecs(struct uvesafb_ktask *task,
+                                   struct fb_info *info)
 {
        struct uvesafb_par *par = info->par;
        int i;
@@ -765,8 +764,8 @@ static void __devinit uvesafb_vbe_getmonspecs(struct uvesafb_ktask *task,
        return;
 }
 
-static void __devinit uvesafb_vbe_getstatesize(struct uvesafb_ktask *task,
-               struct uvesafb_par *par)
+static void uvesafb_vbe_getstatesize(struct uvesafb_ktask *task,
+                                    struct uvesafb_par *par)
 {
        int err;
 
@@ -794,7 +793,7 @@ static void __devinit uvesafb_vbe_getstatesize(struct uvesafb_ktask *task,
        par->vbe_state_size = 64 * (task->t.regs.ebx & 0xffff);
 }
 
-static int __devinit uvesafb_vbe_init(struct fb_info *info)
+static int uvesafb_vbe_init(struct fb_info *info)
 {
        struct uvesafb_ktask *task = NULL;
        struct uvesafb_par *par = info->par;
@@ -839,7 +838,7 @@ out:        uvesafb_free(task);
        return err;
 }
 
-static int __devinit uvesafb_vbe_init_mode(struct fb_info *info)
+static int uvesafb_vbe_init_mode(struct fb_info *info)
 {
        struct list_head *pos;
        struct fb_modelist *modelist;
@@ -1444,8 +1443,7 @@ static struct fb_ops uvesafb_ops = {
        .fb_set_par     = uvesafb_set_par,
 };
 
-static void __devinit uvesafb_init_info(struct fb_info *info,
-               struct vbe_mode_ib *mode)
+static void uvesafb_init_info(struct fb_info *info, struct vbe_mode_ib *mode)
 {
        unsigned int size_vmode;
        unsigned int size_remap;
@@ -1540,7 +1538,7 @@ static void __devinit uvesafb_init_info(struct fb_info *info,
                info->fbops->fb_pan_display = NULL;
 }
 
-static void __devinit uvesafb_init_mtrr(struct fb_info *info)
+static void uvesafb_init_mtrr(struct fb_info *info)
 {
 #ifdef CONFIG_MTRR
        if (mtrr && !(info->fix.smem_start & (PAGE_SIZE - 1))) {
@@ -1582,7 +1580,7 @@ static void __devinit uvesafb_init_mtrr(struct fb_info *info)
 #endif /* CONFIG_MTRR */
 }
 
-static void __devinit uvesafb_ioremap(struct fb_info *info)
+static void uvesafb_ioremap(struct fb_info *info)
 {
 #ifdef CONFIG_X86
        switch (mtrr) {
@@ -1738,7 +1736,7 @@ static struct attribute_group uvesafb_dev_attgrp = {
        .attrs = uvesafb_dev_attrs,
 };
 
-static int __devinit uvesafb_probe(struct platform_device *dev)
+static int uvesafb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct vbe_mode_ib *mode = NULL;
@@ -1882,7 +1880,7 @@ static struct platform_driver uvesafb_driver = {
 static struct platform_device *uvesafb_device;
 
 #ifndef MODULE
-static int __devinit uvesafb_setup(char *options)
+static int uvesafb_setup(char *options)
 {
        char *this_opt;
 
@@ -1950,7 +1948,7 @@ static ssize_t store_v86d(struct device_driver *dev, const char *buf,
 
 static DRIVER_ATTR(v86d, S_IRUGO | S_IWUSR, show_v86d, store_v86d);
 
-static int __devinit uvesafb_init(void)
+static int uvesafb_init(void)
 {
        int err;
 
@@ -1994,7 +1992,7 @@ static int __devinit uvesafb_init(void)
 
 module_init(uvesafb_init);
 
-static void __devexit uvesafb_exit(void)
+static void uvesafb_exit(void)
 {
        struct uvesafb_ktask *task;
 
index 4709edc3cb7f3057f7de9d8d63555f3fd1aa2cea..0aa516fc59cde498343bedf801b0d07c022b28e1 100644 (file)
@@ -393,7 +393,7 @@ static void vmlfb_release_devices(struct vml_par *par)
  * Free up allocated resources for a device.
  */
 
-static void __devexit vml_pci_remove(struct pci_dev *dev)
+static void vml_pci_remove(struct pci_dev *dev)
 {
        struct fb_info *info;
        struct vml_info *vinfo;
@@ -452,8 +452,7 @@ static void vmlfb_set_pref_pixel_format(struct fb_var_screeninfo *var)
  * struct per pipe. Currently we have only one pipe.
  */
 
-static int __devinit vml_pci_probe(struct pci_dev *dev,
-                                  const struct pci_device_id *id)
+static int vml_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct vml_info *vinfo;
        struct fb_info *info;
@@ -1060,7 +1059,7 @@ static struct pci_driver vmlfb_pci_driver = {
        .name = "vmlfb",
        .id_table = vml_ids,
        .probe = vml_pci_probe,
-       .remove = __devexit_p(vml_pci_remove)
+       .remove = vml_pci_remove,
 };
 
 static void __exit vmlfb_cleanup(void)
index c7f692525b8849a64a492577bde6861c55bae71d..8bc1f9398945a2c99b9e45286064499d4dfd88fe 100644 (file)
@@ -78,7 +78,7 @@ static void rvfree(void *mem, unsigned long size)
        vfree(mem);
 }
 
-static struct fb_var_screeninfo vfb_default __devinitdata = {
+static struct fb_var_screeninfo vfb_default = {
        .xres =         640,
        .yres =         480,
        .xres_virtual = 640,
@@ -100,7 +100,7 @@ static struct fb_var_screeninfo vfb_default __devinitdata = {
        .vmode =        FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_fix_screeninfo vfb_fix __devinitdata = {
+static struct fb_fix_screeninfo vfb_fix = {
        .id =           "Virtual FB",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_PSEUDOCOLOR,
@@ -477,7 +477,7 @@ static int __init vfb_setup(char *options)
      *  Initialisation
      */
 
-static int __devinit vfb_probe(struct platform_device *dev)
+static int vfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int retval = -ENOMEM;
index 0267acd8dc832690e3f02709a9e99361a8979805..545faeccdb445f78fc4eaf3809b2c65c792edd55 100644 (file)
@@ -65,7 +65,7 @@ struct vga16fb_par {
 
 /* --------------------------------------------------------------------- */
 
-static struct fb_var_screeninfo vga16fb_defined __devinitdata = {
+static struct fb_var_screeninfo vga16fb_defined = {
        .xres           = 640,
        .yres           = 480,
        .xres_virtual   = 640,
@@ -85,7 +85,7 @@ static struct fb_var_screeninfo vga16fb_defined __devinitdata = {
 };
 
 /* name should not depend on EGA/VGA */
-static struct fb_fix_screeninfo vga16fb_fix __devinitdata = {
+static struct fb_fix_screeninfo vga16fb_fix = {
        .id             = "VGA16 VGA",
        .smem_start     = VGA_FB_PHYS,
        .smem_len       = VGA_FB_PHYS_LEN,
@@ -1303,7 +1303,7 @@ static int __init vga16fb_setup(char *options)
 }
 #endif
 
-static int __devinit vga16fb_probe(struct platform_device *dev)
+static int vga16fb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct vga16fb_par *par;
@@ -1395,7 +1395,7 @@ static int __devinit vga16fb_probe(struct platform_device *dev)
        return ret;
 }
 
-static int __devexit vga16fb_remove(struct platform_device *dev)
+static int vga16fb_remove(struct platform_device *dev)
 {
        struct fb_info *info = platform_get_drvdata(dev);
 
@@ -1407,7 +1407,7 @@ static int __devexit vga16fb_remove(struct platform_device *dev)
 
 static struct platform_driver vga16fb_driver = {
        .probe = vga16fb_probe,
-       .remove = __devexit_p(vga16fb_remove),
+       .remove = vga16fb_remove,
        .driver = {
                .name = "vga16fb",
        },
index 6be72f0ba21d16a7d23b8bb2b0d465d7efd50027..7789553952d3b1fdac3e9a23e6f63edf1cdae4aa 100644 (file)
@@ -25,7 +25,7 @@
 static void tmds_register_write(int index, u8 data);
 static int tmds_register_read(int index);
 static int tmds_register_read_bytes(int index, u8 *buff, int buff_len);
-static void __devinit dvi_get_panel_size_from_DDCv1(
+static void dvi_get_panel_size_from_DDCv1(
        struct tmds_chip_information *tmds_chip,
        struct tmds_setting_information *tmds_setting);
 static int viafb_dvi_query_EDID(void);
@@ -35,8 +35,8 @@ static inline bool check_tmds_chip(int device_id_subaddr, int device_id)
        return tmds_register_read(device_id_subaddr) == device_id;
 }
 
-void __devinit viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
-       struct tmds_setting_information *tmds_setting)
+void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
+                        struct tmds_setting_information *tmds_setting)
 {
        DEBUG_MSG(KERN_INFO "viafb_init_dvi_size()\n");
 
@@ -47,7 +47,7 @@ void __devinit viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
        return;
 }
 
-bool __devinit viafb_tmds_trasmitter_identify(void)
+bool viafb_tmds_trasmitter_identify(void)
 {
        unsigned char sr2a = 0, sr1e = 0, sr3e = 0;
 
@@ -285,7 +285,7 @@ static int viafb_dvi_query_EDID(void)
 }
 
 /* Get Panel Size Using EDID1 Table */
-static void __devinit dvi_get_panel_size_from_DDCv1(
+static void dvi_get_panel_size_from_DDCv1(
        struct tmds_chip_information *tmds_chip,
        struct tmds_setting_information *tmds_setting)
 {
index db757850c2167228ab315a10321aec7ef0db8291..4c6bfba57d11ad87f6bd1d6c8be153e80142aa71 100644 (file)
@@ -56,8 +56,8 @@
 int viafb_dvi_sense(void);
 void viafb_dvi_disable(void);
 void viafb_dvi_enable(void);
-bool __devinit viafb_tmds_trasmitter_identify(void);
-void __devinit viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
+bool viafb_tmds_trasmitter_identify(void);
+void viafb_init_dvi_size(struct tmds_chip_information *tmds_chip,
        struct tmds_setting_information *tmds_setting);
 void viafb_dvi_set_mode(const struct fb_var_screeninfo *var,
        u16 cxres, u16 cyres, int iga);
index 898590db5e14d5ecc3a887dfe4a18c9cf30a4a00..80233dae358ae1e1784d647e41382f90603bd23c 100644 (file)
@@ -465,9 +465,9 @@ static struct via_device_mapping device_mapping[] = {
 static struct via_clock clock;
 
 static void load_fix_bit_crtc_reg(void);
-static void __devinit init_gfx_chip_info(int chip_type);
-static void __devinit init_tmds_chip_info(void);
-static void __devinit init_lvds_chip_info(void);
+static void init_gfx_chip_info(int chip_type);
+static void init_tmds_chip_info(void);
+static void init_lvds_chip_info(void);
 static void device_screen_off(void);
 static void device_screen_on(void);
 static void set_display_channel(void);
@@ -1507,7 +1507,7 @@ void viafb_fill_crtc_timing(const struct fb_var_screeninfo *var,
        viafb_set_vclock(PICOS2KHZ(var->pixclock) * 1000, iga);
 }
 
-void __devinit viafb_init_chip_info(int chip_type)
+void viafb_init_chip_info(int chip_type)
 {
        via_clock_init(&clock, chip_type);
        init_gfx_chip_info(chip_type);
@@ -1540,7 +1540,7 @@ void viafb_update_device_setting(int hres, int vres, int bpp, int flag)
        }
 }
 
-static void __devinit init_gfx_chip_info(int chip_type)
+static void init_gfx_chip_info(int chip_type)
 {
        u8 tmp;
 
@@ -1593,7 +1593,7 @@ static void __devinit init_gfx_chip_info(int chip_type)
        }
 }
 
-static void __devinit init_tmds_chip_info(void)
+static void init_tmds_chip_info(void)
 {
        viafb_tmds_trasmitter_identify();
 
@@ -1638,7 +1638,7 @@ static void __devinit init_tmds_chip_info(void)
                &viaparinfo->shared->tmds_setting_info);
 }
 
-static void __devinit init_lvds_chip_info(void)
+static void init_lvds_chip_info(void)
 {
        viafb_lvds_trasmitter_identify();
        viafb_init_lcd_size();
@@ -1672,7 +1672,7 @@ static void __devinit init_lvds_chip_info(void)
                  viaparinfo->chip_info->lvds_chip_info.output_interface);
 }
 
-void __devinit viafb_init_dac(int set_iga)
+void viafb_init_dac(int set_iga)
 {
        int i;
        u8 tmp;
index 6be243cfc823b4d257fc34044497b99907ce10c0..a8205754c7361ff2d68662892cbc581abaad2706 100644 (file)
@@ -663,8 +663,8 @@ void viafb_set_dpa_gfx(int output_interface, struct GFX_DPA_SETTING\
 int viafb_setmode(void);
 void viafb_fill_var_timing_info(struct fb_var_screeninfo *var,
        const struct fb_videomode *mode);
-void __devinit viafb_init_chip_info(int chip_type);
-void __devinit viafb_init_dac(int set_iga);
+void viafb_init_chip_info(int chip_type);
+void viafb_init_dac(int set_iga);
 int viafb_get_refresh(int hres, int vres, u32 float_refresh);
 void viafb_update_device_setting(int hres, int vres, int bpp, int flag);
 
index 1650379105364d72c6fca5328d407f92035ef95c..980ee1b1dcf313b9dc98a6689b7cac48c702d887 100644 (file)
@@ -49,7 +49,7 @@ static struct _lcd_scaling_factor lcd_scaling_factor_CLE = {
 };
 
 static bool lvds_identify_integratedlvds(void);
-static void __devinit fp_id_to_vindex(int panel_id);
+static void fp_id_to_vindex(int panel_id);
 static int lvds_register_read(int index);
 static void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,
                      int panel_vres);
@@ -81,7 +81,7 @@ static inline bool check_lvds_chip(int device_id_subaddr, int device_id)
        return lvds_register_read(device_id_subaddr) == device_id;
 }
 
-void __devinit viafb_init_lcd_size(void)
+void viafb_init_lcd_size(void)
 {
        DEBUG_MSG(KERN_INFO "viafb_init_lcd_size()\n");
 
@@ -139,7 +139,7 @@ static bool lvds_identify_integratedlvds(void)
        return true;
 }
 
-bool __devinit viafb_lvds_trasmitter_identify(void)
+bool viafb_lvds_trasmitter_identify(void)
 {
        if (viafb_lvds_identify_vt1636(VIA_PORT_31)) {
                viaparinfo->chip_info->lvds_chip_info.i2c_port = VIA_PORT_31;
@@ -180,7 +180,7 @@ bool __devinit viafb_lvds_trasmitter_identify(void)
        return false;
 }
 
-static void __devinit fp_id_to_vindex(int panel_id)
+static void fp_id_to_vindex(int panel_id)
 {
        DEBUG_MSG(KERN_INFO "fp_get_panel_id()\n");
 
@@ -914,7 +914,7 @@ static void check_diport_of_integrated_lvds(
                  plvds_chip_info->output_interface);
 }
 
-void __devinit viafb_init_lvds_output_interface(struct lvds_chip_information
+void viafb_init_lvds_output_interface(struct lvds_chip_information
                                *plvds_chip_info,
                                struct lvds_setting_information
                                *plvds_setting_info)
index 8f3e4e06156c3381648349969a263a7a3edc7afe..5c988a063ad5ec58f6116e92b3e27d05a424146f 100644 (file)
@@ -71,15 +71,15 @@ void viafb_enable_lvds_vt1636(struct lvds_setting_information
                        struct lvds_chip_information *plvds_chip_info);
 void viafb_lcd_disable(void);
 void viafb_lcd_enable(void);
-void __devinit viafb_init_lcd_size(void);
-void __devinit viafb_init_lvds_output_interface(struct lvds_chip_information
+void viafb_init_lcd_size(void);
+void viafb_init_lvds_output_interface(struct lvds_chip_information
                                *plvds_chip_info,
                                struct lvds_setting_information
                                *plvds_setting_info);
 void viafb_lcd_set_mode(const struct fb_var_screeninfo *var, u16 cxres,
        u16 cyres, struct lvds_setting_information *plvds_setting_info,
        struct lvds_chip_information *plvds_chip_info);
-bool __devinit viafb_lvds_trasmitter_identify(void);
+bool viafb_lvds_trasmitter_identify(void);
 void viafb_init_lvds_output_interface(struct lvds_chip_information
                                *plvds_chip_info,
                                struct lvds_setting_information
index dd58b530c0dffde2a1f511a059cb6bc42279f7c9..6e274825fb312349d95d5bdddb43b4c9e45e8775 100644 (file)
@@ -80,7 +80,7 @@ static inline int viafb_mmio_read(int reg)
  */
 static u32 viafb_enabled_ints;
 
-static void __devinit viafb_int_init(void)
+static void viafb_int_init(void)
 {
        viafb_enabled_ints = 0;
 
@@ -475,7 +475,7 @@ static int viafb_get_fb_size_from_pci(int chip_type)
 /*
  * Figure out and map our MMIO regions.
  */
-static int __devinit via_pci_setup_mmio(struct viafb_dev *vdev)
+static int via_pci_setup_mmio(struct viafb_dev *vdev)
 {
        int ret;
        /*
@@ -550,8 +550,8 @@ static struct viafb_subdev_info {
 };
 #define N_SUBDEVS ARRAY_SIZE(viafb_subdevs)
 
-static int __devinit via_create_subdev(struct viafb_dev *vdev,
-               struct viafb_subdev_info *info)
+static int via_create_subdev(struct viafb_dev *vdev,
+                            struct viafb_subdev_info *info)
 {
        int ret;
 
@@ -573,7 +573,7 @@ static int __devinit via_create_subdev(struct viafb_dev *vdev,
        return ret;
 }
 
-static int __devinit via_setup_subdevs(struct viafb_dev *vdev)
+static int via_setup_subdevs(struct viafb_dev *vdev)
 {
        int i;
 
@@ -671,8 +671,7 @@ static int via_resume(struct pci_dev *pdev)
 }
 #endif /* CONFIG_PM */
 
-static int __devinit via_pci_probe(struct pci_dev *pdev,
-               const struct pci_device_id *ent)
+static int via_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int ret;
 
@@ -716,7 +715,7 @@ out_disable:
        return ret;
 }
 
-static void __devexit via_pci_remove(struct pci_dev *pdev)
+static void via_pci_remove(struct pci_dev *pdev)
 {
        via_teardown_subdevs();
        via_fb_pci_remove(pdev);
@@ -725,7 +724,7 @@ static void __devexit via_pci_remove(struct pci_dev *pdev)
 }
 
 
-static struct pci_device_id via_pci_table[] __devinitdata = {
+static struct pci_device_id via_pci_table[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_CLE266_DID),
          .driver_data = UNICHROME_CLE266 },
        { PCI_DEVICE(PCI_VENDOR_ID_VIA, UNICHROME_K400_DID),
@@ -760,7 +759,7 @@ static struct pci_driver via_driver = {
        .name           = "viafb",
        .id_table       = via_pci_table,
        .probe          = via_pci_probe,
-       .remove         = __devexit_p(via_pci_remove),
+       .remove         = via_pci_remove,
 #ifdef CONFIG_PM
        .suspend        = via_suspend,
        .resume         = via_resume,
index d69cfef7c338551cf73524c29a18b99233308158..e408679081ab25a8adb3fe543a8c70c45e4289b5 100644 (file)
@@ -212,7 +212,7 @@ EXPORT_SYMBOL_GPL(viafb_gpio_lookup);
 /*
  * Platform device stuff.
  */
-static __devinit int viafb_gpio_probe(struct platform_device *platdev)
+static int viafb_gpio_probe(struct platform_device *platdev)
 {
        struct viafb_dev *vdev = platdev->dev.platform_data;
        struct via_port_cfg *port_cfg = vdev->port_cfg;
index c80e770e180029a132087f73f3cbbfc6295a7c5e..325c43c6ff973895eb6b4b573b330ad596295a6a 100644 (file)
@@ -1072,7 +1072,7 @@ static int __init parse_active_dev(void)
        return 0;
 }
 
-static int __devinit parse_port(char *opt_str, int *output_interface)
+static int parse_port(char *opt_str, int *output_interface)
 {
        if (!strncmp(opt_str, "DVP0", 4))
                *output_interface = INTERFACE_DVP0;
@@ -1089,7 +1089,7 @@ static int __devinit parse_port(char *opt_str, int *output_interface)
        return 0;
 }
 
-static void __devinit parse_lcd_port(void)
+static void parse_lcd_port(void)
 {
        parse_port(viafb_lcd_port, &viaparinfo->chip_info->lvds_chip_info.
                output_interface);
@@ -1102,7 +1102,7 @@ static void __devinit parse_lcd_port(void)
                  output_interface);
 }
 
-static void __devinit parse_dvi_port(void)
+static void parse_dvi_port(void)
 {
        parse_port(viafb_dvi_port, &viaparinfo->chip_info->tmds_chip_info.
                output_interface);
@@ -1727,7 +1727,7 @@ static struct viafb_pm_hooks viafb_fb_pm_hooks = {
 
 #endif
 
-static void __devinit i2c_bus_probe(struct viafb_shared *shared)
+static void i2c_bus_probe(struct viafb_shared *shared)
 {
        /* should be always CRT */
        printk(KERN_INFO "viafb: Probing I2C bus 0x26\n");
@@ -1753,7 +1753,7 @@ static void i2c_bus_free(struct viafb_shared *shared)
        via_aux_free(shared->i2c_2C);
 }
 
-int __devinit via_fb_pci_probe(struct viafb_dev *vdev)
+int via_fb_pci_probe(struct viafb_dev *vdev)
 {
        u32 default_xres, default_yres;
        struct fb_var_screeninfo default_var;
@@ -1945,7 +1945,7 @@ out_fb_release:
        return rc;
 }
 
-void __devexit via_fb_pci_remove(struct pci_dev *pdev)
+void via_fb_pci_remove(struct pci_dev *pdev)
 {
        DEBUG_MSG(KERN_INFO "via_pci_remove!\n");
        fb_dealloc_cmap(&viafbinfo->cmap);
index 9af8da70e7812e292d6b69cfce09f3a0ee3712c5..aa2579c2364a53ea07573d019605620184591daf 100644 (file)
@@ -273,7 +273,7 @@ static irqreturn_t vt8500lcd_handle_irq(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit vt8500lcd_probe(struct platform_device *pdev)
+static int vt8500lcd_probe(struct platform_device *pdev)
 {
        struct vt8500lcd_info *fbi;
        struct resource *res;
@@ -469,7 +469,7 @@ failed:
        return ret;
 }
 
-static int __devexit vt8500lcd_remove(struct platform_device *pdev)
+static int vt8500lcd_remove(struct platform_device *pdev)
 {
        struct vt8500lcd_info *fbi = platform_get_drvdata(pdev);
        struct resource *res;
@@ -505,7 +505,7 @@ static const struct of_device_id via_dt_ids[] = {
 
 static struct platform_driver vt8500lcd_driver = {
        .probe          = vt8500lcd_probe,
-       .remove         = __devexit_p(vt8500lcd_remove),
+       .remove         = vt8500lcd_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "vt8500-lcd",
index 4e74d262cf3e9f338c1eb0cb46a5835794a532d3..e9557fa014eec0f201b1f91c38970097a37fd5e5 100644 (file)
@@ -660,7 +660,7 @@ static struct fb_ops vt8623fb_ops = {
 
 /* PCI probe */
 
-static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int vt8623_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct pci_bus_region bus_reg;
        struct resource vga_res;
@@ -807,7 +807,7 @@ err_enable_device:
 
 /* PCI remove */
 
-static void __devexit vt8623_pci_remove(struct pci_dev *dev)
+static void vt8623_pci_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
 
@@ -906,7 +906,7 @@ fail:
 
 /* List of boards that we are trying to support */
 
-static struct pci_device_id vt8623_devices[] __devinitdata = {
+static struct pci_device_id vt8623_devices[] = {
        {PCI_DEVICE(PCI_VENDOR_ID_VIA, 0x3122)},
        {0, 0, 0, 0, 0, 0, 0}
 };
@@ -917,7 +917,7 @@ static struct pci_driver vt8623fb_pci_driver = {
        .name           = "vt8623fb",
        .id_table       = vt8623_devices,
        .probe          = vt8623_pci_probe,
-       .remove         = __devexit_p(vt8623_pci_remove),
+       .remove         = vt8623_pci_remove,
        .suspend        = vt8623_pci_suspend,
        .resume         = vt8623_pci_resume,
 };
index 2f6b2b835f880391a9c7beccb750a2acc1347ca5..7a299e951f75421a7a4112eae5af284cc977a6ca 100644 (file)
@@ -54,7 +54,7 @@ static void w100_update_enable(void);
 static void w100_update_disable(void);
 static void calc_hsync(struct w100fb_par *par);
 static void w100_init_graphic_engine(struct w100fb_par *par);
-struct w100_pll_info *w100_get_xtal_table(unsigned int freq) __devinit;
+struct w100_pll_info *w100_get_xtal_table(unsigned int freq);
 
 /* Pseudo palette size */
 #define MAX_PALETTES      16
@@ -630,7 +630,7 @@ static int w100fb_resume(struct platform_device *dev)
 #endif
 
 
-int __devinit w100fb_probe(struct platform_device *pdev)
+int w100fb_probe(struct platform_device *pdev)
 {
        int err = -EIO;
        struct w100fb_mach_info *inf;
@@ -783,7 +783,7 @@ out:
 }
 
 
-static int __devexit w100fb_remove(struct platform_device *pdev)
+static int w100fb_remove(struct platform_device *pdev)
 {
        struct fb_info *info = platform_get_drvdata(pdev);
        struct w100fb_par *par=info->par;
@@ -1021,7 +1021,7 @@ static struct pll_entries {
        { 0 },
 };
 
-struct w100_pll_info __devinit *w100_get_xtal_table(unsigned int freq)
+struct w100_pll_info *w100_get_xtal_table(unsigned int freq)
 {
        struct pll_entries *pll_entry = w100_pll_tables;
 
@@ -1624,7 +1624,7 @@ static void w100_vsync(void)
 
 static struct platform_driver w100fb_driver = {
        .probe          = w100fb_probe,
-       .remove         = __devexit_p(w100fb_remove),
+       .remove         = w100fb_remove,
        .suspend        = w100fb_suspend,
        .resume         = w100fb_resume,
        .driver         = {
index 77539c1b56a028833d35e4db8ede98b8e4e7d4bc..4dd0580f96fd65c32f5c717c5ffdf332626b2a48 100644 (file)
@@ -260,7 +260,7 @@ static struct fb_ops wm8505fb_ops = {
        .fb_blank       = wm8505fb_blank,
 };
 
-static int __devinit wm8505fb_probe(struct platform_device *pdev)
+static int wm8505fb_probe(struct platform_device *pdev)
 {
        struct wm8505fb_info    *fbi;
        struct resource         *res;
@@ -431,7 +431,7 @@ failed:
        return ret;
 }
 
-static int __devexit wm8505fb_remove(struct platform_device *pdev)
+static int wm8505fb_remove(struct platform_device *pdev)
 {
        struct wm8505fb_info *fbi = platform_get_drvdata(pdev);
        struct resource *res;
@@ -462,7 +462,7 @@ static const struct of_device_id wmt_dt_ids[] = {
 
 static struct platform_driver wm8505fb_driver = {
        .probe          = wm8505fb_probe,
-       .remove         = __devexit_p(wm8505fb_remove),
+       .remove         = wm8505fb_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = DRIVER_NAME,
index ba025b4c7d095b562cf5fae84a16914b9473aa37..4aaeb18223bcff371bfac7b9d8653f2c6fdef80b 100644 (file)
@@ -124,7 +124,7 @@ int wmt_ge_sync(struct fb_info *p)
 }
 EXPORT_SYMBOL_GPL(wmt_ge_sync);
 
-static int __devinit wmt_ge_rops_probe(struct platform_device *pdev)
+static int wmt_ge_rops_probe(struct platform_device *pdev)
 {
        struct resource *res;
 
@@ -152,7 +152,7 @@ static int __devinit wmt_ge_rops_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int __devexit wmt_ge_rops_remove(struct platform_device *pdev)
+static int wmt_ge_rops_remove(struct platform_device *pdev)
 {
        iounmap(regbase);
        return 0;
@@ -165,7 +165,7 @@ static const struct of_device_id wmt_dt_ids[] = {
 
 static struct platform_driver wmt_ge_rops_driver = {
        .probe          = wmt_ge_rops_probe,
-       .remove         = __devexit_p(wmt_ge_rops_remove),
+       .remove         = wmt_ge_rops_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "wmt_ge_rops",
index 917bb5681684d31490e1b228b60db57cc0d53a7b..cd005c227a23cd3748ae4cdb22584474273e88c5 100644 (file)
@@ -358,8 +358,8 @@ static irqreturn_t xenfb_event_handler(int rq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __devinit xenfb_probe(struct xenbus_device *dev,
-                                const struct xenbus_device_id *id)
+static int xenfb_probe(struct xenbus_device *dev,
+                      const struct xenbus_device_id *id)
 {
        struct xenfb_info *info;
        struct fb_info *fb_info;
@@ -487,8 +487,7 @@ error:
        return ret;
 }
 
-static __devinit void
-xenfb_make_preferred_console(void)
+static void xenfb_make_preferred_console(void)
 {
        struct console *c;
 
index 18084525402ace0afd1c08ada58e2c2a50f5cfad..af0b4fdf9aa9a709340304a9490797360081b1b6 100644 (file)
@@ -403,7 +403,7 @@ static int xilinxfb_release(struct device *dev)
  * OF bus binding
  */
 
-static int __devinit xilinxfb_of_probe(struct platform_device *op)
+static int xilinxfb_of_probe(struct platform_device *op)
 {
        const u32 *prop;
        u32 *p;
@@ -485,13 +485,13 @@ static int __devinit xilinxfb_of_probe(struct platform_device *op)
        return -ENODEV;
 }
 
-static int __devexit xilinxfb_of_remove(struct platform_device *op)
+static int xilinxfb_of_remove(struct platform_device *op)
 {
        return xilinxfb_release(&op->dev);
 }
 
 /* Match table for of_platform binding */
-static struct of_device_id xilinxfb_of_match[] __devinitdata = {
+static struct of_device_id xilinxfb_of_match[] = {
        { .compatible = "xlnx,xps-tft-1.00.a", },
        { .compatible = "xlnx,xps-tft-2.00.a", },
        { .compatible = "xlnx,xps-tft-2.01.a", },
@@ -503,7 +503,7 @@ MODULE_DEVICE_TABLE(of, xilinxfb_of_match);
 
 static struct platform_driver xilinxfb_of_driver = {
        .probe = xilinxfb_of_probe,
-       .remove = __devexit_p(xilinxfb_of_remove),
+       .remove = xilinxfb_of_remove,
        .driver = {
                .name = DRIVER_NAME,
                .owner = THIS_MODULE,
index d19fe3e323b4dd17ad3cf43b099bdac7cf31aa5c..797e1c79a104864ff5c87c2e887c02eb2fe1db89 100644 (file)
@@ -500,7 +500,7 @@ static void remove_common(struct virtio_balloon *vb)
        vb->vdev->config->del_vqs(vb->vdev);
 }
 
-static void __devexit virtballoon_remove(struct virtio_device *vdev)
+static void virtballoon_remove(struct virtio_device *vdev)
 {
        struct virtio_balloon *vb = vdev->priv;
 
@@ -552,7 +552,7 @@ static struct virtio_driver virtio_balloon_driver = {
        .driver.owner = THIS_MODULE,
        .id_table =     id_table,
        .probe =        virtballoon_probe,
-       .remove =       __devexit_p(virtballoon_remove),
+       .remove =       virtballoon_remove,
        .config_changed = virtballoon_changed,
 #ifdef CONFIG_PM
        .freeze =       virtballoon_freeze,
index 634f80bcdbd7d3872201aa16af79cfd51caccaf9..31f966f4d27f6800899fa8cad4b6e390fd497003 100644 (file)
@@ -440,7 +440,7 @@ static struct virtio_config_ops virtio_mmio_config_ops = {
 
 /* Platform device */
 
-static int __devinit virtio_mmio_probe(struct platform_device *pdev)
+static int virtio_mmio_probe(struct platform_device *pdev)
 {
        struct virtio_mmio_device *vm_dev;
        struct resource *mem;
@@ -493,7 +493,7 @@ static int __devinit virtio_mmio_probe(struct platform_device *pdev)
        return register_virtio_device(&vm_dev->vdev);
 }
 
-static int __devexit virtio_mmio_remove(struct platform_device *pdev)
+static int virtio_mmio_remove(struct platform_device *pdev)
 {
        struct virtio_mmio_device *vm_dev = platform_get_drvdata(pdev);
 
@@ -638,7 +638,7 @@ MODULE_DEVICE_TABLE(of, virtio_mmio_match);
 
 static struct platform_driver virtio_mmio_driver = {
        .probe          = virtio_mmio_probe,
-       .remove         = __devexit_p(virtio_mmio_remove),
+       .remove         = virtio_mmio_remove,
        .driver         = {
                .name   = "virtio-mmio",
                .owner  = THIS_MODULE,
index e3ecc94591ad29defa2b572d54eab60a223cb3aa..0c142892c105f6c56857352d8dda2d262582aaa0 100644 (file)
@@ -676,8 +676,8 @@ static void virtio_pci_release_dev(struct device *_d)
 }
 
 /* the PCI probing function */
-static int __devinit virtio_pci_probe(struct pci_dev *pci_dev,
-                                     const struct pci_device_id *id)
+static int virtio_pci_probe(struct pci_dev *pci_dev,
+                           const struct pci_device_id *id)
 {
        struct virtio_pci_device *vp_dev;
        int err;
@@ -751,7 +751,7 @@ out:
        return err;
 }
 
-static void __devexit virtio_pci_remove(struct pci_dev *pci_dev)
+static void virtio_pci_remove(struct pci_dev *pci_dev)
 {
        struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
 
@@ -822,7 +822,7 @@ static struct pci_driver virtio_pci_driver = {
        .name           = "virtio-pci",
        .id_table       = virtio_pci_id_table,
        .probe          = virtio_pci_probe,
-       .remove         = __devexit_p(virtio_pci_remove),
+       .remove         = virtio_pci_remove,
 #ifdef CONFIG_PM
        .driver.pm      = &virtio_pci_pm_ops,
 #endif
index aa250cebecd2963207b3eda1b767af65b4437f02..7b07135ab26ef722824c7387a9ec9df547d36f49 100644 (file)
@@ -772,7 +772,7 @@ static int vlynq_remove(struct platform_device *pdev)
 static struct platform_driver vlynq_platform_driver = {
        .driver.name = "vlynq",
        .probe = vlynq_probe,
-       .remove = __devexit_p(vlynq_remove),
+       .remove = vlynq_remove,
 };
 
 struct bus_type vlynq_bus_type = {
@@ -783,7 +783,7 @@ struct bus_type vlynq_bus_type = {
 };
 EXPORT_SYMBOL(vlynq_bus_type);
 
-static int __devinit vlynq_init(void)
+static int vlynq_init(void)
 {
        int res = 0;
 
@@ -803,7 +803,7 @@ fail_bus:
        return res;
 }
 
-static void __devexit vlynq_exit(void)
+static void vlynq_exit(void)
 {
        platform_driver_unregister(&vlynq_platform_driver);
        bus_unregister(&vlynq_bus_type);
index d338b56ea2f09b5a5005f7128cdff1a07906d779..708a25fc99616bf124764443d029b376e9f98cf9 100644 (file)
@@ -191,7 +191,7 @@ static struct platform_driver mxc_w1_driver = {
                   .name = "mxc_w1",
        },
        .probe = mxc_w1_probe,
-       .remove = __devexit_p(mxc_w1_remove),
+       .remove = mxc_w1_remove,
 };
 module_platform_driver(mxc_w1_driver);
 
index 709ea1aefebbfdb636e05eef8b1ab34eba2b5a5c..f5ad10546fc9fe46ec6abe182ec09ee7665af30f 100644 (file)
@@ -72,20 +72,21 @@ static int da9055_wdt_set_timeout(struct watchdog_device *wdt_dev,
                                        DA9055_TWDSCALE_MASK,
                                        da9055_wdt_maps[i].reg_val <<
                                        DA9055_TWDSCALE_SHIFT);
-       if (ret < 0)
+       if (ret < 0) {
                dev_err(da9055->dev,
                        "Failed to update timescale bit, %d\n", ret);
+               return ret;
+       }
 
        wdt_dev->timeout = timeout;
 
-       return ret;
+       return 0;
 }
 
 static int da9055_wdt_ping(struct watchdog_device *wdt_dev)
 {
        struct da9055_wdt_data *driver_data = watchdog_get_drvdata(wdt_dev);
        struct da9055 *da9055 = driver_data->da9055;
-       int ret;
 
        /*
         * We have a minimum time for watchdog window called TWDMIN. A write
@@ -94,18 +95,12 @@ static int da9055_wdt_ping(struct watchdog_device *wdt_dev)
        mdelay(DA9055_TWDMIN);
 
        /* Reset the watchdog timer */
-       ret = da9055_reg_update(da9055, DA9055_REG_CONTROL_E,
-                               DA9055_WATCHDOG_MASK, 1);
-
-       return ret;
+       return da9055_reg_update(da9055, DA9055_REG_CONTROL_E,
+                                DA9055_WATCHDOG_MASK, 1);
 }
 
 static void da9055_wdt_release_resources(struct kref *r)
 {
-       struct da9055_wdt_data *driver_data =
-               container_of(r, struct da9055_wdt_data, kref);
-
-       kfree(driver_data);
 }
 
 static void da9055_wdt_ref(struct watchdog_device *wdt_dev)
index 34ed61ea02b46c86e348970c4bbd39d3724f320f..b0e541d022e68a23d6edb8d05bd306d21d291728 100644 (file)
@@ -296,7 +296,6 @@ static int omap_wdt_remove(struct platform_device *pdev)
 {
        struct watchdog_device *wdog = platform_get_drvdata(pdev);
        struct omap_wdt_dev *wdev = watchdog_get_drvdata(wdog);
-       struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        pm_runtime_disable(wdev->dev);
        watchdog_unregister_device(wdog);
index 81918cf8993bafebdd7585df879ad4e0c47aba59..0f03106f7516ab8a6d1198b1f4b4dd31b06e09cc 100644 (file)
@@ -131,14 +131,21 @@ static int twl4030_wdt_resume(struct platform_device *pdev)
 #define twl4030_wdt_resume         NULL
 #endif
 
+static const struct of_device_id twl_wdt_of_match[] = {
+       { .compatible = "ti,twl4030-wdt", },
+       { },
+};
+MODULE_DEVICE_TABLE(of, twl_wdt_of_match);
+
 static struct platform_driver twl4030_wdt_driver = {
        .probe          = twl4030_wdt_probe,
        .remove         = twl4030_wdt_remove,
        .suspend        = twl4030_wdt_suspend,
        .resume         = twl4030_wdt_resume,
        .driver         = {
-               .owner  = THIS_MODULE,
-               .name   = "twl4030_wdt",
+               .owner          = THIS_MODULE,
+               .name           = "twl4030_wdt",
+               .of_match_table = twl_wdt_of_match,
        },
 };
 
index b91f14e831648e68093a02f804f82e4113325360..7038de53652b3cd8999ac7d642fd84441c79dcd5 100644 (file)
@@ -1239,7 +1239,7 @@ int gnttab_init(void)
 }
 EXPORT_SYMBOL_GPL(gnttab_init);
 
-static int __devinit __gnttab_init(void)
+static int __gnttab_init(void)
 {
        /* Delay grant-table initialization in the PV on HVM case */
        if (xen_hvm_domain())
index 97ca359ae2bdfb8d072ee62348114a252660adf9..99db9e1eb8ba47419bc13c5c94803d35537d609d 100644 (file)
@@ -101,8 +101,8 @@ static int platform_pci_resume(struct pci_dev *pdev)
        return 0;
 }
 
-static int __devinit platform_pci_init(struct pci_dev *pdev,
-                                      const struct pci_device_id *ent)
+static int platform_pci_init(struct pci_dev *pdev,
+                            const struct pci_device_id *ent)
 {
        int i, ret;
        long ioaddr;
@@ -170,7 +170,7 @@ pci_out:
        return ret;
 }
 
-static struct pci_device_id platform_pci_tbl[] __devinitdata = {
+static struct pci_device_id platform_pci_tbl[] = {
        {PCI_VENDOR_ID_XEN, PCI_DEVICE_ID_XEN_PLATFORM,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        {0,}
index cd50d251998ee629fc5244add466129d4662e398..9204126f1560ced72321b267b96099acfe71b8dd 100644 (file)
@@ -272,8 +272,8 @@ void pcistub_put_pci_dev(struct pci_dev *dev)
        up_write(&pcistub_sem);
 }
 
-static int __devinit pcistub_match_one(struct pci_dev *dev,
-                                      struct pcistub_device_id *pdev_id)
+static int pcistub_match_one(struct pci_dev *dev,
+                            struct pcistub_device_id *pdev_id)
 {
        /* Match the specified device by domain, bus, slot, func and also if
         * any of the device's parent bridges match.
@@ -292,7 +292,7 @@ static int __devinit pcistub_match_one(struct pci_dev *dev,
        return 0;
 }
 
-static int __devinit pcistub_match(struct pci_dev *dev)
+static int pcistub_match(struct pci_dev *dev)
 {
        struct pcistub_device_id *pdev_id;
        unsigned long flags;
@@ -310,7 +310,7 @@ static int __devinit pcistub_match(struct pci_dev *dev)
        return found;
 }
 
-static int __devinit pcistub_init_device(struct pci_dev *dev)
+static int pcistub_init_device(struct pci_dev *dev)
 {
        struct xen_pcibk_dev_data *dev_data;
        int err = 0;
@@ -428,7 +428,7 @@ static int __init pcistub_init_devices_late(void)
        return 0;
 }
 
-static int __devinit pcistub_seize(struct pci_dev *dev)
+static int pcistub_seize(struct pci_dev *dev)
 {
        struct pcistub_device *psdev;
        unsigned long flags;
@@ -463,8 +463,7 @@ static int __devinit pcistub_seize(struct pci_dev *dev)
        return err;
 }
 
-static int __devinit pcistub_probe(struct pci_dev *dev,
-                                  const struct pci_device_id *id)
+static int pcistub_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        int err = 0;
 
index 229624f867d3533f09173b276065457955878568..ac1db7f1bcab7731e9366cfc4bce832c4258cd35 100644 (file)
@@ -142,7 +142,6 @@ static int zorro_bus_match(struct device *dev, struct device_driver *drv)
 
 static int zorro_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
-#ifdef CONFIG_HOTPLUG
        struct zorro_dev *z;
 
        if (!dev)
@@ -159,9 +158,6 @@ static int zorro_uevent(struct device *dev, struct kobj_uevent_env *env)
                return -ENOMEM;
 
        return 0;
-#else /* !CONFIG_HOTPLUG */
-       return -ENODEV;
-#endif /* !CONFIG_HOTPLUG */
 }
 
 struct bus_type zorro_bus_type = {
index c017a2dfb9097e73837230d244ffb14f73dd0e1c..7a75c3e0fd5896b7fc59595fff859c41f23f65b1 100644 (file)
@@ -2935,6 +2935,7 @@ static void guard_bh_eod(int rw, struct bio *bio, struct buffer_head *bh)
                void *kaddr = kmap_atomic(bh->b_page);
                memset(kaddr + bh_offset(bh) + bytes, 0, bh->b_size - bytes);
                kunmap_atomic(kaddr);
+               flush_dcache_page(bh->b_page);
        }
 }
 
index f653835d067b3323a1eea5f32774326a4937ac09..de7f9168a1185ace14e8212040c96285c6c0bc31 100644 (file)
@@ -228,7 +228,6 @@ cifs_alloc_inode(struct super_block *sb)
        cifs_set_oplock_level(cifs_inode, 0);
        cifs_inode->delete_pending = false;
        cifs_inode->invalid_mapping = false;
-       cifs_inode->leave_pages_clean = false;
        cifs_inode->vfs_inode.i_blkbits = 14;  /* 2**14 = CIFS_MAX_MSGSIZE */
        cifs_inode->server_eof = 0;
        cifs_inode->uniqueid = 0;
index aea1eec649116a3891ce00c9ff6d073d7183fc6a..e6899cea1c3580e6e9217f9cb3f0ff68e8d7626c 100644 (file)
@@ -386,6 +386,7 @@ struct smb_version_values {
        unsigned int    cap_unix;
        unsigned int    cap_nt_find;
        unsigned int    cap_large_files;
+       unsigned int    oplock_read;
 };
 
 #define HEADER_SIZE(server) (server->vals->header_size)
@@ -1030,7 +1031,6 @@ struct cifsInodeInfo {
        bool clientCanCacheAll;         /* read and writebehind oplock */
        bool delete_pending;            /* DELETE_ON_CLOSE is set */
        bool invalid_mapping;           /* pagecache is invalid */
-       bool leave_pages_clean; /* protected by i_mutex, not set pages dirty */
        unsigned long time;             /* jiffies of last update of inode */
        u64  server_eof;                /* current file size on server -- protected by i_lock */
        u64  uniqueid;                  /* server inode number */
index 0a6677ba212b11ef73fbf83465c32f6ffe4fa2c1..8ea6ca50a665cd4dcb016042b52d16ef5492bab4 100644 (file)
@@ -238,6 +238,23 @@ out:
        return rc;
 }
 
+static bool
+cifs_has_mand_locks(struct cifsInodeInfo *cinode)
+{
+       struct cifs_fid_locks *cur;
+       bool has_locks = false;
+
+       down_read(&cinode->lock_sem);
+       list_for_each_entry(cur, &cinode->llist, llist) {
+               if (!list_empty(&cur->locks)) {
+                       has_locks = true;
+                       break;
+               }
+       }
+       up_read(&cinode->lock_sem);
+       return has_locks;
+}
+
 struct cifsFileInfo *
 cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
                  struct tcon_link *tlink, __u32 oplock)
@@ -248,6 +265,7 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
        struct cifsFileInfo *cfile;
        struct cifs_fid_locks *fdlocks;
        struct cifs_tcon *tcon = tlink_tcon(tlink);
+       struct TCP_Server_Info *server = tcon->ses->server;
 
        cfile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
        if (cfile == NULL)
@@ -276,12 +294,22 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
        INIT_WORK(&cfile->oplock_break, cifs_oplock_break);
        mutex_init(&cfile->fh_mutex);
 
+       /*
+        * If the server returned a read oplock and we have mandatory brlocks,
+        * set oplock level to None.
+        */
+       if (oplock == server->vals->oplock_read &&
+                                               cifs_has_mand_locks(cinode)) {
+               cFYI(1, "Reset oplock val from read to None due to mand locks");
+               oplock = 0;
+       }
+
        spin_lock(&cifs_file_list_lock);
-       if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE)
+       if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE && oplock)
                oplock = fid->pending_open->oplock;
        list_del(&fid->pending_open->olist);
 
-       tlink_tcon(tlink)->ses->server->ops->set_fid(cfile, fid, oplock);
+       server->ops->set_fid(cfile, fid, oplock);
 
        list_add(&cfile->tlist, &tcon->openFileList);
        /* if readable file instance put first in list*/
@@ -1422,6 +1450,7 @@ cifs_setlk(struct file *file, struct file_lock *flock, __u32 type,
        struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
        struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
        struct TCP_Server_Info *server = tcon->ses->server;
+       struct inode *inode = cfile->dentry->d_inode;
 
        if (posix_lck) {
                int posix_lock_type;
@@ -1459,6 +1488,21 @@ cifs_setlk(struct file *file, struct file_lock *flock, __u32 type,
                if (!rc)
                        goto out;
 
+               /*
+                * Windows 7 server can delay breaking lease from read to None
+                * if we set a byte-range lock on a file - break it explicitly
+                * before sending the lock to the server to be sure the next
+                * read won't conflict with non-overlapted locks due to
+                * pagereading.
+                */
+               if (!CIFS_I(inode)->clientCanCacheAll &&
+                                       CIFS_I(inode)->clientCanCacheRead) {
+                       cifs_invalidate_mapping(inode);
+                       cFYI(1, "Set no oplock for inode=%p due to mand locks",
+                            inode);
+                       CIFS_I(inode)->clientCanCacheRead = false;
+               }
+
                rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
                                            type, 1, 0, wait_flag);
                if (rc) {
@@ -2103,15 +2147,7 @@ static int cifs_write_end(struct file *file, struct address_space *mapping,
        } else {
                rc = copied;
                pos += copied;
-               /*
-                * When we use strict cache mode and cifs_strict_writev was run
-                * with level II oplock (indicated by leave_pages_clean field of
-                * CIFS_I(inode)), we can leave pages clean - cifs_strict_writev
-                * sent the data to the server itself.
-                */
-               if (!CIFS_I(inode)->leave_pages_clean ||
-                   !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO))
-                       set_page_dirty(page);
+               set_page_dirty(page);
        }
 
        if (rc > 0) {
@@ -2462,8 +2498,8 @@ ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,
 }
 
 static ssize_t
-cifs_pagecache_writev(struct kiocb *iocb, const struct iovec *iov,
-                     unsigned long nr_segs, loff_t pos, bool cache_ex)
+cifs_writev(struct kiocb *iocb, const struct iovec *iov,
+           unsigned long nr_segs, loff_t pos)
 {
        struct file *file = iocb->ki_filp;
        struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
@@ -2485,12 +2521,8 @@ cifs_pagecache_writev(struct kiocb *iocb, const struct iovec *iov,
                                     server->vals->exclusive_lock_type, NULL,
                                     CIFS_WRITE_OP)) {
                mutex_lock(&inode->i_mutex);
-               if (!cache_ex)
-                       cinode->leave_pages_clean = true;
                rc = __generic_file_aio_write(iocb, iov, nr_segs,
-                                             &iocb->ki_pos);
-               if (!cache_ex)
-                       cinode->leave_pages_clean = false;
+                                              &iocb->ki_pos);
                mutex_unlock(&inode->i_mutex);
        }
 
@@ -2517,60 +2549,32 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
        struct cifsFileInfo *cfile = (struct cifsFileInfo *)
                                                iocb->ki_filp->private_data;
        struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
-       ssize_t written, written2;
-       /*
-        * We need to store clientCanCacheAll here to prevent race
-        * conditions - this value can be changed during an execution
-        * of generic_file_aio_write. For CIFS it can be changed from
-        * true to false only, but for SMB2 it can be changed both from
-        * true to false and vice versa. So, we can end up with a data
-        * stored in the cache, not marked dirty and not sent to the
-        * server if this value changes its state from false to true
-        * after cifs_write_end.
-        */
-       bool cache_ex = cinode->clientCanCacheAll;
-       bool cache_read = cinode->clientCanCacheRead;
-       int rc;
-       loff_t saved_pos;
+       ssize_t written;
 
-       if (cache_ex) {
+       if (cinode->clientCanCacheAll) {
                if (cap_unix(tcon->ses) &&
-                   ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0) &&
-                   (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(
-                                               tcon->fsUnixInfo.Capability)))
+               (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability))
+                   && ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
                        return generic_file_aio_write(iocb, iov, nr_segs, pos);
-               return cifs_pagecache_writev(iocb, iov, nr_segs, pos, cache_ex);
+               return cifs_writev(iocb, iov, nr_segs, pos);
        }
-
        /*
-        * For files without exclusive oplock in strict cache mode we need to
-        * write the data to the server exactly from the pos to pos+len-1 rather
-        * than flush all affected pages because it may cause a error with
-        * mandatory locks on these pages but not on the region from pos to
-        * ppos+len-1.
+        * For non-oplocked files in strict cache mode we need to write the data
+        * to the server exactly from the pos to pos+len-1 rather than flush all
+        * affected pages because it may cause a error with mandatory locks on
+        * these pages but not on the region from pos to ppos+len-1.
         */
        written = cifs_user_writev(iocb, iov, nr_segs, pos);
-       if (!cache_read || written <= 0)
-               return written;
-
-       saved_pos = iocb->ki_pos;
-       iocb->ki_pos = pos;
-       /* we have a read oplock - need to store a data in the page cache */
-       if (cap_unix(tcon->ses) &&
-           ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0) &&
-           (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(
-                                       tcon->fsUnixInfo.Capability)))
-               written2 = generic_file_aio_write(iocb, iov, nr_segs, pos);
-       else
-               written2 = cifs_pagecache_writev(iocb, iov, nr_segs, pos,
-                                                cache_ex);
-       /* errors occured during writing - invalidate the page cache */
-       if (written2 < 0) {
-               rc = cifs_invalidate_mapping(inode);
-               if (rc)
-                       written = (ssize_t)rc;
-               else
-                       iocb->ki_pos = saved_pos;
+       if (written > 0 && cinode->clientCanCacheRead) {
+               /*
+                * Windows 7 server can delay breaking level2 oplock if a write
+                * request comes - break it on the client to prevent reading
+                * an old data.
+                */
+               cifs_invalidate_mapping(inode);
+               cFYI(1, "Set no oplock for inode=%p after a write operation",
+                    inode);
+               cinode->clientCanCacheRead = false;
        }
        return written;
 }
@@ -3577,6 +3581,13 @@ void cifs_oplock_break(struct work_struct *work)
        struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
        int rc = 0;
 
+       if (!cinode->clientCanCacheAll && cinode->clientCanCacheRead &&
+                                               cifs_has_mand_locks(cinode)) {
+               cFYI(1, "Reset oplock to None for inode=%p due to mand locks",
+                    inode);
+               cinode->clientCanCacheRead = false;
+       }
+
        if (inode && S_ISREG(inode->i_mode)) {
                if (cinode->clientCanCacheRead)
                        break_lease(inode, O_RDONLY);
index a5d234c8d5d9295f41e947188ba020da68ec33dd..47bc5a87f94e9fd841b9c7bc391462f81ca872c9 100644 (file)
@@ -53,6 +53,13 @@ send_nt_cancel(struct TCP_Server_Info *server, void *buf,
                mutex_unlock(&server->srv_mutex);
                return rc;
        }
+
+       /*
+        * The response to this call was already factored into the sequence
+        * number when the call went out, so we must adjust it back downward
+        * after signing here.
+        */
+       --server->sequence_number;
        rc = smb_send(server, in_buf, be32_to_cpu(in_buf->smb_buf_length));
        mutex_unlock(&server->srv_mutex);
 
@@ -952,4 +959,5 @@ struct smb_version_values smb1_values = {
        .cap_unix = CAP_UNIX,
        .cap_nt_find = CAP_NT_SMBS | CAP_NT_FIND,
        .cap_large_files = CAP_LARGE_FILES,
+       .oplock_read = OPLOCK_READ,
 };
index d79de7bc4435094a3d94657e1d98c390e1389d41..c9c7aa7ed96685bc94b36103350204c68a19b827 100644 (file)
@@ -708,6 +708,7 @@ struct smb_version_values smb20_values = {
        .cap_unix = 0,
        .cap_nt_find = SMB2_NT_FIND,
        .cap_large_files = SMB2_LARGE_FILES,
+       .oplock_read = SMB2_OPLOCK_LEVEL_II,
 };
 
 struct smb_version_values smb21_values = {
@@ -725,6 +726,7 @@ struct smb_version_values smb21_values = {
        .cap_unix = 0,
        .cap_nt_find = SMB2_NT_FIND,
        .cap_large_files = SMB2_LARGE_FILES,
+       .oplock_read = SMB2_OPLOCK_LEVEL_II,
 };
 
 struct smb_version_values smb30_values = {
index 76d974c952fe93126a31d437dc0e362ffef6087c..1a528680ec5a29e4b59485fba5df54568a1e3787 100644 (file)
@@ -144,9 +144,6 @@ smb_send_kvec(struct TCP_Server_Info *server, struct kvec *iov, size_t n_vec,
 
        *sent = 0;
 
-       if (ssocket == NULL)
-               return -ENOTSOCK; /* BB eventually add reconnect code here */
-
        smb_msg.msg_name = (struct sockaddr *) &server->dstaddr;
        smb_msg.msg_namelen = sizeof(struct sockaddr);
        smb_msg.msg_control = NULL;
@@ -291,6 +288,9 @@ smb_send_rqst(struct TCP_Server_Info *server, struct smb_rqst *rqst)
        struct socket *ssocket = server->ssocket;
        int val = 1;
 
+       if (ssocket == NULL)
+               return -ENOTSOCK;
+
        cFYI(1, "Sending smb: smb_len=%u", smb_buf_length);
        dump_smb(iov[0].iov_base, iov[0].iov_len);
 
index 153bb1e42e631e07b41c5d87d82fd660388ed22e..a5f12b7e228d487029ea83ab72482cdfc8bb2a61 100644 (file)
@@ -176,7 +176,7 @@ static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts)
                        opts->uid = uid;
                        break;
                case Opt_gid:
-                       if (match_octal(&args[0], &option))
+                       if (match_int(&args[0], &option))
                                return -EINVAL;
                        gid = make_kgid(current_user_ns(), option);
                        if (!gid_valid(gid))
index ea9931281557ad8d3ed4049b48c66110df5f0811..a7b0c2dfb3db76066703076ab43f4d589637523d 100644 (file)
@@ -1935,7 +1935,7 @@ static const unsigned char filename_rev_map[256] = {
  * @src: Source location for the filename to encode
  * @src_size: Size of the source in bytes
  */
-void ecryptfs_encode_for_filename(unsigned char *dst, size_t *dst_size,
+static void ecryptfs_encode_for_filename(unsigned char *dst, size_t *dst_size,
                                  unsigned char *src, size_t src_size)
 {
        size_t num_blocks;
index 809e67d05ca34fa32eb1363c555db71757d1a6a7..f1ea610362c6c160a9d955c6a8e946da03b83ccb 100644 (file)
@@ -102,12 +102,12 @@ int __init ecryptfs_init_kthread(void)
 
 void ecryptfs_destroy_kthread(void)
 {
-       struct ecryptfs_open_req *req;
+       struct ecryptfs_open_req *req, *tmp;
 
        mutex_lock(&ecryptfs_kthread_ctl.mux);
        ecryptfs_kthread_ctl.flags |= ECRYPTFS_KTHREAD_ZOMBIE;
-       list_for_each_entry(req, &ecryptfs_kthread_ctl.req_list,
-                           kthread_ctl_list) {
+       list_for_each_entry_safe(req, tmp, &ecryptfs_kthread_ctl.req_list,
+                                kthread_ctl_list) {
                list_del(&req->kthread_ctl_list);
                *req->lower_file = ERR_PTR(-EIO);
                complete(&req->done);
index bd1d57f98f746af552df4af0acda732f92f6d2f9..564a1fa34b9941a4672d3b455db928ebcd4e4fa1 100644 (file)
@@ -338,7 +338,8 @@ static int ecryptfs_write_begin(struct file *file,
                        if (prev_page_end_size
                            >= i_size_read(page->mapping->host)) {
                                zero_user(page, 0, PAGE_CACHE_SIZE);
-                       } else {
+                               SetPageUptodate(page);
+                       } else if (len < PAGE_CACHE_SIZE) {
                                rc = ecryptfs_decrypt_page(page);
                                if (rc) {
                                        printk(KERN_ERR "%s: Error decrypting "
@@ -348,8 +349,8 @@ static int ecryptfs_write_begin(struct file *file,
                                        ClearPageUptodate(page);
                                        goto out;
                                }
+                               SetPageUptodate(page);
                        }
-                       SetPageUptodate(page);
                }
        }
        /* If creating a page or more of holes, zero them out via truncate.
@@ -499,6 +500,13 @@ static int ecryptfs_write_end(struct file *file,
                }
                goto out;
        }
+       if (!PageUptodate(page)) {
+               if (copied < PAGE_CACHE_SIZE) {
+                       rc = 0;
+                       goto out;
+               }
+               SetPageUptodate(page);
+       }
        /* Fills in zeros if 'to' goes beyond inode size */
        rc = fill_zeros_to_end_of_page(page, to);
        if (rc) {
index be56b21435f8c4e5170fdb2c0963abdd24dc9291..9fec1836057a9298ad9f121afcea03c64388eb88 100644 (file)
@@ -1313,7 +1313,7 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even
         * otherwise we might miss an event that happens between the
         * f_op->poll() call and the new event set registering.
         */
-       epi->event.events = event->events;
+       epi->event.events = event->events; /* need barrier below */
        pt._key = event->events;
        epi->event.data = event->data; /* protected by mtx */
        if (epi->event.events & EPOLLWAKEUP) {
@@ -1323,6 +1323,26 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even
                ep_destroy_wakeup_source(epi);
        }
 
+       /*
+        * The following barrier has two effects:
+        *
+        * 1) Flush epi changes above to other CPUs.  This ensures
+        *    we do not miss events from ep_poll_callback if an
+        *    event occurs immediately after we call f_op->poll().
+        *    We need this because we did not take ep->lock while
+        *    changing epi above (but ep_poll_callback does take
+        *    ep->lock).
+        *
+        * 2) We also need to ensure we do not miss _past_ events
+        *    when calling f_op->poll().  This barrier also
+        *    pairs with the barrier in wq_has_sleeper (see
+        *    comments for wq_has_sleeper).
+        *
+        * This barrier will now guarantee ep_poll_callback or f_op->poll
+        * (or both) will notice the readiness of an item.
+        */
+       smp_mb();
+
        /*
         * Get current event bits. We can safely use the file* here because
         * its usage count has been increased by the caller of this function.
index 18c45cac368fe3ec830c7f0c8433e5cd2db0fc2d..20df02c1cc70190b04802493d5a25b802e0adcba 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -434,8 +434,9 @@ static int count(struct user_arg_ptr argv, int max)
                        if (IS_ERR(p))
                                return -EFAULT;
 
-                       if (i++ >= max)
+                       if (i >= max)
                                return -E2BIG;
+                       ++i;
 
                        if (fatal_signal_pending(current))
                                return -ERESTARTNOHAND;
index 0a475c881852666d6f21b9a0fc82207d35b6be46..987358740cb970dab82917f952f8cc8bfae4361c 100644 (file)
@@ -41,6 +41,7 @@ config EXT4_USE_FOR_EXT23
 
 config EXT4_FS_POSIX_ACL
        bool "Ext4 POSIX Access Control Lists"
+       depends on EXT4_FS
        select FS_POSIX_ACL
        help
          POSIX Access Control Lists (ACLs) support permissions for users and
@@ -53,6 +54,7 @@ config EXT4_FS_POSIX_ACL
 
 config EXT4_FS_SECURITY
        bool "Ext4 Security Labels"
+       depends on EXT4_FS
        help
          Security labels support alternative access control models
          implemented by security modules like SELinux.  This option
index 26af22832a846d43d94c20e67e92a2ab825d835c..5ae1674ec12f16b7eea6635244f9b68f252d9ba2 100644 (file)
@@ -2226,13 +2226,14 @@ errout:
  * removes index from the index block.
  */
 static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode,
-                       struct ext4_ext_path *path)
+                       struct ext4_ext_path *path, int depth)
 {
        int err;
        ext4_fsblk_t leaf;
 
        /* free index block */
-       path--;
+       depth--;
+       path = path + depth;
        leaf = ext4_idx_pblock(path->p_idx);
        if (unlikely(path->p_hdr->eh_entries == 0)) {
                EXT4_ERROR_INODE(inode, "path->p_hdr->eh_entries == 0");
@@ -2257,6 +2258,19 @@ static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode,
 
        ext4_free_blocks(handle, inode, NULL, leaf, 1,
                         EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET);
+
+       while (--depth >= 0) {
+               if (path->p_idx != EXT_FIRST_INDEX(path->p_hdr))
+                       break;
+               path--;
+               err = ext4_ext_get_access(handle, inode, path);
+               if (err)
+                       break;
+               path->p_idx->ei_block = (path+1)->p_idx->ei_block;
+               err = ext4_ext_dirty(handle, inode, path);
+               if (err)
+                       break;
+       }
        return err;
 }
 
@@ -2599,7 +2613,7 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode,
        /* if this leaf is free, then we should
         * remove it from index block above */
        if (err == 0 && eh->eh_entries == 0 && path[depth].p_bh != NULL)
-               err = ext4_ext_rm_idx(handle, inode, path + depth);
+               err = ext4_ext_rm_idx(handle, inode, path, depth);
 
 out:
        return err;
@@ -2802,7 +2816,7 @@ again:
                                /* index is empty, remove it;
                                 * handle must be already prepared by the
                                 * truncatei_leaf() */
-                               err = ext4_ext_rm_idx(handle, inode, path + i);
+                               err = ext4_ext_rm_idx(handle, inode, path, i);
                        }
                        /* root level has p_bh == NULL, brelse() eats this */
                        brelse(path[i].p_bh);
index d07c27ca594a4578887ed898e71c9b60684730df..405565a62277c5bbbf9d5ea91efbeea4118531b2 100644 (file)
@@ -108,14 +108,6 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov,
 
        /* Unaligned direct AIO must be serialized; see comment above */
        if (unaligned_aio) {
-               static unsigned long unaligned_warn_time;
-
-               /* Warn about this once per day */
-               if (printk_timed_ratelimit(&unaligned_warn_time, 60*60*24*HZ))
-                       ext4_msg(inode->i_sb, KERN_WARNING,
-                                "Unaligned AIO/DIO on inode %ld by %s; "
-                                "performance will be poor.",
-                                inode->i_ino, current->comm);
                mutex_lock(ext4_aio_mutex(inode));
                ext4_unwritten_wait(inode);
        }
index dfbc1fe9667487518d965ecb361d1724f822f983..3278e64e57b61ac51a41db3ceebeecd21003985a 100644 (file)
@@ -109,8 +109,6 @@ static int __sync_inode(struct inode *inode, int datasync)
  *
  * What we do is just kick off a commit and wait on it.  This will snapshot the
  * inode to disk.
- *
- * i_mutex lock is held when entering and exiting this function
  */
 
 int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
index cb1c1ab2720bd6c08c641879adb5ac77c11ca104..cbfe13bf5b2aa3f39b4845fe4fce4f45a02b5f43 100644 (file)
@@ -2880,8 +2880,6 @@ static void ext4_invalidatepage_free_endio(struct page *page, unsigned long offs
 
 static void ext4_invalidatepage(struct page *page, unsigned long offset)
 {
-       journal_t *journal = EXT4_JOURNAL(page->mapping->host);
-
        trace_ext4_invalidatepage(page, offset);
 
        /*
@@ -2889,16 +2887,34 @@ static void ext4_invalidatepage(struct page *page, unsigned long offset)
         */
        if (ext4_should_dioread_nolock(page->mapping->host))
                ext4_invalidatepage_free_endio(page, offset);
+
+       /* No journalling happens on data buffers when this function is used */
+       WARN_ON(page_has_buffers(page) && buffer_jbd(page_buffers(page)));
+
+       block_invalidatepage(page, offset);
+}
+
+static int __ext4_journalled_invalidatepage(struct page *page,
+                                           unsigned long offset)
+{
+       journal_t *journal = EXT4_JOURNAL(page->mapping->host);
+
+       trace_ext4_journalled_invalidatepage(page, offset);
+
        /*
         * If it's a full truncate we just forget about the pending dirtying
         */
        if (offset == 0)
                ClearPageChecked(page);
 
-       if (journal)
-               jbd2_journal_invalidatepage(journal, page, offset);
-       else
-               block_invalidatepage(page, offset);
+       return jbd2_journal_invalidatepage(journal, page, offset);
+}
+
+/* Wrapper for aops... */
+static void ext4_journalled_invalidatepage(struct page *page,
+                                          unsigned long offset)
+{
+       WARN_ON(__ext4_journalled_invalidatepage(page, offset) < 0);
 }
 
 static int ext4_releasepage(struct page *page, gfp_t wait)
@@ -3264,7 +3280,7 @@ static const struct address_space_operations ext4_journalled_aops = {
        .write_end              = ext4_journalled_write_end,
        .set_page_dirty         = ext4_journalled_set_page_dirty,
        .bmap                   = ext4_bmap,
-       .invalidatepage         = ext4_invalidatepage,
+       .invalidatepage         = ext4_journalled_invalidatepage,
        .releasepage            = ext4_releasepage,
        .direct_IO              = ext4_direct_IO,
        .is_partially_uptodate  = block_is_partially_uptodate,
@@ -4304,6 +4320,47 @@ int ext4_write_inode(struct inode *inode, struct writeback_control *wbc)
        return err;
 }
 
+/*
+ * In data=journal mode ext4_journalled_invalidatepage() may fail to invalidate
+ * buffers that are attached to a page stradding i_size and are undergoing
+ * commit. In that case we have to wait for commit to finish and try again.
+ */
+static void ext4_wait_for_tail_page_commit(struct inode *inode)
+{
+       struct page *page;
+       unsigned offset;
+       journal_t *journal = EXT4_SB(inode->i_sb)->s_journal;
+       tid_t commit_tid = 0;
+       int ret;
+
+       offset = inode->i_size & (PAGE_CACHE_SIZE - 1);
+       /*
+        * All buffers in the last page remain valid? Then there's nothing to
+        * do. We do the check mainly to optimize the common PAGE_CACHE_SIZE ==
+        * blocksize case
+        */
+       if (offset > PAGE_CACHE_SIZE - (1 << inode->i_blkbits))
+               return;
+       while (1) {
+               page = find_lock_page(inode->i_mapping,
+                                     inode->i_size >> PAGE_CACHE_SHIFT);
+               if (!page)
+                       return;
+               ret = __ext4_journalled_invalidatepage(page, offset);
+               unlock_page(page);
+               page_cache_release(page);
+               if (ret != -EBUSY)
+                       return;
+               commit_tid = 0;
+               read_lock(&journal->j_state_lock);
+               if (journal->j_committing_transaction)
+                       commit_tid = journal->j_committing_transaction->t_tid;
+               read_unlock(&journal->j_state_lock);
+               if (commit_tid)
+                       jbd2_log_wait_commit(journal, commit_tid);
+       }
+}
+
 /*
  * ext4_setattr()
  *
@@ -4417,16 +4474,28 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
        }
 
        if (attr->ia_valid & ATTR_SIZE) {
-               if (attr->ia_size != i_size_read(inode)) {
-                       truncate_setsize(inode, attr->ia_size);
-                       /* Inode size will be reduced, wait for dio in flight.
-                        * Temporarily disable dioread_nolock to prevent
-                        * livelock. */
+               if (attr->ia_size != inode->i_size) {
+                       loff_t oldsize = inode->i_size;
+
+                       i_size_write(inode, attr->ia_size);
+                       /*
+                        * Blocks are going to be removed from the inode. Wait
+                        * for dio in flight.  Temporarily disable
+                        * dioread_nolock to prevent livelock.
+                        */
                        if (orphan) {
-                               ext4_inode_block_unlocked_dio(inode);
-                               inode_dio_wait(inode);
-                               ext4_inode_resume_unlocked_dio(inode);
+                               if (!ext4_should_journal_data(inode)) {
+                                       ext4_inode_block_unlocked_dio(inode);
+                                       inode_dio_wait(inode);
+                                       ext4_inode_resume_unlocked_dio(inode);
+                               } else
+                                       ext4_wait_for_tail_page_commit(inode);
                        }
+                       /*
+                        * Truncate pagecache after we've waited for commit
+                        * in data=journal mode to make pages freeable.
+                        */
+                       truncate_pagecache(inode, oldsize, inode->i_size);
                }
                ext4_truncate(inode);
        }
index cac44828233159bfeb1d93c502943fe82b813b2a..f9ed946a448ebb4a7704c5d08fcfe44c42a75f80 100644 (file)
@@ -722,7 +722,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir,
                        ext4_warning(dir->i_sb, "Node failed checksum");
                        brelse(bh);
                        *err = ERR_BAD_DX_DIR;
-                       goto fail;
+                       goto fail2;
                }
                set_buffer_verified(bh);
 
@@ -2368,7 +2368,6 @@ static int ext4_init_new_dir(handle_t *handle, struct inode *dir,
        }
 
        inode->i_size = EXT4_I(inode)->i_disksize = blocksize;
-       dir_block = ext4_bread(handle, inode, 0, 1, &err);
        if (!(dir_block = ext4_bread(handle, inode, 0, 1, &err))) {
                if (!err) {
                        err = -EIO;
@@ -2648,7 +2647,8 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode)
        struct ext4_iloc iloc;
        int err = 0;
 
-       if (!EXT4_SB(inode->i_sb)->s_journal)
+       if ((!EXT4_SB(inode->i_sb)->s_journal) &&
+           !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS))
                return 0;
 
        mutex_lock(&EXT4_SB(inode->i_sb)->s_orphan_lock);
index 3cdb0a2fc64856b041ec4b5f184fb41a5a346771..3d4fb81bacd540ca7b81fd4005f392aa7a516b53 100644 (file)
@@ -1645,9 +1645,7 @@ static int parse_options(char *options, struct super_block *sb,
                         unsigned int *journal_ioprio,
                         int is_remount)
 {
-#ifdef CONFIG_QUOTA
        struct ext4_sb_info *sbi = EXT4_SB(sb);
-#endif
        char *p;
        substring_t args[MAX_OPT_ARGS];
        int token;
@@ -1696,6 +1694,16 @@ static int parse_options(char *options, struct super_block *sb,
                }
        }
 #endif
+       if (test_opt(sb, DIOREAD_NOLOCK)) {
+               int blocksize =
+                       BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size);
+
+               if (blocksize < PAGE_CACHE_SIZE) {
+                       ext4_msg(sb, KERN_ERR, "can't mount with "
+                                "dioread_nolock if block size != PAGE_SIZE");
+                       return 0;
+               }
+       }
        return 1;
 }
 
@@ -2212,7 +2220,9 @@ static void ext4_orphan_cleanup(struct super_block *sb,
                                __func__, inode->i_ino, inode->i_size);
                        jbd_debug(2, "truncating inode %lu to %lld bytes\n",
                                  inode->i_ino, inode->i_size);
+                       mutex_lock(&inode->i_mutex);
                        ext4_truncate(inode);
+                       mutex_unlock(&inode->i_mutex);
                        nr_truncates++;
                } else {
                        ext4_msg(sb, KERN_DEBUG,
@@ -3223,6 +3233,10 @@ int ext4_calculate_overhead(struct super_block *sb)
                        memset(buf, 0, PAGE_SIZE);
                cond_resched();
        }
+       /* Add the journal blocks as well */
+       if (sbi->s_journal)
+               overhead += EXT4_B2C(sbi, sbi->s_journal->j_maxlen);
+
        sbi->s_overhead = overhead;
        smp_wmb();
        free_page((unsigned long) buf);
@@ -3436,15 +3450,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
                        clear_opt(sb, DELALLOC);
        }
 
-       blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size);
-       if (test_opt(sb, DIOREAD_NOLOCK)) {
-               if (blocksize < PAGE_SIZE) {
-                       ext4_msg(sb, KERN_ERR, "can't mount with "
-                                "dioread_nolock if block size != PAGE_SIZE");
-                       goto failed_mount;
-               }
-       }
-
        sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
                (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0);
 
@@ -3486,6 +3491,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
        if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY)))
                goto failed_mount;
 
+       blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size);
        if (blocksize < EXT4_MIN_BLOCK_SIZE ||
            blocksize > EXT4_MAX_BLOCK_SIZE) {
                ext4_msg(sb, KERN_ERR,
@@ -4725,7 +4731,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
        }
 
        ext4_setup_system_zone(sb);
-       if (sbi->s_journal == NULL)
+       if (sbi->s_journal == NULL && !(old_sb_flags & MS_RDONLY))
                ext4_commit_super(sb, 1);
 
 #ifdef CONFIG_QUOTA
index 655aeabc1dd41f8b18f77ee14092601c8ad89cbb..3aa5ce7cab83d30012e86942bfed4317ac0b2b99 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/backing-dev.h>
 #include <linux/blkdev.h>
 #include <linux/bio.h>
+#include <linux/prefetch.h>
 
 #include "f2fs.h"
 #include "node.h"
index b4e24f32b54ee11297d2109aeeb9bd77ce3da63e..951ed52748f6171a3bc1097a3d806f0df37c778c 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
 #include "f2fs.h"
+#include "node.h"
 #include "acl.h"
 
 static unsigned long dir_blocks(struct inode *inode)
@@ -74,7 +75,7 @@ static unsigned long dir_block_index(unsigned int level, unsigned int idx)
        return bidx;
 }
 
-static bool early_match_name(const char *name, int namelen,
+static bool early_match_name(const char *name, size_t namelen,
                        f2fs_hash_t namehash, struct f2fs_dir_entry *de)
 {
        if (le16_to_cpu(de->name_len) != namelen)
@@ -87,7 +88,7 @@ static bool early_match_name(const char *name, int namelen,
 }
 
 static struct f2fs_dir_entry *find_in_block(struct page *dentry_page,
-                       const char *name, int namelen, int *max_slots,
+                       const char *name, size_t namelen, int *max_slots,
                        f2fs_hash_t namehash, struct page **res_page)
 {
        struct f2fs_dir_entry *de;
@@ -126,7 +127,7 @@ found:
 }
 
 static struct f2fs_dir_entry *find_in_level(struct inode *dir,
-               unsigned int level, const char *name, int namelen,
+               unsigned int level, const char *name, size_t namelen,
                        f2fs_hash_t namehash, struct page **res_page)
 {
        int s = GET_DENTRY_SLOTS(namelen);
@@ -181,7 +182,7 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
                        struct qstr *child, struct page **res_page)
 {
        const char *name = child->name;
-       int namelen = child->len;
+       size_t namelen = child->len;
        unsigned long npages = dir_blocks(dir);
        struct f2fs_dir_entry *de = NULL;
        f2fs_hash_t name_hash;
@@ -308,6 +309,7 @@ static int init_inode_metadata(struct inode *inode, struct dentry *dentry)
                ipage = get_node_page(F2FS_SB(dir->i_sb), inode->i_ino);
                if (IS_ERR(ipage))
                        return PTR_ERR(ipage);
+               set_cold_node(inode, ipage);
                init_dent_inode(dentry, ipage);
                f2fs_put_page(ipage, 1);
        }
@@ -381,7 +383,7 @@ int f2fs_add_link(struct dentry *dentry, struct inode *inode)
        struct inode *dir = dentry->d_parent->d_inode;
        struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
        const char *name = dentry->d_name.name;
-       int namelen = dentry->d_name.len;
+       size_t namelen = dentry->d_name.len;
        struct page *dentry_page = NULL;
        struct f2fs_dentry_block *dentry_blk = NULL;
        int slots = GET_DENTRY_SLOTS(namelen);
@@ -540,13 +542,13 @@ int f2fs_make_empty(struct inode *inode, struct inode *parent)
 
        de = &dentry_blk->dentry[0];
        de->name_len = cpu_to_le16(1);
-       de->hash_code = 0;
+       de->hash_code = f2fs_dentry_hash(".", 1);
        de->ino = cpu_to_le32(inode->i_ino);
        memcpy(dentry_blk->filename[0], ".", 1);
        set_de_type(de, inode);
 
        de = &dentry_blk->dentry[1];
-       de->hash_code = 0;
+       de->hash_code = f2fs_dentry_hash("..", 2);
        de->name_len = cpu_to_le16(2);
        de->ino = cpu_to_le32(parent->i_ino);
        memcpy(dentry_blk->filename[1], "..", 2);
index a18d63db2fb6adbe323156ccc74c26405f233893..13c6dfbb71833e202ffec05a21ee8f0dceb5c046 100644 (file)
@@ -881,7 +881,7 @@ int f2fs_sync_fs(struct super_block *, int);
 /*
  * hash.c
  */
-f2fs_hash_t f2fs_dentry_hash(const char *, int);
+f2fs_hash_t f2fs_dentry_hash(const char *, size_t);
 
 /*
  * node.c
index f9e085dfb1f088fbc3e94c7ea7fead9e9093cf9e..7f9ea9271ebeaa4e1da9440758c5fe6c2cee62f3 100644 (file)
@@ -160,15 +160,17 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
        if (need_to_sync_dir(sbi, inode))
                need_cp = true;
 
-       f2fs_write_inode(inode, NULL);
-
        if (need_cp) {
                /* all the dirty node pages should be flushed for POR */
                ret = f2fs_sync_fs(inode->i_sb, 1);
                clear_inode_flag(F2FS_I(inode), FI_NEED_CP);
        } else {
-               while (sync_node_pages(sbi, inode->i_ino, &wbc) == 0)
-                       f2fs_write_inode(inode, NULL);
+               /* if there is no written node page, write its inode page */
+               while (!sync_node_pages(sbi, inode->i_ino, &wbc)) {
+                       ret = f2fs_write_inode(inode, NULL);
+                       if (ret)
+                               goto out;
+               }
                filemap_fdatawait_range(sbi->node_inode->i_mapping,
                                                        0, LONG_MAX);
        }
index 644aa3808273e805c1a366aa1f0815206afb3389..b0ec721e984a324e3e239d4cdfe946cb0a5b8df0 100644 (file)
@@ -390,9 +390,7 @@ next_step:
                }
 
                err = check_valid_map(sbi, segno, off);
-               if (err == GC_ERROR)
-                       return err;
-               else if (err == GC_NEXT)
+               if (err == GC_NEXT)
                        continue;
 
                if (initial) {
@@ -430,28 +428,22 @@ next_step:
  */
 block_t start_bidx_of_node(unsigned int node_ofs)
 {
-       block_t start_bidx;
-       unsigned int bidx, indirect_blks;
-       int dec;
+       unsigned int indirect_blks = 2 * NIDS_PER_BLOCK + 4;
+       unsigned int bidx;
 
-       indirect_blks = 2 * NIDS_PER_BLOCK + 4;
+       if (node_ofs == 0)
+               return 0;
 
-       start_bidx = 1;
-       if (node_ofs == 0) {
-               start_bidx = 0;
-       } else if (node_ofs <= 2) {
+       if (node_ofs <= 2) {
                bidx = node_ofs - 1;
        } else if (node_ofs <= indirect_blks) {
-               dec = (node_ofs - 4) / (NIDS_PER_BLOCK + 1);
+               int dec = (node_ofs - 4) / (NIDS_PER_BLOCK + 1);
                bidx = node_ofs - 2 - dec;
        } else {
-               dec = (node_ofs - indirect_blks - 3) / (NIDS_PER_BLOCK + 1);
+               int dec = (node_ofs - indirect_blks - 3) / (NIDS_PER_BLOCK + 1);
                bidx = node_ofs - 5 - dec;
        }
-
-       if (start_bidx)
-               start_bidx = bidx * ADDRS_PER_BLOCK + ADDRS_PER_INODE;
-       return start_bidx;
+       return bidx * ADDRS_PER_BLOCK + ADDRS_PER_INODE;
 }
 
 static int check_dnode(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
@@ -556,9 +548,7 @@ next_step:
                }
 
                err = check_valid_map(sbi, segno, off);
-               if (err == GC_ERROR)
-                       goto stop;
-               else if (err == GC_NEXT)
+               if (err == GC_NEXT)
                        continue;
 
                if (phase == 0) {
@@ -568,9 +558,7 @@ next_step:
 
                /* Get an inode by ino with checking validity */
                err = check_dnode(sbi, entry, &dni, start_addr + off, &nofs);
-               if (err == GC_ERROR)
-                       goto stop;
-               else if (err == GC_NEXT)
+               if (err == GC_NEXT)
                        continue;
 
                if (phase == 1) {
index a60f04200f8badc98e5468367e6cece8354247d1..6eb8d269b53b612b7141b2d101eccfcf840197e0 100644 (file)
@@ -42,7 +42,7 @@ static void TEA_transform(unsigned int buf[4], unsigned int const in[])
        buf[1] += b1;
 }
 
-static void str2hashbuf(const char *msg, int len, unsigned int *buf, int num)
+static void str2hashbuf(const char *msg, size_t len, unsigned int *buf, int num)
 {
        unsigned pad, val;
        int i;
@@ -69,13 +69,17 @@ static void str2hashbuf(const char *msg, int len, unsigned int *buf, int num)
                *buf++ = pad;
 }
 
-f2fs_hash_t f2fs_dentry_hash(const char *name, int len)
+f2fs_hash_t f2fs_dentry_hash(const char *name, size_t len)
 {
-       __u32 hash, minor_hash;
+       __u32 hash;
        f2fs_hash_t f2fs_hash;
        const char *p;
        __u32 in[8], buf[4];
 
+       if ((len <= 2) && (name[0] == '.') &&
+               (name[1] == '.' || name[1] == '\0'))
+               return 0;
+
        /* Initialize the default seed for the hash checksum functions */
        buf[0] = 0x67452301;
        buf[1] = 0xefcdab89;
@@ -83,15 +87,15 @@ f2fs_hash_t f2fs_dentry_hash(const char *name, int len)
        buf[3] = 0x10325476;
 
        p = name;
-       while (len > 0) {
+       while (1) {
                str2hashbuf(p, len, in, 4);
                TEA_transform(buf, in);
-               len -= 16;
                p += 16;
+               if (len <= 16)
+                       break;
+               len -= 16;
        }
        hash = buf[0];
-       minor_hash = buf[1];
-
        f2fs_hash = cpu_to_le32(hash & ~F2FS_HASH_COL_BIT);
        return f2fs_hash;
 }
index df5fb381ebf137dad5b91748e53d8acc1deb4ee5..bf20b4d03214f01c2a2fa3b278612dc52d73896a 100644 (file)
@@ -203,6 +203,7 @@ void update_inode(struct inode *inode, struct page *node_page)
        ri->i_flags = cpu_to_le32(F2FS_I(inode)->i_flags);
        ri->i_pino = cpu_to_le32(F2FS_I(inode)->i_pino);
        ri->i_generation = cpu_to_le32(inode->i_generation);
+       set_cold_node(inode, node_page);
        set_page_dirty(node_page);
 }
 
index 89b7675dc3770e0ce6d3f6ba4616f2318191a1ce..1a49b881bac021cefa53df578108a2a6972c3961 100644 (file)
@@ -77,8 +77,8 @@ fail:
 
 static int is_multimedia_file(const unsigned char *s, const char *sub)
 {
-       int slen = strlen(s);
-       int sublen = strlen(sub);
+       size_t slen = strlen(s);
+       size_t sublen = strlen(sub);
        int ret;
 
        if (sublen > slen)
@@ -123,6 +123,8 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
        nid_t ino = 0;
        int err;
 
+       f2fs_balance_fs(sbi);
+
        inode = f2fs_new_inode(dir, mode);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
@@ -144,8 +146,6 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
        if (!sbi->por_doing)
                d_instantiate(dentry, inode);
        unlock_new_inode(inode);
-
-       f2fs_balance_fs(sbi);
        return 0;
 out:
        clear_nlink(inode);
@@ -163,6 +163,8 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
        struct f2fs_sb_info *sbi = F2FS_SB(sb);
        int err;
 
+       f2fs_balance_fs(sbi);
+
        inode->i_ctime = CURRENT_TIME;
        atomic_inc(&inode->i_count);
 
@@ -172,8 +174,6 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
                goto out;
 
        d_instantiate(dentry, inode);
-
-       f2fs_balance_fs(sbi);
        return 0;
 out:
        clear_inode_flag(F2FS_I(inode), FI_INC_LINK);
@@ -223,6 +223,8 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
        struct page *page;
        int err = -ENOENT;
 
+       f2fs_balance_fs(sbi);
+
        de = f2fs_find_entry(dir, &dentry->d_name, &page);
        if (!de)
                goto fail;
@@ -238,7 +240,6 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
 
        /* In order to evict this inode,  we set it dirty */
        mark_inode_dirty(inode);
-       f2fs_balance_fs(sbi);
 fail:
        return err;
 }
@@ -249,9 +250,11 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry,
        struct super_block *sb = dir->i_sb;
        struct f2fs_sb_info *sbi = F2FS_SB(sb);
        struct inode *inode;
-       unsigned symlen = strlen(symname) + 1;
+       size_t symlen = strlen(symname) + 1;
        int err;
 
+       f2fs_balance_fs(sbi);
+
        inode = f2fs_new_inode(dir, S_IFLNK | S_IRWXUGO);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
@@ -268,9 +271,6 @@ static int f2fs_symlink(struct inode *dir, struct dentry *dentry,
 
        d_instantiate(dentry, inode);
        unlock_new_inode(inode);
-
-       f2fs_balance_fs(sbi);
-
        return err;
 out:
        clear_nlink(inode);
@@ -286,6 +286,8 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
        struct inode *inode;
        int err;
 
+       f2fs_balance_fs(sbi);
+
        inode = f2fs_new_inode(dir, S_IFDIR | mode);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
@@ -305,7 +307,6 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
        d_instantiate(dentry, inode);
        unlock_new_inode(inode);
 
-       f2fs_balance_fs(sbi);
        return 0;
 
 out_fail:
@@ -336,6 +337,8 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry,
        if (!new_valid_dev(rdev))
                return -EINVAL;
 
+       f2fs_balance_fs(sbi);
+
        inode = f2fs_new_inode(dir, mode);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
@@ -350,9 +353,6 @@ static int f2fs_mknod(struct inode *dir, struct dentry *dentry,
        alloc_nid_done(sbi, inode->i_ino);
        d_instantiate(dentry, inode);
        unlock_new_inode(inode);
-
-       f2fs_balance_fs(sbi);
-
        return 0;
 out:
        clear_nlink(inode);
@@ -376,6 +376,8 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
        struct f2fs_dir_entry *new_entry;
        int err = -ENOENT;
 
+       f2fs_balance_fs(sbi);
+
        old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
        if (!old_entry)
                goto out;
@@ -441,8 +443,6 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
        }
 
        mutex_unlock_op(sbi, RENAME);
-
-       f2fs_balance_fs(sbi);
        return 0;
 
 out_dir:
index 19870361497e00b088999873a88837e8c41bb90c..5066bfd256c973657ec28795e2d87af557b13b89 100644 (file)
@@ -484,12 +484,14 @@ static void truncate_node(struct dnode_of_data *dn)
        struct node_info ni;
 
        get_node_info(sbi, dn->nid, &ni);
+       if (dn->inode->i_blocks == 0) {
+               BUG_ON(ni.blk_addr != NULL_ADDR);
+               goto invalidate;
+       }
        BUG_ON(ni.blk_addr == NULL_ADDR);
 
-       if (ni.blk_addr != NULL_ADDR)
-               invalidate_blocks(sbi, ni.blk_addr);
-
        /* Deallocate node address */
+       invalidate_blocks(sbi, ni.blk_addr);
        dec_valid_node_count(sbi, dn->inode, 1);
        set_node_addr(sbi, &ni, NULL_ADDR);
 
@@ -499,7 +501,7 @@ static void truncate_node(struct dnode_of_data *dn)
        } else {
                sync_inode_page(dn);
        }
-
+invalidate:
        clear_node_page_dirty(dn->node_page);
        F2FS_SET_SB_DIRT(sbi);
 
@@ -768,20 +770,12 @@ int remove_inode_page(struct inode *inode)
                dn.inode_page_locked = 1;
                truncate_node(&dn);
        }
-       if (inode->i_blocks == 1) {
-               /* inernally call f2fs_put_page() */
-               set_new_dnode(&dn, inode, page, page, ino);
-               truncate_node(&dn);
-       } else if (inode->i_blocks == 0) {
-               struct node_info ni;
-               get_node_info(sbi, inode->i_ino, &ni);
 
-               /* called after f2fs_new_inode() is failed */
-               BUG_ON(ni.blk_addr != NULL_ADDR);
-               f2fs_put_page(page, 1);
-       } else {
-               BUG();
-       }
+       /* 0 is possible, after f2fs_new_inode() is failed */
+       BUG_ON(inode->i_blocks != 0 && inode->i_blocks != 1);
+       set_new_dnode(&dn, inode, page, page, ino);
+       truncate_node(&dn);
+
        mutex_unlock_op(sbi, NODE_TRUNC);
        return 0;
 }
@@ -834,17 +828,18 @@ struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs)
                goto fail;
        }
        set_node_addr(sbi, &new_ni, NEW_ADDR);
+       set_cold_node(dn->inode, page);
 
        dn->node_page = page;
        sync_inode_page(dn);
        set_page_dirty(page);
-       set_cold_node(dn->inode, page);
        if (ofs == 0)
                inc_valid_inode_count(sbi);
 
        return page;
 
 fail:
+       clear_node_page_dirty(page);
        f2fs_put_page(page, 1);
        return ERR_PTR(err);
 }
@@ -1093,7 +1088,6 @@ static int f2fs_write_node_page(struct page *page,
 {
        struct f2fs_sb_info *sbi = F2FS_SB(page->mapping->host->i_sb);
        nid_t nid;
-       unsigned int nofs;
        block_t new_addr;
        struct node_info ni;
 
@@ -1110,7 +1104,6 @@ static int f2fs_write_node_page(struct page *page,
 
        /* get old block addr of this node page */
        nid = nid_of_node(page);
-       nofs = ofs_of_node(page);
        BUG_ON(page->index != nid);
 
        get_node_info(sbi, nid, &ni);
@@ -1571,7 +1564,7 @@ void flush_nat_entries(struct f2fs_sb_info *sbi)
                nid_t nid;
                struct f2fs_nat_entry raw_ne;
                int offset = -1;
-               block_t old_blkaddr, new_blkaddr;
+               block_t new_blkaddr;
 
                ne = list_entry(cur, struct nat_entry, list);
                nid = nat_get_nid(ne);
@@ -1585,7 +1578,6 @@ void flush_nat_entries(struct f2fs_sb_info *sbi)
                offset = lookup_journal_in_cursum(sum, NAT_JOURNAL, nid, 1);
                if (offset >= 0) {
                        raw_ne = nat_in_journal(sum, offset);
-                       old_blkaddr = le32_to_cpu(raw_ne.block_addr);
                        goto flush_now;
                }
 to_nat_page:
@@ -1607,7 +1599,6 @@ to_nat_page:
 
                BUG_ON(!nat_blk);
                raw_ne = nat_blk->entries[nid - start_nid];
-               old_blkaddr = le32_to_cpu(raw_ne.block_addr);
 flush_now:
                new_blkaddr = nat_get_blkaddr(ne);
 
index b07e9b6ef376643e509fa31329765665680600d3..b571fee677d5837e4481c805f82f3f38f8975281 100644 (file)
@@ -144,14 +144,15 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head)
                                goto out;
                        }
 
-                       INIT_LIST_HEAD(&entry->list);
-                       list_add_tail(&entry->list, head);
-
                        entry->inode = f2fs_iget(sbi->sb, ino_of_node(page));
                        if (IS_ERR(entry->inode)) {
                                err = PTR_ERR(entry->inode);
+                               kmem_cache_free(fsync_entry_slab, entry);
                                goto out;
                        }
+
+                       INIT_LIST_HEAD(&entry->list);
+                       list_add_tail(&entry->list, head);
                        entry->blkaddr = blkaddr;
                }
                if (IS_INODE(page)) {
@@ -228,6 +229,9 @@ static void check_index_in_prev_nodes(struct f2fs_sb_info *sbi,
 
        /* Deallocate previous index in the node page */
        inode = f2fs_iget_nowait(sbi->sb, ino);
+       if (IS_ERR(inode))
+               return;
+
        truncate_hole(inode, bidx, bidx + 1);
        iput(inode);
 }
index 1b26e4ea10167edad524cde5c1316b059edb8e07..de6240922b0a8f14d4a17109013d09e432b0fb6e 100644 (file)
 #include <linux/f2fs_fs.h>
 #include <linux/bio.h>
 #include <linux/blkdev.h>
+#include <linux/prefetch.h>
 #include <linux/vmalloc.h>
 
 #include "f2fs.h"
 #include "segment.h"
 #include "node.h"
 
-static int need_to_flush(struct f2fs_sb_info *sbi)
-{
-       unsigned int pages_per_sec = (1 << sbi->log_blocks_per_seg) *
-                       sbi->segs_per_sec;
-       int node_secs = ((get_pages(sbi, F2FS_DIRTY_NODES) + pages_per_sec - 1)
-               >> sbi->log_blocks_per_seg) / sbi->segs_per_sec;
-       int dent_secs = ((get_pages(sbi, F2FS_DIRTY_DENTS) + pages_per_sec - 1)
-               >> sbi->log_blocks_per_seg) / sbi->segs_per_sec;
-
-       if (sbi->por_doing)
-               return 0;
-
-       if (free_sections(sbi) <= (node_secs + 2 * dent_secs +
-                                               reserved_sections(sbi)))
-               return 1;
-       return 0;
-}
-
 /*
  * This function balances dirty node and dentry pages.
  * In addition, it controls garbage collection.
  */
 void f2fs_balance_fs(struct f2fs_sb_info *sbi)
 {
-       struct writeback_control wbc = {
-               .sync_mode = WB_SYNC_ALL,
-               .nr_to_write = LONG_MAX,
-               .for_reclaim = 0,
-       };
-
-       if (sbi->por_doing)
-               return;
-
        /*
-        * We should do checkpoint when there are so many dirty node pages
-        * with enough free segments. After then, we should do GC.
+        * We should do GC or end up with checkpoint, if there are so many dirty
+        * dir/node pages without enough free segments.
         */
-       if (need_to_flush(sbi)) {
-               sync_dirty_dir_inodes(sbi);
-               sync_node_pages(sbi, 0, &wbc);
-       }
-
        if (has_not_enough_free_secs(sbi)) {
                mutex_lock(&sbi->gc_mutex);
                f2fs_gc(sbi, 1);
@@ -631,7 +600,6 @@ static void f2fs_end_io_write(struct bio *bio, int err)
                        if (page->mapping)
                                set_bit(AS_EIO, &page->mapping->flags);
                        set_ckpt_flags(p->sbi->ckpt, CP_ERROR_FLAG);
-                       set_page_dirty(page);
                }
                end_page_writeback(page);
                dec_page_count(p->sbi, F2FS_WRITEBACK);
@@ -791,11 +759,10 @@ static int __get_segment_type(struct page *page, enum page_type p_type)
                return __get_segment_type_2(page, p_type);
        case 4:
                return __get_segment_type_4(page, p_type);
-       case 6:
-               return __get_segment_type_6(page, p_type);
-       default:
-               BUG();
        }
+       /* NR_CURSEG_TYPE(6) logs by default */
+       BUG_ON(sbi->active_logs != NR_CURSEG_TYPE);
+       return __get_segment_type_6(page, p_type);
 }
 
 static void do_write_page(struct f2fs_sb_info *sbi, struct page *page,
@@ -1608,7 +1575,6 @@ static int build_dirty_segmap(struct f2fs_sb_info *sbi)
 
        for (i = 0; i < NR_DIRTY_TYPE; i++) {
                dirty_i->dirty_segmap[i] = kzalloc(bitmap_size, GFP_KERNEL);
-               dirty_i->nr_dirty[i] = 0;
                if (!dirty_i->dirty_segmap[i])
                        return -ENOMEM;
        }
index 0948405af6f5f88ef1e71a2904231677e37bfa69..66a288a52fd306f64d83cba764729d35c56f46f1 100644 (file)
@@ -459,7 +459,20 @@ static inline int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
 
 static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi)
 {
-       return free_sections(sbi) <= reserved_sections(sbi);
+       unsigned int pages_per_sec = (1 << sbi->log_blocks_per_seg) *
+                       sbi->segs_per_sec;
+       int node_secs = ((get_pages(sbi, F2FS_DIRTY_NODES) + pages_per_sec - 1)
+                       >> sbi->log_blocks_per_seg) / sbi->segs_per_sec;
+       int dent_secs = ((get_pages(sbi, F2FS_DIRTY_DENTS) + pages_per_sec - 1)
+                       >> sbi->log_blocks_per_seg) / sbi->segs_per_sec;
+
+       if (sbi->por_doing)
+               return false;
+
+       if (free_sections(sbi) <= (node_secs + 2 * dent_secs +
+                                               reserved_sections(sbi)))
+               return true;
+       return false;
 }
 
 static inline int utilization(struct f2fs_sb_info *sbi)
index 13867322cf5afaa20fc5fe5089fb1b58a36e772d..08a94c814bdc9a9a5047e632863ac1d03bdfcd8d 100644 (file)
@@ -119,7 +119,6 @@ static void f2fs_put_super(struct super_block *sb)
 int f2fs_sync_fs(struct super_block *sb, int sync)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(sb);
-       int ret = 0;
 
        if (!sbi->s_dirty && !get_pages(sbi, F2FS_DIRTY_NODES))
                return 0;
@@ -127,7 +126,7 @@ int f2fs_sync_fs(struct super_block *sb, int sync)
        if (sync)
                write_checkpoint(sbi, false, false);
 
-       return ret;
+       return 0;
 }
 
 static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)
@@ -148,8 +147,8 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)
        buf->f_bfree = buf->f_blocks - valid_user_blocks(sbi) - ovp_count;
        buf->f_bavail = user_block_count - valid_user_blocks(sbi);
 
-       buf->f_files = valid_inode_count(sbi);
-       buf->f_ffree = sbi->total_node_count - valid_node_count(sbi);
+       buf->f_files = sbi->total_node_count;
+       buf->f_ffree = sbi->total_node_count - valid_inode_count(sbi);
 
        buf->f_namelen = F2FS_MAX_NAME_LEN;
        buf->f_fsid.val[0] = (u32)id;
@@ -302,7 +301,7 @@ static int parse_options(struct f2fs_sb_info *sbi, char *options)
                case Opt_active_logs:
                        if (args->from && match_int(args, &arg))
                                return -EINVAL;
-                       if (arg != 2 && arg != 4 && arg != 6)
+                       if (arg != 2 && arg != 4 && arg != NR_CURSEG_TYPE)
                                return -EINVAL;
                        sbi->active_logs = arg;
                        break;
@@ -528,8 +527,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
 
        /* if there are nt orphan nodes free them */
        err = -EINVAL;
-       if (!is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG) &&
-                               recover_orphan_inodes(sbi))
+       if (recover_orphan_inodes(sbi))
                goto free_node_inode;
 
        /* read root inode and dentry */
@@ -548,8 +546,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
        }
 
        /* recover fsynced data */
-       if (!is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG) &&
-                               !test_opt(sbi, DISABLE_ROLL_FORWARD))
+       if (!test_opt(sbi, DISABLE_ROLL_FORWARD))
                recover_fsync_data(sbi);
 
        /* After POR, we can run background GC thread */
index 7d52e8dc0c5962bd2c30007d73f907c8c92255c7..940136a3d3a61a05494f9163c5cbd9cf19874a37 100644 (file)
@@ -208,7 +208,7 @@ int f2fs_getxattr(struct inode *inode, int name_index, const char *name,
        struct page *page;
        void *base_addr;
        int error = 0, found = 0;
-       int value_len, name_len;
+       size_t value_len, name_len;
 
        if (name == NULL)
                return -EINVAL;
@@ -304,7 +304,8 @@ int f2fs_setxattr(struct inode *inode, int name_index, const char *name,
        struct f2fs_xattr_entry *here, *last;
        struct page *page;
        void *base_addr;
-       int error, found, free, name_len, newsize;
+       int error, found, free, newsize;
+       size_t name_len;
        char *pval;
 
        if (name == NULL)
index 15cb8618e95d0cf6568e8e9dd68b37008ea4d435..2b3570b7caeba28bab8df3a4598fbdfc75fdcfc7 100644 (file)
--- a/fs/file.c
+++ b/fs/file.c
@@ -490,7 +490,7 @@ void exit_files(struct task_struct *tsk)
        }
 }
 
-static void __devinit fdtable_defer_list_init(int cpu)
+static void fdtable_defer_list_init(int cpu)
 {
        struct fdtable_defer *fddef = &per_cpu(fdtable_defer_list, cpu);
        spin_lock_init(&fddef->lock);
index 8dad6b09371660ff66d5fb17dba7c6e38bbd0d53..b906ed17a8391a99ffbc15d8ea62c6861be90689 100644 (file)
@@ -241,6 +241,7 @@ static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags,
 
 static void gfs2_reverse_hex(char *c, u64 value)
 {
+       *c = '0';
        while (value) {
                *c-- = hex_asc[value & 0x0f];
                value >>= 4;
index 37ee061d899e81a8eb45f5bc64382634e573c108..b7eff078fe90f88f6561978b1917e50658482011 100644 (file)
@@ -350,10 +350,14 @@ static u32 gfs2_free_extlen(const struct gfs2_rbm *rrbm, u32 len)
                BUG_ON(len < chunk_size);
                len -= chunk_size;
                block = gfs2_rbm_to_block(&rbm);
-               gfs2_rbm_from_block(&rbm, block + chunk_size);
-               n_unaligned = 3;
-               if (ptr)
+               if (gfs2_rbm_from_block(&rbm, block + chunk_size)) {
+                       n_unaligned = 0;
                        break;
+               }
+               if (ptr) {
+                       n_unaligned = 3;
+                       break;
+               }
                n_unaligned = len & 3;
        }
 
@@ -557,22 +561,20 @@ void gfs2_free_clones(struct gfs2_rgrpd *rgd)
  */
 int gfs2_rs_alloc(struct gfs2_inode *ip)
 {
-       struct gfs2_blkreserv *res;
+       int error = 0;
 
+       down_write(&ip->i_rw_mutex);
        if (ip->i_res)
-               return 0;
-
-       res = kmem_cache_zalloc(gfs2_rsrv_cachep, GFP_NOFS);
-       if (!res)
-               return -ENOMEM;
+               goto out;
 
-       RB_CLEAR_NODE(&res->rs_node);
+       ip->i_res = kmem_cache_zalloc(gfs2_rsrv_cachep, GFP_NOFS);
+       if (!ip->i_res) {
+               error = -ENOMEM;
+               goto out;
+       }
 
-       down_write(&ip->i_rw_mutex);
-       if (ip->i_res)
-               kmem_cache_free(gfs2_rsrv_cachep, res);
-       else
-               ip->i_res = res;
+       RB_CLEAR_NODE(&ip->i_res->rs_node);
+out:
        up_write(&ip->i_rw_mutex);
        return 0;
 }
@@ -1424,6 +1426,9 @@ static void rg_mblk_search(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip,
                rs->rs_free = extlen;
                rs->rs_inum = ip->i_no_addr;
                rs_insert(ip);
+       } else {
+               if (goal == rgd->rd_last_alloc + rgd->rd_data0)
+                       rgd->rd_last_alloc = 0;
        }
 }
 
index 42f6615af0ac47d984fc5084623570d231832cfb..df9f29760efa99931bef9fdd9609e7580d8852cd 100644 (file)
@@ -209,7 +209,8 @@ repeat:
                if (!new_transaction)
                        goto alloc_transaction;
                write_lock(&journal->j_state_lock);
-               if (!journal->j_running_transaction) {
+               if (!journal->j_running_transaction &&
+                   !journal->j_barrier_count) {
                        jbd2_get_transaction(journal, new_transaction);
                        new_transaction = NULL;
                }
@@ -1839,7 +1840,6 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh,
 
        BUFFER_TRACE(bh, "entry");
 
-retry:
        /*
         * It is safe to proceed here without the j_list_lock because the
         * buffers cannot be stolen by try_to_free_buffers as long as we are
@@ -1934,14 +1934,11 @@ retry:
                 * for commit and try again.
                 */
                if (partial_page) {
-                       tid_t tid = journal->j_committing_transaction->t_tid;
-
                        jbd2_journal_put_journal_head(jh);
                        spin_unlock(&journal->j_list_lock);
                        jbd_unlock_bh_state(bh);
                        write_unlock(&journal->j_state_lock);
-                       jbd2_log_wait_commit(journal, tid);
-                       goto retry;
+                       return -EBUSY;
                }
                /*
                 * OK, buffer won't be reachable after truncate. We just set
@@ -2002,21 +1999,23 @@ zap_buffer_unlocked:
  * @page:    page to flush
  * @offset:  length of page to invalidate.
  *
- * Reap page buffers containing data after offset in page.
- *
+ * Reap page buffers containing data after offset in page. Can return -EBUSY
+ * if buffers are part of the committing transaction and the page is straddling
+ * i_size. Caller then has to wait for current commit and try again.
  */
-void jbd2_journal_invalidatepage(journal_t *journal,
-                     struct page *page,
-                     unsigned long offset)
+int jbd2_journal_invalidatepage(journal_t *journal,
+                               struct page *page,
+                               unsigned long offset)
 {
        struct buffer_head *head, *bh, *next;
        unsigned int curr_off = 0;
        int may_free = 1;
+       int ret = 0;
 
        if (!PageLocked(page))
                BUG();
        if (!page_has_buffers(page))
-               return;
+               return 0;
 
        /* We will potentially be playing with lists other than just the
         * data lists (especially for journaled data mode), so be
@@ -2030,9 +2029,11 @@ void jbd2_journal_invalidatepage(journal_t *journal,
                if (offset <= curr_off) {
                        /* This block is wholly outside the truncation point */
                        lock_buffer(bh);
-                       may_free &= journal_unmap_buffer(journal, bh,
-                                                        offset > 0);
+                       ret = journal_unmap_buffer(journal, bh, offset > 0);
                        unlock_buffer(bh);
+                       if (ret < 0)
+                               return ret;
+                       may_free &= ret;
                }
                curr_off = next_off;
                bh = next;
@@ -2043,6 +2044,7 @@ void jbd2_journal_invalidatepage(journal_t *journal,
                if (may_free && try_to_free_buffers(page))
                        J_ASSERT(!page_has_buffers(page));
        }
+       return 0;
 }
 
 /*
index c89b26bc9759251ab370da28eab07a266adbd573..264d1aa935f2b3e52e3e08bd26ee99c30912c8f6 100644 (file)
@@ -206,7 +206,7 @@ static u32 initiate_bulk_draining(struct nfs_client *clp,
 
                list_for_each_entry(lo, &server->layouts, plh_layouts) {
                        ino = igrab(lo->plh_inode);
-                       if (ino)
+                       if (!ino)
                                continue;
                        spin_lock(&ino->i_lock);
                        /* Is this layout in the process of being freed? */
index 32e6c53520e22033237206e9264378efe33104e6..1b2d7eb93796dcbda72ee7d21deb0e7aa2b58952 100644 (file)
@@ -2153,12 +2153,16 @@ static int nfs_open_permission_mask(int openflags)
 {
        int mask = 0;
 
-       if ((openflags & O_ACCMODE) != O_WRONLY)
-               mask |= MAY_READ;
-       if ((openflags & O_ACCMODE) != O_RDONLY)
-               mask |= MAY_WRITE;
-       if (openflags & __FMODE_EXEC)
-               mask |= MAY_EXEC;
+       if (openflags & __FMODE_EXEC) {
+               /* ONLY check exec rights */
+               mask = MAY_EXEC;
+       } else {
+               if ((openflags & O_ACCMODE) != O_WRONLY)
+                       mask |= MAY_READ;
+               if ((openflags & O_ACCMODE) != O_RDONLY)
+                       mask |= MAY_WRITE;
+       }
+
        return mask;
 }
 
index 5d864fb3657885ff9eb8a043d880f2c1490f8d0e..cf747ef8665078a2a684b256402ab63484a77665 100644 (file)
@@ -1626,7 +1626,8 @@ static int _nfs4_recover_proc_open(struct nfs4_opendata *data)
 
 static int nfs4_opendata_access(struct rpc_cred *cred,
                                struct nfs4_opendata *opendata,
-                               struct nfs4_state *state, fmode_t fmode)
+                               struct nfs4_state *state, fmode_t fmode,
+                               int openflags)
 {
        struct nfs_access_entry cache;
        u32 mask;
@@ -1638,11 +1639,14 @@ static int nfs4_opendata_access(struct rpc_cred *cred,
 
        mask = 0;
        /* don't check MAY_WRITE - a newly created file may not have
-        * write mode bits, but POSIX allows the creating process to write */
-       if (fmode & FMODE_READ)
-               mask |= MAY_READ;
-       if (fmode & FMODE_EXEC)
-               mask |= MAY_EXEC;
+        * write mode bits, but POSIX allows the creating process to write.
+        * use openflags to check for exec, because fmode won't
+        * always have FMODE_EXEC set when file open for exec. */
+       if (openflags & __FMODE_EXEC) {
+               /* ONLY check for exec rights */
+               mask = MAY_EXEC;
+       } else if (fmode & FMODE_READ)
+               mask = MAY_READ;
 
        cache.cred = cred;
        cache.jiffies = jiffies;
@@ -1896,7 +1900,7 @@ static int _nfs4_do_open(struct inode *dir,
        if (server->caps & NFS_CAP_POSIX_LOCK)
                set_bit(NFS_STATE_POSIX_LOCKS, &state->flags);
 
-       status = nfs4_opendata_access(cred, opendata, state, fmode);
+       status = nfs4_opendata_access(cred, opendata, state, fmode, flags);
        if (status != 0)
                goto err_opendata_put;
 
index e7165d915362838ab485e51ddde95db97ecd96c0..d00260b0810332c622e82faa44d4d94b75c111db 100644 (file)
@@ -254,7 +254,7 @@ static void
 pnfs_layout_set_fail_bit(struct pnfs_layout_hdr *lo, int fail_bit)
 {
        lo->plh_retry_timestamp = jiffies;
-       if (test_and_set_bit(fail_bit, &lo->plh_flags))
+       if (!test_and_set_bit(fail_bit, &lo->plh_flags))
                atomic_inc(&lo->plh_refcount);
 }
 
index b6bdb18e892c8ea5bf04869e296b1cdafca4d4a7..a5e5d9899d56fa622c1156609b406ee953527d6c 100644 (file)
@@ -91,12 +91,16 @@ void nfs_readdata_release(struct nfs_read_data *rdata)
        put_nfs_open_context(rdata->args.context);
        if (rdata->pages.pagevec != rdata->pages.page_array)
                kfree(rdata->pages.pagevec);
-       if (rdata != &read_header->rpc_data)
-               kfree(rdata);
-       else
+       if (rdata == &read_header->rpc_data) {
                rdata->header = NULL;
+               rdata = NULL;
+       }
        if (atomic_dec_and_test(&hdr->refcnt))
                hdr->completion_ops->completion(hdr);
+       /* Note: we only free the rpc_task after callbacks are done.
+        * See the comment in rpc_free_task() for why
+        */
+       kfree(rdata);
 }
 EXPORT_SYMBOL_GPL(nfs_readdata_release);
 
index c25cadf8f8c4a5d58bf02bce527939c7875e5474..2e7e8c878e5d157418e91a3ce742b8810168c5d3 100644 (file)
@@ -1152,7 +1152,7 @@ static int nfs_get_option_str(substring_t args[], char **option)
 {
        kfree(*option);
        *option = match_strdup(args);
-       return !option;
+       return !*option;
 }
 
 static int nfs_get_option_ul(substring_t args[], unsigned long *option)
index b673be31590e496605a82f3b8b0e01c4d701f0b3..c483cc50b82ee5aa77f80f0d057550526469f466 100644 (file)
@@ -126,12 +126,16 @@ void nfs_writedata_release(struct nfs_write_data *wdata)
        put_nfs_open_context(wdata->args.context);
        if (wdata->pages.pagevec != wdata->pages.page_array)
                kfree(wdata->pages.pagevec);
-       if (wdata != &write_header->rpc_data)
-               kfree(wdata);
-       else
+       if (wdata == &write_header->rpc_data) {
                wdata->header = NULL;
+               wdata = NULL;
+       }
        if (atomic_dec_and_test(&hdr->refcnt))
                hdr->completion_ops->completion(hdr);
+       /* Note: we only free the rpc_task after callbacks are done.
+        * See the comment in rpc_free_task() for why
+        */
+       kfree(wdata);
 }
 EXPORT_SYMBOL_GPL(nfs_writedata_release);
 
index 448455b7fd910af4ff4cf1b530bde57d7d02e79d..ca5ce7f9f800934d0252598ec5491bed71dc581d 100644 (file)
@@ -1278,7 +1278,7 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
        walk.mm = mm;
 
        pol = get_vma_policy(task, vma, vma->vm_start);
-       mpol_to_str(buffer, sizeof(buffer), pol, 0);
+       mpol_to_str(buffer, sizeof(buffer), pol);
        mpol_cond_put(pol);
 
        seq_printf(m, "%08lx %s", vma->vm_start, buffer);
index f883e7e74305c9935b2f26e27e92f01c7e138aa9..7003e5266f25748b6099d47ba8a2a2910c83a454 100644 (file)
@@ -291,9 +291,8 @@ static void ramoops_free_przs(struct ramoops_context *cxt)
        kfree(cxt->przs);
 }
 
-static int __devinit ramoops_init_przs(struct device *dev,
-                                      struct ramoops_context *cxt,
-                                      phys_addr_t *paddr, size_t dump_mem_sz)
+static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt,
+                            phys_addr_t *paddr, size_t dump_mem_sz)
 {
        int err = -ENOMEM;
        int i;
@@ -336,10 +335,9 @@ fail_prz:
        return err;
 }
 
-static int __devinit ramoops_init_prz(struct device *dev,
-                                     struct ramoops_context *cxt,
-                                     struct persistent_ram_zone **prz,
-                                     phys_addr_t *paddr, size_t sz, u32 sig)
+static int ramoops_init_prz(struct device *dev, struct ramoops_context *cxt,
+                           struct persistent_ram_zone **prz,
+                           phys_addr_t *paddr, size_t sz, u32 sig)
 {
        if (!sz)
                return 0;
@@ -367,7 +365,7 @@ static int __devinit ramoops_init_prz(struct device *dev,
        return 0;
 }
 
-static int __devinit ramoops_probe(struct platform_device *pdev)
+static int ramoops_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct ramoops_platform_data *pdata = pdev->dev.platform_data;
index eecd2a8a84dd1b586967f2c785caf2caee2bc68d..0306303be372d14edb8d46b546e7493f3520ca3e 100644 (file)
@@ -390,8 +390,8 @@ static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size,
        return 0;
 }
 
-static int __devinit persistent_ram_post_init(struct persistent_ram_zone *prz,
-                                             u32 sig, int ecc_size)
+static int persistent_ram_post_init(struct persistent_ram_zone *prz, u32 sig,
+                                   int ecc_size)
 {
        int ret;
 
@@ -443,9 +443,8 @@ void persistent_ram_free(struct persistent_ram_zone *prz)
        kfree(prz);
 }
 
-struct persistent_ram_zone * __devinit persistent_ram_new(phys_addr_t start,
-                                                         size_t size, u32 sig,
-                                                         int ecc_size)
+struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
+                                              u32 sig, int ecc_size)
 {
        struct persistent_ram_zone *prz;
        int ret = -ENOMEM;
index 9d863fb501f92ab9a9207fcce7d8b2087c637c0e..f2bc3dfd0b883585e1a2afe6734de2db6be77004 100644 (file)
@@ -296,7 +296,7 @@ EXPORT_SYMBOL(seq_read);
  *     seq_lseek -     ->llseek() method for sequential files.
  *     @file: the file in question
  *     @offset: new position
- *     @origin: 0 for absolute, 1 for relative position
+ *     @whence: 0 for absolute, 1 for relative position
  *
  *     Ready-made ->f_op->llseek()
  */
index 8890604e3fcdd638d6d150ffbfc981a783467dfe..6909d89d0da56ffd929a2114b0228a03d1f35589 100644 (file)
@@ -696,8 +696,10 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe,
                return -EINVAL;
 
        more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0;
-       if (sd->len < sd->total_len)
+
+       if (sd->len < sd->total_len && pipe->nrbufs > 1)
                more |= MSG_SENDPAGE_NOTLAST;
+
        return file->f_op->sendpage(file, buf->page, buf->offset,
                                    sd->len, &pos, more);
 }
index 83256b64166a85380eb6a20adc357195ca8bfe77..1dfd33e8d43bdb5a3890f31cbd5810a1010fcef5 100644 (file)
@@ -1,8 +1,5 @@
 # Top-level Makefile calls into asm-$(ARCH)
 # List only non-arch directories below
 
-header-y += linux/
-header-y += sound/
-header-y += rdma/
 header-y += video/
 header-y += scsi/
index 40528cb977e81be02b244f2a6f82c006635c9388..2c9f9d4336cacf8cf46d591cf1a4b019ef4044e7 100644 (file)
@@ -10,8 +10,8 @@
  * to devices on the PCI bus.
  */
 
-static int __devinit parport_pc_find_isa_ports(int autoirq, int autodma);
-static int __devinit parport_pc_find_nonpci_ports(int autoirq, int autodma)
+static int parport_pc_find_isa_ports(int autoirq, int autodma);
+static int parport_pc_find_nonpci_ports(int autoirq, int autodma)
 {
 #ifdef CONFIG_ISA
        return parport_pc_find_isa_ports(autoirq, autodma);
index ed6642ad03e073fcd5a4d35d02ba9f6bcb5221b0..25f01d0bc149cc388ce5a8e66d556669809e2b34 100644 (file)
@@ -78,6 +78,14 @@ struct mmu_gather_batch {
 #define MAX_GATHER_BATCH       \
        ((PAGE_SIZE - sizeof(struct mmu_gather_batch)) / sizeof(void *))
 
+/*
+ * Limit the maximum number of mmu_gather batches to reduce a risk of soft
+ * lockups for non-preemptible kernels on huge machines when a lot of memory
+ * is zapped during unmapping.
+ * 10K pages freed at once should be safe even without a preemption point.
+ */
+#define MAX_GATHER_BATCH_COUNT (10000UL/MAX_GATHER_BATCH)
+
 /* struct mmu_gather is an opaque type used by the mm code for passing around
  * any data needed by arch specific code for tlb_remove_page.
  */
@@ -96,6 +104,7 @@ struct mmu_gather {
        struct mmu_gather_batch *active;
        struct mmu_gather_batch local;
        struct page             *__pages[MMU_GATHER_BUNDLE];
+       unsigned int            batch_count;
 };
 
 #define HAVE_GENERIC_MMU_GATHER
index 06d7f798a08c547c3dfbd3ed3139c33b86c26c0b..3527fb3f75bbe82c408e8614f5cfbb8c1a88dff9 100644 (file)
@@ -70,7 +70,7 @@ struct drm_mm {
        unsigned long scan_color;
        unsigned long scan_size;
        unsigned long scan_hit_start;
-       unsigned scan_hit_size;
+       unsigned long scan_hit_end;
        unsigned scanned_blocks;
        unsigned long scan_start;
        unsigned long scan_end;
@@ -158,12 +158,29 @@ static inline struct drm_mm_node *drm_mm_get_block_atomic_range(
        return drm_mm_get_block_range_generic(parent, size, alignment, 0,
                                                start, end, 1);
 }
-extern int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
-                             unsigned long size, unsigned alignment);
+
+extern int drm_mm_insert_node(struct drm_mm *mm,
+                             struct drm_mm_node *node,
+                             unsigned long size,
+                             unsigned alignment);
 extern int drm_mm_insert_node_in_range(struct drm_mm *mm,
                                       struct drm_mm_node *node,
-                                      unsigned long size, unsigned alignment,
-                                      unsigned long start, unsigned long end);
+                                      unsigned long size,
+                                      unsigned alignment,
+                                      unsigned long start,
+                                      unsigned long end);
+extern int drm_mm_insert_node_generic(struct drm_mm *mm,
+                                     struct drm_mm_node *node,
+                                     unsigned long size,
+                                     unsigned alignment,
+                                     unsigned long color);
+extern int drm_mm_insert_node_in_range_generic(struct drm_mm *mm,
+                                      struct drm_mm_node *node,
+                                      unsigned long size,
+                                      unsigned alignment,
+                                      unsigned long color,
+                                      unsigned long start,
+                                      unsigned long end);
 extern void drm_mm_put_block(struct drm_mm_node *cur);
 extern void drm_mm_remove_node(struct drm_mm_node *node);
 extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new);
index 808dad29607a17790c0bf9b69ba5493e021e3bfd..d6aeaf3c6d6cb69ad039ec18bddd559cf32f8d62 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 #ifndef _EXYNOS_DRM_H_
 #define _EXYNOS_DRM_H_
diff --git a/include/linux/Kbuild b/include/linux/Kbuild
deleted file mode 100644 (file)
index 7fe2dae..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-header-y += dvb/
-header-y += hdlc/
-header-y += hsi/
-header-y += raid/
-header-y += usb/
index fe9989636b6252536b6abf7042e598c7d6da39fd..b9fde17f767cf654479759b66e22ec9828206ed3 100644 (file)
@@ -15,12 +15,12 @@ struct pata_platform_info {
        unsigned int irq_flags;
 };
 
-extern int __devinit __pata_platform_probe(struct device *dev,
-                                          struct resource *io_res,
-                                          struct resource *ctl_res,
-                                          struct resource *irq_res,
-                                          unsigned int ioport_shift,
-                                          int __pio_mask);
+extern int __pata_platform_probe(struct device *dev,
+                                struct resource *io_res,
+                                struct resource *ctl_res,
+                                struct resource *irq_res,
+                                unsigned int ioport_shift,
+                                int __pio_mask);
 
 /*
  * Marvell SATA private data
index bce729afbcf9a5e184e70edc1bebf9f65a0176a3..5a6d718adf34825eb11bc4dd20cbcb8f1dced0ad 100644 (file)
@@ -24,6 +24,7 @@
 #define _LINUX_AUDIT_H_
 
 #include <linux/sched.h>
+#include <linux/ptrace.h>
 #include <uapi/linux/audit.h>
 
 struct audit_sig_info {
@@ -157,7 +158,8 @@ void audit_core_dumps(long signr);
 
 static inline void audit_seccomp(unsigned long syscall, long signr, int code)
 {
-       if (unlikely(!audit_dummy_context()))
+       /* Force a record to be reported if a signal was delivered. */
+       if (signr || unlikely(!audit_dummy_context()))
                __audit_seccomp(syscall, signr, code);
 }
 
index 9a0e3fa3ca9539123f1a5494cb0007c17b4c9a26..ee332fab825bcbd44368f616fd0dd062d54fa177 100644 (file)
@@ -634,4 +634,6 @@ extern void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc,
                                       u32 offset, u32 mask, u32 set);
 extern void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid);
 
+extern u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc);
+
 #endif /* LINUX_BCMA_DRIVER_CC_H_ */
index def894b83b0dcc48010c3e69f5593ce3e68f80ae..4dd1f33e36a20accc10d1aa1f1d66cfd5203f49b 100644 (file)
@@ -92,7 +92,7 @@ struct bcma_drv_gmac_cmn {
 #define gmac_cmn_write32(gc, offset, val)      bcma_write32((gc)->core, offset, val)
 
 #ifdef CONFIG_BCMA_DRIVER_GMAC_CMN
-extern void __devinit bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc);
+extern void bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc);
 #else
 static inline void bcma_core_gmac_cmn_init(struct bcma_drv_gmac_cmn *gc) { }
 #endif
index 41da581e1612a515157559aee5b5e90e23fccf50..c48d98d27b770ee8f13a6ff26aa918aeb89d66be 100644 (file)
@@ -214,7 +214,7 @@ struct bcma_drv_pci {
 #define pcicore_write16(pc, offset, val)       bcma_write16((pc)->core, offset, val)
 #define pcicore_write32(pc, offset, val)       bcma_write32((pc)->core, offset, val)
 
-extern void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc);
+extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
 extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
                                 struct bcma_device *core, bool enable);
 extern void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend);
index 6ecb6dc2f3033fc50ba1a8f14eb4b2b12b8ec044..cc7bddeaf553b334e6aa1250fbf74924358e5de4 100644 (file)
@@ -22,7 +22,7 @@ extern int sysctl_extfrag_handler(struct ctl_table *table, int write,
 extern int fragmentation_index(struct zone *zone, unsigned int order);
 extern unsigned long try_to_compact_pages(struct zonelist *zonelist,
                        int order, gfp_t gfp_mask, nodemask_t *mask,
-                       bool sync, bool *contended, struct page **page);
+                       bool sync, bool *contended);
 extern int compact_pgdat(pg_data_t *pgdat, int order);
 extern void reset_isolation_suitable(pg_data_t *pgdat);
 extern unsigned long compaction_suitable(struct zone *zone, int order);
@@ -75,7 +75,7 @@ static inline bool compaction_restarting(struct zone *zone, int order)
 #else
 static inline unsigned long try_to_compact_pages(struct zonelist *zonelist,
                        int order, gfp_t gfp_mask, nodemask_t *nodemask,
-                       bool sync, bool *contended, struct page **page)
+                       bool sync, bool *contended)
 {
        return COMPACT_CONTINUE;
 }
index ac3bbb5b95029caeea6546372ad2b6f35c0b83ad..1739510d89943df23f193d5fb04332f47cdaf958 100644 (file)
 #include <linux/cpumask.h>
 #include <linux/gfp.h>
 #include <linux/slab.h>
+#include <linux/kref.h>
 
 /**
  * struct cpu_rmap - CPU affinity reverse-map
+ * @refcount: kref for object
  * @size: Number of objects to be reverse-mapped
  * @used: Number of objects added
  * @obj: Pointer to array of object pointers
@@ -23,6 +25,7 @@
  *      based on affinity masks
  */
 struct cpu_rmap {
+       struct kref     refcount;
        u16             size, used;
        void            **obj;
        struct {
@@ -33,15 +36,7 @@ struct cpu_rmap {
 #define CPU_RMAP_DIST_INF 0xffff
 
 extern struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags);
-
-/**
- * free_cpu_rmap - free CPU affinity reverse-map
- * @rmap: Reverse-map allocated with alloc_cpu_rmap(), or %NULL
- */
-static inline void free_cpu_rmap(struct cpu_rmap *rmap)
-{
-       kfree(rmap);
-}
+extern int cpu_rmap_put(struct cpu_rmap *rmap);
 
 extern int cpu_rmap_add(struct cpu_rmap *rmap, void *obj);
 extern int cpu_rmap_update(struct cpu_rmap *rmap, u16 index,
index abb2cd50f6b26ace7da7a554527087d4685d3e76..04421e82536596c5aeb7a28b35e142556c821598 100644 (file)
@@ -128,7 +128,6 @@ struct cred {
        struct key      *process_keyring; /* keyring private to this process */
        struct key      *thread_keyring; /* keyring private to this thread */
        struct key      *request_key_auth; /* assumed request_key authority */
-       struct thread_group_cred *tgcred; /* thread-group shared credentials */
 #endif
 #ifdef CONFIG_SECURITY
        void            *security;      /* subjective LSM security */
index 1a43e1b4f7ad21574229dde092bf296705a41953..c623861964e4c8d6773c632758770fe4d5ac03be 100644 (file)
@@ -40,6 +40,8 @@ extern int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh,
 extern void eth_header_cache_update(struct hh_cache *hh,
                                    const struct net_device *dev,
                                    const unsigned char *haddr);
+extern int eth_prepare_mac_addr_change(struct net_device *dev, void *p);
+extern void eth_commit_mac_addr_change(struct net_device *dev, void *p);
 extern int eth_mac_addr(struct net_device *dev, void *p);
 extern int eth_change_mtu(struct net_device *dev, int new_mtu);
 extern int eth_validate_addr(struct net_device *dev);
diff --git a/include/linux/hdlc/Kbuild b/include/linux/hdlc/Kbuild
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/include/linux/hsi/Kbuild b/include/linux/hsi/Kbuild
deleted file mode 100644 (file)
index e69de29..0000000
index 9e2ae26fb5981703159c27cc60e7c73cf6d311f6..a16e19349ec0f132849288df8c2a01ed5ac59d4e 100644 (file)
 
 #include <uapi/linux/in6.h>
 
+/* IPv6 Wildcard Address (::) and Loopback Address (::1) defined in RFC2553
+ * NOTE: Be aware the IN6ADDR_* constants and in6addr_* externals are defined
+ * in network byte order, not in host byte order as are the IPv4 equivalents
+ */
 extern const struct in6_addr in6addr_any;
 #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
 extern const struct in6_addr in6addr_loopback;
index a799273714accff40c0bf54850389b095746ff83..10ed4f4364589d5d810385e144ab7138fefc13ba 100644 (file)
 
 #define __exit          __section(.exit.text) __exitused __cold notrace
 
-/* Used for HOTPLUG, but that is always enabled now, so just make them noops */
-#define __devinit
-#define __devinitdata
-#define __devinitconst
-#define __devexit
-#define __devexitdata
-#define __devexitconst
-
 /* Used for HOTPLUG_CPU */
 #define __cpuinit        __section(.cpuinit.text) __cold notrace
 #define __cpuinitdata    __section(.cpuinit.data)
@@ -337,18 +329,6 @@ void __init parse_early_options(char *cmdline);
 #define __INITRODATA_OR_MODULE __INITRODATA
 #endif /*CONFIG_MODULES*/
 
-/* Functions marked as __devexit may be discarded at kernel link time, depending
-   on config options.  Newer versions of binutils detect references from
-   retained sections to discarded sections and flag an error.  Pointers to
-   __devexit functions must use __devexit_p(function_name), the wrapper will
-   insert either the function_name or NULL, depending on the config options.
- */
-#if defined(MODULE) || defined(CONFIG_HOTPLUG)
-#define __devexit_p(x) x
-#else
-#define __devexit_p(x) NULL
-#endif
-
 #ifdef MODULE
 #define __exit_p(x) x
 #else
index 5e4e6170f43a5ef672ddd0d28694849669e310cb..5fa5afeeb7599d6c0f05d7fb59796cf153a614a9 100644 (file)
@@ -268,11 +268,6 @@ struct irq_affinity_notify {
 extern int
 irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify);
 
-static inline void irq_run_affinity_notifiers(void)
-{
-       flush_scheduled_work();
-}
-
 #else /* CONFIG_SMP */
 
 static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m)
index fe771978e87759000562162835f32fa66b4b4571..ae221a7b509237a649e8ccfed988265e22f07fa5 100644 (file)
@@ -24,6 +24,7 @@ struct ipc_ids {
        unsigned short seq_max;
        struct rw_semaphore rw_mutex;
        struct idr ipcs_idr;
+       int next_id;
 };
 
 struct ipc_namespace {
index faed1e357dd6c605cdea3445a803e167d17d3e0c..e971e3742172c0c7817d1933fffa8bcf67f13492 100644 (file)
@@ -77,11 +77,6 @@ static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
        return (struct ipv6hdr *)skb_transport_header(skb);
 }
 
-static inline __u8 ipv6_tclass(const struct ipv6hdr *iph)
-{
-       return (ntohl(*(__be32 *)iph) >> 20) & 0xff;
-}
-
 /* 
    This structure contains results of exthdrs parsing
    as offsets from skb->nh.
@@ -89,7 +84,7 @@ static inline __u8 ipv6_tclass(const struct ipv6hdr *iph)
 
 struct inet6_skb_parm {
        int                     iif;
-       __u16                   ra;
+       __be16                  ra;
        __u16                   hop;
        __u16                   dst0;
        __u16                   srcrt;
@@ -105,6 +100,7 @@ struct inet6_skb_parm {
 #define IP6SKB_XFRM_TRANSFORMED        1
 #define IP6SKB_FORWARDED       2
 #define IP6SKB_REROUTED                4
+#define IP6SKB_ROUTERALERT     8
 };
 
 #define IP6CB(skb)     ((struct inet6_skb_parm*)((skb)->cb))
index 1be23d9fdacb5151a6af6f8b30b2086e50c50bb1..e30b66346942a90a4c79cdc5a0362b3899db0521 100644 (file)
@@ -1098,7 +1098,7 @@ void               jbd2_journal_set_triggers(struct buffer_head *,
 extern int      jbd2_journal_dirty_metadata (handle_t *, struct buffer_head *);
 extern int      jbd2_journal_forget (handle_t *, struct buffer_head *);
 extern void     journal_sync_buffer (struct buffer_head *);
-extern void     jbd2_journal_invalidatepage(journal_t *,
+extern int      jbd2_journal_invalidatepage(journal_t *,
                                struct page *, unsigned long);
 extern int      jbd2_journal_try_to_free_buffers(journal_t *, struct page *, gfp_t);
 extern int      jbd2_journal_stop(handle_t *);
index 00e46376e28f73d33bdfbf56480932dfa12eee9f..2bca44b0893c787bdb463a8f42e7306e02edf87f 100644 (file)
@@ -524,14 +524,17 @@ static inline void print_irqtrace_events(struct task_struct *curr)
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 # ifdef CONFIG_PROVE_LOCKING
 #  define rwsem_acquire(l, s, t, i)            lock_acquire(l, s, t, 0, 2, NULL, i)
+#  define rwsem_acquire_nest(l, s, t, n, i)    lock_acquire(l, s, t, 0, 2, n, i)
 #  define rwsem_acquire_read(l, s, t, i)       lock_acquire(l, s, t, 1, 2, NULL, i)
 # else
 #  define rwsem_acquire(l, s, t, i)            lock_acquire(l, s, t, 0, 1, NULL, i)
+#  define rwsem_acquire_nest(l, s, t, n, i)    lock_acquire(l, s, t, 0, 1, n, i)
 #  define rwsem_acquire_read(l, s, t, i)       lock_acquire(l, s, t, 1, 1, NULL, i)
 # endif
 # define rwsem_release(l, n, i)                        lock_release(l, n, i)
 #else
 # define rwsem_acquire(l, s, t, i)             do { } while (0)
+# define rwsem_acquire_nest(l, s, t, n, i)     do { } while (0)
 # define rwsem_acquire_read(l, s, t, i)                do { } while (0)
 # define rwsem_release(l, n, i)                        do { } while (0)
 #endif
index 9adc270de7ef0fe020a8bd36d7dd905367dfe2e0..0d7df39a5885f84c33a843e59f77f44d3ec6824f 100644 (file)
@@ -123,7 +123,7 @@ struct sp_node {
 
 struct shared_policy {
        struct rb_root root;
-       struct mutex mutex;
+       spinlock_t lock;
 };
 
 void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol);
@@ -165,11 +165,10 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from,
 
 
 #ifdef CONFIG_TMPFS
-extern int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context);
+extern int mpol_parse_str(char *str, struct mempolicy **mpol);
 #endif
 
-extern int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol,
-                       int no_context);
+extern int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol);
 
 /* Check if a vma is migratable */
 static inline int vma_migratable(struct vm_area_struct *vma)
@@ -296,15 +295,13 @@ static inline void check_highest_zone(int k)
 }
 
 #ifdef CONFIG_TMPFS
-static inline int mpol_parse_str(char *str, struct mempolicy **mpol,
-                               int no_context)
+static inline int mpol_parse_str(char *str, struct mempolicy **mpol)
 {
        return 1;       /* error */
 }
 #endif
 
-static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol,
-                               int no_context)
+static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
 {
        return 0;
 }
index 63204078f72b9798901b6ef6371847ade8031809..66e2f7c61e5c9d3a2924389e28ffa9d32c8728bf 100644 (file)
@@ -455,7 +455,6 @@ void put_pages_list(struct list_head *pages);
 
 void split_page(struct page *page, unsigned int order);
 int split_free_page(struct page *page);
-int capture_free_page(struct page *page, int alloc_order, int migratetype);
 
 /*
  * Compound pages have a destructor function.  Provide a
index 4bec5be82cab5fe2f873cd867c84c8ac18993dba..73b64a38b984a985259c468049cff50a6c44fdd3 100644 (file)
@@ -503,14 +503,6 @@ struct zone {
         * rarely used fields:
         */
        const char              *name;
-#ifdef CONFIG_MEMORY_ISOLATION
-       /*
-        * the number of MIGRATE_ISOLATE *pageblock*.
-        * We need this for free page counting. Look at zone_watermark_ok_safe.
-        * It's protected by zone->lock
-        */
-       int             nr_pageblock_isolate;
-#endif
 } ____cacheline_internodealigned_in_smp;
 
 typedef enum {
index ea00d9162ee57c858954e8ec8cd36d4ebf0f15e0..79aaa9fc1a15d6ed7caac2b147ae030b18da060a 100644 (file)
@@ -9,7 +9,7 @@
 #ifdef CONFIG_IP_MROUTE
 static inline int ip_mroute_opt(int opt)
 {
-       return (opt >= MRT_BASE) && (opt <= MRT_BASE + 10);
+       return (opt >= MRT_BASE) && (opt <= MRT_MAX);
 }
 #else
 static inline int ip_mroute_opt(int opt)
index a223561ba12e397e89d23dcd2ed3fd3e4311645a..66982e7640514389098c140a39665f95261071d8 100644 (file)
@@ -10,7 +10,7 @@
 #ifdef CONFIG_IPV6_MROUTE
 static inline int ip6_mroute_opt(int opt)
 {
-       return (opt >= MRT6_BASE) && (opt <= MRT6_BASE + 10);
+       return (opt >= MRT6_BASE) && (opt <= MRT6_MAX);
 }
 #else
 static inline int ip6_mroute_opt(int opt)
index 7a4b9e97d29a0782ef0dde63126f6a124eeb848b..391af8d11cceea2f306f460ec137d75f0ea236c9 100644 (file)
@@ -34,7 +34,9 @@ struct msg_queue {
 /* Helper routines for sys_msgsnd and sys_msgrcv */
 extern long do_msgsnd(int msqid, long mtype, void __user *mtext,
                        size_t msgsz, int msgflg);
-extern long do_msgrcv(int msqid, long *pmtype, void __user *mtext,
-                       size_t msgsz, long msgtyp, int msgflg);
+extern long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,
+                     int msgflg,
+                     long (*msg_fill)(void __user *, struct msg_msg *,
+                                      size_t));
 
 #endif /* _LINUX_MSG_H */
index e998c030061d30741c85d2738caf31dfec06ca68..5a5ff57ceed4e74f76237437fc3b22453ec27a66 100644 (file)
@@ -2,6 +2,7 @@
 #define _LINUX_NAMEI_H
 
 #include <linux/dcache.h>
+#include <linux/errno.h>
 #include <linux/linkage.h>
 #include <linux/path.h>
 
index 0209ac328e8a29494a46dcd01bde8625e4641270..549f5ad2055d06f0f4f0580d0068e41f9e3271cf 100644 (file)
@@ -60,6 +60,9 @@ struct wireless_dev;
 #define SET_ETHTOOL_OPS(netdev,ops) \
        ( (netdev)->ethtool_ops = (ops) )
 
+extern void netdev_set_default_ethtool_ops(struct net_device *dev,
+                                          const struct ethtool_ops *ops);
+
 /* hardware address assignment types */
 #define NET_ADDR_PERM          0       /* address is permanent (default) */
 #define NET_ADDR_RANDOM                1       /* address is generated randomly */
@@ -1403,6 +1406,7 @@ static inline void netdev_for_each_tx_queue(struct net_device *dev,
 
 extern struct netdev_queue *netdev_pick_tx(struct net_device *dev,
                                           struct sk_buff *skb);
+extern u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb);
 
 /*
  * Net namespace inlines
@@ -2102,6 +2106,18 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)
                __netif_schedule(txq->qdisc);
 }
 
+#ifdef CONFIG_XPS
+extern int netif_set_xps_queue(struct net_device *dev, struct cpumask *mask,
+                              u16 index);
+#else
+static inline int netif_set_xps_queue(struct net_device *dev,
+                                     struct cpumask *mask,
+                                     u16 index)
+{
+       return 0;
+}
+#endif
+
 /*
  * Returns a Tx hash for the given packet when dev->real_num_tx_queues is used
  * as a distribution range limit for the returned value.
index 66d5379c305e60d17dcde8b60d286f0b57b23a16..f54c3bb6a22b52b05da086e3033d368e0cb9e494 100644 (file)
 #include <linux/rcupdate.h>
 #include <linux/list.h>
 
+union inet_addr {
+       __u32           all[4];
+       __be32          ip;
+       __be32          ip6[4];
+       struct in_addr  in;
+       struct in6_addr in6;
+};
+
 struct netpoll {
        struct net_device *dev;
        char dev_name[IFNAMSIZ];
        const char *name;
        void (*rx_hook)(struct netpoll *, int, char *, int);
 
-       __be32 local_ip, remote_ip;
+       union inet_addr local_ip, remote_ip;
+       bool ipv6;
        u16 local_port, remote_port;
        u8 remote_mac[ETH_ALEN];
 
@@ -33,7 +42,7 @@ struct netpoll_info {
        spinlock_t rx_lock;
        struct list_head rx_np; /* netpolls that registered an rx_hook */
 
-       struct sk_buff_head arp_tx; /* list of arp requests to reply to */
+       struct sk_buff_head neigh_tx; /* list of neigh requests to reply to */
        struct sk_buff_head txq;
 
        struct delayed_work tx_work;
index 0f8447376ddbf1dc7177924438076645d34e2671..0eb65796bcb9af7f5876c300608e7caebdfe6297 100644 (file)
 #define PCI_DEVICE_ID_RICOH_RL5C476    0x0476
 #define PCI_DEVICE_ID_RICOH_RL5C478    0x0478
 #define PCI_DEVICE_ID_RICOH_R5C822     0x0822
+#define PCI_DEVICE_ID_RICOH_R5CE822    0xe822
 #define PCI_DEVICE_ID_RICOH_R5CE823    0xe823
 #define PCI_DEVICE_ID_RICOH_R5C832     0x0832
 #define PCI_DEVICE_ID_RICOH_R5C843     0x0843
index 93b3cf77f564e52b65a4fd19c248466e68298dcd..33999adbf8c85e91f16651c5d2dfd64ff2b58439 100644 (file)
@@ -506,13 +506,13 @@ struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45);
 int phy_device_register(struct phy_device *phy);
 int phy_init_hw(struct phy_device *phydev);
 struct phy_device * phy_attach(struct net_device *dev,
-               const char *bus_id, u32 flags, phy_interface_t interface);
+               const char *bus_id, phy_interface_t interface);
 struct phy_device *phy_find_first(struct mii_bus *bus);
 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
-               void (*handler)(struct net_device *), u32 flags,
+               void (*handler)(struct net_device *),
                phy_interface_t interface);
 struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
-               void (*handler)(struct net_device *), u32 flags,
+               void (*handler)(struct net_device *),
                phy_interface_t interface);
 void phy_disconnect(struct phy_device *phydev);
 void phy_detach(struct phy_device *phydev);
index 098d2a83829618e585cd4412920c6d803af6fa21..cb6ab5feab67812e6c55c31b23a9c504f8e63b5c 100644 (file)
@@ -46,9 +46,8 @@ struct persistent_ram_zone {
        size_t old_log_size;
 };
 
-struct persistent_ram_zone * __devinit persistent_ram_new(phys_addr_t start,
-                                                         size_t size, u32 sig,
-                                                         int ecc_size);
+struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
+                                              u32 sig, int ecc_size);
 void persistent_ram_free(struct persistent_ram_zone *prz);
 void persistent_ram_zap(struct persistent_ram_zone *prz);
 
diff --git a/include/linux/raid/Kbuild b/include/linux/raid/Kbuild
deleted file mode 100644 (file)
index e69de29..0000000
index d9846088c2c5fe63ed7b97c0c1a19a5bf23f31dc..347ce553a3065fd5020eb1ab864434db488df27c 100644 (file)
@@ -74,4 +74,10 @@ static inline int arch_get_random_int(unsigned int *v)
 }
 #endif
 
+/* Pseudo random number generator from numerical recipes. */
+static inline u32 next_pseudo_random32(u32 seed)
+{
+       return seed * 1664525 + 1013904223;
+}
+
 #endif /* _LINUX_RANDOM_H */
index 2ac60c9cf6448fac839074e752d61f2de7b56c0a..fea49b5da12a99bfa6c87b865a461a2a28e0495b 100644 (file)
@@ -123,9 +123,9 @@ __rb_change_child(struct rb_node *old, struct rb_node *new,
 extern void __rb_erase_color(struct rb_node *parent, struct rb_root *root,
        void (*augment_rotate)(struct rb_node *old, struct rb_node *new));
 
-static __always_inline void
-rb_erase_augmented(struct rb_node *node, struct rb_root *root,
-                  const struct rb_augment_callbacks *augment)
+static __always_inline struct rb_node *
+__rb_erase_augmented(struct rb_node *node, struct rb_root *root,
+                    const struct rb_augment_callbacks *augment)
 {
        struct rb_node *child = node->rb_right, *tmp = node->rb_left;
        struct rb_node *parent, *rebalance;
@@ -217,6 +217,14 @@ rb_erase_augmented(struct rb_node *node, struct rb_root *root,
        }
 
        augment->propagate(tmp, NULL);
+       return rebalance;
+}
+
+static __always_inline void
+rb_erase_augmented(struct rb_node *node, struct rb_root *root,
+                  const struct rb_augment_callbacks *augment)
+{
+       struct rb_node *rebalance = __rb_erase_augmented(node, root, augment);
        if (rebalance)
                __rb_erase_color(rebalance, root, augment->rotate);
 }
index 54bd7cd7ecbd11449b9e15b49f9ab7e208e96413..413cc11e414a7af34bd0946dac18f29021e7ecbd 100644 (file)
@@ -125,8 +125,17 @@ extern void downgrade_write(struct rw_semaphore *sem);
  */
 extern void down_read_nested(struct rw_semaphore *sem, int subclass);
 extern void down_write_nested(struct rw_semaphore *sem, int subclass);
+extern void _down_write_nest_lock(struct rw_semaphore *sem, struct lockdep_map *nest_lock);
+
+# define down_write_nest_lock(sem, nest_lock)                  \
+do {                                                           \
+       typecheck(struct lockdep_map *, &(nest_lock)->dep_map); \
+       _down_write_nest_lock(sem, &(nest_lock)->dep_map);      \
+} while (0);
+
 #else
 # define down_read_nested(sem, subclass)               down_read(sem)
+# define down_write_nest_lock(sem, nest_lock)  down_read(sem)
 # define down_write_nested(sem, subclass)      down_write(sem)
 #endif
 
index 0f6afc657f778f2e682e7fb108e97b6788a53973..eee7478cda701ddeabc00150f607f368a4239350 100644 (file)
@@ -989,17 +989,29 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
  *     tells the LSM to decrement the number of secmark labeling rules loaded
  * @req_classify_flow:
  *     Sets the flow's sid to the openreq sid.
+ * @tun_dev_alloc_security:
+ *     This hook allows a module to allocate a security structure for a TUN
+ *     device.
+ *     @security pointer to a security structure pointer.
+ *     Returns a zero on success, negative values on failure.
+ * @tun_dev_free_security:
+ *     This hook allows a module to free the security structure for a TUN
+ *     device.
+ *     @security pointer to the TUN device's security structure
  * @tun_dev_create:
  *     Check permissions prior to creating a new TUN device.
- * @tun_dev_post_create:
- *     This hook allows a module to update or allocate a per-socket security
- *     structure.
- *     @sk contains the newly created sock structure.
+ * @tun_dev_attach_queue:
+ *     Check permissions prior to attaching to a TUN device queue.
+ *     @security pointer to the TUN device's security structure.
  * @tun_dev_attach:
- *     Check permissions prior to attaching to a persistent TUN device.  This
- *     hook can also be used by the module to update any security state
+ *     This hook can be used by the module to update any security state
  *     associated with the TUN device's sock structure.
  *     @sk contains the existing sock structure.
+ *     @security pointer to the TUN device's security structure.
+ * @tun_dev_open:
+ *     This hook can be used by the module to update any security state
+ *     associated with the TUN device's security structure.
+ *     @security pointer to the TUN devices's security structure.
  *
  * Security hooks for XFRM operations.
  *
@@ -1620,9 +1632,12 @@ struct security_operations {
        void (*secmark_refcount_inc) (void);
        void (*secmark_refcount_dec) (void);
        void (*req_classify_flow) (const struct request_sock *req, struct flowi *fl);
-       int (*tun_dev_create)(void);
-       void (*tun_dev_post_create)(struct sock *sk);
-       int (*tun_dev_attach)(struct sock *sk);
+       int (*tun_dev_alloc_security) (void **security);
+       void (*tun_dev_free_security) (void *security);
+       int (*tun_dev_create) (void);
+       int (*tun_dev_attach_queue) (void *security);
+       int (*tun_dev_attach) (struct sock *sk, void *security);
+       int (*tun_dev_open) (void *security);
 #endif /* CONFIG_SECURITY_NETWORK */
 
 #ifdef CONFIG_SECURITY_NETWORK_XFRM
@@ -2566,9 +2581,12 @@ void security_inet_conn_established(struct sock *sk,
 int security_secmark_relabel_packet(u32 secid);
 void security_secmark_refcount_inc(void);
 void security_secmark_refcount_dec(void);
+int security_tun_dev_alloc_security(void **security);
+void security_tun_dev_free_security(void *security);
 int security_tun_dev_create(void);
-void security_tun_dev_post_create(struct sock *sk);
-int security_tun_dev_attach(struct sock *sk);
+int security_tun_dev_attach_queue(void *security);
+int security_tun_dev_attach(struct sock *sk, void *security);
+int security_tun_dev_open(void *security);
 
 #else  /* CONFIG_SECURITY_NETWORK */
 static inline int security_unix_stream_connect(struct sock *sock,
@@ -2733,16 +2751,31 @@ static inline void security_secmark_refcount_dec(void)
 {
 }
 
+static inline int security_tun_dev_alloc_security(void **security)
+{
+       return 0;
+}
+
+static inline void security_tun_dev_free_security(void *security)
+{
+}
+
 static inline int security_tun_dev_create(void)
 {
        return 0;
 }
 
-static inline void security_tun_dev_post_create(struct sock *sk)
+static inline int security_tun_dev_attach_queue(void *security)
+{
+       return 0;
+}
+
+static inline int security_tun_dev_attach(struct sock *sk, void *security)
 {
+       return 0;
 }
 
-static inline int security_tun_dev_attach(struct sock *sk)
+static inline int security_tun_dev_open(void *security)
 {
        return 0;
 }
index 320e976d5ab861b9e143476ae7dcd4b87956854e..8b2256e880e0ea135892b2deb5f5957dfc7568e9 100644 (file)
@@ -1492,6 +1492,11 @@ static inline void skb_set_inner_network_header(struct sk_buff *skb,
        skb->inner_network_header += offset;
 }
 
+static inline bool skb_transport_header_was_set(const struct sk_buff *skb)
+{
+       return skb->transport_header != ~0U;
+}
+
 static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
 {
        return skb->head + skb->transport_header;
@@ -1580,6 +1585,11 @@ static inline void skb_set_inner_network_header(struct sk_buff *skb,
        skb->inner_network_header = skb->data + offset;
 }
 
+static inline bool skb_transport_header_was_set(const struct sk_buff *skb)
+{
+       return skb->transport_header != NULL;
+}
+
 static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
 {
        return skb->transport_header;
diff --git a/include/linux/usb/Kbuild b/include/linux/usb/Kbuild
deleted file mode 100644 (file)
index e69de29..0000000
index c739531e156492e573e431d329fe058d6c56e9df..112c25c393a2e94c1c8a6c2339ce3849b50584aa 100644 (file)
@@ -91,7 +91,9 @@ struct tc_action_ops {
        int     (*dump)(struct sk_buff *, struct tc_action *, int, int);
        int     (*cleanup)(struct tc_action *, int bind);
        int     (*lookup)(struct tc_action *, u32);
-       int     (*init)(struct nlattr *, struct nlattr *, struct tc_action *, int , int);
+       int     (*init)(struct net *net, struct nlattr *nla,
+                       struct nlattr *est, struct tc_action *act, int ovr,
+                       int bind);
        int     (*walk)(struct sk_buff *, struct netlink_callback *, int, struct tc_action *);
 };
 
@@ -116,8 +118,12 @@ extern int tcf_register_action(struct tc_action_ops *a);
 extern int tcf_unregister_action(struct tc_action_ops *a);
 extern void tcf_action_destroy(struct tc_action *a, int bind);
 extern int tcf_action_exec(struct sk_buff *skb, const struct tc_action *a, struct tcf_result *res);
-extern struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est, char *n, int ovr, int bind);
-extern struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est, char *n, int ovr, int bind);
+extern struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla,
+                                        struct nlattr *est, char *n, int ovr,
+                                        int bind);
+extern struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla,
+                                          struct nlattr *est, char *n, int ovr,
+                                          int bind);
 extern int tcf_action_dump(struct sk_buff *skb, struct tc_action *a, int, int);
 extern int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int);
 extern int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int);
index df4ef945338425d7fc6d64a858dd706d2628ea28..6c58d507123fbf1370942143aaf151fcf17e4394 100644 (file)
@@ -150,7 +150,31 @@ extern void addrconf_dad_failure(struct inet6_ifaddr *ifp);
 extern bool ipv6_chk_mcast_addr(struct net_device *dev,
                                const struct in6_addr *group,
                                const struct in6_addr *src_addr);
-extern bool ipv6_is_mld(struct sk_buff *skb, int nexthdr);
+
+/*
+ * identify MLD packets for MLD filter exceptions
+ */
+static inline bool ipv6_is_mld(struct sk_buff *skb, int nexthdr, int offset)
+{
+       struct icmp6hdr *hdr;
+
+       if (nexthdr != IPPROTO_ICMPV6 ||
+           !pskb_network_may_pull(skb, offset + sizeof(struct icmp6hdr)))
+               return false;
+
+       hdr = (struct icmp6hdr *)(skb_network_header(skb) + offset);
+
+       switch (hdr->icmp6_type) {
+       case ICMPV6_MGM_QUERY:
+       case ICMPV6_MGM_REPORT:
+       case ICMPV6_MGM_REDUCTION:
+       case ICMPV6_MLD2_REPORT:
+               return true;
+       default:
+               break;
+       }
+       return false;
+}
 
 extern void addrconf_prefix_rcv(struct net_device *dev,
                                u8 *opt, int len, bool sllao);
@@ -257,30 +281,55 @@ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr,
                      htonl(0xFF000000) | addr->s6_addr32[3]);
 }
 
-static inline int ipv6_addr_is_multicast(const struct in6_addr *addr)
+static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr)
 {
        return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
 }
 
-static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr)
+static inline bool ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr)
 {
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+       __u64 *p = (__u64 *)addr;
+       return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(1))) == 0UL;
+#else
        return ((addr->s6_addr32[0] ^ htonl(0xff020000)) |
                addr->s6_addr32[1] | addr->s6_addr32[2] |
                (addr->s6_addr32[3] ^ htonl(0x00000001))) == 0;
+#endif
 }
 
-static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr)
+static inline bool ipv6_addr_is_ll_all_routers(const struct in6_addr *addr)
 {
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+       __u64 *p = (__u64 *)addr;
+       return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(2))) == 0UL;
+#else
        return ((addr->s6_addr32[0] ^ htonl(0xff020000)) |
                addr->s6_addr32[1] | addr->s6_addr32[2] |
                (addr->s6_addr32[3] ^ htonl(0x00000002))) == 0;
+#endif
 }
 
-static inline int ipv6_addr_is_isatap(const struct in6_addr *addr)
+static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)
 {
        return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);
 }
 
+static inline bool ipv6_addr_is_solict_mult(const struct in6_addr *addr)
+{
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+       __u64 *p = (__u64 *)addr;
+       return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) |
+               ((p[1] ^ cpu_to_be64(0x00000001ff000000UL)) &
+                cpu_to_be64(0xffffffffff000000UL))) == 0UL;
+#else
+       return ((addr->s6_addr32[0] ^ htonl(0xff020000)) |
+               addr->s6_addr32[1] |
+               (addr->s6_addr32[2] ^ htonl(0x00000001)) |
+               (addr->s6_addr[12] ^ 0xff)) == 0;
+#endif
+}
+
 #ifdef CONFIG_PROC_FS
 extern int if6_proc_init(void);
 extern void if6_proc_exit(void);
index 8a8d4e06900d8824ba4a892c5f29f9c40525f0e0..e1ad903a8d6a0ff2a93106a9a3e430d4f0089558 100644 (file)
@@ -43,11 +43,9 @@ static inline void ipv4_change_dsfield(struct iphdr *iph,__u8 mask,
 static inline void ipv6_change_dsfield(struct ipv6hdr *ipv6h,__u8 mask,
     __u8 value)
 {
-        __u16 tmp;
+       __be16 *p = (__force __be16 *)ipv6h;
 
-       tmp = ntohs(*(__be16 *) ipv6h);
-       tmp = (tmp & ((mask << 4) | 0xf00f)) | (value << 4);
-       *(__be16 *) ipv6h = htons(tmp);
+       *p = (*p & htons((((u16)mask << 4) | 0xf00f))) | htons((u16)value << 4);
 }
 
 
index 9e34c877a77093ff1257e18941949a12391363d6..7ca75cbbf75e2071ed068276c8f69f1a11990b2a 100644 (file)
@@ -71,6 +71,8 @@ extern struct sock *__inet6_lookup_established(struct net *net,
 
 extern struct sock *inet6_lookup_listener(struct net *net,
                                          struct inet_hashinfo *hashinfo,
+                                         const struct in6_addr *saddr,
+                                         const __be16 sport,
                                          const struct in6_addr *daddr,
                                          const unsigned short hnum,
                                          const int dif);
@@ -88,7 +90,8 @@ static inline struct sock *__inet6_lookup(struct net *net,
        if (sk)
                return sk;
 
-       return inet6_lookup_listener(net, hashinfo, daddr, hnum, dif);
+       return inet6_lookup_listener(net, hashinfo, saddr, sport,
+                                    daddr, hnum, dif);
 }
 
 static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo,
index 67a8fa098e3a2b0d456996f78af4ff845db4d079..7b2ae9d37076fb49c6aaa62f110318689d92dda8 100644 (file)
@@ -81,7 +81,9 @@ struct inet_bind_bucket {
        struct net              *ib_net;
 #endif
        unsigned short          port;
-       signed short            fastreuse;
+       signed char             fastreuse;
+       signed char             fastreuseport;
+       kuid_t                  fastuid;
        int                     num_owners;
        struct hlist_node       node;
        struct hlist_head       owners;
@@ -257,15 +259,19 @@ extern void inet_unhash(struct sock *sk);
 
 extern struct sock *__inet_lookup_listener(struct net *net,
                                           struct inet_hashinfo *hashinfo,
+                                          const __be32 saddr,
+                                          const __be16 sport,
                                           const __be32 daddr,
                                           const unsigned short hnum,
                                           const int dif);
 
 static inline struct sock *inet_lookup_listener(struct net *net,
                struct inet_hashinfo *hashinfo,
+               __be32 saddr, __be16 sport,
                __be32 daddr, __be16 dport, int dif)
 {
-       return __inet_lookup_listener(net, hashinfo, daddr, ntohs(dport), dif);
+       return __inet_lookup_listener(net, hashinfo, saddr, sport,
+                                     daddr, ntohs(dport), dif);
 }
 
 /* Socket demux engine toys. */
@@ -358,7 +364,8 @@ static inline struct sock *__inet_lookup(struct net *net,
        struct sock *sk = __inet_lookup_established(net, hashinfo,
                                saddr, sport, daddr, hnum, dif);
 
-       return sk ? : __inet_lookup_listener(net, hashinfo, daddr, hnum, dif);
+       return sk ? : __inet_lookup_listener(net, hashinfo, saddr, sport,
+                                            daddr, hnum, dif);
 }
 
 static inline struct sock *inet_lookup(struct net *net,
index 652d3d309357c8d587c313817c61261479c78e0e..7686e3f5033d8364da7aad69be58b86018af7589 100644 (file)
 #include <linux/ipv6.h>
 
 #ifndef _HAVE_ARCH_IPV6_CSUM
-
-static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
-                                         const struct in6_addr *daddr,
-                                         __u32 len, unsigned short proto,
-                                         __wsum csum)
-{
-
-       int carry;
-       __u32 ulen;
-       __u32 uproto;
-       __u32 sum = (__force u32)csum;
-
-       sum += (__force u32)saddr->s6_addr32[0];
-       carry = (sum < (__force u32)saddr->s6_addr32[0]);
-       sum += carry;
-
-       sum += (__force u32)saddr->s6_addr32[1];
-       carry = (sum < (__force u32)saddr->s6_addr32[1]);
-       sum += carry;
-
-       sum += (__force u32)saddr->s6_addr32[2];
-       carry = (sum < (__force u32)saddr->s6_addr32[2]);
-       sum += carry;
-
-       sum += (__force u32)saddr->s6_addr32[3];
-       carry = (sum < (__force u32)saddr->s6_addr32[3]);
-       sum += carry;
-
-       sum += (__force u32)daddr->s6_addr32[0];
-       carry = (sum < (__force u32)daddr->s6_addr32[0]);
-       sum += carry;
-
-       sum += (__force u32)daddr->s6_addr32[1];
-       carry = (sum < (__force u32)daddr->s6_addr32[1]);
-       sum += carry;
-
-       sum += (__force u32)daddr->s6_addr32[2];
-       carry = (sum < (__force u32)daddr->s6_addr32[2]);
-       sum += carry;
-
-       sum += (__force u32)daddr->s6_addr32[3];
-       carry = (sum < (__force u32)daddr->s6_addr32[3]);
-       sum += carry;
-
-       ulen = (__force u32)htonl((__u32) len);
-       sum += ulen;
-       carry = (sum < ulen);
-       sum += carry;
-
-       uproto = (__force u32)htonl(proto);
-       sum += uproto;
-       carry = (sum < uproto);
-       sum += carry;
-
-       return csum_fold((__force __wsum)sum);
-}
-
+__sum16 csum_ipv6_magic(const struct in6_addr *saddr,
+                       const struct in6_addr *daddr,
+                       __u32 len, unsigned short proto,
+                       __wsum csum);
 #endif
 
 static __inline__ __sum16 tcp_v6_check(int len,
@@ -126,4 +73,5 @@ static inline void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)
        __tcp_v6_send_check(skb, &np->saddr, &np->daddr);
 }
 
+int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto);
 #endif
index fdc48a94a063ae8ce746c501a477ab3471ab028e..6919a501f99efeceb2f24d59d6a0a4a47ade857c 100644 (file)
@@ -89,8 +89,6 @@ struct fib6_table;
 struct rt6_info {
        struct dst_entry                dst;
 
-       struct neighbour                *n;
-
        /*
         * Tail elements of dst_entry (__refcnt etc.)
         * and these elements (rarely used in hot path) are in
index 27d83183e615ef0029150d58858e7828a06e6921..260f83f16bcfb3e79f2572604fc373c1830e2310 100644 (file)
@@ -23,6 +23,7 @@ struct route_info {
 #include <net/sock.h>
 #include <linux/ip.h>
 #include <linux/ipv6.h>
+#include <linux/route.h>
 
 #define RT6_LOOKUP_F_IFACE             0x00000001
 #define RT6_LOOKUP_F_REACHABLE         0x00000002
@@ -102,7 +103,6 @@ extern struct rt6_info              *rt6_lookup(struct net *net,
                                            int oif, int flags);
 
 extern struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
-                                        struct neighbour *neigh,
                                         struct flowi6 *fl6);
 extern int icmp6_dst_gc(void);
 
@@ -194,4 +194,11 @@ static inline int ip6_skb_dst_mtu(struct sk_buff *skb)
               skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb));
 }
 
+static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt, struct in6_addr *dest)
+{
+       if (rt->rt6i_flags & RTF_GATEWAY)
+               return &rt->rt6i_gateway;
+       return dest;
+}
+
 #endif
index 5af66b26ebdd6379ce34ae1a914c3c71a2ce5f32..c1878f7049c8f982be4dee7401a59ffbc53c38b9 100644 (file)
@@ -292,8 +292,8 @@ static inline int ip6_frag_mem(struct net *net)
 }
 #endif
 
-#define IPV6_FRAG_HIGH_THRESH  (256 * 1024)    /* 262144 */
-#define IPV6_FRAG_LOW_THRESH   (192 * 1024)    /* 196608 */
+#define IPV6_FRAG_HIGH_THRESH  (4 * 1024*1024) /* 4194304 */
+#define IPV6_FRAG_LOW_THRESH   (3 * 1024*1024) /* 3145728 */
 #define IPV6_FRAG_TIMEOUT      (60 * HZ)       /* 60 seconds */
 
 extern int __ipv6_addr_type(const struct in6_addr *addr);
@@ -355,14 +355,32 @@ static inline void ipv6_addr_prefix(struct in6_addr *pfx,
                pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
 }
 
+static inline void __ipv6_addr_set_half(__be32 *addr,
+                                       __be32 wh, __be32 wl)
+{
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+#if defined(__BIG_ENDIAN)
+       if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) {
+               *(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl));
+               return;
+       }
+#elif defined(__LITTLE_ENDIAN)
+       if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) {
+               *(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh));
+               return;
+       }
+#endif
+#endif
+       addr[0] = wh;
+       addr[1] = wl;
+}
+
 static inline void ipv6_addr_set(struct in6_addr *addr, 
                                     __be32 w1, __be32 w2,
                                     __be32 w3, __be32 w4)
 {
-       addr->s6_addr32[0] = w1;
-       addr->s6_addr32[1] = w2;
-       addr->s6_addr32[2] = w3;
-       addr->s6_addr32[3] = w4;
+       __ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2);
+       __ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);
 }
 
 static inline bool ipv6_addr_equal(const struct in6_addr *a1,
@@ -381,9 +399,37 @@ static inline bool ipv6_addr_equal(const struct in6_addr *a1,
 #endif
 }
 
-static inline bool __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2,
-                                      unsigned int prefixlen)
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+static inline bool __ipv6_prefix_equal64_half(const __be64 *a1,
+                                             const __be64 *a2,
+                                             unsigned int len)
+{
+       if (len && ((*a1 ^ *a2) & cpu_to_be64((~0UL) << (64 - len))))
+               return false;
+       return true;
+}
+
+static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
+                                    const struct in6_addr *addr2,
+                                    unsigned int prefixlen)
+{
+       const __be64 *a1 = (const __be64 *)addr1;
+       const __be64 *a2 = (const __be64 *)addr2;
+
+       if (prefixlen >= 64) {
+               if (a1[0] ^ a2[0])
+                       return false;
+               return __ipv6_prefix_equal64_half(a1 + 1, a2 + 1, prefixlen - 64);
+       }
+       return __ipv6_prefix_equal64_half(a1, a2, prefixlen);
+}
+#else
+static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
+                                    const struct in6_addr *addr2,
+                                    unsigned int prefixlen)
 {
+       const __be32 *a1 = addr1->s6_addr32;
+       const __be32 *a2 = addr2->s6_addr32;
        unsigned int pdw, pbi;
 
        /* check complete u32 in prefix */
@@ -398,14 +444,7 @@ static inline bool __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2,
 
        return true;
 }
-
-static inline bool ipv6_prefix_equal(const struct in6_addr *a1,
-                                    const struct in6_addr *a2,
-                                    unsigned int prefixlen)
-{
-       return __ipv6_prefix_equal(a1->s6_addr32, a2->s6_addr32,
-                                  prefixlen);
-}
+#endif
 
 struct inet_frag_queue;
 
@@ -475,14 +514,25 @@ static inline u32 ipv6_addr_hash(const struct in6_addr *a)
 
 static inline bool ipv6_addr_loopback(const struct in6_addr *a)
 {
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+       const unsigned long *ul = (const unsigned long *)a;
+
+       return (ul[0] | (ul[1] ^ cpu_to_be64(1))) == 0UL;
+#else
        return (a->s6_addr32[0] | a->s6_addr32[1] |
                a->s6_addr32[2] | (a->s6_addr32[3] ^ htonl(1))) == 0;
+#endif
 }
 
 static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
 {
-       return (a->s6_addr32[0] | a->s6_addr32[1] |
-                (a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0;
+       return (
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+               *(__be64 *)a |
+#else
+               (a->s6_addr32[0] | a->s6_addr32[1]) |
+#endif
+               (a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL;
 }
 
 /*
@@ -507,7 +557,7 @@ static inline void ipv6_addr_set_v4mapped(const __be32 addr,
  * find the first different bit between two addresses
  * length of address must be a multiple of 32bits
  */
-static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
+static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)
 {
        const __be32 *a1 = token1, *a2 = token2;
        int i;
@@ -539,6 +589,33 @@ static inline int __ipv6_addr_diff(const void *token1, const void *token2, int a
        return addrlen << 5;
 }
 
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+static inline int __ipv6_addr_diff64(const void *token1, const void *token2, int addrlen)
+{
+       const __be64 *a1 = token1, *a2 = token2;
+       int i;
+
+       addrlen >>= 3;
+
+       for (i = 0; i < addrlen; i++) {
+               __be64 xb = a1[i] ^ a2[i];
+               if (xb)
+                       return i * 64 + 63 - __fls(be64_to_cpu(xb));
+       }
+
+       return addrlen << 6;
+}
+#endif
+
+static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
+{
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
+       if (__builtin_constant_p(addrlen) && !(addrlen & 7))
+               return __ipv6_addr_diff64(token1, token2, addrlen);
+#endif
+       return __ipv6_addr_diff32(token1, token2, addrlen);
+}
+
 static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2)
 {
        return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
@@ -546,6 +623,20 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add
 
 extern void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt);
 
+/*
+ *     Header manipulation
+ */
+static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass,
+                               __be32 flowlabel)
+{
+       *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel;
+}
+
+static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr)
+{
+       return *(__be32 *)hdr & IPV6_FLOWINFO_MASK;
+}
+
 /*
  *     Prototypes exported by ipv6
  */
@@ -570,13 +661,6 @@ extern int                 ip6_xmit(struct sock *sk,
                                         struct ipv6_txoptions *opt,
                                         int tclass);
 
-extern int                     ip6_nd_hdr(struct sock *sk,
-                                          struct sk_buff *skb,
-                                          struct net_device *dev,
-                                          const struct in6_addr *saddr,
-                                          const struct in6_addr *daddr,
-                                          int proto, int len);
-
 extern int                     ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
 
 extern int                     ip6_append_data(struct sock *sk,
index 23b3a7c5878308003f2bd89c53f78703a20980e9..745bf741e029c50d8a464374ec5cc4bae855c655 100644 (file)
@@ -127,13 +127,19 @@ static int ndisc_addr_option_pad(unsigned short type)
        }
 }
 
+static inline int ndisc_opt_addr_space(struct net_device *dev)
+{
+       return NDISC_OPT_SPACE(dev->addr_len +
+                              ndisc_addr_option_pad(dev->type));
+}
+
 static inline u8 *ndisc_opt_addr_data(struct nd_opt_hdr *p,
                                      struct net_device *dev)
 {
        u8 *lladdr = (u8 *)(p + 1);
        int lladdrlen = p->nd_opt_len << 3;
        int prepad = ndisc_addr_option_pad(dev->type);
-       if (lladdrlen != NDISC_OPT_SPACE(dev->addr_len + prepad))
+       if (lladdrlen != ndisc_opt_addr_space(dev))
                return NULL;
        return lladdr + prepad;
 }
@@ -148,15 +154,14 @@ static inline u32 ndisc_hashfn(const void *pkey, const struct net_device *dev, _
                (p32[3] * hash_rnd[3]));
 }
 
-static inline struct neighbour *__ipv6_neigh_lookup(struct neigh_table *tbl, struct net_device *dev, const void *pkey)
+static inline struct neighbour *__ipv6_neigh_lookup_noref(struct net_device *dev, const void *pkey)
 {
        struct neigh_hash_table *nht;
        const u32 *p32 = pkey;
        struct neighbour *n;
        u32 hash_val;
 
-       rcu_read_lock_bh();
-       nht = rcu_dereference_bh(tbl->nht);
+       nht = rcu_dereference_bh(nd_tbl.nht);
        hash_val = ndisc_hashfn(pkey, dev, nht->hash_rnd) >> (32 - nht->hash_shift);
        for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);
             n != NULL;
@@ -164,12 +169,21 @@ static inline struct neighbour *__ipv6_neigh_lookup(struct neigh_table *tbl, str
                u32 *n32 = (u32 *) n->primary_key;
                if (n->dev == dev &&
                    ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) |
-                    (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0) {
-                       if (!atomic_inc_not_zero(&n->refcnt))
-                               n = NULL;
-                       break;
-               }
+                    (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0)
+                       return n;
        }
+
+       return NULL;
+}
+
+static inline struct neighbour *__ipv6_neigh_lookup(struct net_device *dev, const void *pkey)
+{
+       struct neighbour *n;
+
+       rcu_read_lock_bh();
+       n = __ipv6_neigh_lookup_noref(dev, pkey);
+       if (n && !atomic_inc_not_zero(&n->refcnt))
+               n = NULL;
        rcu_read_unlock_bh();
 
        return n;
index 3ce4988c9c08a96c0837407bd7c092c043a0309b..fe630dde35c3f3688d30e1e33a5fb5d06393bba6 100644 (file)
@@ -16,9 +16,8 @@ struct neighbour;
 
 struct netevent_redirect {
        struct dst_entry *old;
-       struct neighbour *old_neigh;
        struct dst_entry *new;
-       struct neighbour *new_neigh;
+       struct neighbour *neigh;
        const void *daddr;
 };
 
index d8f5b9f5216939d2053c8c99ad54925fb5a0ce5c..e98aeb3da033a38e29f745d5f043a33d3888bcc3 100644 (file)
@@ -31,6 +31,8 @@ extern void nf_conntrack_cleanup(struct net *net);
 extern int nf_conntrack_proto_init(struct net *net);
 extern void nf_conntrack_proto_fini(struct net *net);
 
+extern void nf_conntrack_cleanup_end(void);
+
 extern bool
 nf_ct_get_tuple(const struct sk_buff *skb,
                unsigned int nhoff,
index 75ca9291cf2ce307a8e54dec8a559a65069945f9..36d9379d4c4b495a20b65e448f3ecc4da5b3bf5e 100644 (file)
@@ -82,6 +82,7 @@ nf_tproxy_get_sock_v4(struct net *net, const u8 protocol,
                        break;
                case NFT_LOOKUP_LISTENER:
                        sk = inet_lookup_listener(net, &tcp_hashinfo,
+                                                   saddr, sport,
                                                    daddr, dport,
                                                    in->ifindex);
 
@@ -151,6 +152,7 @@ nf_tproxy_get_sock_v6(struct net *net, const u8 protocol,
                        break;
                case NFT_LOOKUP_LISTENER:
                        sk = inet6_lookup_listener(net, &tcp_hashinfo,
+                                                  saddr, sport,
                                                   daddr, ntohs(dport),
                                                   in->ifindex);
 
index a1d83cc8bf859d356b9d4b437c4d03590fa25453..923cb20051edfbb93a3fb84c8c78b7dae0993c82 100644 (file)
@@ -71,6 +71,7 @@ struct netns_ct {
        struct hlist_head       *expect_hash;
        struct hlist_nulls_head unconfirmed;
        struct hlist_nulls_head dying;
+       struct hlist_nulls_head tmpl;
        struct ip_conntrack_stat __percpu *stat;
        struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;
        struct nf_exp_event_notifier __rcu *nf_expect_event_cb;
index 591db7d657a37d42107b38582cd8a45ad5838552..c24060ee411e9e15a91a0fc5bd189eef8425869b 100644 (file)
@@ -8,6 +8,7 @@ struct ebt_table;
 
 struct netns_xt {
        struct list_head tables[NFPROTO_NUMPROTO];
+       bool notrack_deprecated_warning;
 #if defined(CONFIG_BRIDGE_NF_EBTABLES) || \
     defined(CONFIG_BRIDGE_NF_EBTABLES_MODULE)
        struct ebt_table *broute_table;
index 9fcc680ab6b9d1f4de4d15583275efe7acf66975..13174509cdfd38485a48f6fb1055f285a7306936 100644 (file)
@@ -126,9 +126,10 @@ tcf_exts_exec(struct sk_buff *skb, struct tcf_exts *exts,
        return 0;
 }
 
-extern int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb,
-                            struct nlattr *rate_tlv, struct tcf_exts *exts,
-                            const struct tcf_ext_map *map);
+extern int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
+                            struct nlattr **tb, struct nlattr *rate_tlv,
+                            struct tcf_exts *exts,
+                            const struct tcf_ext_map *map);
 extern void tcf_exts_destroy(struct tcf_proto *tp, struct tcf_exts *exts);
 extern void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst,
                             struct tcf_exts *src);
index 1540f9c2fcf4b555780087e48850911659009c25..2d06c2a53de176f3157b5487651de7f1d8c775e4 100644 (file)
@@ -195,7 +195,7 @@ struct tcf_proto_ops {
 
        unsigned long           (*get)(struct tcf_proto*, u32 handle);
        void                    (*put)(struct tcf_proto*, unsigned long);
-       int                     (*change)(struct sk_buff *,
+       int                     (*change)(struct net *net, struct sk_buff *,
                                        struct tcf_proto*, unsigned long,
                                        u32 handle, struct nlattr **,
                                        unsigned long *);
index 182ca99405adfb30e7b72181847b4a5ffd5d69ca..581dc6bd7dc633a23aef606826023f9b642bdeff 100644 (file)
@@ -140,6 +140,7 @@ typedef __u64 __bitwise __addrpair;
  *     @skc_family: network address family
  *     @skc_state: Connection state
  *     @skc_reuse: %SO_REUSEADDR setting
+ *     @skc_reuseport: %SO_REUSEPORT setting
  *     @skc_bound_dev_if: bound device index if != 0
  *     @skc_bind_node: bind hash linkage for various protocol lookup tables
  *     @skc_portaddr_node: second hash linkage for UDP/UDP-Lite protocol
@@ -179,7 +180,8 @@ struct sock_common {
 
        unsigned short          skc_family;
        volatile unsigned char  skc_state;
-       unsigned char           skc_reuse;
+       unsigned char           skc_reuse:4;
+       unsigned char           skc_reuseport:4;
        int                     skc_bound_dev_if;
        union {
                struct hlist_node       skc_bind_node;
@@ -297,6 +299,7 @@ struct sock {
 #define sk_family              __sk_common.skc_family
 #define sk_state               __sk_common.skc_state
 #define sk_reuse               __sk_common.skc_reuse
+#define sk_reuseport           __sk_common.skc_reuseport
 #define sk_bound_dev_if                __sk_common.skc_bound_dev_if
 #define sk_bind_node           __sk_common.skc_bind_node
 #define sk_prot                        __sk_common.skc_prot
@@ -664,6 +667,7 @@ enum sock_flags {
                     * Will use last 4 bytes of packet sent from
                     * user-space instead.
                     */
+       SOCK_FILTER_LOCKED, /* Filter cannot be changed anymore */
 };
 
 static inline void sock_copy_flags(struct sock *nsk, struct sock *osk)
diff --git a/include/rdma/Kbuild b/include/rdma/Kbuild
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/include/sound/Kbuild b/include/sound/Kbuild
deleted file mode 100644 (file)
index e69de29..0000000
index 6d9e15ed1dcf0cb2875a10ca6795b14f3d4e0c51..dd8c48d14ed9637b3d1264ac5b88811e9be2dae6 100644 (file)
@@ -19,7 +19,7 @@
 
 struct cs4271_platform_data {
        int gpio_nreset;        /* GPIO driving Reset pin, if any */
-       int amutec_eq_bmutec:1; /* flag to enable AMUTEC=BMUTEC */
+       bool amutec_eq_bmutec;  /* flag to enable AMUTEC=BMUTEC */
 };
 
 #endif /* __CS4271_H */
index 769e27c774a3de382ec93650766621056dc78820..bc56738cb1091b8319b2413fe7e6b2f105ba0ac8 100644 (file)
@@ -58,8 +58,9 @@
        .info = snd_soc_info_volsw_range, .get = snd_soc_get_volsw_range, \
        .put = snd_soc_put_volsw_range, \
        .private_value = (unsigned long)&(struct soc_mixer_control) \
-               {.reg = xreg, .shift = xshift, .min = xmin,\
-                .max = xmax, .platform_max = xmax, .invert = xinvert} }
+               {.reg = xreg, .rreg = xreg, .shift = xshift, \
+                .rshift = xshift,  .min = xmin, .max = xmax, \
+                .platform_max = xmax, .invert = xinvert} }
 #define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
 {      .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
@@ -88,8 +89,9 @@
        .info = snd_soc_info_volsw_range, \
        .get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
        .private_value = (unsigned long)&(struct soc_mixer_control) \
-               {.reg = xreg, .shift = xshift, .min = xmin,\
-                .max = xmax, .platform_max = xmax, .invert = xinvert} }
+               {.reg = xreg, .rreg = xreg, .shift = xshift, \
+                .rshift = xshift, .min = xmin, .max = xmax, \
+                .platform_max = xmax, .invert = xinvert} }
 #define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \
 {      .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
index f6372b01136657cd5a0b9213090733c87347250e..7e8c36bc708225c0f3eb79c0b33977c1dcb17519 100644 (file)
@@ -451,7 +451,7 @@ DEFINE_EVENT(ext4__page_op, ext4_releasepage,
        TP_ARGS(page)
 );
 
-TRACE_EVENT(ext4_invalidatepage,
+DECLARE_EVENT_CLASS(ext4_invalidatepage_op,
        TP_PROTO(struct page *page, unsigned long offset),
 
        TP_ARGS(page, offset),
@@ -477,6 +477,18 @@ TRACE_EVENT(ext4_invalidatepage,
                  (unsigned long) __entry->index, __entry->offset)
 );
 
+DEFINE_EVENT(ext4_invalidatepage_op, ext4_invalidatepage,
+       TP_PROTO(struct page *page, unsigned long offset),
+
+       TP_ARGS(page, offset)
+);
+
+DEFINE_EVENT(ext4_invalidatepage_op, ext4_journalled_invalidatepage,
+       TP_PROTO(struct page *page, unsigned long offset),
+
+       TP_ARGS(page, offset)
+);
+
 TRACE_EVENT(ext4_discard_blocks,
        TP_PROTO(struct super_block *sb, unsigned long long blk,
                        unsigned long long count),
index 2d32d073a6f9e4275d47c27cbd63b169a3267b9a..4ef3acbba5daeba94e21ab2a9c4700c9b9cf2108 100644 (file)
@@ -22,8 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
-
+#define SO_REUSEPORT   15
 #ifndef SO_PASSCRED /* powerpc only differs in these */
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
@@ -73,4 +72,6 @@
 /* Instruct lower device to use last 4-bytes of skb data as FCS */
 #define SO_NOFCS               43
 
+#define SO_LOCK_FILTER         44
+
 #endif /* __ASM_GENERIC_SOCKET_H */
index e7f52c334005bb3b461005a4be97620048053676..d5844122ff329dabf4d5c8431f138f48a86d0ed3 100644 (file)
@@ -6,24 +6,10 @@
  *     Joonyoung Shim <jy0922.shim@samsung.com>
  *     Seung-Woo Kim <sw0312.kim@samsung.com>
  *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
 #ifndef _UAPI_EXYNOS_DRM_H_
@@ -185,6 +171,8 @@ enum drm_exynos_flip {
        EXYNOS_DRM_FLIP_NONE = (0 << 0),
        EXYNOS_DRM_FLIP_VERTICAL = (1 << 0),
        EXYNOS_DRM_FLIP_HORIZONTAL = (1 << 1),
+       EXYNOS_DRM_FLIP_BOTH = EXYNOS_DRM_FLIP_VERTICAL |
+                       EXYNOS_DRM_FLIP_HORIZONTAL,
 };
 
 enum drm_exynos_degree {
index b746a3cf5fa9b6a56d75d1a4a5cf5bafa5a46a5a..c4d2e9c74002d00b0981157d55576609ba002899 100644 (file)
@@ -307,6 +307,7 @@ typedef struct drm_i915_irq_wait {
 #define I915_PARAM_HAS_PRIME_VMAP_FLUSH         21
 #define I915_PARAM_RSVD_FOR_FUTURE_USE  22
 #define I915_PARAM_HAS_SECURE_BATCHES   23
+#define I915_PARAM_HAS_PINNED_BATCHES   24
 
 typedef struct drm_i915_getparam {
        int param;
@@ -677,6 +678,15 @@ struct drm_i915_gem_execbuffer2 {
  */
 #define I915_EXEC_SECURE               (1<<9)
 
+/** Inform the kernel that the batch is and will always be pinned. This
+ * negates the requirement for a workaround to be performed to avoid
+ * an incoherent CS (such as can be found on 830/845). If this flag is
+ * not passed, the kernel will endeavour to make sure the batch is
+ * coherent with the CS before execution. If this flag is passed,
+ * userspace assumes the responsibility for ensuring the same.
+ */
+#define I915_EXEC_IS_PINNED            (1<<10)
+
 #define I915_EXEC_CONTEXT_ID_MASK      (0xffffffff)
 #define i915_execbuffer2_set_context_id(eb2, context) \
        (eb2).rsvd1 = context & I915_EXEC_CONTEXT_ID_MASK
index 76352ac45f24bf1290196327ad9af8fb504e4d69..9f096f1c0907b7056bcbe396783fdb2237724a65 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <linux/types.h>
 #include <linux/elf-em.h>
-#include <linux/ptrace.h>
 
 /* The netlink messages for the audit system is divided into blocks:
  * 1000 - 1099 are for commanding the audit system
 #define AUDIT_MMAP             1323    /* Record showing descriptor and flags in mmap */
 #define AUDIT_NETFILTER_PKT    1324    /* Packets traversing netfilter chains */
 #define AUDIT_NETFILTER_CFG    1325    /* Netfilter chain modifications */
+#define AUDIT_SECCOMP          1326    /* Secure Computing event */
 
 #define AUDIT_AVC              1400    /* SE Linux avc denial or grant */
 #define AUDIT_SELINUX_ERR      1401    /* Internal SE Linux Errors */
index f79c3721da6e772991779c4ee55eddce00f3bab0..53b1d56a6e7f3544b1cd3ec3bcac87b62e630c40 100644 (file)
@@ -38,11 +38,6 @@ struct in6_addr {
 #define s6_addr32              in6_u.u6_addr32
 };
 
-/* IPv6 Wildcard Address (::) and Loopback Address (::1) defined in RFC2553
- * NOTE: Be aware the IN6ADDR_* constants and in6addr_* externals are defined
- * in network byte order, not in host byte order as are the IPv4 equivalents
- */
-
 struct sockaddr_in6 {
        unsigned short int      sin6_family;    /* AF_INET6 */
        __be16                  sin6_port;      /* Transport layer port # */
@@ -264,17 +259,10 @@ struct in6_flowlabel_req {
 
 /*
  * Multicast Routing:
- * see include/linux/mroute6.h.
+ * see include/uapi/linux/mroute6.h.
  *
- * MRT6_INIT                   200
- * MRT6_DONE                   201
- * MRT6_ADD_MIF                        202
- * MRT6_DEL_MIF                        203
- * MRT6_ADD_MFC                        204
- * MRT6_DEL_MFC                        205
- * MRT6_VERSION                        206
- * MRT6_ASSERT                 207
- * MRT6_PIM                    208
- * (reserved)                  209
+ * MRT6_BASE                   200
+ * ...
+ * MRT6_MAX
  */
 #endif /* _UAPI_LINUX_IN6_H */
index 5a2991cf0251d558c15d108d9ea88155240425e7..4bda4cf5b0f56d84651497df86bd9fa09909fa85 100644 (file)
@@ -63,6 +63,8 @@ struct ipv6_opt_hdr {
 #define ipv6_destopt_hdr ipv6_opt_hdr
 #define ipv6_hopopt_hdr  ipv6_opt_hdr
 
+/* Router Alert option values (RFC2711) */
+#define IPV6_OPT_ROUTERALERT_MLD       0x0000  /* MLD(RFC2710) */
 
 /*
  *     routing header type 0 (used in cmsghdr struct)
index 16929993acc4976535c73bf8172e29789275bfeb..a382d2c04a42d061f758faa84f4b76820f135e48 100644 (file)
@@ -26,6 +26,9 @@
 #define MRT_ASSERT     (MRT_BASE+7)    /* Activate PIM assert mode             */
 #define MRT_PIM                (MRT_BASE+8)    /* enable PIM code                      */
 #define MRT_TABLE      (MRT_BASE+9)    /* Specify mroute table ID              */
+#define MRT_ADD_MFC_PROXY      (MRT_BASE+10)   /* Add a (*,*|G) mfc entry      */
+#define MRT_DEL_MFC_PROXY      (MRT_BASE+11)   /* Del a (*,*|G) mfc entry      */
+#define MRT_MAX                (MRT_BASE+11)
 
 #define SIOCGETVIFCNT  SIOCPROTOPRIVATE        /* IP protocol privates */
 #define SIOCGETSGCNT   (SIOCPROTOPRIVATE+1)
index 3e89b5e7f9e33052adeb6b5dafa01944f02ee5cc..ce91215cf7e62cab5832264edaf78f76b08a8205 100644 (file)
@@ -26,6 +26,9 @@
 #define MRT6_ASSERT    (MRT6_BASE+7)   /* Activate PIM assert mode             */
 #define MRT6_PIM       (MRT6_BASE+8)   /* enable PIM code                      */
 #define MRT6_TABLE     (MRT6_BASE+9)   /* Specify mroute table ID              */
+#define MRT6_ADD_MFC_PROXY     (MRT6_BASE+10)  /* Add a (*,*|G) mfc entry      */
+#define MRT6_DEL_MFC_PROXY     (MRT6_BASE+11)  /* Del a (*,*|G) mfc entry      */
+#define MRT6_MAX       (MRT6_BASE+11)
 
 #define SIOCGETMIFCNT_IN6      SIOCPROTOPRIVATE        /* IP protocol privates */
 #define SIOCGETSGCNT_IN6       (SIOCPROTOPRIVATE+1)
index 78dbd2f996a3668665718e5dcad7918966640281..22d95c6854e0cb0fbadaafae1c681ed9ad805780 100644 (file)
@@ -10,6 +10,7 @@
 /* msgrcv options */
 #define MSG_NOERROR     010000  /* no error if message is too big */
 #define MSG_EXCEPT      020000  /* recv any msg except of specified type.*/
+#define MSG_COPY        040000  /* copy (not remove) all queue messages */
 
 /* Obsolete, used only for backwards compatibility and libc5 compiles */
 struct msqid_ds {
index 6b7b6f1e2fd6a697dd26427c1130a5b51823d899..ebfadc56d1b43526c439086eb294124d20bec524 100644 (file)
 #define  PCI_EXP_DEVSTA_TRPND  0x20    /* Transactions Pending */
 #define PCI_EXP_LNKCAP         12      /* Link Capabilities */
 #define  PCI_EXP_LNKCAP_SLS    0x0000000f /* Supported Link Speeds */
+#define  PCI_EXP_LNKCAP_SLS_2_5GB 0x1  /* LNKCAP2 SLS Vector bit 0 (2.5GT/s) */
+#define  PCI_EXP_LNKCAP_SLS_5_0GB 0x2  /* LNKCAP2 SLS Vector bit 1 (5.0GT/s) */
 #define  PCI_EXP_LNKCAP_MLW    0x000003f0 /* Maximum Link Width */
 #define  PCI_EXP_LNKCAP_ASPMS  0x00000c00 /* ASPM Support */
 #define  PCI_EXP_LNKCAP_L0SEL  0x00007000 /* L0s Exit Latency */
index 848e3584d7c8063759548eb4f440e7b2bf262126..a5a8c88753b9579e8bcc9caed170a6f859a163b1 100644 (file)
@@ -53,6 +53,7 @@
                                         * network */
 #define VIRTIO_NET_F_MQ        22      /* Device supports Receive Flow
                                         * Steering */
+#define VIRTIO_NET_F_CTRL_MAC_ADDR 23  /* Set MAC address */
 
 #define VIRTIO_NET_S_LINK_UP   1       /* Link is up */
 #define VIRTIO_NET_S_ANNOUNCE  2       /* Announcement is needed */
@@ -127,7 +128,7 @@ typedef __u8 virtio_net_ctrl_ack;
  #define VIRTIO_NET_CTRL_RX_NOBCAST      5
 
 /*
- * Control the MAC filter table.
+ * Control the MAC
  *
  * The MAC filter table is managed by the hypervisor, the guest should
  * assume the size is infinite.  Filtering should be considered
@@ -140,6 +141,10 @@ typedef __u8 virtio_net_ctrl_ack;
  * first sg list contains unicast addresses, the second is for multicast.
  * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature
  * is available.
+ *
+ * The ADDR_SET command requests one out scatterlist, it contains a
+ * 6 bytes MAC address. This functionality is present if the
+ * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available.
  */
 struct virtio_net_ctrl_mac {
        __u32 entries;
@@ -148,6 +153,7 @@ struct virtio_net_ctrl_mac {
 
 #define VIRTIO_NET_CTRL_MAC    1
  #define VIRTIO_NET_CTRL_MAC_TABLE_SET        0
+ #define VIRTIO_NET_CTRL_MAC_ADDR_SET         1
 
 /*
  * Control VLAN filtering
index ad9518eb26e06e648c6044b95de41d39e9b076d0..2547f29dcd1b5e00ab93ed37c594e93d6e1f5b75 100644 (file)
@@ -306,6 +306,20 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
        return err;
 }
 
+long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
+{
+       struct compat_msgbuf __user *msgp = dest;
+       size_t msgsz;
+
+       if (put_user(msg->m_type, &msgp->mtype))
+               return -EFAULT;
+
+       msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz;
+       if (store_msg(msgp->mtext, msg, msgsz))
+               return -EFAULT;
+       return msgsz;
+}
+
 #ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC
 long compat_sys_semctl(int first, int second, int third, void __user *uptr)
 {
@@ -337,10 +351,6 @@ long compat_sys_msgsnd(int first, int second, int third, void __user *uptr)
 long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
                           int version, void __user *uptr)
 {
-       struct compat_msgbuf __user *up;
-       long type;
-       int err;
-
        if (first < 0)
                return -EINVAL;
        if (second < 0)
@@ -348,23 +358,15 @@ long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
 
        if (!version) {
                struct compat_ipc_kludge ipck;
-               err = -EINVAL;
                if (!uptr)
-                       goto out;
-               err = -EFAULT;
+                       return -EINVAL;
                if (copy_from_user (&ipck, uptr, sizeof(ipck)))
-                       goto out;
+                       return -EFAULT;
                uptr = compat_ptr(ipck.msgp);
                msgtyp = ipck.msgtyp;
        }
-       up = uptr;
-       err = do_msgrcv(first, &type, up->mtext, second, msgtyp, third);
-       if (err < 0)
-               goto out;
-       if (put_user(type, &up->mtype))
-               err = -EFAULT;
-out:
-       return err;
+       return do_msgrcv(first, uptr, second, msgtyp, third,
+                        compat_do_msg_fill);
 }
 #else
 long compat_sys_semctl(int semid, int semnum, int cmd, int arg)
@@ -385,16 +387,8 @@ long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp,
 long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp,
                       compat_ssize_t msgsz, long msgtyp, int msgflg)
 {
-       long err, mtype;
-
-       err =  do_msgrcv(msqid, &mtype, msgp->mtext, (ssize_t)msgsz, msgtyp, msgflg);
-       if (err < 0)
-               goto out;
-
-       if (put_user(mtype, &msgp->mtype))
-               err = -EFAULT;
- out:
-       return err;
+       return do_msgrcv(msqid, msgp, (ssize_t)msgsz, msgtyp, msgflg,
+                        compat_do_msg_fill);
 }
 #endif
 
index 00fba2bab87d8019739e4645f98e21559688dcbe..130dfece27ac7cc74c40a60c6b8eeceb97963deb 100644 (file)
@@ -158,6 +158,9 @@ static int proc_ipcauto_dointvec_minmax(ctl_table *table, int write,
 
 static int zero;
 static int one = 1;
+#ifdef CONFIG_CHECKPOINT_RESTORE
+static int int_max = INT_MAX;
+#endif
 
 static struct ctl_table ipc_kern_table[] = {
        {
@@ -227,6 +230,35 @@ static struct ctl_table ipc_kern_table[] = {
                .extra1         = &zero,
                .extra2         = &one,
        },
+#ifdef CONFIG_CHECKPOINT_RESTORE
+       {
+               .procname       = "sem_next_id",
+               .data           = &init_ipc_ns.ids[IPC_SEM_IDS].next_id,
+               .maxlen         = sizeof(init_ipc_ns.ids[IPC_SEM_IDS].next_id),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_dointvec_minmax,
+               .extra1         = &zero,
+               .extra2         = &int_max,
+       },
+       {
+               .procname       = "msg_next_id",
+               .data           = &init_ipc_ns.ids[IPC_MSG_IDS].next_id,
+               .maxlen         = sizeof(init_ipc_ns.ids[IPC_MSG_IDS].next_id),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_dointvec_minmax,
+               .extra1         = &zero,
+               .extra2         = &int_max,
+       },
+       {
+               .procname       = "shm_next_id",
+               .data           = &init_ipc_ns.ids[IPC_SHM_IDS].next_id,
+               .maxlen         = sizeof(init_ipc_ns.ids[IPC_SHM_IDS].next_id),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_dointvec_minmax,
+               .extra1         = &zero,
+               .extra2         = &int_max,
+       },
+#endif
        {}
 };
 
index a71af5a65abf2b6a3029c4792d13594317dba8d2..950572f9d7963858d46e01998fea00e14024f26b 100644 (file)
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -755,26 +755,91 @@ static inline int convert_mode(long *msgtyp, int msgflg)
        return SEARCH_EQUAL;
 }
 
-long do_msgrcv(int msqid, long *pmtype, void __user *mtext,
-               size_t msgsz, long msgtyp, int msgflg)
+static long do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
+{
+       struct msgbuf __user *msgp = dest;
+       size_t msgsz;
+
+       if (put_user(msg->m_type, &msgp->mtype))
+               return -EFAULT;
+
+       msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz;
+       if (store_msg(msgp->mtext, msg, msgsz))
+               return -EFAULT;
+       return msgsz;
+}
+
+#ifdef CONFIG_CHECKPOINT_RESTORE
+/*
+ * This function creates new kernel message structure, large enough to store
+ * bufsz message bytes.
+ */
+static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz,
+                                          int msgflg, long *msgtyp,
+                                          unsigned long *copy_number)
+{
+       struct msg_msg *copy;
+
+       *copy_number = *msgtyp;
+       *msgtyp = 0;
+       /*
+        * Create dummy message to copy real message to.
+        */
+       copy = load_msg(buf, bufsz);
+       if (!IS_ERR(copy))
+               copy->m_ts = bufsz;
+       return copy;
+}
+
+static inline void free_copy(struct msg_msg *copy)
+{
+       if (copy)
+               free_msg(copy);
+}
+#else
+static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz,
+                                          int msgflg, long *msgtyp,
+                                          unsigned long *copy_number)
+{
+       return ERR_PTR(-ENOSYS);
+}
+
+static inline void free_copy(struct msg_msg *copy)
+{
+}
+#endif
+
+long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp,
+              int msgflg,
+              long (*msg_handler)(void __user *, struct msg_msg *, size_t))
 {
        struct msg_queue *msq;
        struct msg_msg *msg;
        int mode;
        struct ipc_namespace *ns;
+       struct msg_msg *copy = NULL;
+       unsigned long copy_number = 0;
 
-       if (msqid < 0 || (long) msgsz < 0)
+       if (msqid < 0 || (long) bufsz < 0)
                return -EINVAL;
+       if (msgflg & MSG_COPY) {
+               copy = prepare_copy(buf, bufsz, msgflg, &msgtyp, &copy_number);
+               if (IS_ERR(copy))
+                       return PTR_ERR(copy);
+       }
        mode = convert_mode(&msgtyp, msgflg);
        ns = current->nsproxy->ipc_ns;
 
        msq = msg_lock_check(ns, msqid);
-       if (IS_ERR(msq))
+       if (IS_ERR(msq)) {
+               free_copy(copy);
                return PTR_ERR(msq);
+       }
 
        for (;;) {
                struct msg_receiver msr_d;
                struct list_head *tmp;
+               long msg_counter = 0;
 
                msg = ERR_PTR(-EACCES);
                if (ipcperms(ns, &msq->q_perm, S_IRUGO))
@@ -793,12 +858,21 @@ long do_msgrcv(int msqid, long *pmtype, void __user *mtext,
                                msg = walk_msg;
                                if (mode == SEARCH_LESSEQUAL &&
                                                walk_msg->m_type != 1) {
-                                       msg = walk_msg;
                                        msgtyp = walk_msg->m_type - 1;
-                               } else {
-                                       msg = walk_msg;
+                               } else if (msgflg & MSG_COPY) {
+                                       if (copy_number == msg_counter) {
+                                               /*
+                                                * Found requested message.
+                                                * Copy it.
+                                                */
+                                               msg = copy_msg(msg, copy);
+                                               if (IS_ERR(msg))
+                                                       goto out_unlock;
+                                               break;
+                                       }
+                               } else
                                        break;
-                               }
+                               msg_counter++;
                        }
                        tmp = tmp->next;
                }
@@ -807,10 +881,16 @@ long do_msgrcv(int msqid, long *pmtype, void __user *mtext,
                         * Found a suitable message.
                         * Unlink it from the queue.
                         */
-                       if ((msgsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) {
+                       if ((bufsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) {
                                msg = ERR_PTR(-E2BIG);
                                goto out_unlock;
                        }
+                       /*
+                        * If we are copying, then do not unlink message and do
+                        * not update queue parameters.
+                        */
+                       if (msgflg & MSG_COPY)
+                               goto out_unlock;
                        list_del(&msg->m_list);
                        msq->q_qnum--;
                        msq->q_rtime = get_seconds();
@@ -834,7 +914,7 @@ long do_msgrcv(int msqid, long *pmtype, void __user *mtext,
                if (msgflg & MSG_NOERROR)
                        msr_d.r_maxsize = INT_MAX;
                else
-                       msr_d.r_maxsize = msgsz;
+                       msr_d.r_maxsize = bufsz;
                msr_d.r_msg = ERR_PTR(-EAGAIN);
                current->state = TASK_INTERRUPTIBLE;
                msg_unlock(msq);
@@ -894,32 +974,21 @@ out_unlock:
                        break;
                }
        }
-       if (IS_ERR(msg))
+       if (IS_ERR(msg)) {
+               free_copy(copy);
                return PTR_ERR(msg);
+       }
 
-       msgsz = (msgsz > msg->m_ts) ? msg->m_ts : msgsz;
-       *pmtype = msg->m_type;
-       if (store_msg(mtext, msg, msgsz))
-               msgsz = -EFAULT;
-
+       bufsz = msg_handler(buf, msg, bufsz);
        free_msg(msg);
 
-       return msgsz;
+       return bufsz;
 }
 
 SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
                long, msgtyp, int, msgflg)
 {
-       long err, mtype;
-
-       err =  do_msgrcv(msqid, &mtype, msgp->mtext, msgsz, msgtyp, msgflg);
-       if (err < 0)
-               goto out;
-
-       if (put_user(mtype, &msgp->mtype))
-               err = -EFAULT;
-out:
-       return err;
+       return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg, do_msg_fill);
 }
 
 #ifdef CONFIG_PROC_FS
index 6471f1bdae96f2c6650a3c369bb77d0dc357d388..ebfcbfa8b7f25a4193dcfd196963e4b87428a6e6 100644 (file)
@@ -102,7 +102,50 @@ out_err:
        free_msg(msg);
        return ERR_PTR(err);
 }
+#ifdef CONFIG_CHECKPOINT_RESTORE
+struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst)
+{
+       struct msg_msgseg *dst_pseg, *src_pseg;
+       int len = src->m_ts;
+       int alen;
+
+       BUG_ON(dst == NULL);
+       if (src->m_ts > dst->m_ts)
+               return ERR_PTR(-EINVAL);
 
+       alen = len;
+       if (alen > DATALEN_MSG)
+               alen = DATALEN_MSG;
+
+       dst->next = NULL;
+       dst->security = NULL;
+
+       memcpy(dst + 1, src + 1, alen);
+
+       len -= alen;
+       dst_pseg = dst->next;
+       src_pseg = src->next;
+       while (len > 0) {
+               alen = len;
+               if (alen > DATALEN_SEG)
+                       alen = DATALEN_SEG;
+               memcpy(dst_pseg + 1, src_pseg + 1, alen);
+               dst_pseg = dst_pseg->next;
+               len -= alen;
+               src_pseg = src_pseg->next;
+       }
+
+       dst->m_type = src->m_type;
+       dst->m_ts = src->m_ts;
+
+       return dst;
+}
+#else
+struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst)
+{
+       return ERR_PTR(-ENOSYS);
+}
+#endif
 int store_msg(void __user *dest, struct msg_msg *msg, int len)
 {
        int alen;
index 72fd0785ac948b4c3813a2aac8f463ea41e7955f..74e1d9c7a98afcef566b80bf906e1398f94e7760 100644 (file)
@@ -122,6 +122,7 @@ void ipc_init_ids(struct ipc_ids *ids)
 
        ids->in_use = 0;
        ids->seq = 0;
+       ids->next_id = -1;
        {
                int seq_limit = INT_MAX/SEQ_MULTIPLIER;
                if (seq_limit > USHRT_MAX)
@@ -252,6 +253,7 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
        kuid_t euid;
        kgid_t egid;
        int id, err;
+       int next_id = ids->next_id;
 
        if (size > IPCMNI)
                size = IPCMNI;
@@ -264,7 +266,8 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
        rcu_read_lock();
        spin_lock(&new->lock);
 
-       err = idr_get_new(&ids->ipcs_idr, new, &id);
+       err = idr_get_new_above(&ids->ipcs_idr, new,
+                               (next_id < 0) ? 0 : ipcid_to_idx(next_id), &id);
        if (err) {
                spin_unlock(&new->lock);
                rcu_read_unlock();
@@ -277,9 +280,14 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
        new->cuid = new->uid = euid;
        new->gid = new->cgid = egid;
 
-       new->seq = ids->seq++;
-       if(ids->seq > ids->seq_max)
-               ids->seq = 0;
+       if (next_id < 0) {
+               new->seq = ids->seq++;
+               if (ids->seq > ids->seq_max)
+                       ids->seq = 0;
+       } else {
+               new->seq = ipcid_to_seqx(next_id);
+               ids->next_id = -1;
+       }
 
        new->id = ipc_buildid(id, new->seq);
        return id;
index c8fe2f7631e9b616177d69c8ac614e901db669d2..eeb79a1fbd834eda23027624824faf94bfb2f459 100644 (file)
@@ -92,6 +92,7 @@ void __init ipc_init_proc_interface(const char *path, const char *header,
 #define IPC_SHM_IDS    2
 
 #define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER)
+#define ipcid_to_seqx(id) ((id) / SEQ_MULTIPLIER)
 
 /* must be called with ids->rw_mutex acquired for writing */
 int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int);
@@ -139,6 +140,7 @@ int ipc_parse_version (int *cmd);
 
 extern void free_msg(struct msg_msg *msg);
 extern struct msg_msg *load_msg(const void __user *src, int len);
+extern struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst);
 extern int store_msg(void __user *dest, struct msg_msg *msg, int len);
 
 extern void recompute_msgmni(struct ipc_namespace *);
index 40414e9143db609b194b04e95c798351118f07b7..d596e5355f153d0cac5da1bc7806239a1ec6b860 100644 (file)
@@ -272,6 +272,8 @@ static int audit_log_config_change(char *function_name, int new, int old,
        int rc = 0;
 
        ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
+       if (unlikely(!ab))
+               return rc;
        audit_log_format(ab, "%s=%d old=%d auid=%u ses=%u", function_name, new,
                         old, from_kuid(&init_user_ns, loginuid), sessionid);
        if (sid) {
@@ -619,6 +621,8 @@ static int audit_log_common_recv_msg(struct audit_buffer **ab, u16 msg_type,
        }
 
        *ab = audit_log_start(NULL, GFP_KERNEL, msg_type);
+       if (unlikely(!*ab))
+               return rc;
        audit_log_format(*ab, "pid=%d uid=%u auid=%u ses=%u",
                         task_tgid_vnr(current),
                         from_kuid(&init_user_ns, current_uid()),
@@ -1097,6 +1101,23 @@ static inline void audit_get_stamp(struct audit_context *ctx,
        }
 }
 
+/*
+ * Wait for auditd to drain the queue a little
+ */
+static void wait_for_auditd(unsigned long sleep_time)
+{
+       DECLARE_WAITQUEUE(wait, current);
+       set_current_state(TASK_INTERRUPTIBLE);
+       add_wait_queue(&audit_backlog_wait, &wait);
+
+       if (audit_backlog_limit &&
+           skb_queue_len(&audit_skb_queue) > audit_backlog_limit)
+               schedule_timeout(sleep_time);
+
+       __set_current_state(TASK_RUNNING);
+       remove_wait_queue(&audit_backlog_wait, &wait);
+}
+
 /* Obtain an audit buffer.  This routine does locking to obtain the
  * audit buffer, but then no locking is required for calls to
  * audit_log_*format.  If the tsk is a task that is currently in a
@@ -1142,20 +1163,13 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
 
        while (audit_backlog_limit
               && skb_queue_len(&audit_skb_queue) > audit_backlog_limit + reserve) {
-               if (gfp_mask & __GFP_WAIT && audit_backlog_wait_time
-                   && time_before(jiffies, timeout_start + audit_backlog_wait_time)) {
+               if (gfp_mask & __GFP_WAIT && audit_backlog_wait_time) {
+                       unsigned long sleep_time;
 
-                       /* Wait for auditd to drain the queue a little */
-                       DECLARE_WAITQUEUE(wait, current);
-                       set_current_state(TASK_INTERRUPTIBLE);
-                       add_wait_queue(&audit_backlog_wait, &wait);
-
-                       if (audit_backlog_limit &&
-                           skb_queue_len(&audit_skb_queue) > audit_backlog_limit)
-                               schedule_timeout(timeout_start + audit_backlog_wait_time - jiffies);
-
-                       __set_current_state(TASK_RUNNING);
-                       remove_wait_queue(&audit_backlog_wait, &wait);
+                       sleep_time = timeout_start + audit_backlog_wait_time -
+                                       jiffies;
+                       if ((long)sleep_time > 0)
+                               wait_for_auditd(sleep_time);
                        continue;
                }
                if (audit_rate_check() && printk_ratelimit())
index e81175ef25f82d129dbe4c3b5df70f718d59d782..642a89c4f3d60c23cabf89b86d387f2a29b2bea9 100644 (file)
@@ -449,11 +449,26 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
        return 0;
 }
 
+static void audit_log_remove_rule(struct audit_krule *rule)
+{
+       struct audit_buffer *ab;
+
+       ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
+       if (unlikely(!ab))
+               return;
+       audit_log_format(ab, "op=");
+       audit_log_string(ab, "remove rule");
+       audit_log_format(ab, " dir=");
+       audit_log_untrustedstring(ab, rule->tree->pathname);
+       audit_log_key(ab, rule->filterkey);
+       audit_log_format(ab, " list=%d res=1", rule->listnr);
+       audit_log_end(ab);
+}
+
 static void kill_rules(struct audit_tree *tree)
 {
        struct audit_krule *rule, *next;
        struct audit_entry *entry;
-       struct audit_buffer *ab;
 
        list_for_each_entry_safe(rule, next, &tree->rules, rlist) {
                entry = container_of(rule, struct audit_entry, rule);
@@ -461,14 +476,7 @@ static void kill_rules(struct audit_tree *tree)
                list_del_init(&rule->rlist);
                if (rule->tree) {
                        /* not a half-baked one */
-                       ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
-                       audit_log_format(ab, "op=");
-                       audit_log_string(ab, "remove rule");
-                       audit_log_format(ab, " dir=");
-                       audit_log_untrustedstring(ab, rule->tree->pathname);
-                       audit_log_key(ab, rule->filterkey);
-                       audit_log_format(ab, " list=%d res=1", rule->listnr);
-                       audit_log_end(ab);
+                       audit_log_remove_rule(rule);
                        rule->tree = NULL;
                        list_del_rcu(&entry->list);
                        list_del(&entry->rule.list);
index 4a599f699adcfeca242e34f1a9691385a500450e..22831c4d369c67d988b1f0702f9db51bac6275bf 100644 (file)
@@ -240,6 +240,8 @@ static void audit_watch_log_rule_change(struct audit_krule *r, struct audit_watc
        if (audit_enabled) {
                struct audit_buffer *ab;
                ab = audit_log_start(NULL, GFP_NOFS, AUDIT_CONFIG_CHANGE);
+               if (unlikely(!ab))
+                       return;
                audit_log_format(ab, "auid=%u ses=%u op=",
                                 from_kuid(&init_user_ns, audit_get_loginuid(current)),
                                 audit_get_sessionid(current));
index 7f19f23d38a3347373ec00a629c6c0b39a8f770a..f9fc54bbe06faa3e845e19871d15ace3e6c5e1b3 100644 (file)
@@ -1144,7 +1144,6 @@ static void audit_log_rule_change(kuid_t loginuid, u32 sessionid, u32 sid,
  * audit_receive_filter - apply all rules to the specified message type
  * @type: audit message type
  * @pid: target pid for netlink audit messages
- * @uid: target uid for netlink audit messages
  * @seq: netlink audit message sequence (serial) number
  * @data: payload data
  * @datasz: size of payload data
index e37e6a12c5e32c204ca93b4422c52ffaee72aad3..a371f857a0a908a40a960511bf047d81ade471a9 100644 (file)
@@ -1464,14 +1464,14 @@ static void show_special(struct audit_context *context, int *call_panic)
                        audit_log_end(ab);
                        ab = audit_log_start(context, GFP_KERNEL,
                                             AUDIT_IPC_SET_PERM);
+                       if (unlikely(!ab))
+                               return;
                        audit_log_format(ab,
                                "qbytes=%lx ouid=%u ogid=%u mode=%#ho",
                                context->ipc.qbytes,
                                context->ipc.perm_uid,
                                context->ipc.perm_gid,
                                context->ipc.perm_mode);
-                       if (!ab)
-                               return;
                }
                break; }
        case AUDIT_MQ_OPEN: {
@@ -2675,7 +2675,7 @@ void __audit_mmap_fd(int fd, int flags)
        context->type = AUDIT_MMAP;
 }
 
-static void audit_log_abend(struct audit_buffer *ab, char *reason, long signr)
+static void audit_log_task(struct audit_buffer *ab)
 {
        kuid_t auid, uid;
        kgid_t gid;
@@ -2693,6 +2693,11 @@ static void audit_log_abend(struct audit_buffer *ab, char *reason, long signr)
        audit_log_task_context(ab);
        audit_log_format(ab, " pid=%d comm=", current->pid);
        audit_log_untrustedstring(ab, current->comm);
+}
+
+static void audit_log_abend(struct audit_buffer *ab, char *reason, long signr)
+{
+       audit_log_task(ab);
        audit_log_format(ab, " reason=");
        audit_log_string(ab, reason);
        audit_log_format(ab, " sig=%ld", signr);
@@ -2715,6 +2720,8 @@ void audit_core_dumps(long signr)
                return;
 
        ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_ANOM_ABEND);
+       if (unlikely(!ab))
+               return;
        audit_log_abend(ab, "memory violation", signr);
        audit_log_end(ab);
 }
@@ -2723,8 +2730,11 @@ void __audit_seccomp(unsigned long syscall, long signr, int code)
 {
        struct audit_buffer *ab;
 
-       ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_ANOM_ABEND);
-       audit_log_abend(ab, "seccomp", signr);
+       ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_SECCOMP);
+       if (unlikely(!ab))
+               return;
+       audit_log_task(ab);
+       audit_log_format(ab, " sig=%ld", signr);
        audit_log_format(ab, " syscall=%ld", syscall);
        audit_log_format(ab, " compat=%d", is_compat_task());
        audit_log_format(ab, " ip=0x%lx", KSTK_EIP(current));
index 19c0d7bcf24a77e0f6de246a30fab029cf3a30cc..357f714ddd4983e75e3816577b237d8c8d38bd3f 100644 (file)
@@ -870,10 +870,11 @@ static size_t print_time(u64 ts, char *buf)
        if (!printk_time)
                return 0;
 
+       rem_nsec = do_div(ts, 1000000000);
+
        if (!buf)
-               return 15;
+               return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts);
 
-       rem_nsec = do_div(ts, 1000000000);
        return sprintf(buf, "[%5lu.%06lu] ",
                       (unsigned long)ts, rem_nsec / 1000);
 }
index 6850f53e02d82e023954df56f5230b4033e80b73..b3c6c3fcd8474237a2e41ab4db87ee04c2435b7b 100644 (file)
@@ -116,6 +116,16 @@ void down_read_nested(struct rw_semaphore *sem, int subclass)
 
 EXPORT_SYMBOL(down_read_nested);
 
+void _down_write_nest_lock(struct rw_semaphore *sem, struct lockdep_map *nest)
+{
+       might_sleep();
+       rwsem_acquire_nest(&sem->dep_map, 0, 0, nest, _RET_IP_);
+
+       LOCK_CONTENDED(sem, __down_write_trylock, __down_write);
+}
+
+EXPORT_SYMBOL(_down_write_nest_lock);
+
 void down_write_nested(struct rw_semaphore *sem, int subclass)
 {
        might_sleep();
index 7aaa51d8e5b8895f047651caa0b021a6e7a88113..372771e948c230141a767003fa0f2e18c0d44db2 100644 (file)
@@ -2528,11 +2528,8 @@ static void __set_task_blocked(struct task_struct *tsk, const sigset_t *newset)
  */
 void set_current_blocked(sigset_t *newset)
 {
-       struct task_struct *tsk = current;
        sigdelsetmask(newset, sigmask(SIGKILL) | sigmask(SIGSTOP));
-       spin_lock_irq(&tsk->sighand->siglock);
-       __set_task_blocked(tsk, newset);
-       spin_unlock_irq(&tsk->sighand->siglock);
+       __set_current_blocked(newset);
 }
 
 void __set_current_blocked(const sigset_t *newset)
@@ -3204,7 +3201,6 @@ SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, nset,
        if (nset) {
                if (copy_from_user(&new_set, nset, sizeof(*nset)))
                        return -EFAULT;
-               new_set &= ~(sigmask(SIGKILL) | sigmask(SIGSTOP));
 
                new_blocked = current->blocked;
 
@@ -3222,7 +3218,7 @@ SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, nset,
                        return -EINVAL;
                }
 
-               __set_current_blocked(&new_blocked);
+               set_current_blocked(&new_blocked);
        }
 
        if (oset) {
@@ -3286,6 +3282,7 @@ SYSCALL_DEFINE1(ssetmask, int, newmask)
        int old = current->blocked.sig[0];
        sigset_t newset;
 
+       siginitset(&newset, newmask);
        set_current_blocked(&newset);
 
        return old;
index ed567babe789c10ef48a2db7b63e17e0a2192d65..47cb991c6ba40888377d83668eb362192e995979 100644 (file)
@@ -195,21 +195,21 @@ void local_bh_enable_ip(unsigned long ip)
 EXPORT_SYMBOL(local_bh_enable_ip);
 
 /*
- * We restart softirq processing MAX_SOFTIRQ_RESTART times,
- * and we fall back to softirqd after that.
+ * We restart softirq processing for at most 2 ms,
+ * and if need_resched() is not set.
  *
- * This number has been established via experimentation.
+ * These limits have been established via experimentation.
  * The two things to balance is latency against fairness -
  * we want to handle softirqs as soon as possible, but they
  * should not be able to lock up the box.
  */
-#define MAX_SOFTIRQ_RESTART 10
+#define MAX_SOFTIRQ_TIME  msecs_to_jiffies(2)
 
 asmlinkage void __do_softirq(void)
 {
        struct softirq_action *h;
        __u32 pending;
-       int max_restart = MAX_SOFTIRQ_RESTART;
+       unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
        int cpu;
        unsigned long old_flags = current->flags;
 
@@ -264,11 +264,12 @@ restart:
        local_irq_disable();
 
        pending = local_softirq_pending();
-       if (pending && --max_restart)
-               goto restart;
+       if (pending) {
+               if (time_before(jiffies, end) && !need_resched())
+                       goto restart;
 
-       if (pending)
                wakeup_softirqd();
+       }
 
        lockdep_softirq_exit();
 
index e5125677efa007a8ff58d5cd14b70766117dbc92..1bbfa0446507405d2fce92036322224170d7411e 100644 (file)
@@ -2899,6 +2899,8 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf,
        if (copy_from_user(&buf, ubuf, cnt))
                return -EFAULT;
 
+       buf[cnt] = 0;
+
        trace_set_options(buf);
 
        *ppos += cnt;
index 3a353091a90390f6b95b632408797d14908d57f3..67604e599384ebdbfada31a854e5ae59312e26e0 100644 (file)
@@ -134,7 +134,7 @@ config DEBUG_SECTION_MISMATCH
          any use of code/data previously in these sections would
          most likely result in an oops.
          In the code, functions and variables are annotated with
-         __init, __devinit, etc. (see the full list in include/linux/init.h),
+         __init, __cpuinit, etc. (see the full list in include/linux/init.h),
          which results in the code/data being placed in specific sections.
          The section mismatch analysis is always performed after a full
          kernel build, and enabling this option causes the following
index 145dec5267c91a6989402acc51ec50895e488988..5fbed5caba6e833222a62952cb4ba6e3430c053e 100644 (file)
@@ -45,6 +45,7 @@ struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags)
        if (!rmap)
                return NULL;
 
+       kref_init(&rmap->refcount);
        rmap->obj = (void **)((char *)rmap + obj_offset);
 
        /* Initially assign CPUs to objects on a rota, since we have
@@ -63,6 +64,35 @@ struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags)
 }
 EXPORT_SYMBOL(alloc_cpu_rmap);
 
+/**
+ * cpu_rmap_release - internal reclaiming helper called from kref_put
+ * @ref: kref to struct cpu_rmap
+ */
+static void cpu_rmap_release(struct kref *ref)
+{
+       struct cpu_rmap *rmap = container_of(ref, struct cpu_rmap, refcount);
+       kfree(rmap);
+}
+
+/**
+ * cpu_rmap_get - internal helper to get new ref on a cpu_rmap
+ * @rmap: reverse-map allocated with alloc_cpu_rmap()
+ */
+static inline void cpu_rmap_get(struct cpu_rmap *rmap)
+{
+       kref_get(&rmap->refcount);
+}
+
+/**
+ * cpu_rmap_put - release ref on a cpu_rmap
+ * @rmap: reverse-map allocated with alloc_cpu_rmap()
+ */
+int cpu_rmap_put(struct cpu_rmap *rmap)
+{
+       return kref_put(&rmap->refcount, cpu_rmap_release);
+}
+EXPORT_SYMBOL(cpu_rmap_put);
+
 /* Reevaluate nearest object for given CPU, comparing with the given
  * neighbours at the given distance.
  */
@@ -197,8 +227,7 @@ struct irq_glue {
  * free_irq_cpu_rmap - free a CPU affinity reverse-map used for IRQs
  * @rmap: Reverse-map allocated with alloc_irq_cpu_map(), or %NULL
  *
- * Must be called in process context, before freeing the IRQs, and
- * without holding any locks required by global workqueue items.
+ * Must be called in process context, before freeing the IRQs.
  */
 void free_irq_cpu_rmap(struct cpu_rmap *rmap)
 {
@@ -212,12 +241,18 @@ void free_irq_cpu_rmap(struct cpu_rmap *rmap)
                glue = rmap->obj[index];
                irq_set_affinity_notifier(glue->notify.irq, NULL);
        }
-       irq_run_affinity_notifiers();
 
-       kfree(rmap);
+       cpu_rmap_put(rmap);
 }
 EXPORT_SYMBOL(free_irq_cpu_rmap);
 
+/**
+ * irq_cpu_rmap_notify - callback for IRQ subsystem when IRQ affinity updated
+ * @notify: struct irq_affinity_notify passed by irq/manage.c
+ * @mask: cpu mask for new SMP affinity
+ *
+ * This is executed in workqueue context.
+ */
 static void
 irq_cpu_rmap_notify(struct irq_affinity_notify *notify, const cpumask_t *mask)
 {
@@ -230,10 +265,16 @@ irq_cpu_rmap_notify(struct irq_affinity_notify *notify, const cpumask_t *mask)
                pr_warning("irq_cpu_rmap_notify: update failed: %d\n", rc);
 }
 
+/**
+ * irq_cpu_rmap_release - reclaiming callback for IRQ subsystem
+ * @ref: kref to struct irq_affinity_notify passed by irq/manage.c
+ */
 static void irq_cpu_rmap_release(struct kref *ref)
 {
        struct irq_glue *glue =
                container_of(ref, struct irq_glue, notify.kref);
+
+       cpu_rmap_put(glue->rmap);
        kfree(glue);
 }
 
@@ -258,10 +299,13 @@ int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq)
        glue->notify.notify = irq_cpu_rmap_notify;
        glue->notify.release = irq_cpu_rmap_release;
        glue->rmap = rmap;
+       cpu_rmap_get(rmap);
        glue->index = cpu_rmap_add(rmap, glue);
        rc = irq_set_affinity_notifier(irq, &glue->notify);
-       if (rc)
+       if (rc) {
+               cpu_rmap_put(glue->rmap);
                kfree(glue);
+       }
        return rc;
 }
 EXPORT_SYMBOL(irq_cpu_rmap_add);
index 4f56a11d67fa9da105b34337280277d6fe437b2e..c0e31fe2fabf5b99c160fb01daf618cb7c0488b3 100644 (file)
@@ -194,8 +194,12 @@ __rb_insert(struct rb_node *node, struct rb_root *root,
        }
 }
 
-__always_inline void
-__rb_erase_color(struct rb_node *parent, struct rb_root *root,
+/*
+ * Inline version for rb_erase() use - we want to be able to inline
+ * and eliminate the dummy_rotate callback there
+ */
+static __always_inline void
+____rb_erase_color(struct rb_node *parent, struct rb_root *root,
        void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
 {
        struct rb_node *node = NULL, *sibling, *tmp1, *tmp2;
@@ -355,6 +359,13 @@ __rb_erase_color(struct rb_node *parent, struct rb_root *root,
                }
        }
 }
+
+/* Non-inline version for rb_erase_augmented() use */
+void __rb_erase_color(struct rb_node *parent, struct rb_root *root,
+       void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
+{
+       ____rb_erase_color(parent, root, augment_rotate);
+}
 EXPORT_SYMBOL(__rb_erase_color);
 
 /*
@@ -380,7 +391,10 @@ EXPORT_SYMBOL(rb_insert_color);
 
 void rb_erase(struct rb_node *node, struct rb_root *root)
 {
-       rb_erase_augmented(node, root, &dummy_callbacks);
+       struct rb_node *rebalance;
+       rebalance = __rb_erase_augmented(node, root, &dummy_callbacks);
+       if (rebalance)
+               ____rb_erase_color(rebalance, root, dummy_rotate);
 }
 EXPORT_SYMBOL(rb_erase);
 
index 1324cd74faec45dc2b0ba4f0b3fb0659640e9f25..b93376c39b61308fe2ef7de2466e83306c865cf9 100644 (file)
@@ -185,10 +185,23 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
 
        while (start < end) {
                unsigned long *map, idx, vec;
+               unsigned shift;
 
                map = bdata->node_bootmem_map;
                idx = start - bdata->node_min_pfn;
+               shift = idx & (BITS_PER_LONG - 1);
+               /*
+                * vec holds at most BITS_PER_LONG map bits,
+                * bit 0 corresponds to start.
+                */
                vec = ~map[idx / BITS_PER_LONG];
+
+               if (shift) {
+                       vec >>= shift;
+                       if (end - start >= BITS_PER_LONG)
+                               vec |= ~map[idx / BITS_PER_LONG + 1] <<
+                                       (BITS_PER_LONG - shift);
+               }
                /*
                 * If we have a properly aligned and fully unreserved
                 * BITS_PER_LONG block of pages in front of us, free
@@ -201,19 +214,18 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
                        count += BITS_PER_LONG;
                        start += BITS_PER_LONG;
                } else {
-                       unsigned long off = 0;
+                       unsigned long cur = start;
 
-                       vec >>= start & (BITS_PER_LONG - 1);
-                       while (vec) {
+                       start = ALIGN(start + 1, BITS_PER_LONG);
+                       while (vec && cur != start) {
                                if (vec & 1) {
-                                       page = pfn_to_page(start + off);
+                                       page = pfn_to_page(cur);
                                        __free_pages_bootmem(page, 0);
                                        count++;
                                }
                                vec >>= 1;
-                               off++;
+                               ++cur;
                        }
-                       start = ALIGN(start + 1, BITS_PER_LONG);
                }
        }
 
index 6b807e46649703909d0662a44f88d7c4b2057635..c62bd063d766c7333ca0370444636a52ddc70802 100644 (file)
@@ -816,6 +816,7 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,
 static int compact_finished(struct zone *zone,
                            struct compact_control *cc)
 {
+       unsigned int order;
        unsigned long watermark;
 
        if (fatal_signal_pending(current))
@@ -850,22 +851,16 @@ static int compact_finished(struct zone *zone,
                return COMPACT_CONTINUE;
 
        /* Direct compactor: Is a suitable page free? */
-       if (cc->page) {
-               /* Was a suitable page captured? */
-               if (*cc->page)
+       for (order = cc->order; order < MAX_ORDER; order++) {
+               struct free_area *area = &zone->free_area[order];
+
+               /* Job done if page is free of the right migratetype */
+               if (!list_empty(&area->free_list[cc->migratetype]))
+                       return COMPACT_PARTIAL;
+
+               /* Job done if allocation would set block type */
+               if (cc->order >= pageblock_order && area->nr_free)
                        return COMPACT_PARTIAL;
-       } else {
-               unsigned int order;
-               for (order = cc->order; order < MAX_ORDER; order++) {
-                       struct free_area *area = &zone->free_area[cc->order];
-                       /* Job done if page is free of the right migratetype */
-                       if (!list_empty(&area->free_list[cc->migratetype]))
-                               return COMPACT_PARTIAL;
-
-                       /* Job done if allocation would set block type */
-                       if (cc->order >= pageblock_order && area->nr_free)
-                               return COMPACT_PARTIAL;
-               }
        }
 
        return COMPACT_CONTINUE;
@@ -921,60 +916,6 @@ unsigned long compaction_suitable(struct zone *zone, int order)
        return COMPACT_CONTINUE;
 }
 
-static void compact_capture_page(struct compact_control *cc)
-{
-       unsigned long flags;
-       int mtype, mtype_low, mtype_high;
-
-       if (!cc->page || *cc->page)
-               return;
-
-       /*
-        * For MIGRATE_MOVABLE allocations we capture a suitable page ASAP
-        * regardless of the migratetype of the freelist is is captured from.
-        * This is fine because the order for a high-order MIGRATE_MOVABLE
-        * allocation is typically at least a pageblock size and overall
-        * fragmentation is not impaired. Other allocation types must
-        * capture pages from their own migratelist because otherwise they
-        * could pollute other pageblocks like MIGRATE_MOVABLE with
-        * difficult to move pages and making fragmentation worse overall.
-        */
-       if (cc->migratetype == MIGRATE_MOVABLE) {
-               mtype_low = 0;
-               mtype_high = MIGRATE_PCPTYPES;
-       } else {
-               mtype_low = cc->migratetype;
-               mtype_high = cc->migratetype + 1;
-       }
-
-       /* Speculatively examine the free lists without zone lock */
-       for (mtype = mtype_low; mtype < mtype_high; mtype++) {
-               int order;
-               for (order = cc->order; order < MAX_ORDER; order++) {
-                       struct page *page;
-                       struct free_area *area;
-                       area = &(cc->zone->free_area[order]);
-                       if (list_empty(&area->free_list[mtype]))
-                               continue;
-
-                       /* Take the lock and attempt capture of the page */
-                       if (!compact_trylock_irqsave(&cc->zone->lock, &flags, cc))
-                               return;
-                       if (!list_empty(&area->free_list[mtype])) {
-                               page = list_entry(area->free_list[mtype].next,
-                                                       struct page, lru);
-                               if (capture_free_page(page, cc->order, mtype)) {
-                                       spin_unlock_irqrestore(&cc->zone->lock,
-                                                                       flags);
-                                       *cc->page = page;
-                                       return;
-                               }
-                       }
-                       spin_unlock_irqrestore(&cc->zone->lock, flags);
-               }
-       }
-}
-
 static int compact_zone(struct zone *zone, struct compact_control *cc)
 {
        int ret;
@@ -1054,9 +995,6 @@ static int compact_zone(struct zone *zone, struct compact_control *cc)
                                goto out;
                        }
                }
-
-               /* Capture a page now if it is a suitable size */
-               compact_capture_page(cc);
        }
 
 out:
@@ -1069,8 +1007,7 @@ out:
 
 static unsigned long compact_zone_order(struct zone *zone,
                                 int order, gfp_t gfp_mask,
-                                bool sync, bool *contended,
-                                struct page **page)
+                                bool sync, bool *contended)
 {
        unsigned long ret;
        struct compact_control cc = {
@@ -1080,7 +1017,6 @@ static unsigned long compact_zone_order(struct zone *zone,
                .migratetype = allocflags_to_migratetype(gfp_mask),
                .zone = zone,
                .sync = sync,
-               .page = page,
        };
        INIT_LIST_HEAD(&cc.freepages);
        INIT_LIST_HEAD(&cc.migratepages);
@@ -1110,7 +1046,7 @@ int sysctl_extfrag_threshold = 500;
  */
 unsigned long try_to_compact_pages(struct zonelist *zonelist,
                        int order, gfp_t gfp_mask, nodemask_t *nodemask,
-                       bool sync, bool *contended, struct page **page)
+                       bool sync, bool *contended)
 {
        enum zone_type high_zoneidx = gfp_zone(gfp_mask);
        int may_enter_fs = gfp_mask & __GFP_FS;
@@ -1136,7 +1072,7 @@ unsigned long try_to_compact_pages(struct zonelist *zonelist,
                int status;
 
                status = compact_zone_order(zone, order, gfp_mask, sync,
-                                               contended, page);
+                                               contended);
                rc = max(status, rc);
 
                /* If a normal allocation would succeed, stop compacting */
@@ -1192,7 +1128,6 @@ int compact_pgdat(pg_data_t *pgdat, int order)
        struct compact_control cc = {
                .order = order,
                .sync = false,
-               .page = NULL,
        };
 
        return __compact_pgdat(pgdat, &cc);
@@ -1203,14 +1138,13 @@ static int compact_node(int nid)
        struct compact_control cc = {
                .order = -1,
                .sync = true,
-               .page = NULL,
        };
 
        return __compact_pgdat(NODE_DATA(nid), &cc);
 }
 
 /* Compact all nodes in the system */
-static int compact_nodes(void)
+static void compact_nodes(void)
 {
        int nid;
 
@@ -1219,8 +1153,6 @@ static int compact_nodes(void)
 
        for_each_online_node(nid)
                compact_node(nid);
-
-       return COMPACT_COMPLETE;
 }
 
 /* The written value is actually unused, all memory is compacted */
@@ -1231,7 +1163,7 @@ int sysctl_compaction_handler(struct ctl_table *table, int write,
                        void __user *buffer, size_t *length, loff_t *ppos)
 {
        if (write)
-               return compact_nodes();
+               compact_nodes();
 
        return 0;
 }
index 9e894edc7811ca66bda078e9606011ca25035238..6001ee6347a9694f4a9b31ef9060913ff30440bf 100644 (file)
@@ -1819,9 +1819,19 @@ int split_huge_page(struct page *page)
 
        BUG_ON(is_huge_zero_pfn(page_to_pfn(page)));
        BUG_ON(!PageAnon(page));
-       anon_vma = page_lock_anon_vma_read(page);
+
+       /*
+        * The caller does not necessarily hold an mmap_sem that would prevent
+        * the anon_vma disappearing so we first we take a reference to it
+        * and then lock the anon_vma for write. This is similar to
+        * page_lock_anon_vma_read except the write lock is taken to serialise
+        * against parallel split or collapse operations.
+        */
+       anon_vma = page_get_anon_vma(page);
        if (!anon_vma)
                goto out;
+       anon_vma_lock_write(anon_vma);
+
        ret = 0;
        if (!PageCompound(page))
                goto out_unlock;
@@ -1832,7 +1842,8 @@ int split_huge_page(struct page *page)
 
        BUG_ON(PageCompound(page));
 out_unlock:
-       page_unlock_anon_vma_read(anon_vma);
+       anon_vma_unlock(anon_vma);
+       put_anon_vma(anon_vma);
 out:
        return ret;
 }
index d597f94cc2059ade4d9fd808457d240538faac55..9ba21100ebf3b01bb0f2296baaf55ec41e303450 100644 (file)
@@ -135,7 +135,6 @@ struct compact_control {
        int migratetype;                /* MOVABLE, RECLAIMABLE etc */
        struct zone *zone;
        bool contended;                 /* True if a lock was contended */
-       struct page **page;             /* Page captured of requested size */
 };
 
 unsigned long
index 625905523c2a1592f539c46f6721723d62376648..88adc8afb6103d6c1ba2eb7e20c1ed226cf2b1d3 100644 (file)
@@ -314,7 +314,8 @@ static void __init_memblock memblock_merge_regions(struct memblock_type *type)
                }
 
                this->size += next->size;
-               memmove(next, next + 1, (type->cnt - (i + 1)) * sizeof(*next));
+               /* move forward from next + 1, index of which is i + 2 */
+               memmove(next, next + 1, (type->cnt - (i + 2)) * sizeof(*next));
                type->cnt--;
        }
 }
index e0a9b0ce4f102f8cfef2d6d7c6581d71f7595ff4..bb1369f7b9b4ba8af51d90a40de8f522aa2470dc 100644 (file)
@@ -184,10 +184,14 @@ static int tlb_next_batch(struct mmu_gather *tlb)
                return 1;
        }
 
+       if (tlb->batch_count == MAX_GATHER_BATCH_COUNT)
+               return 0;
+
        batch = (void *)__get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0);
        if (!batch)
                return 0;
 
+       tlb->batch_count++;
        batch->next = NULL;
        batch->nr   = 0;
        batch->max  = MAX_GATHER_BATCH;
@@ -216,6 +220,7 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm)
        tlb->local.nr   = 0;
        tlb->local.max  = ARRAY_SIZE(tlb->__pages);
        tlb->active     = &tlb->local;
+       tlb->batch_count = 0;
 
 #ifdef CONFIG_HAVE_RCU_TABLE_FREE
        tlb->batch = NULL;
@@ -3706,6 +3711,14 @@ retry:
                if (pmd_trans_huge(orig_pmd)) {
                        unsigned int dirty = flags & FAULT_FLAG_WRITE;
 
+                       /*
+                        * If the pmd is splitting, return and retry the
+                        * the fault.  Alternative: wait until the split
+                        * is done, and goto retry.
+                        */
+                       if (pmd_trans_splitting(orig_pmd))
+                               return 0;
+
                        if (pmd_numa(orig_pmd))
                                return do_huge_pmd_numa_page(mm, vma, address,
                                                             orig_pmd, pmd);
index d1b315e9862726a7f9511615279942f144261f4d..e2df1c1fb41f7a94e4ac2db1248cfb8165e5a17a 100644 (file)
@@ -2132,7 +2132,7 @@ bool __mpol_equal(struct mempolicy *a, struct mempolicy *b)
  */
 
 /* lookup first element intersecting start-end */
-/* Caller holds sp->mutex */
+/* Caller holds sp->lock */
 static struct sp_node *
 sp_lookup(struct shared_policy *sp, unsigned long start, unsigned long end)
 {
@@ -2196,13 +2196,13 @@ mpol_shared_policy_lookup(struct shared_policy *sp, unsigned long idx)
 
        if (!sp->root.rb_node)
                return NULL;
-       mutex_lock(&sp->mutex);
+       spin_lock(&sp->lock);
        sn = sp_lookup(sp, idx, idx+1);
        if (sn) {
                mpol_get(sn->policy);
                pol = sn->policy;
        }
-       mutex_unlock(&sp->mutex);
+       spin_unlock(&sp->lock);
        return pol;
 }
 
@@ -2328,6 +2328,14 @@ static void sp_delete(struct shared_policy *sp, struct sp_node *n)
        sp_free(n);
 }
 
+static void sp_node_init(struct sp_node *node, unsigned long start,
+                       unsigned long end, struct mempolicy *pol)
+{
+       node->start = start;
+       node->end = end;
+       node->policy = pol;
+}
+
 static struct sp_node *sp_alloc(unsigned long start, unsigned long end,
                                struct mempolicy *pol)
 {
@@ -2344,10 +2352,7 @@ static struct sp_node *sp_alloc(unsigned long start, unsigned long end,
                return NULL;
        }
        newpol->flags |= MPOL_F_SHARED;
-
-       n->start = start;
-       n->end = end;
-       n->policy = newpol;
+       sp_node_init(n, start, end, newpol);
 
        return n;
 }
@@ -2357,9 +2362,12 @@ static int shared_policy_replace(struct shared_policy *sp, unsigned long start,
                                 unsigned long end, struct sp_node *new)
 {
        struct sp_node *n;
+       struct sp_node *n_new = NULL;
+       struct mempolicy *mpol_new = NULL;
        int ret = 0;
 
-       mutex_lock(&sp->mutex);
+restart:
+       spin_lock(&sp->lock);
        n = sp_lookup(sp, start, end);
        /* Take care of old policies in the same range. */
        while (n && n->start < end) {
@@ -2372,14 +2380,16 @@ static int shared_policy_replace(struct shared_policy *sp, unsigned long start,
                } else {
                        /* Old policy spanning whole new range. */
                        if (n->end > end) {
-                               struct sp_node *new2;
-                               new2 = sp_alloc(end, n->end, n->policy);
-                               if (!new2) {
-                                       ret = -ENOMEM;
-                                       goto out;
-                               }
+                               if (!n_new)
+                                       goto alloc_new;
+
+                               *mpol_new = *n->policy;
+                               atomic_set(&mpol_new->refcnt, 1);
+                               sp_node_init(n_new, n->end, end, mpol_new);
+                               sp_insert(sp, n_new);
                                n->end = start;
-                               sp_insert(sp, new2);
+                               n_new = NULL;
+                               mpol_new = NULL;
                                break;
                        } else
                                n->end = start;
@@ -2390,9 +2400,27 @@ static int shared_policy_replace(struct shared_policy *sp, unsigned long start,
        }
        if (new)
                sp_insert(sp, new);
-out:
-       mutex_unlock(&sp->mutex);
+       spin_unlock(&sp->lock);
+       ret = 0;
+
+err_out:
+       if (mpol_new)
+               mpol_put(mpol_new);
+       if (n_new)
+               kmem_cache_free(sn_cache, n_new);
+
        return ret;
+
+alloc_new:
+       spin_unlock(&sp->lock);
+       ret = -ENOMEM;
+       n_new = kmem_cache_alloc(sn_cache, GFP_KERNEL);
+       if (!n_new)
+               goto err_out;
+       mpol_new = kmem_cache_alloc(policy_cache, GFP_KERNEL);
+       if (!mpol_new)
+               goto err_out;
+       goto restart;
 }
 
 /**
@@ -2410,7 +2438,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol)
        int ret;
 
        sp->root = RB_ROOT;             /* empty tree == default mempolicy */
-       mutex_init(&sp->mutex);
+       spin_lock_init(&sp->lock);
 
        if (mpol) {
                struct vm_area_struct pvma;
@@ -2476,14 +2504,14 @@ void mpol_free_shared_policy(struct shared_policy *p)
 
        if (!p->root.rb_node)
                return;
-       mutex_lock(&p->mutex);
+       spin_lock(&p->lock);
        next = rb_first(&p->root);
        while (next) {
                n = rb_entry(next, struct sp_node, nd);
                next = rb_next(&n->nd);
                sp_delete(p, n);
        }
-       mutex_unlock(&p->mutex);
+       spin_unlock(&p->lock);
 }
 
 #ifdef CONFIG_NUMA_BALANCING
@@ -2595,8 +2623,7 @@ void numa_default_policy(void)
  */
 
 /*
- * "local" is pseudo-policy:  MPOL_PREFERRED with MPOL_F_LOCAL flag
- * Used only for mpol_parse_str() and mpol_to_str()
+ * "local" is implemented internally by MPOL_PREFERRED with MPOL_F_LOCAL flag.
  */
 static const char * const policy_modes[] =
 {
@@ -2610,28 +2637,20 @@ static const char * const policy_modes[] =
 
 #ifdef CONFIG_TMPFS
 /**
- * mpol_parse_str - parse string to mempolicy
+ * mpol_parse_str - parse string to mempolicy, for tmpfs mpol mount option.
  * @str:  string containing mempolicy to parse
  * @mpol:  pointer to struct mempolicy pointer, returned on success.
- * @no_context:  flag whether to "contextualize" the mempolicy
  *
  * Format of input:
  *     <mode>[=<flags>][:<nodelist>]
  *
- * if @no_context is true, save the input nodemask in w.user_nodemask in
- * the returned mempolicy.  This will be used to "clone" the mempolicy in
- * a specific context [cpuset] at a later time.  Used to parse tmpfs mpol
- * mount option.  Note that if 'static' or 'relative' mode flags were
- * specified, the input nodemask will already have been saved.  Saving
- * it again is redundant, but safe.
- *
  * On success, returns 0, else 1
  */
-int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
+int mpol_parse_str(char *str, struct mempolicy **mpol)
 {
        struct mempolicy *new = NULL;
        unsigned short mode;
-       unsigned short uninitialized_var(mode_flags);
+       unsigned short mode_flags;
        nodemask_t nodes;
        char *nodelist = strchr(str, ':');
        char *flags = strchr(str, '=');
@@ -2719,24 +2738,23 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
        if (IS_ERR(new))
                goto out;
 
-       if (no_context) {
-               /* save for contextualization */
-               new->w.user_nodemask = nodes;
-       } else {
-               int ret;
-               NODEMASK_SCRATCH(scratch);
-               if (scratch) {
-                       task_lock(current);
-                       ret = mpol_set_nodemask(new, &nodes, scratch);
-                       task_unlock(current);
-               } else
-                       ret = -ENOMEM;
-               NODEMASK_SCRATCH_FREE(scratch);
-               if (ret) {
-                       mpol_put(new);
-                       goto out;
-               }
-       }
+       /*
+        * Save nodes for mpol_to_str() to show the tmpfs mount options
+        * for /proc/mounts, /proc/pid/mounts and /proc/pid/mountinfo.
+        */
+       if (mode != MPOL_PREFERRED)
+               new->v.nodes = nodes;
+       else if (nodelist)
+               new->v.preferred_node = first_node(nodes);
+       else
+               new->flags |= MPOL_F_LOCAL;
+
+       /*
+        * Save nodes for contextualization: this will be used to "clone"
+        * the mempolicy in a specific context [cpuset] at a later time.
+        */
+       new->w.user_nodemask = nodes;
+
        err = 0;
 
 out:
@@ -2756,13 +2774,12 @@ out:
  * @buffer:  to contain formatted mempolicy string
  * @maxlen:  length of @buffer
  * @pol:  pointer to mempolicy to be formatted
- * @no_context:  "context free" mempolicy - use nodemask in w.user_nodemask
  *
  * Convert a mempolicy into a string.
  * Returns the number of characters in buffer (if positive)
  * or an error (negative)
  */
-int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context)
+int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
 {
        char *p = buffer;
        int l;
@@ -2788,7 +2805,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context)
        case MPOL_PREFERRED:
                nodes_clear(nodes);
                if (flags & MPOL_F_LOCAL)
-                       mode = MPOL_LOCAL;      /* pseudo-policy */
+                       mode = MPOL_LOCAL;
                else
                        node_set(pol->v.preferred_node, nodes);
                break;
@@ -2796,10 +2813,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context)
        case MPOL_BIND:
                /* Fall through */
        case MPOL_INTERLEAVE:
-               if (no_context)
-                       nodes = pol->w.user_nodemask;
-               else
-                       nodes = pol->v.nodes;
+               nodes = pol->v.nodes;
                break;
 
        default:
index 3b676b0c5c3ecca91d5e91d8ef2adc2982353f57..c38778610aa8cd32e377b588f2178e68b1f17d89 100644 (file)
@@ -1679,9 +1679,21 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm,
        page_xchg_last_nid(new_page, page_last_nid(page));
 
        isolated = numamigrate_isolate_page(pgdat, page);
-       if (!isolated) {
+
+       /*
+        * Failing to isolate or a GUP pin prevents migration. The expected
+        * page count is 2. 1 for anonymous pages without a mapping and 1
+        * for the callers pin. If the page was isolated, the page will
+        * need to be put back on the LRU.
+        */
+       if (!isolated || page_count(page) != 2) {
                count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR);
                put_page(new_page);
+               if (isolated) {
+                       putback_lru_page(page);
+                       isolated = 0;
+                       goto out;
+               }
                goto out_keep_locked;
        }
 
index f54b235f29a98c3b3a91c2c1e6b4b50ef5e8f287..35730ee9d51523b2ef6c8f59c96a2178ee95554b 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2886,7 +2886,7 @@ static void vm_lock_anon_vma(struct mm_struct *mm, struct anon_vma *anon_vma)
                 * The LSB of head.next can't change from under us
                 * because we hold the mm_all_locks_mutex.
                 */
-               down_write(&anon_vma->root->rwsem);
+               down_write_nest_lock(&anon_vma->root->rwsem, &mm->mmap_sem);
                /*
                 * We can safely modify head.next after taking the
                 * anon_vma->root->rwsem. If some other vma in this mm shares
index 4ba5e37127fca863af15fe3090f068ac295c0386..df2022ff0c8a1d9fb7ff13ed4cf88058999485e6 100644 (file)
@@ -221,11 +221,6 @@ EXPORT_SYMBOL(nr_online_nodes);
 
 int page_group_by_mobility_disabled __read_mostly;
 
-/*
- * NOTE:
- * Don't use set_pageblock_migratetype(page, MIGRATE_ISOLATE) directly.
- * Instead, use {un}set_pageblock_isolate.
- */
 void set_pageblock_migratetype(struct page *page, int migratetype)
 {
 
@@ -1389,14 +1384,8 @@ void split_page(struct page *page, unsigned int order)
                set_page_refcounted(page + i);
 }
 
-/*
- * Similar to the split_page family of functions except that the page
- * required at the given order and being isolated now to prevent races
- * with parallel allocators
- */
-int capture_free_page(struct page *page, int alloc_order, int migratetype)
+static int __isolate_free_page(struct page *page, unsigned int order)
 {
-       unsigned int order;
        unsigned long watermark;
        struct zone *zone;
        int mt;
@@ -1404,7 +1393,6 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)
        BUG_ON(!PageBuddy(page));
 
        zone = page_zone(page);
-       order = page_order(page);
        mt = get_pageblock_migratetype(page);
 
        if (mt != MIGRATE_ISOLATE) {
@@ -1413,7 +1401,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)
                if (!zone_watermark_ok(zone, 0, watermark, 0, 0))
                        return 0;
 
-               __mod_zone_freepage_state(zone, -(1UL << alloc_order), mt);
+               __mod_zone_freepage_state(zone, -(1UL << order), mt);
        }
 
        /* Remove page from free list */
@@ -1421,11 +1409,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)
        zone->free_area[order].nr_free--;
        rmv_page_order(page);
 
-       if (alloc_order != order)
-               expand(zone, page, alloc_order, order,
-                       &zone->free_area[order], migratetype);
-
-       /* Set the pageblock if the captured page is at least a pageblock */
+       /* Set the pageblock if the isolated page is at least a pageblock */
        if (order >= pageblock_order - 1) {
                struct page *endpage = page + (1 << order) - 1;
                for (; page < endpage; page += pageblock_nr_pages) {
@@ -1436,7 +1420,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)
                }
        }
 
-       return 1UL << alloc_order;
+       return 1UL << order;
 }
 
 /*
@@ -1454,10 +1438,9 @@ int split_free_page(struct page *page)
        unsigned int order;
        int nr_pages;
 
-       BUG_ON(!PageBuddy(page));
        order = page_order(page);
 
-       nr_pages = capture_free_page(page, order, 0);
+       nr_pages = __isolate_free_page(page, order);
        if (!nr_pages)
                return 0;
 
@@ -1655,20 +1638,6 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
        return true;
 }
 
-#ifdef CONFIG_MEMORY_ISOLATION
-static inline unsigned long nr_zone_isolate_freepages(struct zone *zone)
-{
-       if (unlikely(zone->nr_pageblock_isolate))
-               return zone->nr_pageblock_isolate * pageblock_nr_pages;
-       return 0;
-}
-#else
-static inline unsigned long nr_zone_isolate_freepages(struct zone *zone)
-{
-       return 0;
-}
-#endif
-
 bool zone_watermark_ok(struct zone *z, int order, unsigned long mark,
                      int classzone_idx, int alloc_flags)
 {
@@ -1684,14 +1653,6 @@ bool zone_watermark_ok_safe(struct zone *z, int order, unsigned long mark,
        if (z->percpu_drift_mark && free_pages < z->percpu_drift_mark)
                free_pages = zone_page_state_snapshot(z, NR_FREE_PAGES);
 
-       /*
-        * If the zone has MIGRATE_ISOLATE type free pages, we should consider
-        * it.  nr_zone_isolate_freepages is never accurate so kswapd might not
-        * sleep although it could do so.  But this is more desirable for memory
-        * hotplug than sleeping which can cause a livelock in the direct
-        * reclaim path.
-        */
-       free_pages -= nr_zone_isolate_freepages(z);
        return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags,
                                                                free_pages);
 }
@@ -2163,8 +2124,6 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
        bool *contended_compaction, bool *deferred_compaction,
        unsigned long *did_some_progress)
 {
-       struct page *page = NULL;
-
        if (!order)
                return NULL;
 
@@ -2176,16 +2135,12 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
        current->flags |= PF_MEMALLOC;
        *did_some_progress = try_to_compact_pages(zonelist, order, gfp_mask,
                                                nodemask, sync_migration,
-                                               contended_compaction, &page);
+                                               contended_compaction);
        current->flags &= ~PF_MEMALLOC;
 
-       /* If compaction captured a page, prep and use it */
-       if (page) {
-               prep_new_page(page, order, gfp_mask);
-               goto got_page;
-       }
-
        if (*did_some_progress != COMPACT_SKIPPED) {
+               struct page *page;
+
                /* Page migration frees to the PCP lists but we want merging */
                drain_pages(get_cpu());
                put_cpu();
@@ -2195,7 +2150,6 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
                                alloc_flags & ~ALLOC_NO_WATERMARKS,
                                preferred_zone, migratetype);
                if (page) {
-got_page:
                        preferred_zone->compact_blockskip_flush = false;
                        preferred_zone->compact_considered = 0;
                        preferred_zone->compact_defer_shift = 0;
@@ -5631,7 +5585,7 @@ static inline int pfn_to_bitidx(struct zone *zone, unsigned long pfn)
        pfn &= (PAGES_PER_SECTION-1);
        return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS;
 #else
-       pfn = pfn - zone->zone_start_pfn;
+       pfn = pfn - round_down(zone->zone_start_pfn, pageblock_nr_pages);
        return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS;
 #endif /* CONFIG_SPARSEMEM */
 }
index 9d2264ea460617b6aef2b59271e61933c15fbffd..383bdbb98b04ca22726fe3d243db2ce789642975 100644 (file)
@@ -8,28 +8,6 @@
 #include <linux/memory.h>
 #include "internal.h"
 
-/* called while holding zone->lock */
-static void set_pageblock_isolate(struct page *page)
-{
-       if (get_pageblock_migratetype(page) == MIGRATE_ISOLATE)
-               return;
-
-       set_pageblock_migratetype(page, MIGRATE_ISOLATE);
-       page_zone(page)->nr_pageblock_isolate++;
-}
-
-/* called while holding zone->lock */
-static void restore_pageblock_isolate(struct page *page, int migratetype)
-{
-       struct zone *zone = page_zone(page);
-       if (WARN_ON(get_pageblock_migratetype(page) != MIGRATE_ISOLATE))
-               return;
-
-       BUG_ON(zone->nr_pageblock_isolate <= 0);
-       set_pageblock_migratetype(page, migratetype);
-       zone->nr_pageblock_isolate--;
-}
-
 int set_migratetype_isolate(struct page *page, bool skip_hwpoisoned_pages)
 {
        struct zone *zone;
@@ -80,7 +58,7 @@ out:
                unsigned long nr_pages;
                int migratetype = get_pageblock_migratetype(page);
 
-               set_pageblock_isolate(page);
+               set_pageblock_migratetype(page, MIGRATE_ISOLATE);
                nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE);
 
                __mod_zone_freepage_state(zone, -nr_pages, migratetype);
@@ -103,7 +81,7 @@ void unset_migratetype_isolate(struct page *page, unsigned migratetype)
                goto out;
        nr_pages = move_freepages_block(zone, page, migratetype);
        __mod_zone_freepage_state(zone, nr_pages, migratetype);
-       restore_pageblock_isolate(page, migratetype);
+       set_pageblock_migratetype(page, migratetype);
 out:
        spin_unlock_irqrestore(&zone->lock, flags);
 }
index 5c90d84c2b028ae6478b78cacdf52494bab2c233..5dd56f6efdbd593733b793df2731f243dbaf031c 100644 (file)
@@ -889,7 +889,7 @@ static void shmem_show_mpol(struct seq_file *seq, struct mempolicy *mpol)
        if (!mpol || mpol->mode == MPOL_DEFAULT)
                return;         /* show nothing */
 
-       mpol_to_str(buffer, sizeof(buffer), mpol, 1);
+       mpol_to_str(buffer, sizeof(buffer), mpol);
 
        seq_printf(seq, ",mpol=%s", buffer);
 }
@@ -2463,7 +2463,7 @@ static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo,
                        if (!gid_valid(sbinfo->gid))
                                goto bad_val;
                } else if (!strcmp(this_char,"mpol")) {
-                       if (mpol_parse_str(value, &sbinfo->mpol, 1))
+                       if (mpol_parse_str(value, &sbinfo->mpol))
                                goto bad_val;
                } else {
                        printk(KERN_ERR "tmpfs: Bad mount option %s\n",
index 23291b9ae87139c27f60de1e820e3d9e8e66f4b3..196709f5ee5862753f5f3731bdeab58c2c45c323 100644 (file)
@@ -2775,7 +2775,7 @@ loop_again:
                if (total_scanned && (sc.priority < DEF_PRIORITY - 2)) {
                        if (has_under_min_watermark_zone)
                                count_vm_event(KSWAPD_SKIP_CONGESTION_WAIT);
-                       else
+                       else if (unbalanced_zone)
                                wait_iff_congested(unbalanced_zone, BLK_RW_ASYNC, HZ/10);
                }
 
@@ -3122,8 +3122,8 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim)
    not required for correctness.  So if the last cpu in a node goes
    away, we get changed to run anywhere: as the first one comes back,
    restore their cpu bindings. */
-static int __devinit cpu_callback(struct notifier_block *nfb,
-                                 unsigned long action, void *hcpu)
+static int cpu_callback(struct notifier_block *nfb, unsigned long action,
+                       void *hcpu)
 {
        int nid;
 
index 30b48f523135be8f00025f32b887b51f0f7000c3..3cc5be0fe420458f7a435126b1bb135a99437f5f 100644 (file)
@@ -232,7 +232,7 @@ config RFS_ACCEL
 
 config XPS
        boolean
-       depends on SMP && SYSFS && USE_GENERIC_SMP_HELPERS
+       depends on SMP && USE_GENERIC_SMP_HELPERS
        default y
 
 config NETPRIO_CGROUP
index a0ba3bff9b3648b15c8ca0aeb446573817f6dc7c..a4808c29ea3d3cdb95021c2c7130735cf21c3955 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 7d02ebd11a7f1bd13b173cbe1eb0f54e623e0345..72fe1bbf7721621391dd97f3416029960d3d4df9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -123,7 +123,7 @@ batadv_iv_ogm_emit_send_time(const struct batadv_priv *bat_priv)
        unsigned int msecs;
 
        msecs = atomic_read(&bat_priv->orig_interval) - BATADV_JITTER;
-       msecs += random32() % (2 * BATADV_JITTER);
+       msecs += prandom_u32() % (2 * BATADV_JITTER);
 
        return jiffies + msecs_to_jiffies(msecs);
 }
@@ -131,7 +131,7 @@ batadv_iv_ogm_emit_send_time(const struct batadv_priv *bat_priv)
 /* when do we schedule a ogm packet to be sent */
 static unsigned long batadv_iv_ogm_fwd_send_time(void)
 {
-       return jiffies + msecs_to_jiffies(random32() % (BATADV_JITTER / 2));
+       return jiffies + msecs_to_jiffies(prandom_u32() % (BATADV_JITTER / 2));
 }
 
 /* apply hop penalty for a normal link */
@@ -183,7 +183,6 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
        /* adjust all flags and log packets */
        while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
                                         batadv_ogm_packet->tt_num_changes)) {
-
                /* we might have aggregated direct link packets with an
                 * ordinary base packet
                 */
@@ -261,7 +260,6 @@ static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
         */
        if ((directlink && (batadv_ogm_packet->header.ttl == 1)) ||
            (forw_packet->own && (forw_packet->if_incoming != primary_if))) {
-
                /* FIXME: what about aggregated packets ? */
                batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
                           "%s packet (originator %pM, seqno %u, TTL %d) on interface %s [%pM]\n",
@@ -325,7 +323,6 @@ batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
        if (time_before(send_time, forw_packet->send_time) &&
            time_after_eq(aggregation_end_time, forw_packet->send_time) &&
            (aggregated_bytes <= BATADV_MAX_AGGREGATION_BYTES)) {
-
                /* check aggregation compatibility
                 * -> direct link packets are broadcasted on
                 *    their interface only
@@ -815,7 +812,6 @@ static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
        rcu_read_lock();
        hlist_for_each_entry_rcu(tmp_neigh_node, node,
                                 &orig_neigh_node->neigh_list, list) {
-
                if (!batadv_compare_eth(tmp_neigh_node->addr,
                                        orig_neigh_node->orig))
                        continue;
@@ -949,7 +945,6 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
        rcu_read_lock();
        hlist_for_each_entry_rcu(tmp_neigh_node, node,
                                 &orig_node->neigh_list, list) {
-
                is_duplicate |= batadv_test_bit(tmp_neigh_node->real_bits,
                                                orig_node->last_real_seqno,
                                                seqno);
@@ -1033,7 +1028,7 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
                is_single_hop_neigh = true;
 
        batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
-                  "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, ttvn %u, crc %u, changes %u, td %d, TTL %d, V %d, IDF %d)\n",
+                  "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, ttvn %u, crc %#.4x, changes %u, tq %d, TTL %d, V %d, IDF %d)\n",
                   ethhdr->h_source, if_incoming->net_dev->name,
                   if_incoming->net_dev->dev_addr, batadv_ogm_packet->orig,
                   batadv_ogm_packet->prev_sender,
@@ -1223,7 +1218,6 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
 
        /* is single hop (direct) neighbor */
        if (is_single_hop_neigh) {
-
                /* mark direct link on incoming interface */
                batadv_iv_ogm_forward(orig_node, ethhdr, batadv_ogm_packet,
                                      is_single_hop_neigh,
index 5453b17d8df20249c6647bcc5c2485edfec4c1e5..973982414d58559c3ac009f2fb9b2db60a4221ea 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2006-2013 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index cebaae7e148b7f8a88f8b265bb625256363cde5a..a81b9322e382b42635d8689085f20d02e602c296 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2006-2013 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index 5aebe9327d68c8fd691243f78880c12d69951611..30f46526cbbdabee8c9b93cda29c8d7a07c36bbf 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich
  *
 static const uint8_t batadv_announce_mac[4] = {0x43, 0x05, 0x43, 0x05};
 
 static void batadv_bla_periodic_work(struct work_struct *work);
-static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
-                                    struct batadv_backbone_gw *backbone_gw);
+static void
+batadv_bla_send_announce(struct batadv_priv *bat_priv,
+                        struct batadv_bla_backbone_gw *backbone_gw);
 
 /* return the index of the claim */
 static inline uint32_t batadv_choose_claim(const void *data, uint32_t size)
 {
-       struct batadv_claim *claim = (struct batadv_claim *)data;
+       struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
        uint32_t hash = 0;
 
        hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr));
@@ -57,7 +58,7 @@ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size)
 static inline uint32_t batadv_choose_backbone_gw(const void *data,
                                                 uint32_t size)
 {
-       struct batadv_claim *claim = (struct batadv_claim *)data;
+       const struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
        uint32_t hash = 0;
 
        hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr));
@@ -75,9 +76,9 @@ static inline uint32_t batadv_choose_backbone_gw(const void *data,
 static int batadv_compare_backbone_gw(const struct hlist_node *node,
                                      const void *data2)
 {
-       const void *data1 = container_of(node, struct batadv_backbone_gw,
+       const void *data1 = container_of(node, struct batadv_bla_backbone_gw,
                                         hash_entry);
-       const struct batadv_backbone_gw *gw1 = data1, *gw2 = data2;
+       const struct batadv_bla_backbone_gw *gw1 = data1, *gw2 = data2;
 
        if (!batadv_compare_eth(gw1->orig, gw2->orig))
                return 0;
@@ -92,9 +93,9 @@ static int batadv_compare_backbone_gw(const struct hlist_node *node,
 static int batadv_compare_claim(const struct hlist_node *node,
                                const void *data2)
 {
-       const void *data1 = container_of(node, struct batadv_claim,
+       const void *data1 = container_of(node, struct batadv_bla_claim,
                                         hash_entry);
-       const struct batadv_claim *cl1 = data1, *cl2 = data2;
+       const struct batadv_bla_claim *cl1 = data1, *cl2 = data2;
 
        if (!batadv_compare_eth(cl1->addr, cl2->addr))
                return 0;
@@ -106,7 +107,8 @@ static int batadv_compare_claim(const struct hlist_node *node,
 }
 
 /* free a backbone gw */
-static void batadv_backbone_gw_free_ref(struct batadv_backbone_gw *backbone_gw)
+static void
+batadv_backbone_gw_free_ref(struct batadv_bla_backbone_gw *backbone_gw)
 {
        if (atomic_dec_and_test(&backbone_gw->refcount))
                kfree_rcu(backbone_gw, rcu);
@@ -115,16 +117,16 @@ static void batadv_backbone_gw_free_ref(struct batadv_backbone_gw *backbone_gw)
 /* finally deinitialize the claim */
 static void batadv_claim_free_rcu(struct rcu_head *rcu)
 {
-       struct batadv_claim *claim;
+       struct batadv_bla_claim *claim;
 
-       claim = container_of(rcu, struct batadv_claim, rcu);
+       claim = container_of(rcu, struct batadv_bla_claim, rcu);
 
        batadv_backbone_gw_free_ref(claim->backbone_gw);
        kfree(claim);
 }
 
 /* free a claim, call claim_free_rcu if its the last reference */
-static void batadv_claim_free_ref(struct batadv_claim *claim)
+static void batadv_claim_free_ref(struct batadv_bla_claim *claim)
 {
        if (atomic_dec_and_test(&claim->refcount))
                call_rcu(&claim->rcu, batadv_claim_free_rcu);
@@ -136,14 +138,15 @@ static void batadv_claim_free_ref(struct batadv_claim *claim)
  * looks for a claim in the hash, and returns it if found
  * or NULL otherwise.
  */
-static struct batadv_claim *batadv_claim_hash_find(struct batadv_priv *bat_priv,
-                                                  struct batadv_claim *data)
+static struct batadv_bla_claim
+*batadv_claim_hash_find(struct batadv_priv *bat_priv,
+                       struct batadv_bla_claim *data)
 {
        struct batadv_hashtable *hash = bat_priv->bla.claim_hash;
        struct hlist_head *head;
        struct hlist_node *node;
-       struct batadv_claim *claim;
-       struct batadv_claim *claim_tmp = NULL;
+       struct batadv_bla_claim *claim;
+       struct batadv_bla_claim *claim_tmp = NULL;
        int index;
 
        if (!hash)
@@ -176,15 +179,15 @@ static struct batadv_claim *batadv_claim_hash_find(struct batadv_priv *bat_priv,
  *
  * Returns claim if found or NULL otherwise.
  */
-static struct batadv_backbone_gw *
+static struct batadv_bla_backbone_gw *
 batadv_backbone_hash_find(struct batadv_priv *bat_priv,
                          uint8_t *addr, short vid)
 {
        struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
        struct hlist_head *head;
        struct hlist_node *node;
-       struct batadv_backbone_gw search_entry, *backbone_gw;
-       struct batadv_backbone_gw *backbone_gw_tmp = NULL;
+       struct batadv_bla_backbone_gw search_entry, *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw_tmp = NULL;
        int index;
 
        if (!hash)
@@ -215,12 +218,12 @@ batadv_backbone_hash_find(struct batadv_priv *bat_priv,
 
 /* delete all claims for a backbone */
 static void
-batadv_bla_del_backbone_claims(struct batadv_backbone_gw *backbone_gw)
+batadv_bla_del_backbone_claims(struct batadv_bla_backbone_gw *backbone_gw)
 {
        struct batadv_hashtable *hash;
        struct hlist_node *node, *node_tmp;
        struct hlist_head *head;
-       struct batadv_claim *claim;
+       struct batadv_bla_claim *claim;
        int i;
        spinlock_t *list_lock;  /* protects write access to the hash lists */
 
@@ -235,7 +238,6 @@ batadv_bla_del_backbone_claims(struct batadv_backbone_gw *backbone_gw)
                spin_lock_bh(list_lock);
                hlist_for_each_entry_safe(claim, node, node_tmp,
                                          head, hash_entry) {
-
                        if (claim->backbone_gw != backbone_gw)
                                continue;
 
@@ -338,7 +340,6 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,
                           "bla_send_claim(): REQUEST of %pM to %pMon vid %d\n",
                           ethhdr->h_source, ethhdr->h_dest, vid);
                break;
-
        }
 
        if (vid != -1)
@@ -366,11 +367,11 @@ out:
  * searches for the backbone gw or creates a new one if it could not
  * be found.
  */
-static struct batadv_backbone_gw *
+static struct batadv_bla_backbone_gw *
 batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig,
                           short vid, bool own_backbone)
 {
-       struct batadv_backbone_gw *entry;
+       struct batadv_bla_backbone_gw *entry;
        struct batadv_orig_node *orig_node;
        int hash_added;
 
@@ -437,7 +438,7 @@ batadv_bla_update_own_backbone_gw(struct batadv_priv *bat_priv,
                                  struct batadv_hard_iface *primary_if,
                                  short vid)
 {
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
 
        backbone_gw = batadv_bla_get_backbone_gw(bat_priv,
                                                 primary_if->net_dev->dev_addr,
@@ -462,8 +463,8 @@ static void batadv_bla_answer_request(struct batadv_priv *bat_priv,
        struct hlist_node *node;
        struct hlist_head *head;
        struct batadv_hashtable *hash;
-       struct batadv_claim *claim;
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_claim *claim;
+       struct batadv_bla_backbone_gw *backbone_gw;
        int i;
 
        batadv_dbg(BATADV_DBG_BLA, bat_priv,
@@ -502,7 +503,7 @@ static void batadv_bla_answer_request(struct batadv_priv *bat_priv,
  * After the request, it will repeat all of his own claims and finally
  * send an announcement claim with which we can check again.
  */
-static void batadv_bla_send_request(struct batadv_backbone_gw *backbone_gw)
+static void batadv_bla_send_request(struct batadv_bla_backbone_gw *backbone_gw)
 {
        /* first, remove all old entries */
        batadv_bla_del_backbone_claims(backbone_gw);
@@ -528,7 +529,7 @@ static void batadv_bla_send_request(struct batadv_backbone_gw *backbone_gw)
  * places.
  */
 static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
-                                    struct batadv_backbone_gw *backbone_gw)
+                                    struct batadv_bla_backbone_gw *backbone_gw)
 {
        uint8_t mac[ETH_ALEN];
        __be16 crc;
@@ -539,7 +540,6 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
 
        batadv_bla_send_claim(bat_priv, mac, backbone_gw->vid,
                              BATADV_CLAIM_TYPE_ANNOUNCE);
-
 }
 
 /**
@@ -551,10 +551,10 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
  */
 static void batadv_bla_add_claim(struct batadv_priv *bat_priv,
                                 const uint8_t *mac, const short vid,
-                                struct batadv_backbone_gw *backbone_gw)
+                                struct batadv_bla_backbone_gw *backbone_gw)
 {
-       struct batadv_claim *claim;
-       struct batadv_claim search_claim;
+       struct batadv_bla_claim *claim;
+       struct batadv_bla_claim search_claim;
        int hash_added;
 
        memcpy(search_claim.addr, mac, ETH_ALEN);
@@ -598,7 +598,6 @@ static void batadv_bla_add_claim(struct batadv_priv *bat_priv,
 
                claim->backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);
                batadv_backbone_gw_free_ref(claim->backbone_gw);
-
        }
        /* set (new) backbone gw */
        atomic_inc(&backbone_gw->refcount);
@@ -617,7 +616,7 @@ claim_free_ref:
 static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
                                 const uint8_t *mac, const short vid)
 {
-       struct batadv_claim search_claim, *claim;
+       struct batadv_bla_claim search_claim, *claim;
 
        memcpy(search_claim.addr, mac, ETH_ALEN);
        search_claim.vid = vid;
@@ -643,7 +642,7 @@ static int batadv_handle_announce(struct batadv_priv *bat_priv,
                                  uint8_t *an_addr, uint8_t *backbone_addr,
                                  short vid)
 {
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
        uint16_t crc;
 
        if (memcmp(an_addr, batadv_announce_mac, 4) != 0)
@@ -661,12 +660,12 @@ static int batadv_handle_announce(struct batadv_priv *bat_priv,
        crc = ntohs(*((__be16 *)(&an_addr[4])));
 
        batadv_dbg(BATADV_DBG_BLA, bat_priv,
-                  "handle_announce(): ANNOUNCE vid %d (sent by %pM)... CRC = %04x\n",
+                  "handle_announce(): ANNOUNCE vid %d (sent by %pM)... CRC = %#.4x\n",
                   vid, backbone_gw->orig, crc);
 
        if (backbone_gw->crc != crc) {
                batadv_dbg(BATADV_DBG_BLA, backbone_gw->bat_priv,
-                          "handle_announce(): CRC FAILED for %pM/%d (my = %04x, sent = %04x)\n",
+                          "handle_announce(): CRC FAILED for %pM/%d (my = %#.4x, sent = %#.4x)\n",
                           backbone_gw->orig, backbone_gw->vid,
                           backbone_gw->crc, crc);
 
@@ -715,7 +714,7 @@ static int batadv_handle_unclaim(struct batadv_priv *bat_priv,
                                 uint8_t *backbone_addr,
                                 uint8_t *claim_addr, short vid)
 {
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
 
        /* unclaim in any case if it is our own */
        if (primary_if && batadv_compare_eth(backbone_addr,
@@ -744,7 +743,7 @@ static int batadv_handle_claim(struct batadv_priv *bat_priv,
                               uint8_t *backbone_addr, uint8_t *claim_addr,
                               short vid)
 {
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
 
        /* register the gateway if not yet available, and add the claim. */
 
@@ -835,7 +834,7 @@ static int batadv_check_claim_group(struct batadv_priv *bat_priv,
        /* if our mesh friends mac is bigger, use it for ourselves. */
        if (ntohs(bla_dst->group) > ntohs(bla_dst_own->group)) {
                batadv_dbg(BATADV_DBG_BLA, bat_priv,
-                          "taking other backbones claim group: %04x\n",
+                          "taking other backbones claim group: %#.4x\n",
                           ntohs(bla_dst->group));
                bla_dst_own->group = bla_dst->group;
        }
@@ -958,7 +957,7 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv,
  */
 static void batadv_bla_purge_backbone_gw(struct batadv_priv *bat_priv, int now)
 {
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
        struct hlist_node *node, *node_tmp;
        struct hlist_head *head;
        struct batadv_hashtable *hash;
@@ -1013,7 +1012,7 @@ static void batadv_bla_purge_claims(struct batadv_priv *bat_priv,
                                    struct batadv_hard_iface *primary_if,
                                    int now)
 {
-       struct batadv_claim *claim;
+       struct batadv_bla_claim *claim;
        struct hlist_node *node;
        struct hlist_head *head;
        struct batadv_hashtable *hash;
@@ -1062,7 +1061,7 @@ void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
                                    struct batadv_hard_iface *primary_if,
                                    struct batadv_hard_iface *oldif)
 {
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
        struct hlist_node *node;
        struct hlist_head *head;
        struct batadv_hashtable *hash;
@@ -1104,16 +1103,6 @@ void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
        }
 }
 
-
-
-/* (re)start the timer */
-static void batadv_bla_start_timer(struct batadv_priv *bat_priv)
-{
-       INIT_DELAYED_WORK(&bat_priv->bla.work, batadv_bla_periodic_work);
-       queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work,
-                          msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));
-}
-
 /* periodic work to do:
  *  * purge structures when they are too old
  *  * send announcements
@@ -1125,7 +1114,7 @@ static void batadv_bla_periodic_work(struct work_struct *work)
        struct batadv_priv_bla *priv_bla;
        struct hlist_node *node;
        struct hlist_head *head;
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
        struct batadv_hashtable *hash;
        struct batadv_hard_iface *primary_if;
        int i;
@@ -1184,7 +1173,8 @@ out:
        if (primary_if)
                batadv_hardif_free_ref(primary_if);
 
-       batadv_bla_start_timer(bat_priv);
+       queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work,
+                          msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));
 }
 
 /* The hash for claim and backbone hash receive the same key because they
@@ -1242,7 +1232,10 @@ int batadv_bla_init(struct batadv_priv *bat_priv)
 
        batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla hashes initialized\n");
 
-       batadv_bla_start_timer(bat_priv);
+       INIT_DELAYED_WORK(&bat_priv->bla.work, batadv_bla_periodic_work);
+
+       queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work,
+                          msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));
        return 0;
 }
 
@@ -1330,7 +1323,7 @@ int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig)
        struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
        struct hlist_head *head;
        struct hlist_node *node;
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
        int i;
 
        if (!atomic_read(&bat_priv->bridge_loop_avoidance))
@@ -1371,7 +1364,7 @@ int batadv_bla_is_backbone_gw(struct sk_buff *skb,
 {
        struct ethhdr *ethhdr;
        struct vlan_ethhdr *vhdr;
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
        short vid = -1;
 
        if (!atomic_read(&orig_node->bat_priv->bridge_loop_avoidance))
@@ -1442,7 +1435,7 @@ int batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb, short vid,
                  bool is_bcast)
 {
        struct ethhdr *ethhdr;
-       struct batadv_claim search_claim, *claim = NULL;
+       struct batadv_bla_claim search_claim, *claim = NULL;
        struct batadv_hard_iface *primary_if;
        int ret;
 
@@ -1536,7 +1529,7 @@ out:
 int batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb, short vid)
 {
        struct ethhdr *ethhdr;
-       struct batadv_claim search_claim, *claim = NULL;
+       struct batadv_bla_claim search_claim, *claim = NULL;
        struct batadv_hard_iface *primary_if;
        int ret = 0;
 
@@ -1612,7 +1605,7 @@ int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)
        struct net_device *net_dev = (struct net_device *)seq->private;
        struct batadv_priv *bat_priv = netdev_priv(net_dev);
        struct batadv_hashtable *hash = bat_priv->bla.claim_hash;
-       struct batadv_claim *claim;
+       struct batadv_bla_claim *claim;
        struct batadv_hard_iface *primary_if;
        struct hlist_node *node;
        struct hlist_head *head;
@@ -1626,10 +1619,10 @@ int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)
 
        primary_addr = primary_if->net_dev->dev_addr;
        seq_printf(seq,
-                  "Claims announced for the mesh %s (orig %pM, group id %04x)\n",
+                  "Claims announced for the mesh %s (orig %pM, group id %#.4x)\n",
                   net_dev->name, primary_addr,
                   ntohs(bat_priv->bla.claim_dest.group));
-       seq_printf(seq, "   %-17s    %-5s    %-17s [o] (%-4s)\n",
+       seq_printf(seq, "   %-17s    %-5s    %-17s [o] (%-6s)\n",
                   "Client", "VID", "Originator", "CRC");
        for (i = 0; i < hash->size; i++) {
                head = &hash->table[i];
@@ -1638,7 +1631,7 @@ int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)
                hlist_for_each_entry_rcu(claim, node, head, hash_entry) {
                        is_own = batadv_compare_eth(claim->backbone_gw->orig,
                                                    primary_addr);
-                       seq_printf(seq, " * %pM on % 5d by %pM [%c] (%04x)\n",
+                       seq_printf(seq, " * %pM on % 5d by %pM [%c] (%#.4x)\n",
                                   claim->addr, claim->vid,
                                   claim->backbone_gw->orig,
                                   (is_own ? 'x' : ' '),
@@ -1657,7 +1650,7 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)
        struct net_device *net_dev = (struct net_device *)seq->private;
        struct batadv_priv *bat_priv = netdev_priv(net_dev);
        struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
-       struct batadv_backbone_gw *backbone_gw;
+       struct batadv_bla_backbone_gw *backbone_gw;
        struct batadv_hard_iface *primary_if;
        struct hlist_node *node;
        struct hlist_head *head;
@@ -1672,10 +1665,10 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)
 
        primary_addr = primary_if->net_dev->dev_addr;
        seq_printf(seq,
-                  "Backbones announced for the mesh %s (orig %pM, group id %04x)\n",
+                  "Backbones announced for the mesh %s (orig %pM, group id %#.4x)\n",
                   net_dev->name, primary_addr,
                   ntohs(bat_priv->bla.claim_dest.group));
-       seq_printf(seq, "   %-17s    %-5s %-9s (%-4s)\n",
+       seq_printf(seq, "   %-17s    %-5s %-9s (%-6s)\n",
                   "Originator", "VID", "last seen", "CRC");
        for (i = 0; i < hash->size; i++) {
                head = &hash->table[i];
@@ -1693,7 +1686,7 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)
                                continue;
 
                        seq_printf(seq,
-                                  " * %pM on % 5d % 4i.%03is (%04x)\n",
+                                  " * %pM on % 5d % 4i.%03is (%#.4x)\n",
                                   backbone_gw->orig, backbone_gw->vid,
                                   secs, msecs, backbone_gw->crc);
                }
index 196d9a0254bcbc6820c5f60f3c53a63638b683c9..dea2fbc5d98d00d020608db19e51e830501c93a7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich
  *
index 6f58ddd53bff8d2752c7a59dda1c20e40ec428e0..6ae86516db4dcebd6125d8d04976c33a06ff9f5f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
@@ -40,13 +40,14 @@ static struct dentry *batadv_debugfs;
 
 static const int batadv_log_buff_len = BATADV_LOG_BUF_LEN;
 
-static char *batadv_log_char_addr(struct batadv_debug_log *debug_log,
+static char *batadv_log_char_addr(struct batadv_priv_debug_log *debug_log,
                                  size_t idx)
 {
        return &debug_log->log_buff[idx & BATADV_LOG_BUFF_MASK];
 }
 
-static void batadv_emit_log_char(struct batadv_debug_log *debug_log, char c)
+static void batadv_emit_log_char(struct batadv_priv_debug_log *debug_log,
+                                char c)
 {
        char *char_addr;
 
@@ -59,7 +60,7 @@ static void batadv_emit_log_char(struct batadv_debug_log *debug_log, char c)
 }
 
 __printf(2, 3)
-static int batadv_fdebug_log(struct batadv_debug_log *debug_log,
+static int batadv_fdebug_log(struct batadv_priv_debug_log *debug_log,
                             const char *fmt, ...)
 {
        va_list args;
@@ -114,7 +115,7 @@ static int batadv_log_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static int batadv_log_empty(struct batadv_debug_log *debug_log)
+static int batadv_log_empty(struct batadv_priv_debug_log *debug_log)
 {
        return !(debug_log->log_start - debug_log->log_end);
 }
@@ -123,7 +124,7 @@ static ssize_t batadv_log_read(struct file *file, char __user *buf,
                               size_t count, loff_t *ppos)
 {
        struct batadv_priv *bat_priv = file->private_data;
-       struct batadv_debug_log *debug_log = bat_priv->debug_log;
+       struct batadv_priv_debug_log *debug_log = bat_priv->debug_log;
        int error, i = 0;
        char *char_addr;
        char c;
@@ -164,7 +165,6 @@ static ssize_t batadv_log_read(struct file *file, char __user *buf,
 
                buf++;
                i++;
-
        }
 
        spin_unlock_bh(&debug_log->lock);
@@ -178,7 +178,7 @@ static ssize_t batadv_log_read(struct file *file, char __user *buf,
 static unsigned int batadv_log_poll(struct file *file, poll_table *wait)
 {
        struct batadv_priv *bat_priv = file->private_data;
-       struct batadv_debug_log *debug_log = bat_priv->debug_log;
+       struct batadv_priv_debug_log *debug_log = bat_priv->debug_log;
 
        poll_wait(file, &debug_log->queue_wait, wait);
 
@@ -230,7 +230,6 @@ static void batadv_debug_log_cleanup(struct batadv_priv *bat_priv)
 #else /* CONFIG_BATMAN_ADV_DEBUG */
 static int batadv_debug_log_setup(struct batadv_priv *bat_priv)
 {
-       bat_priv->debug_log = NULL;
        return 0;
 }
 
@@ -397,10 +396,8 @@ err:
 
 void batadv_debugfs_destroy(void)
 {
-       if (batadv_debugfs) {
-               debugfs_remove_recursive(batadv_debugfs);
-               batadv_debugfs = NULL;
-       }
+       debugfs_remove_recursive(batadv_debugfs);
+       batadv_debugfs = NULL;
 }
 
 int batadv_debugfs_add_meshif(struct net_device *dev)
index 3319e1f21f555f8d044d96a79cb14adf83772a46..f8c3849edff428e3d98fbd7f74edfece03235400 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 8e1d89d2b1c1cada56f190bcca967525a2b7a2e7..7485a78484ffec32a2d413c025cacbf9f59014e4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors:
  *
  * Antonio Quartulli
  *
index d060c033e7de097dc4d5272f4595161082ca135a..125c8c6fcfadfed4d8b388d3f7775877a5b6ff93 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors:
  *
  * Antonio Quartulli
  *
index dd07c7e3654fa4b3e38f9c0665ca705a332203cc..074107f2cfaa554b02ece1b327cf7bd105d83bc6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index f0d129e323c88b2f0747fabec25d9d8f8d8fe495..039902dca4a691074856d7846c59ad89f0bd8b8e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 9001208d1752cbd5f32fd5dadcbe49d7ffc2920b..84bb2b18d7110a4597dc71c7b2f68c032d7750a9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 13697f6e71131e3f2cff82febf3c43486909e81d..509b2bf8c2f4fa6388e095c998dd0006ec3d9b6e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index f1d37cd818155ed82b388571a2342afb39509897..368219e026a96fbf2ca50df30cb49bd2c54d5978 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -457,6 +457,24 @@ out:
                batadv_hardif_free_ref(primary_if);
 }
 
+/**
+ * batadv_hardif_remove_interface_finish - cleans up the remains of a hardif
+ * @work: work queue item
+ *
+ * Free the parts of the hard interface which can not be removed under
+ * rtnl lock (to prevent deadlock situations).
+ */
+static void batadv_hardif_remove_interface_finish(struct work_struct *work)
+{
+       struct batadv_hard_iface *hard_iface;
+
+       hard_iface = container_of(work, struct batadv_hard_iface,
+                                 cleanup_work);
+
+       batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
+       batadv_hardif_free_ref(hard_iface);
+}
+
 static struct batadv_hard_iface *
 batadv_hardif_add_interface(struct net_device *net_dev)
 {
@@ -484,6 +502,9 @@ batadv_hardif_add_interface(struct net_device *net_dev)
        hard_iface->soft_iface = NULL;
        hard_iface->if_status = BATADV_IF_NOT_IN_USE;
        INIT_LIST_HEAD(&hard_iface->list);
+       INIT_WORK(&hard_iface->cleanup_work,
+                 batadv_hardif_remove_interface_finish);
+
        /* extra reference for return */
        atomic_set(&hard_iface->refcount, 2);
 
@@ -518,8 +539,7 @@ static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
                return;
 
        hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
-       batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
-       batadv_hardif_free_ref(hard_iface);
+       queue_work(batadv_event_workqueue, &hard_iface->cleanup_work);
 }
 
 void batadv_hardif_remove_interfaces(void)
index 3732366e7445b478df99015454b093cdc2c26665..308437d52e221f3dfdaf917cfeee8676dd422c20 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 15a849c2d41498989c82ff9d86740eb5cfe4d7cb..7198dafd3bf353b97c13a798d1daeed705fb4e30 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2006-2013 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index e05333905afd566117bf1267d6e3ac05596c89c1..1b4da72f2093e0f77b08702febf7a0f120e12ff8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2006-2013 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
@@ -89,7 +89,7 @@ static inline void batadv_hash_delete(struct batadv_hashtable *hash,
  *
  *     Returns the new hash value.
  */
-static inline uint32_t batadv_hash_bytes(uint32_t hash, void *data,
+static inline uint32_t batadv_hash_bytes(uint32_t hash, const void *data,
                                         uint32_t size)
 {
        const unsigned char *key = data;
index 87ca8095b011517b6f41faf8d1dfa25ef8e0b570..0ba6c899b2d3512b9dd0bc0c4292fcf08d1f0154 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 29443a1dbb5c80f0147179d387244386c49e4370..1fcca37b62234d92b2e6092dcdc4ccfed4d76ba2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index f65a222b7b83c0d691f859f2eef1ea189ac84e2c..21fe6987733bf0d635fca38f22c826ca4bdb9b4b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 2f85577086a7cf923c6185f84f6efeb3bfb5fe84..ced08b936a9690a6f7d01af7f7eb8a31f3e1f29d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -26,7 +26,7 @@
 #define BATADV_DRIVER_DEVICE "batman-adv"
 
 #ifndef BATADV_SOURCE_VERSION
-#define BATADV_SOURCE_VERSION "2012.5.0"
+#define BATADV_SOURCE_VERSION "2013.1.0"
 #endif
 
 /* B.A.T.M.A.N. parameters */
  * -> TODO: check influence on BATADV_TQ_LOCAL_WINDOW_SIZE
  */
 #define BATADV_PURGE_TIMEOUT 200000 /* 200 seconds */
-#define BATADV_TT_LOCAL_TIMEOUT 3600000 /* in milliseconds */
+#define BATADV_TT_LOCAL_TIMEOUT 600000 /* in milliseconds */
 #define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000 /* in milliseconds */
 #define BATADV_TT_CLIENT_TEMP_TIMEOUT 600000 /* in milliseconds */
+#define BATADV_TT_WORK_PERIOD 5000 /* 5 seconds */
+#define BATADV_ORIG_WORK_PERIOD 1000 /* 1 second */
 #define BATADV_DAT_ENTRY_TIMEOUT (5*60000) /* 5 mins in milliseconds */
 /* sliding packet range of received originator messages in sequence numbers
  * (should be a multiple of our word size)
@@ -276,9 +278,7 @@ static inline bool batadv_has_timed_out(unsigned long timestamp,
 static inline void batadv_add_counter(struct batadv_priv *bat_priv, size_t idx,
                                      size_t count)
 {
-       int cpu = get_cpu();
-       per_cpu_ptr(bat_priv->bat_counters, cpu)[idx] += count;
-       put_cpu();
+       this_cpu_add(bat_priv->bat_counters[idx], count);
 }
 
 #define batadv_inc_counter(b, i) batadv_add_counter(b, i, 1)
index 8c32cf1c2deca7177945a804afcdf6ad10572ee5..457ea445217c2dd7eec34647b9e8969d93590707 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
 #include "soft-interface.h"
 #include "bridge_loop_avoidance.h"
 
-static void batadv_purge_orig(struct work_struct *work);
+/* hash class keys */
+static struct lock_class_key batadv_orig_hash_lock_class_key;
 
-static void batadv_start_purge_timer(struct batadv_priv *bat_priv)
-{
-       INIT_DELAYED_WORK(&bat_priv->orig_work, batadv_purge_orig);
-       queue_delayed_work(batadv_event_workqueue,
-                          &bat_priv->orig_work, msecs_to_jiffies(1000));
-}
+static void batadv_purge_orig(struct work_struct *work);
 
 /* returns 1 if they are the same originator */
 static int batadv_compare_orig(const struct hlist_node *node, const void *data2)
@@ -57,7 +53,14 @@ int batadv_originator_init(struct batadv_priv *bat_priv)
        if (!bat_priv->orig_hash)
                goto err;
 
-       batadv_start_purge_timer(bat_priv);
+       batadv_hash_set_lock_class(bat_priv->orig_hash,
+                                  &batadv_orig_hash_lock_class_key);
+
+       INIT_DELAYED_WORK(&bat_priv->orig_work, batadv_purge_orig);
+       queue_delayed_work(batadv_event_workqueue,
+                          &bat_priv->orig_work,
+                          msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD));
+
        return 0;
 
 err:
@@ -178,7 +181,6 @@ void batadv_originator_free(struct batadv_priv *bat_priv)
                spin_lock_bh(list_lock);
                hlist_for_each_entry_safe(orig_node, node, node_tmp,
                                          head, hash_entry) {
-
                        hlist_del_rcu(node);
                        batadv_orig_node_free_ref(orig_node);
                }
@@ -285,7 +287,6 @@ batadv_purge_orig_neighbors(struct batadv_priv *bat_priv,
        /* for all neighbors towards this originator ... */
        hlist_for_each_entry_safe(neigh_node, node, node_tmp,
                                  &orig_node->neigh_list, list) {
-
                last_seen = neigh_node->last_seen;
                if_incoming = neigh_node->if_incoming;
 
@@ -293,7 +294,6 @@ batadv_purge_orig_neighbors(struct batadv_priv *bat_priv,
                    (if_incoming->if_status == BATADV_IF_INACTIVE) ||
                    (if_incoming->if_status == BATADV_IF_NOT_IN_USE) ||
                    (if_incoming->if_status == BATADV_IF_TO_BE_REMOVED)) {
-
                        if ((if_incoming->if_status == BATADV_IF_INACTIVE) ||
                            (if_incoming->if_status == BATADV_IF_NOT_IN_USE) ||
                            (if_incoming->if_status == BATADV_IF_TO_BE_REMOVED))
@@ -393,7 +393,9 @@ static void batadv_purge_orig(struct work_struct *work)
        delayed_work = container_of(work, struct delayed_work, work);
        bat_priv = container_of(delayed_work, struct batadv_priv, orig_work);
        _batadv_purge_orig(bat_priv);
-       batadv_start_purge_timer(bat_priv);
+       queue_delayed_work(batadv_event_workqueue,
+                          &bat_priv->orig_work,
+                          msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD));
 }
 
 void batadv_purge_orig_ref(struct batadv_priv *bat_priv)
index 9778e656dec73bb5c1cb44e126cbe03d80052359..286bf743e76a34e0519d9ba6c9c871c3b3295105 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index cb6405bf755cdbdf24b005b38416999e9ec38e19..ed0aa89bbf8b7bae0fdf70c5421598c1a04df2d2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index c8f61e395b74864de3ef5c7944074358eda1706c..ccab0bbdbb599d1f6e192f15d7c6708326745b7d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index fda8c17df273fb82731d3ef8ecfb25d18bac97bf..3f92ae248e83dbbd9b43f373197728828f77cd49 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 1aa1722d01870d69738f6be60a7e7868882cab88..60ba03fc83904f3008d7b7bd6b064955f0809b81 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -80,7 +80,6 @@ static void _batadv_update_route(struct batadv_priv *bat_priv,
 
        /* route added */
        } else if ((!curr_router) && (neigh_node)) {
-
                batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
                           "Adding route towards: %pM (via %pM)\n",
                           orig_node->orig, neigh_node->addr);
@@ -172,7 +171,6 @@ void batadv_bonding_candidate_add(struct batadv_orig_node *orig_node,
         */
        hlist_for_each_entry_rcu(tmp_neigh_node, node,
                                 &orig_node->neigh_list, list) {
-
                if (tmp_neigh_node == neigh_node)
                        continue;
 
@@ -836,7 +834,6 @@ static int batadv_route_unicast_packet(struct sk_buff *skb,
        if (unicast_packet->header.packet_type == BATADV_UNICAST_FRAG &&
            batadv_frag_can_reassemble(skb,
                                       neigh_node->if_incoming->net_dev->mtu)) {
-
                ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
 
                if (ret == NET_RX_DROP)
@@ -1103,7 +1100,6 @@ int batadv_recv_ucast_frag_packet(struct sk_buff *skb,
 
        /* packet for me */
        if (batadv_is_my_mac(unicast_packet->dest)) {
-
                ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
 
                if (ret == NET_RX_DROP)
index 9262279ea6677888f6b20d72d2658cb7171458bf..99eeafaba4075a37df1562e7e1b890b6a717fb71 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 4425af9dad40e2b9698f48c576c27042c13a8dbb..80ca65fc89a19e76b599f0df8c80aa4b811e520b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -155,8 +155,6 @@ _batadv_add_bcast_packet_to_list(struct batadv_priv *bat_priv,
        spin_unlock_bh(&bat_priv->forw_bcast_list_lock);
 
        /* start timer for this packet */
-       INIT_DELAYED_WORK(&forw_packet->delayed_work,
-                         batadv_send_outstanding_bcast_packet);
        queue_delayed_work(batadv_event_workqueue, &forw_packet->delayed_work,
                           send_time);
 }
@@ -210,6 +208,9 @@ int batadv_add_bcast_packet_to_list(struct batadv_priv *bat_priv,
        /* how often did we send the bcast packet ? */
        forw_packet->num_packets = 0;
 
+       INIT_DELAYED_WORK(&forw_packet->delayed_work,
+                         batadv_send_outstanding_bcast_packet);
+
        _batadv_add_bcast_packet_to_list(bat_priv, forw_packet, delay);
        return NETDEV_TX_OK;
 
@@ -330,7 +331,6 @@ batadv_purge_outstanding_packets(struct batadv_priv *bat_priv,
        spin_lock_bh(&bat_priv->forw_bcast_list_lock);
        hlist_for_each_entry_safe(forw_packet, tmp_node, safe_tmp_node,
                                  &bat_priv->forw_bcast_list, list) {
-
                /* if purge_outstanding_packets() was called with an argument
                 * we delete only packets belonging to the given interface
                 */
@@ -357,7 +357,6 @@ batadv_purge_outstanding_packets(struct batadv_priv *bat_priv,
        spin_lock_bh(&bat_priv->forw_bat_list_lock);
        hlist_for_each_entry_safe(forw_packet, tmp_node, safe_tmp_node,
                                  &bat_priv->forw_bat_list, list) {
-
                /* if purge_outstanding_packets() was called with an argument
                 * we delete only packets belonging to the given interface
                 */
index 0078dece1abcd4cf6784b59cf5441ac150424330..38e662f619ac6e45bebed3b982f444396ea94bd8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 90f4049a90ddf0aabd8cdd77764703be46d70c6d..2711e870f557d43ac6bbd4180a7f239a27fb850a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -180,7 +180,8 @@ static int batadv_interface_tx(struct sk_buff *skb,
                goto dropped;
 
        /* Register the client MAC in the transtable */
-       batadv_tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif);
+       if (!is_multicast_ether_addr(ethhdr->h_source))
+               batadv_tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif);
 
        /* don't accept stp packets. STP does not help in meshes.
         * better use the bridge loop avoidance ...
@@ -448,6 +449,30 @@ static void batadv_interface_setup(struct net_device *dev)
        memset(priv, 0, sizeof(*priv));
 }
 
+/**
+ * batadv_softif_destroy_finish - cleans up the remains of a softif
+ * @work: work queue item
+ *
+ * Free the parts of the soft interface which can not be removed under
+ * rtnl lock (to prevent deadlock situations).
+ */
+static void batadv_softif_destroy_finish(struct work_struct *work)
+{
+       struct batadv_priv *bat_priv;
+       struct net_device *soft_iface;
+
+       bat_priv = container_of(work, struct batadv_priv,
+                               cleanup_work);
+       soft_iface = bat_priv->soft_iface;
+
+       batadv_debugfs_del_meshif(soft_iface);
+       batadv_sysfs_del_meshif(soft_iface);
+
+       rtnl_lock();
+       unregister_netdevice(soft_iface);
+       rtnl_unlock();
+}
+
 struct net_device *batadv_softif_create(const char *name)
 {
        struct net_device *soft_iface;
@@ -462,6 +487,8 @@ struct net_device *batadv_softif_create(const char *name)
                goto out;
 
        bat_priv = netdev_priv(soft_iface);
+       bat_priv->soft_iface = soft_iface;
+       INIT_WORK(&bat_priv->cleanup_work, batadv_softif_destroy_finish);
 
        /* batadv_interface_stats() needs to be available as soon as
         * register_netdevice() has been called
@@ -479,7 +506,9 @@ struct net_device *batadv_softif_create(const char *name)
 
        atomic_set(&bat_priv->aggregated_ogms, 1);
        atomic_set(&bat_priv->bonding, 0);
+#ifdef CONFIG_BATMAN_ADV_BLA
        atomic_set(&bat_priv->bridge_loop_avoidance, 0);
+#endif
 #ifdef CONFIG_BATMAN_ADV_DAT
        atomic_set(&bat_priv->distributed_arp_table, 1);
 #endif
@@ -490,7 +519,9 @@ struct net_device *batadv_softif_create(const char *name)
        atomic_set(&bat_priv->gw_bandwidth, 41);
        atomic_set(&bat_priv->orig_interval, 1000);
        atomic_set(&bat_priv->hop_penalty, 30);
+#ifdef CONFIG_BATMAN_ADV_DEBUG
        atomic_set(&bat_priv->log_level, 0);
+#endif
        atomic_set(&bat_priv->fragmentation, 1);
        atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
        atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
@@ -546,10 +577,10 @@ out:
 
 void batadv_softif_destroy(struct net_device *soft_iface)
 {
-       batadv_debugfs_del_meshif(soft_iface);
-       batadv_sysfs_del_meshif(soft_iface);
+       struct batadv_priv *bat_priv = netdev_priv(soft_iface);
+
        batadv_mesh_free(soft_iface);
-       unregister_netdevice(soft_iface);
+       queue_work(batadv_event_workqueue, &bat_priv->cleanup_work);
 }
 
 int batadv_softif_is_valid(const struct net_device *net_dev)
index 07a08fed28b97ae2739e8a7cb36040f75345a951..43182e5e603aafd4dead1fa516472c4bc4ee5dc4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 84a55cb19b0b9b2d4e5c9f2d787bf916059556db..afbba319d73af8fb96fb80f14da86416a95a86ef 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 3fd1412b06202fe3526dcd5b10e4ac2a40458edd..479acf4c16f47d1068698d15362099459544af79 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 22457a7952baae3fc85c3ce43bd14bbeb5acf068..fb15b4c076f77e901cc56a59ad31d50a42caa5b5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich, Antonio Quartulli
  *
 
 #include <linux/crc16.h>
 
+/* hash class keys */
+static struct lock_class_key batadv_tt_local_hash_lock_class_key;
+static struct lock_class_key batadv_tt_global_hash_lock_class_key;
+
 static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client,
                                 struct batadv_orig_node *orig_node);
 static void batadv_tt_purge(struct work_struct *work);
@@ -48,13 +52,6 @@ static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
        return (memcmp(data1, data2, ETH_ALEN) == 0 ? 1 : 0);
 }
 
-static void batadv_tt_start_timer(struct batadv_priv *bat_priv)
-{
-       INIT_DELAYED_WORK(&bat_priv->tt.work, batadv_tt_purge);
-       queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work,
-                          msecs_to_jiffies(5000));
-}
-
 static struct batadv_tt_common_entry *
 batadv_tt_hash_find(struct batadv_hashtable *hash, const void *data)
 {
@@ -112,7 +109,6 @@ batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const void *data)
                                               struct batadv_tt_global_entry,
                                               common);
        return tt_global_entry;
-
 }
 
 static void
@@ -235,6 +231,9 @@ static int batadv_tt_local_init(struct batadv_priv *bat_priv)
        if (!bat_priv->tt.local_hash)
                return -ENOMEM;
 
+       batadv_hash_set_lock_class(bat_priv->tt.local_hash,
+                                  &batadv_tt_local_hash_lock_class_key);
+
        return 0;
 }
 
@@ -249,7 +248,6 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv,
        batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt,
                           batadv_choose_orig, tt_global->common.addr);
        batadv_tt_global_entry_free_ref(tt_global);
-
 }
 
 void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
@@ -305,7 +303,11 @@ void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
                   (uint8_t)atomic_read(&bat_priv->tt.vn));
 
        memcpy(tt_local->common.addr, addr, ETH_ALEN);
-       tt_local->common.flags = BATADV_NO_FLAGS;
+       /* The local entry has to be marked as NEW to avoid to send it in
+        * a full table response going out before the next ttvn increment
+        * (consistency check)
+        */
+       tt_local->common.flags = BATADV_TT_CLIENT_NEW;
        if (batadv_is_wifi_iface(ifindex))
                tt_local->common.flags |= BATADV_TT_CLIENT_WIFI;
        atomic_set(&tt_local->common.refcount, 2);
@@ -316,12 +318,6 @@ void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
        if (batadv_compare_eth(addr, soft_iface->dev_addr))
                tt_local->common.flags |= BATADV_TT_CLIENT_NOPURGE;
 
-       /* The local entry has to be marked as NEW to avoid to send it in
-        * a full table response going out before the next ttvn increment
-        * (consistency check)
-        */
-       tt_local->common.flags |= BATADV_TT_CLIENT_NEW;
-
        hash_added = batadv_hash_add(bat_priv->tt.local_hash, batadv_compare_tt,
                                     batadv_choose_orig, &tt_local->common,
                                     &tt_local->common.hash_entry);
@@ -472,18 +468,27 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
        struct batadv_priv *bat_priv = netdev_priv(net_dev);
        struct batadv_hashtable *hash = bat_priv->tt.local_hash;
        struct batadv_tt_common_entry *tt_common_entry;
+       struct batadv_tt_local_entry *tt_local;
        struct batadv_hard_iface *primary_if;
        struct hlist_node *node;
        struct hlist_head *head;
        uint32_t i;
+       int last_seen_secs;
+       int last_seen_msecs;
+       unsigned long last_seen_jiffies;
+       bool no_purge;
+       uint16_t np_flag = BATADV_TT_CLIENT_NOPURGE;
 
        primary_if = batadv_seq_print_text_primary_if_get(seq);
        if (!primary_if)
                goto out;
 
        seq_printf(seq,
-                  "Locally retrieved addresses (from %s) announced via TT (TTVN: %u):\n",
-                  net_dev->name, (uint8_t)atomic_read(&bat_priv->tt.vn));
+                  "Locally retrieved addresses (from %s) announced via TT (TTVN: %u CRC: %#.4x):\n",
+                  net_dev->name, (uint8_t)atomic_read(&bat_priv->tt.vn),
+                  bat_priv->tt.local_crc);
+       seq_printf(seq, "       %-13s %-7s %-10s\n", "Client", "Flags",
+                  "Last seen");
 
        for (i = 0; i < hash->size; i++) {
                head = &hash->table[i];
@@ -491,18 +496,29 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
                rcu_read_lock();
                hlist_for_each_entry_rcu(tt_common_entry, node,
                                         head, hash_entry) {
-                       seq_printf(seq, " * %pM [%c%c%c%c%c]\n",
+                       tt_local = container_of(tt_common_entry,
+                                               struct batadv_tt_local_entry,
+                                               common);
+                       last_seen_jiffies = jiffies - tt_local->last_seen;
+                       last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
+                       last_seen_secs = last_seen_msecs / 1000;
+                       last_seen_msecs = last_seen_msecs % 1000;
+
+                       no_purge = tt_common_entry->flags & np_flag;
+
+                       seq_printf(seq, " * %pM [%c%c%c%c%c] %3u.%03u\n",
                                   tt_common_entry->addr,
                                   (tt_common_entry->flags &
                                    BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
-                                  (tt_common_entry->flags &
-                                   BATADV_TT_CLIENT_NOPURGE ? 'P' : '.'),
+                                  no_purge ? 'P' : '.',
                                   (tt_common_entry->flags &
                                    BATADV_TT_CLIENT_NEW ? 'N' : '.'),
                                   (tt_common_entry->flags &
                                    BATADV_TT_CLIENT_PENDING ? 'X' : '.'),
                                   (tt_common_entry->flags &
-                                   BATADV_TT_CLIENT_WIFI ? 'W' : '.'));
+                                   BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
+                                  no_purge ? last_seen_secs : 0,
+                                  no_purge ? last_seen_msecs : 0);
                }
                rcu_read_unlock();
        }
@@ -627,7 +643,6 @@ static void batadv_tt_local_purge(struct batadv_priv *bat_priv)
                batadv_tt_local_purge_list(bat_priv, head);
                spin_unlock_bh(list_lock);
        }
-
 }
 
 static void batadv_tt_local_table_free(struct batadv_priv *bat_priv)
@@ -676,6 +691,9 @@ static int batadv_tt_global_init(struct batadv_priv *bat_priv)
        if (!bat_priv->tt.global_hash)
                return -ENOMEM;
 
+       batadv_hash_set_lock_class(bat_priv->tt.global_hash,
+                                  &batadv_tt_global_hash_lock_class_key);
+
        return 0;
 }
 
@@ -967,10 +985,11 @@ batadv_tt_global_print_entry(struct batadv_tt_global_entry *tt_global_entry,
        best_entry = batadv_transtable_best_orig(tt_global_entry);
        if (best_entry) {
                last_ttvn = atomic_read(&best_entry->orig_node->last_ttvn);
-               seq_printf(seq, " %c %pM  (%3u) via %pM     (%3u)   [%c%c%c]\n",
+               seq_printf(seq,
+                          " %c %pM  (%3u) via %pM     (%3u)   (%#.4x) [%c%c%c]\n",
                           '*', tt_global_entry->common.addr,
                           best_entry->ttvn, best_entry->orig_node->orig,
-                          last_ttvn,
+                          last_ttvn, best_entry->orig_node->tt_crc,
                           (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
                           (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
                           (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.'));
@@ -1012,8 +1031,9 @@ int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset)
        seq_printf(seq,
                   "Globally announced TT entries received via the mesh %s\n",
                   net_dev->name);
-       seq_printf(seq, "       %-13s %s       %-15s %s %s\n",
-                  "Client", "(TTVN)", "Originator", "(Curr TTVN)", "Flags");
+       seq_printf(seq, "       %-13s %s       %-15s %s (%-6s) %s\n",
+                  "Client", "(TTVN)", "Originator", "(Curr TTVN)", "CRC",
+                  "Flags");
 
        for (i = 0; i < hash->size; i++) {
                head = &hash->table[i];
@@ -1049,7 +1069,6 @@ batadv_tt_global_del_orig_list(struct batadv_tt_global_entry *tt_global_entry)
                batadv_tt_orig_list_entry_free_ref(orig_entry);
        }
        spin_unlock_bh(&tt_global_entry->list_lock);
-
 }
 
 static void
@@ -1825,7 +1844,6 @@ out:
        if (!ret)
                kfree_skb(skb);
        return ret;
-
 }
 
 static bool
@@ -2111,7 +2129,9 @@ int batadv_tt_init(struct batadv_priv *bat_priv)
        if (ret < 0)
                return ret;
 
-       batadv_tt_start_timer(bat_priv);
+       INIT_DELAYED_WORK(&bat_priv->tt.work, batadv_tt_purge);
+       queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work,
+                          msecs_to_jiffies(BATADV_TT_WORK_PERIOD));
 
        return 1;
 }
@@ -2261,7 +2281,8 @@ static void batadv_tt_purge(struct work_struct *work)
        batadv_tt_req_purge(bat_priv);
        batadv_tt_roam_purge(bat_priv);
 
-       batadv_tt_start_timer(bat_priv);
+       queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work,
+                          msecs_to_jiffies(BATADV_TT_WORK_PERIOD));
 }
 
 void batadv_tt_free(struct batadv_priv *bat_priv)
@@ -2352,7 +2373,6 @@ static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv)
                }
                spin_unlock_bh(list_lock);
        }
-
 }
 
 static int batadv_tt_commit_changes(struct batadv_priv *bat_priv,
@@ -2496,7 +2516,7 @@ void batadv_tt_update_orig(struct batadv_priv *bat_priv,
                    orig_node->tt_crc != tt_crc) {
 request_table:
                        batadv_dbg(BATADV_DBG_TT, bat_priv,
-                                  "TT inconsistency for %pM. Need to retrieve the correct information (ttvn: %u last_ttvn: %u crc: %u last_crc: %u num_changes: %u)\n",
+                                  "TT inconsistency for %pM. Need to retrieve the correct information (ttvn: %u last_ttvn: %u crc: %#.4x last_crc: %#.4x num_changes: %u)\n",
                                   orig_node->orig, ttvn, orig_ttvn, tt_crc,
                                   orig_node->tt_crc, tt_num_changes);
                        batadv_send_tt_request(bat_priv, orig_node, ttvn,
@@ -2549,7 +2569,6 @@ bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv,
        batadv_tt_local_entry_free_ref(tt_local_entry);
 out:
        return ret;
-
 }
 
 bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv,
index 46d4451a59ee8feb6ce895473d6df838e97f8326..ab8e683b402f0686a6e1ffe4168f99961c898bc4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich, Antonio Quartulli
  *
index ae9ac9aca8c53d5ffd93b015cb6ff779f55c86fe..4cd87a0b5b8037d12c9af6ed1d78d515b598af0f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -24,6 +24,9 @@
 #include "bitarray.h"
 #include <linux/kernel.h>
 
+/**
+ * Maximum overhead for the encapsulation for a payload packet
+ */
 #define BATADV_HEADER_LEN \
        (ETH_HLEN + max(sizeof(struct batadv_unicast_packet), \
                        sizeof(struct batadv_bcast_packet)))
@@ -51,6 +54,22 @@ struct batadv_hard_iface_bat_iv {
        atomic_t ogm_seqno;
 };
 
+/**
+ * struct batadv_hard_iface - network device known to batman-adv
+ * @list: list node for batadv_hardif_list
+ * @if_num: identificator of the interface
+ * @if_status: status of the interface for batman-adv
+ * @net_dev: pointer to the net_device
+ * @frag_seqno: last fragment sequence number sent by this interface
+ * @hardif_obj: kobject of the per interface sysfs "mesh" directory
+ * @refcount: number of contexts the object is used
+ * @batman_adv_ptype: packet type describing packets that should be processed by
+ *  batman-adv for this interface
+ * @soft_iface: the batman-adv interface which uses this network interface
+ * @rcu: struct used for freeing in an RCU-safe manner
+ * @bat_iv: BATMAN IV specific per hard interface data
+ * @cleanup_work: work queue callback item for hard interface deinit
+ */
 struct batadv_hard_iface {
        struct list_head list;
        int16_t if_num;
@@ -63,22 +82,52 @@ struct batadv_hard_iface {
        struct net_device *soft_iface;
        struct rcu_head rcu;
        struct batadv_hard_iface_bat_iv bat_iv;
+       struct work_struct cleanup_work;
 };
 
 /**
- *     struct batadv_orig_node - structure for orig_list maintaining nodes of mesh
- *     @primary_addr: hosts primary interface address
- *     @last_seen: when last packet from this node was received
- *     @bcast_seqno_reset: time when the broadcast seqno window was reset
- *     @batman_seqno_reset: time when the batman seqno window was reset
- *     @gw_flags: flags related to gateway class
- *     @flags: for now only VIS_SERVER flag
- *     @last_real_seqno: last and best known sequence number
- *     @last_ttl: ttl of last received packet
- *     @last_bcast_seqno: last broadcast sequence number received by this host
- *
- *     @candidates: how many candidates are available
- *     @selected: next bonding candidate
+ * struct batadv_orig_node - structure for orig_list maintaining nodes of mesh
+ * @orig: originator ethernet address
+ * @primary_addr: hosts primary interface address
+ * @router: router that should be used to reach this originator
+ * @batadv_dat_addr_t:  address of the orig node in the distributed hash
+ * @bcast_own: bitfield containing the number of our OGMs this orig_node
+ *  rebroadcasted "back" to us (relative to last_real_seqno)
+ * @bcast_own_sum: counted result of bcast_own
+ * @last_seen: time when last packet from this node was received
+ * @bcast_seqno_reset: time when the broadcast seqno window was reset
+ * @batman_seqno_reset: time when the batman seqno window was reset
+ * @gw_flags: flags related to gateway class
+ * @flags: for now only VIS_SERVER flag
+ * @last_ttvn: last seen translation table version number
+ * @tt_crc: CRC of the translation table
+ * @tt_buff: last tt changeset this node received from the orig node
+ * @tt_buff_len: length of the last tt changeset this node received from the
+ *  orig node
+ * @tt_buff_lock: lock that protects tt_buff and tt_buff_len
+ * @tt_size: number of global TT entries announced by the orig node
+ * @tt_initialised: bool keeping track of whether or not this node have received
+ *  any translation table information from the orig node yet
+ * @last_real_seqno: last and best known sequence number
+ * @last_ttl: ttl of last received packet
+ * @bcast_bits: bitfield containing the info which payload broadcast originated
+ *  from this orig node this host already has seen (relative to
+ *  last_bcast_seqno)
+ * @last_bcast_seqno: last broadcast sequence number received by this host
+ * @neigh_list: list of potential next hop neighbor towards this orig node
+ * @frag_list: fragmentation buffer list for fragment re-assembly
+ * @last_frag_packet: time when last fragmented packet from this node was
+ *  received
+ * @neigh_list_lock: lock protecting neigh_list, router and bonding_list
+ * @hash_entry: hlist node for batadv_priv::orig_hash
+ * @bat_priv: pointer to soft_iface this orig node belongs to
+ * @ogm_cnt_lock: lock protecting bcast_own, bcast_own_sum,
+ *  neigh_node->real_bits & neigh_node->real_packet_count
+ * @bcast_seqno_lock: lock protecting bcast_bits & last_bcast_seqno
+ * @bond_candidates: how many candidates are available
+ * @bond_list: list of bonding candidates
+ * @refcount: number of contexts the object is used
+ * @rcu: struct used for freeing in an RCU-safe manner
  */
 struct batadv_orig_node {
        uint8_t orig[ETH_ALEN];
@@ -94,11 +143,11 @@ struct batadv_orig_node {
        unsigned long batman_seqno_reset;
        uint8_t gw_flags;
        uint8_t flags;
-       atomic_t last_ttvn; /* last seen translation table version number */
+       atomic_t last_ttvn;
        uint16_t tt_crc;
        unsigned char *tt_buff;
        int16_t tt_buff_len;
-       spinlock_t tt_buff_lock; /* protects tt_buff */
+       spinlock_t tt_buff_lock; /* protects tt_buff & tt_buff_len */
        atomic_t tt_size;
        bool tt_initialised;
        uint32_t last_real_seqno;
@@ -107,23 +156,31 @@ struct batadv_orig_node {
        uint32_t last_bcast_seqno;
        struct hlist_head neigh_list;
        struct list_head frag_list;
-       spinlock_t neigh_list_lock; /* protects neigh_list and router */
-       atomic_t refcount;
-       struct rcu_head rcu;
+       unsigned long last_frag_packet;
+       /* neigh_list_lock protects: neigh_list, router & bonding_list */
+       spinlock_t neigh_list_lock;
        struct hlist_node hash_entry;
        struct batadv_priv *bat_priv;
-       unsigned long last_frag_packet;
        /* ogm_cnt_lock protects: bcast_own, bcast_own_sum,
-        * neigh_node->real_bits, neigh_node->real_packet_count
+        * neigh_node->real_bits & neigh_node->real_packet_count
         */
        spinlock_t ogm_cnt_lock;
-       /* bcast_seqno_lock protects bcast_bits, last_bcast_seqno */
+       /* bcast_seqno_lock protects: bcast_bits & last_bcast_seqno */
        spinlock_t bcast_seqno_lock;
-       spinlock_t tt_list_lock; /* protects tt_list */
        atomic_t bond_candidates;
        struct list_head bond_list;
+       atomic_t refcount;
+       struct rcu_head rcu;
 };
 
+/**
+ * struct batadv_gw_node - structure for orig nodes announcing gw capabilities
+ * @list: list node for batadv_priv_gw::list
+ * @orig_node: pointer to corresponding orig node
+ * @deleted: this struct is scheduled for deletion
+ * @refcount: number of contexts the object is used
+ * @rcu: struct used for freeing in an RCU-safe manner
+ */
 struct batadv_gw_node {
        struct hlist_node list;
        struct batadv_orig_node *orig_node;
@@ -132,13 +189,28 @@ struct batadv_gw_node {
        struct rcu_head rcu;
 };
 
-/*     batadv_neigh_node
- *     @last_seen: when last packet via this neighbor was received
+/**
+ * struct batadv_neigh_node - structure for single hop neighbors
+ * @list: list node for batadv_orig_node::neigh_list
+ * @addr: mac address of neigh node
+ * @tq_recv: ring buffer of received TQ values from this neigh node
+ * @tq_index: ring buffer index
+ * @tq_avg: averaged tq of all tq values in the ring buffer (tq_recv)
+ * @last_ttl: last received ttl from this neigh node
+ * @bonding_list: list node for batadv_orig_node::bond_list
+ * @last_seen: when last packet via this neighbor was received
+ * @real_bits: bitfield containing the number of OGMs received from this neigh
+ *  node (relative to orig_node->last_real_seqno)
+ * @real_packet_count: counted result of real_bits
+ * @orig_node: pointer to corresponding orig_node
+ * @if_incoming: pointer to incoming hard interface
+ * @lq_update_lock: lock protecting tq_recv & tq_index
+ * @refcount: number of contexts the object is used
+ * @rcu: struct used for freeing in an RCU-safe manner
  */
 struct batadv_neigh_node {
        struct hlist_node list;
        uint8_t addr[ETH_ALEN];
-       uint8_t real_packet_count;
        uint8_t tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
        uint8_t tq_index;
        uint8_t tq_avg;
@@ -146,13 +218,20 @@ struct batadv_neigh_node {
        struct list_head bonding_list;
        unsigned long last_seen;
        DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
-       atomic_t refcount;
-       struct rcu_head rcu;
+       uint8_t real_packet_count;
        struct batadv_orig_node *orig_node;
        struct batadv_hard_iface *if_incoming;
-       spinlock_t lq_update_lock;      /* protects: tq_recv, tq_index */
+       spinlock_t lq_update_lock; /* protects tq_recv & tq_index */
+       atomic_t refcount;
+       struct rcu_head rcu;
 };
 
+/**
+ * struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression
+ * @orig[ETH_ALEN]: mac address of orig node orginating the broadcast
+ * @crc: crc32 checksum of broadcast payload
+ * @entrytime: time when the broadcast packet was received
+ */
 #ifdef CONFIG_BATMAN_ADV_BLA
 struct batadv_bcast_duplist_entry {
        uint8_t orig[ETH_ALEN];
@@ -161,6 +240,33 @@ struct batadv_bcast_duplist_entry {
 };
 #endif
 
+/**
+ * enum batadv_counters - indices for traffic counters
+ * @BATADV_CNT_TX: transmitted payload traffic packet counter
+ * @BATADV_CNT_TX_BYTES: transmitted payload traffic bytes counter
+ * @BATADV_CNT_TX_DROPPED: dropped transmission payload traffic packet counter
+ * @BATADV_CNT_RX: received payload traffic packet counter
+ * @BATADV_CNT_RX_BYTES: received payload traffic bytes counter
+ * @BATADV_CNT_FORWARD: forwarded payload traffic packet counter
+ * @BATADV_CNT_FORWARD_BYTES: forwarded payload traffic bytes counter
+ * @BATADV_CNT_MGMT_TX: transmitted routing protocol traffic packet counter
+ * @BATADV_CNT_MGMT_TX_BYTES: transmitted routing protocol traffic bytes counter
+ * @BATADV_CNT_MGMT_RX: received routing protocol traffic packet counter
+ * @BATADV_CNT_MGMT_RX_BYTES: received routing protocol traffic bytes counter
+ * @BATADV_CNT_TT_REQUEST_TX: transmitted tt req traffic packet counter
+ * @BATADV_CNT_TT_REQUEST_RX: received tt req traffic packet counter
+ * @BATADV_CNT_TT_RESPONSE_TX: transmitted tt resp traffic packet counter
+ * @BATADV_CNT_TT_RESPONSE_RX: received tt resp traffic packet counter
+ * @BATADV_CNT_TT_ROAM_ADV_TX: transmitted tt roam traffic packet counter
+ * @BATADV_CNT_TT_ROAM_ADV_RX: received tt roam traffic packet counter
+ * @BATADV_CNT_DAT_GET_TX: transmitted dht GET traffic packet counter
+ * @BATADV_CNT_DAT_GET_RX: received dht GET traffic packet counter
+ * @BATADV_CNT_DAT_PUT_TX: transmitted dht PUT traffic packet counter
+ * @BATADV_CNT_DAT_PUT_RX: received dht PUT traffic packet counter
+ * @BATADV_CNT_DAT_CACHED_REPLY_TX: transmitted dat cache reply traffic packet
+ *  counter
+ * @BATADV_CNT_NUM: number of traffic counters
+ */
 enum batadv_counters {
        BATADV_CNT_TX,
        BATADV_CNT_TX_BYTES,
@@ -192,14 +298,23 @@ enum batadv_counters {
 /**
  * struct batadv_priv_tt - per mesh interface translation table data
  * @vn: translation table version number
+ * @ogm_append_cnt: counter of number of OGMs containing the local tt diff
  * @local_changes: changes registered in an originator interval
- * @poss_change: Detect an ongoing roaming phase. If true, then this node
- *  received a roaming_adv and has to inspect every packet directed to it to
- *  check whether it still is the true destination or not. This flag will be
- *  reset to false as soon as the this node's ttvn is increased
  * @changes_list: tracks tt local changes within an originator interval
- * @req_list: list of pending tt_requests
+ * @local_hash: local translation table hash table
+ * @global_hash: global translation table hash table
+ * @req_list: list of pending & unanswered tt_requests
+ * @roam_list: list of the last roaming events of each client limiting the
+ *  number of roaming events to avoid route flapping
+ * @changes_list_lock: lock protecting changes_list
+ * @req_list_lock: lock protecting req_list
+ * @roam_list_lock: lock protecting roam_list
+ * @local_entry_num: number of entries in the local hash table
  * @local_crc: Checksum of the local table, recomputed before sending a new OGM
+ * @last_changeset: last tt changeset this host has generated
+ * @last_changeset_len: length of last tt changeset this host has generated
+ * @last_changeset_lock: lock protecting last_changeset & last_changeset_len
+ * @work: work queue callback item for translation table purging
  */
 struct batadv_priv_tt {
        atomic_t vn;
@@ -217,36 +332,83 @@ struct batadv_priv_tt {
        uint16_t local_crc;
        unsigned char *last_changeset;
        int16_t last_changeset_len;
-       spinlock_t last_changeset_lock; /* protects last_changeset */
+       /* protects last_changeset & last_changeset_len */
+       spinlock_t last_changeset_lock;
        struct delayed_work work;
 };
 
+/**
+ * struct batadv_priv_bla - per mesh interface bridge loope avoidance data
+ * @num_requests; number of bla requests in flight
+ * @claim_hash: hash table containing mesh nodes this host has claimed
+ * @backbone_hash: hash table containing all detected backbone gateways
+ * @bcast_duplist: recently received broadcast packets array (for broadcast
+ *  duplicate suppression)
+ * @bcast_duplist_curr: index of last broadcast packet added to bcast_duplist
+ * @bcast_duplist_lock: lock protecting bcast_duplist & bcast_duplist_curr
+ * @claim_dest: local claim data (e.g. claim group)
+ * @work: work queue callback item for cleanups & bla announcements
+ */
 #ifdef CONFIG_BATMAN_ADV_BLA
 struct batadv_priv_bla {
-       atomic_t num_requests; /* number of bla requests in flight */
+       atomic_t num_requests;
        struct batadv_hashtable *claim_hash;
        struct batadv_hashtable *backbone_hash;
        struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
        int bcast_duplist_curr;
-       /* protects bcast_duplist and bcast_duplist_curr */
+       /* protects bcast_duplist & bcast_duplist_curr */
        spinlock_t bcast_duplist_lock;
        struct batadv_bla_claim_dst claim_dest;
        struct delayed_work work;
 };
 #endif
 
+/**
+ * struct batadv_debug_log - debug logging data
+ * @log_buff: buffer holding the logs (ring bufer)
+ * @log_start: index of next character to read
+ * @log_end: index of next character to write
+ * @lock: lock protecting log_buff, log_start & log_end
+ * @queue_wait: log reader's wait queue
+ */
+#ifdef CONFIG_BATMAN_ADV_DEBUG
+struct batadv_priv_debug_log {
+       char log_buff[BATADV_LOG_BUF_LEN];
+       unsigned long log_start;
+       unsigned long log_end;
+       spinlock_t lock; /* protects log_buff, log_start and log_end */
+       wait_queue_head_t queue_wait;
+};
+#endif
+
+/**
+ * struct batadv_priv_gw - per mesh interface gateway data
+ * @list: list of available gateway nodes
+ * @list_lock: lock protecting gw_list & curr_gw
+ * @curr_gw: pointer to currently selected gateway node
+ * @reselect: bool indicating a gateway re-selection is in progress
+ */
 struct batadv_priv_gw {
        struct hlist_head list;
-       spinlock_t list_lock; /* protects gw_list and curr_gw */
+       spinlock_t list_lock; /* protects gw_list & curr_gw */
        struct batadv_gw_node __rcu *curr_gw;  /* rcu protected pointer */
        atomic_t reselect;
 };
 
+/**
+ * struct batadv_priv_vis - per mesh interface vis data
+ * @send_list: list of batadv_vis_info packets to sent
+ * @hash: hash table containing vis data from other nodes in the network
+ * @hash_lock: lock protecting the hash table
+ * @list_lock: lock protecting my_info::recv_list
+ * @work: work queue callback item for vis packet sending
+ * @my_info: holds this node's vis data sent on a regular basis
+ */
 struct batadv_priv_vis {
        struct list_head send_list;
        struct batadv_hashtable *hash;
        spinlock_t hash_lock; /* protects hash */
-       spinlock_t list_lock; /* protects info::recv_list */
+       spinlock_t list_lock; /* protects my_info::recv_list */
        struct delayed_work work;
        struct batadv_vis_info *my_info;
 };
@@ -265,30 +427,78 @@ struct batadv_priv_dat {
 };
 #endif
 
+/**
+ * struct batadv_priv - per mesh interface data
+ * @mesh_state: current status of the mesh (inactive/active/deactivating)
+ * @soft_iface: net device which holds this struct as private data
+ * @stats: structure holding the data for the ndo_get_stats() call
+ * @bat_counters: mesh internal traffic statistic counters (see batadv_counters)
+ * @aggregated_ogms: bool indicating whether OGM aggregation is enabled
+ * @bonding: bool indicating whether traffic bonding is enabled
+ * @fragmentation: bool indicating whether traffic fragmentation is enabled
+ * @ap_isolation: bool indicating whether ap isolation is enabled
+ * @bridge_loop_avoidance: bool indicating whether bridge loop avoidance is
+ *  enabled
+ * @distributed_arp_table: bool indicating whether distributed ARP table is
+ *  enabled
+ * @vis_mode: vis operation: client or server (see batadv_vis_packettype)
+ * @gw_mode: gateway operation: off, client or server (see batadv_gw_modes)
+ * @gw_sel_class: gateway selection class (applies if gw_mode client)
+ * @gw_bandwidth: gateway announced bandwidth (applies if gw_mode server)
+ * @orig_interval: OGM broadcast interval in milliseconds
+ * @hop_penalty: penalty which will be applied to an OGM's tq-field on every hop
+ * @log_level: configured log level (see batadv_dbg_level)
+ * @bcast_seqno: last sent broadcast packet sequence number
+ * @bcast_queue_left: number of remaining buffered broadcast packet slots
+ * @batman_queue_left: number of remaining OGM packet slots
+ * @num_ifaces: number of interfaces assigned to this mesh interface
+ * @mesh_obj: kobject for sysfs mesh subdirectory
+ * @debug_dir: dentry for debugfs batman-adv subdirectory
+ * @forw_bat_list: list of aggregated OGMs that will be forwarded
+ * @forw_bcast_list: list of broadcast packets that will be rebroadcasted
+ * @orig_hash: hash table containing mesh participants (orig nodes)
+ * @forw_bat_list_lock: lock protecting forw_bat_list
+ * @forw_bcast_list_lock: lock protecting forw_bcast_list
+ * @orig_work: work queue callback item for orig node purging
+ * @cleanup_work: work queue callback item for soft interface deinit
+ * @primary_if: one of the hard interfaces assigned to this mesh interface
+ *  becomes the primary interface
+ * @bat_algo_ops: routing algorithm used by this mesh interface
+ * @bla: bridge loope avoidance data
+ * @debug_log: holding debug logging relevant data
+ * @gw: gateway data
+ * @tt: translation table data
+ * @vis: vis data
+ * @dat: distributed arp table data
+ */
 struct batadv_priv {
        atomic_t mesh_state;
+       struct net_device *soft_iface;
        struct net_device_stats stats;
        uint64_t __percpu *bat_counters; /* Per cpu counters */
-       atomic_t aggregated_ogms;       /* boolean */
-       atomic_t bonding;               /* boolean */
-       atomic_t fragmentation;         /* boolean */
-       atomic_t ap_isolation;          /* boolean */
-       atomic_t bridge_loop_avoidance; /* boolean */
+       atomic_t aggregated_ogms;
+       atomic_t bonding;
+       atomic_t fragmentation;
+       atomic_t ap_isolation;
+#ifdef CONFIG_BATMAN_ADV_BLA
+       atomic_t bridge_loop_avoidance;
+#endif
 #ifdef CONFIG_BATMAN_ADV_DAT
-       atomic_t distributed_arp_table; /* boolean */
+       atomic_t distributed_arp_table;
+#endif
+       atomic_t vis_mode;
+       atomic_t gw_mode;
+       atomic_t gw_sel_class;
+       atomic_t gw_bandwidth;
+       atomic_t orig_interval;
+       atomic_t hop_penalty;
+#ifdef CONFIG_BATMAN_ADV_DEBUG
+       atomic_t log_level;
 #endif
-       atomic_t vis_mode;              /* VIS_TYPE_* */
-       atomic_t gw_mode;               /* GW_MODE_* */
-       atomic_t gw_sel_class;          /* uint */
-       atomic_t gw_bandwidth;          /* gw bandwidth */
-       atomic_t orig_interval;         /* uint */
-       atomic_t hop_penalty;           /* uint */
-       atomic_t log_level;             /* uint */
        atomic_t bcast_seqno;
        atomic_t bcast_queue_left;
        atomic_t batman_queue_left;
        char num_ifaces;
-       struct batadv_debug_log *debug_log;
        struct kobject *mesh_obj;
        struct dentry *debug_dir;
        struct hlist_head forw_bat_list;
@@ -297,10 +507,14 @@ struct batadv_priv {
        spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
        spinlock_t forw_bcast_list_lock; /* protects forw_bcast_list */
        struct delayed_work orig_work;
+       struct work_struct cleanup_work;
        struct batadv_hard_iface __rcu *primary_if;  /* rcu protected pointer */
        struct batadv_algo_ops *bat_algo_ops;
 #ifdef CONFIG_BATMAN_ADV_BLA
        struct batadv_priv_bla bla;
+#endif
+#ifdef CONFIG_BATMAN_ADV_DEBUG
+       struct batadv_priv_debug_log *debug_log;
 #endif
        struct batadv_priv_gw gw;
        struct batadv_priv_tt tt;
@@ -310,21 +524,97 @@ struct batadv_priv {
 #endif
 };
 
+/**
+ * struct batadv_socket_client - layer2 icmp socket client data
+ * @queue_list: packet queue for packets destined for this socket client
+ * @queue_len: number of packets in the packet queue (queue_list)
+ * @index: socket client's index in the batadv_socket_client_hash
+ * @lock: lock protecting queue_list, queue_len & index
+ * @queue_wait: socket client's wait queue
+ * @bat_priv: pointer to soft_iface this client belongs to
+ */
 struct batadv_socket_client {
        struct list_head queue_list;
        unsigned int queue_len;
        unsigned char index;
-       spinlock_t lock; /* protects queue_list, queue_len, index */
+       spinlock_t lock; /* protects queue_list, queue_len & index */
        wait_queue_head_t queue_wait;
        struct batadv_priv *bat_priv;
 };
 
+/**
+ * struct batadv_socket_packet - layer2 icmp packet for socket client
+ * @list: list node for batadv_socket_client::queue_list
+ * @icmp_len: size of the layer2 icmp packet
+ * @icmp_packet: layer2 icmp packet
+ */
 struct batadv_socket_packet {
        struct list_head list;
        size_t icmp_len;
        struct batadv_icmp_packet_rr icmp_packet;
 };
 
+/**
+ * struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN
+ * @orig: originator address of backbone node (mac address of primary iface)
+ * @vid: vlan id this gateway was detected on
+ * @hash_entry: hlist node for batadv_priv_bla::backbone_hash
+ * @bat_priv: pointer to soft_iface this backbone gateway belongs to
+ * @lasttime: last time we heard of this backbone gw
+ * @wait_periods: grace time for bridge forward delays and bla group forming at
+ *  bootup phase - no bcast traffic is formwared until it has elapsed
+ * @request_sent: if this bool is set to true we are out of sync with this
+ *  backbone gateway - no bcast traffic is formwared until the situation was
+ *  resolved
+ * @crc: crc16 checksum over all claims
+ * @refcount: number of contexts the object is used
+ * @rcu: struct used for freeing in an RCU-safe manner
+ */
+#ifdef CONFIG_BATMAN_ADV_BLA
+struct batadv_bla_backbone_gw {
+       uint8_t orig[ETH_ALEN];
+       short vid;
+       struct hlist_node hash_entry;
+       struct batadv_priv *bat_priv;
+       unsigned long lasttime;
+       atomic_t wait_periods;
+       atomic_t request_sent;
+       uint16_t crc;
+       atomic_t refcount;
+       struct rcu_head rcu;
+};
+
+/**
+ * struct batadv_bla_claim - claimed non-mesh client structure
+ * @addr: mac address of claimed non-mesh client
+ * @vid: vlan id this client was detected on
+ * @batadv_bla_backbone_gw: pointer to backbone gw claiming this client
+ * @lasttime: last time we heard of claim (locals only)
+ * @hash_entry: hlist node for batadv_priv_bla::claim_hash
+ * @refcount: number of contexts the object is used
+ * @rcu: struct used for freeing in an RCU-safe manner
+ */
+struct batadv_bla_claim {
+       uint8_t addr[ETH_ALEN];
+       short vid;
+       struct batadv_bla_backbone_gw *backbone_gw;
+       unsigned long lasttime;
+       struct hlist_node hash_entry;
+       struct rcu_head rcu;
+       atomic_t refcount;
+};
+#endif
+
+/**
+ * struct batadv_tt_common_entry - tt local & tt global common data
+ * @addr: mac address of non-mesh client
+ * @hash_entry: hlist node for batadv_priv_tt::local_hash or for
+ *  batadv_priv_tt::global_hash
+ * @flags: various state handling flags (see batadv_tt_client_flags)
+ * @added_at: timestamp used for purging stale tt common entries
+ * @refcount: number of contexts the object is used
+ * @rcu: struct used for freeing in an RCU-safe manner
+ */
 struct batadv_tt_common_entry {
        uint8_t addr[ETH_ALEN];
        struct hlist_node hash_entry;
@@ -334,62 +624,76 @@ struct batadv_tt_common_entry {
        struct rcu_head rcu;
 };
 
+/**
+ * struct batadv_tt_local_entry - translation table local entry data
+ * @common: general translation table data
+ * @last_seen: timestamp used for purging stale tt local entries
+ */
 struct batadv_tt_local_entry {
        struct batadv_tt_common_entry common;
        unsigned long last_seen;
 };
 
+/**
+ * struct batadv_tt_global_entry - translation table global entry data
+ * @common: general translation table data
+ * @orig_list: list of orig nodes announcing this non-mesh client
+ * @list_lock: lock protecting orig_list
+ * @roam_at: time at which TT_GLOBAL_ROAM was set
+ */
 struct batadv_tt_global_entry {
        struct batadv_tt_common_entry common;
        struct hlist_head orig_list;
-       spinlock_t list_lock;   /* protects the list */
-       unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */
+       spinlock_t list_lock;   /* protects orig_list */
+       unsigned long roam_at;
 };
 
+/**
+ * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client
+ * @orig_node: pointer to orig node announcing this non-mesh client
+ * @ttvn: translation table version number which added the non-mesh client
+ * @list: list node for batadv_tt_global_entry::orig_list
+ * @refcount: number of contexts the object is used
+ * @rcu: struct used for freeing in an RCU-safe manner
+ */
 struct batadv_tt_orig_list_entry {
        struct batadv_orig_node *orig_node;
        uint8_t ttvn;
-       atomic_t refcount;
-       struct rcu_head rcu;
        struct hlist_node list;
-};
-
-#ifdef CONFIG_BATMAN_ADV_BLA
-struct batadv_backbone_gw {
-       uint8_t orig[ETH_ALEN];
-       short vid;              /* used VLAN ID */
-       struct hlist_node hash_entry;
-       struct batadv_priv *bat_priv;
-       unsigned long lasttime; /* last time we heard of this backbone gw */
-       atomic_t wait_periods;
-       atomic_t request_sent;
        atomic_t refcount;
        struct rcu_head rcu;
-       uint16_t crc;           /* crc checksum over all claims */
-};
-
-struct batadv_claim {
-       uint8_t addr[ETH_ALEN];
-       short vid;
-       struct batadv_backbone_gw *backbone_gw;
-       unsigned long lasttime; /* last time we heard of claim (locals only) */
-       struct rcu_head rcu;
-       atomic_t refcount;
-       struct hlist_node hash_entry;
 };
-#endif
 
+/**
+ * struct batadv_tt_change_node - structure for tt changes occured
+ * @list: list node for batadv_priv_tt::changes_list
+ * @change: holds the actual translation table diff data
+ */
 struct batadv_tt_change_node {
        struct list_head list;
        struct batadv_tt_change change;
 };
 
+/**
+ * struct batadv_tt_req_node - data to keep track of the tt requests in flight
+ * @addr: mac address address of the originator this request was sent to
+ * @issued_at: timestamp used for purging stale tt requests
+ * @list: list node for batadv_priv_tt::req_list
+ */
 struct batadv_tt_req_node {
        uint8_t addr[ETH_ALEN];
        unsigned long issued_at;
        struct list_head list;
 };
 
+/**
+ * struct batadv_tt_roam_node - roaming client data
+ * @addr: mac address of the client in the roaming phase
+ * @counter: number of allowed roaming events per client within a single
+ *  OGM interval (changes are committed with each OGM)
+ * @first_time: timestamp used for purging stale roaming node entries
+ * @list: list node for batadv_priv_tt::roam_list
+ */
 struct batadv_tt_roam_node {
        uint8_t addr[ETH_ALEN];
        atomic_t counter;
@@ -397,8 +701,19 @@ struct batadv_tt_roam_node {
        struct list_head list;
 };
 
-/*     forw_packet - structure for forw_list maintaining packets to be
- *                   send/forwarded
+/**
+ * struct batadv_forw_packet - structure for bcast packets to be sent/forwarded
+ * @list: list node for batadv_socket_client::queue_list
+ * @send_time: execution time for delayed_work (packet sending)
+ * @own: bool for locally generated packets (local OGMs are re-scheduled after
+ *  sending)
+ * @skb: bcast packet's skb buffer
+ * @packet_len: size of aggregated OGM packet inside the skb buffer
+ * @direct_link_flags: direct link flags for aggregated OGM packets
+ * @num_packets: counter for bcast packet retransmission
+ * @delayed_work: work queue callback item for packet sending
+ * @if_incoming: pointer incoming hard-iface or primary iface if locally
+ *  generated packet
  */
 struct batadv_forw_packet {
        struct hlist_node list;
@@ -412,72 +727,98 @@ struct batadv_forw_packet {
        struct batadv_hard_iface *if_incoming;
 };
 
-/* While scanning for vis-entries of a particular vis-originator
- * this list collects its interfaces to create a subgraph/cluster
- * out of them later
+/**
+ * struct batadv_frag_packet_list_entry - storage for fragment packet
+ * @list: list node for orig_node::frag_list
+ * @seqno: sequence number of the fragment
+ * @skb: fragment's skb buffer
  */
-struct batadv_if_list_entry {
-       uint8_t addr[ETH_ALEN];
-       bool primary;
-       struct hlist_node list;
-};
-
-struct batadv_debug_log {
-       char log_buff[BATADV_LOG_BUF_LEN];
-       unsigned long log_start;
-       unsigned long log_end;
-       spinlock_t lock; /* protects log_buff, log_start and log_end */
-       wait_queue_head_t queue_wait;
-};
-
 struct batadv_frag_packet_list_entry {
        struct list_head list;
        uint16_t seqno;
        struct sk_buff *skb;
 };
 
+/**
+ * struct batadv_vis_info - local data for vis information
+ * @first_seen: timestamp used for purging stale vis info entries
+ * @recv_list: List of server-neighbors we have received this packet from. This
+ *  packet should not be re-forward to them again. List elements are struct
+ *  batadv_vis_recvlist_node
+ * @send_list: list of packets to be forwarded
+ * @refcount: number of contexts the object is used
+ * @hash_entry: hlist node for batadv_priv_vis::hash
+ * @bat_priv: pointer to soft_iface this orig node belongs to
+ * @skb_packet: contains the vis packet
+ */
 struct batadv_vis_info {
        unsigned long first_seen;
-       /* list of server-neighbors we received a vis-packet
-        * from.  we should not reply to them.
-        */
        struct list_head recv_list;
        struct list_head send_list;
        struct kref refcount;
        struct hlist_node hash_entry;
        struct batadv_priv *bat_priv;
-       /* this packet might be part of the vis send queue. */
        struct sk_buff *skb_packet;
-       /* vis_info may follow here */
 } __packed;
 
+/**
+ * struct batadv_vis_info_entry - contains link information for vis
+ * @src: source MAC of the link, all zero for local TT entry
+ * @dst: destination MAC of the link, client mac address for local TT entry
+ * @quality: transmission quality of the link, or 0 for local TT entry
+ */
 struct batadv_vis_info_entry {
        uint8_t  src[ETH_ALEN];
        uint8_t  dest[ETH_ALEN];
-       uint8_t  quality;       /* quality = 0 client */
+       uint8_t  quality;
 } __packed;
 
-struct batadv_recvlist_node {
+/**
+ * struct batadv_vis_recvlist_node - list entry for batadv_vis_info::recv_list
+ * @list: list node for batadv_vis_info::recv_list
+ * @mac: MAC address of the originator from where the vis_info was received
+ */
+struct batadv_vis_recvlist_node {
        struct list_head list;
        uint8_t mac[ETH_ALEN];
 };
 
+/**
+ * struct batadv_vis_if_list_entry - auxiliary data for vis data generation
+ * @addr: MAC address of the interface
+ * @primary: true if this interface is the primary interface
+ * @list: list node the interface list
+ *
+ * While scanning for vis-entries of a particular vis-originator
+ * this list collects its interfaces to create a subgraph/cluster
+ * out of them later
+ */
+struct batadv_vis_if_list_entry {
+       uint8_t addr[ETH_ALEN];
+       bool primary;
+       struct hlist_node list;
+};
+
+/**
+ * struct batadv_algo_ops - mesh algorithm callbacks
+ * @list: list node for the batadv_algo_list
+ * @name: name of the algorithm
+ * @bat_iface_enable: init routing info when hard-interface is enabled
+ * @bat_iface_disable: de-init routing info when hard-interface is disabled
+ * @bat_iface_update_mac: (re-)init mac addresses of the protocol information
+ *  belonging to this hard-interface
+ * @bat_primary_iface_set: called when primary interface is selected / changed
+ * @bat_ogm_schedule: prepare a new outgoing OGM for the send queue
+ * @bat_ogm_emit: send scheduled OGM
+ */
 struct batadv_algo_ops {
        struct hlist_node list;
        char *name;
-       /* init routing info when hard-interface is enabled */
        int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface);
-       /* de-init routing info when hard-interface is disabled */
        void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface);
-       /* (re-)init mac addresses of the protocol information
-        * belonging to this hard-interface
-        */
        void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface);
-       /* called when primary interface is selected / changed */
        void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface);
-       /* prepare a new outgoing OGM for the send queue */
        void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface);
-       /* send scheduled OGM */
        void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet);
 };
 
index 10aff49fcf25adb106cefb020309e456d8f04a2f..50e079f00be62aeb7530a88d70edc42215dff743 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors:
  *
  * Andreas Langer
  *
@@ -133,7 +133,6 @@ batadv_frag_search_packet(struct list_head *head,
        is_head = !!(up->flags & BATADV_UNI_FRAG_HEAD);
 
        list_for_each_entry(tfp, head, list) {
-
                if (!tfp->skb)
                        continue;
 
@@ -162,7 +161,6 @@ void batadv_frag_list_free(struct list_head *head)
        struct batadv_frag_packet_list_entry *pf, *tmp_pf;
 
        if (!list_empty(head)) {
-
                list_for_each_entry_safe(pf, tmp_pf, head, list) {
                        kfree_skb(pf->skb);
                        list_del(&pf->list);
index 61abba58bd8fee1ac6be8b043927d52ddf9f141b..429cf8a4a31eb367f727d494af43077b10f12854 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors:
  *
  * Andreas Langer
  *
index 0f65a9de5f749719b9b778cd8c989680b0b1eb4d..22d2785177d15f63b8c853cc4a5910858b268f0b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2008-2013 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich
  *
 
 #define BATADV_MAX_VIS_PACKET_SIZE 1000
 
-static void batadv_start_vis_timer(struct batadv_priv *bat_priv);
+/* hash class keys */
+static struct lock_class_key batadv_vis_hash_lock_class_key;
 
 /* free the info */
 static void batadv_free_info(struct kref *ref)
 {
        struct batadv_vis_info *info;
        struct batadv_priv *bat_priv;
-       struct batadv_recvlist_node *entry, *tmp;
+       struct batadv_vis_recvlist_node *entry, *tmp;
 
        info = container_of(ref, struct batadv_vis_info, refcount);
        bat_priv = info->bat_priv;
@@ -126,7 +127,7 @@ static void batadv_vis_data_insert_interface(const uint8_t *interface,
                                             struct hlist_head *if_list,
                                             bool primary)
 {
-       struct batadv_if_list_entry *entry;
+       struct batadv_vis_if_list_entry *entry;
        struct hlist_node *pos;
 
        hlist_for_each_entry(entry, pos, if_list, list) {
@@ -146,7 +147,7 @@ static void batadv_vis_data_insert_interface(const uint8_t *interface,
 static void batadv_vis_data_read_prim_sec(struct seq_file *seq,
                                          const struct hlist_head *if_list)
 {
-       struct batadv_if_list_entry *entry;
+       struct batadv_vis_if_list_entry *entry;
        struct hlist_node *pos;
 
        hlist_for_each_entry(entry, pos, if_list, list) {
@@ -196,7 +197,7 @@ static void batadv_vis_data_read_entries(struct seq_file *seq,
                                         struct batadv_vis_info_entry *entries)
 {
        int i;
-       struct batadv_if_list_entry *entry;
+       struct batadv_vis_if_list_entry *entry;
        struct hlist_node *pos;
 
        hlist_for_each_entry(entry, pos, list, list) {
@@ -222,7 +223,7 @@ static void batadv_vis_seq_print_text_bucket(struct seq_file *seq,
        struct batadv_vis_packet *packet;
        uint8_t *entries_pos;
        struct batadv_vis_info_entry *entries;
-       struct batadv_if_list_entry *entry;
+       struct batadv_vis_if_list_entry *entry;
        struct hlist_node *pos, *n;
 
        HLIST_HEAD(vis_if_list);
@@ -304,7 +305,7 @@ static void batadv_send_list_del(struct batadv_vis_info *info)
 static void batadv_recv_list_add(struct batadv_priv *bat_priv,
                                 struct list_head *recv_list, const char *mac)
 {
-       struct batadv_recvlist_node *entry;
+       struct batadv_vis_recvlist_node *entry;
 
        entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
        if (!entry)
@@ -321,7 +322,7 @@ static int batadv_recv_list_is_in(struct batadv_priv *bat_priv,
                                  const struct list_head *recv_list,
                                  const char *mac)
 {
-       const struct batadv_recvlist_node *entry;
+       const struct batadv_vis_recvlist_node *entry;
 
        spin_lock_bh(&bat_priv->vis.list_lock);
        list_for_each_entry(entry, recv_list, list) {
@@ -827,7 +828,9 @@ static void batadv_send_vis_packets(struct work_struct *work)
                kref_put(&info->refcount, batadv_free_info);
        }
        spin_unlock_bh(&bat_priv->vis.hash_lock);
-       batadv_start_vis_timer(bat_priv);
+
+       queue_delayed_work(batadv_event_workqueue, &bat_priv->vis.work,
+                          msecs_to_jiffies(BATADV_VIS_INTERVAL));
 }
 
 /* init the vis server. this may only be called when if_list is already
@@ -852,6 +855,9 @@ int batadv_vis_init(struct batadv_priv *bat_priv)
                goto err;
        }
 
+       batadv_hash_set_lock_class(bat_priv->vis.hash,
+                                  &batadv_vis_hash_lock_class_key);
+
        bat_priv->vis.my_info = kmalloc(BATADV_MAX_VIS_PACKET_SIZE, GFP_ATOMIC);
        if (!bat_priv->vis.my_info)
                goto err;
@@ -894,7 +900,11 @@ int batadv_vis_init(struct batadv_priv *bat_priv)
        }
 
        spin_unlock_bh(&bat_priv->vis.hash_lock);
-       batadv_start_vis_timer(bat_priv);
+
+       INIT_DELAYED_WORK(&bat_priv->vis.work, batadv_send_vis_packets);
+       queue_delayed_work(batadv_event_workqueue, &bat_priv->vis.work,
+                          msecs_to_jiffies(BATADV_VIS_INTERVAL));
+
        return 0;
 
 free_info:
@@ -931,11 +941,3 @@ void batadv_vis_quit(struct batadv_priv *bat_priv)
        bat_priv->vis.my_info = NULL;
        spin_unlock_bh(&bat_priv->vis.hash_lock);
 }
-
-/* schedule packets for (re)transmission */
-static void batadv_start_vis_timer(struct batadv_priv *bat_priv)
-{
-       INIT_DELAYED_WORK(&bat_priv->vis.work, batadv_send_vis_packets);
-       queue_delayed_work(batadv_event_workqueue, &bat_priv->vis.work,
-                          msecs_to_jiffies(BATADV_VIS_INTERVAL));
-}
index 873282fa86dadce0671c1c928a44903229462543..ad92b0e3c230de211bfd2aca90f1c9431bc1b9c1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008-2012 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2008-2013 B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index 5391ca43336a7d518c1640f855ecc7b739ce7226..6d6f26531de227004450456065fc51a8ee0c7c73 100644 (file)
@@ -1608,7 +1608,6 @@ void br_multicast_init(struct net_bridge *br)
                    br_multicast_querier_expired, (unsigned long)br);
        setup_timer(&br->multicast_query_timer, br_multicast_query_expired,
                    (unsigned long)br);
-       br_mdb_init();
 }
 
 void br_multicast_open(struct net_bridge *br)
@@ -1633,7 +1632,6 @@ void br_multicast_stop(struct net_bridge *br)
        del_timer_sync(&br->multicast_querier_timer);
        del_timer_sync(&br->multicast_query_timer);
 
-       br_mdb_uninit();
        spin_lock_bh(&br->multicast_lock);
        mdb = mlock_dereference(br->mdb, br);
        if (!mdb)
index caa3f6919436a2a262b3085f56d9e1960530d02c..39ca9796f3f7a4cfe9c9be437749fbda939d5152 100644 (file)
@@ -302,10 +302,21 @@ struct rtnl_link_ops br_link_ops __read_mostly = {
 
 int __init br_netlink_init(void)
 {
-       return rtnl_link_register(&br_link_ops);
+       int err;
+
+       br_mdb_init();
+       err = rtnl_link_register(&br_link_ops);
+       if (err)
+               goto out;
+
+       return 0;
+out:
+       br_mdb_uninit();
+       return err;
 }
 
 void __exit br_netlink_fini(void)
 {
+       br_mdb_uninit();
        rtnl_link_unregister(&br_link_ops);
 }
index 8d83be5ffedcd8d04fdff6edf715947f56a1fbcc..711094aed41a29f967cf925c1863f569dff023d0 100644 (file)
@@ -526,6 +526,12 @@ static inline bool br_multicast_is_router(struct net_bridge *br)
 {
        return 0;
 }
+static inline void br_mdb_init(void)
+{
+}
+static inline void br_mdb_uninit(void)
+{
+}
 #endif
 
 /* br_netfilter.c */
index 4d111fd2b4923f7fe7cd287de00029b19c61f274..5ccf87ed8d688820a23ba1267439abe149398ec2 100644 (file)
@@ -506,6 +506,7 @@ static void reset_connection(struct ceph_connection *con)
 {
        /* reset connection, out_queue, msg_ and connect_seq */
        /* discard existing out_queue and msg_seq */
+       dout("reset_connection %p\n", con);
        ceph_msg_remove_list(&con->out_queue);
        ceph_msg_remove_list(&con->out_sent);
 
@@ -561,7 +562,7 @@ void ceph_con_open(struct ceph_connection *con,
        mutex_lock(&con->mutex);
        dout("con_open %p %s\n", con, ceph_pr_addr(&addr->in_addr));
 
-       BUG_ON(con->state != CON_STATE_CLOSED);
+       WARN_ON(con->state != CON_STATE_CLOSED);
        con->state = CON_STATE_PREOPEN;
 
        con->peer_name.type = (__u8) entity_type;
@@ -1506,13 +1507,6 @@ static int process_banner(struct ceph_connection *con)
        return 0;
 }
 
-static void fail_protocol(struct ceph_connection *con)
-{
-       reset_connection(con);
-       BUG_ON(con->state != CON_STATE_NEGOTIATING);
-       con->state = CON_STATE_CLOSED;
-}
-
 static int process_connect(struct ceph_connection *con)
 {
        u64 sup_feat = con->msgr->supported_features;
@@ -1530,7 +1524,7 @@ static int process_connect(struct ceph_connection *con)
                       ceph_pr_addr(&con->peer_addr.in_addr),
                       sup_feat, server_feat, server_feat & ~sup_feat);
                con->error_msg = "missing required protocol features";
-               fail_protocol(con);
+               reset_connection(con);
                return -1;
 
        case CEPH_MSGR_TAG_BADPROTOVER:
@@ -1541,7 +1535,7 @@ static int process_connect(struct ceph_connection *con)
                       le32_to_cpu(con->out_connect.protocol_version),
                       le32_to_cpu(con->in_reply.protocol_version));
                con->error_msg = "protocol version mismatch";
-               fail_protocol(con);
+               reset_connection(con);
                return -1;
 
        case CEPH_MSGR_TAG_BADAUTHORIZER:
@@ -1631,11 +1625,11 @@ static int process_connect(struct ceph_connection *con)
                               ceph_pr_addr(&con->peer_addr.in_addr),
                               req_feat, server_feat, req_feat & ~server_feat);
                        con->error_msg = "missing required protocol features";
-                       fail_protocol(con);
+                       reset_connection(con);
                        return -1;
                }
 
-               BUG_ON(con->state != CON_STATE_NEGOTIATING);
+               WARN_ON(con->state != CON_STATE_NEGOTIATING);
                con->state = CON_STATE_OPEN;
 
                con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq);
@@ -2132,7 +2126,6 @@ more:
                if (ret < 0)
                        goto out;
 
-               BUG_ON(con->state != CON_STATE_CONNECTING);
                con->state = CON_STATE_NEGOTIATING;
 
                /*
@@ -2160,7 +2153,7 @@ more:
                goto more;
        }
 
-       BUG_ON(con->state != CON_STATE_OPEN);
+       WARN_ON(con->state != CON_STATE_OPEN);
 
        if (con->in_base_pos < 0) {
                /*
@@ -2382,7 +2375,7 @@ static void ceph_fault(struct ceph_connection *con)
        dout("fault %p state %lu to peer %s\n",
             con, con->state, ceph_pr_addr(&con->peer_addr.in_addr));
 
-       BUG_ON(con->state != CON_STATE_CONNECTING &&
+       WARN_ON(con->state != CON_STATE_CONNECTING &&
               con->state != CON_STATE_NEGOTIATING &&
               con->state != CON_STATE_OPEN);
 
index 780caf6b049188cd20e043f2206b23600223b820..eb9a4447876481e9a4110a1e68ea351ce3ec86d9 100644 (file)
@@ -1270,7 +1270,7 @@ static void reset_changed_osds(struct ceph_osd_client *osdc)
  * Requeue requests whose mapping to an OSD has changed.  If requests map to
  * no osd, request a new map.
  *
- * Caller should hold map_sem for read and request_mutex.
+ * Caller should hold map_sem for read.
  */
 static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
 {
@@ -1284,6 +1284,24 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
        for (p = rb_first(&osdc->requests); p; ) {
                req = rb_entry(p, struct ceph_osd_request, r_node);
                p = rb_next(p);
+
+               /*
+                * For linger requests that have not yet been
+                * registered, move them to the linger list; they'll
+                * be sent to the osd in the loop below.  Unregister
+                * the request before re-registering it as a linger
+                * request to ensure the __map_request() below
+                * will decide it needs to be sent.
+                */
+               if (req->r_linger && list_empty(&req->r_linger_item)) {
+                       dout("%p tid %llu restart on osd%d\n",
+                            req, req->r_tid,
+                            req->r_osd ? req->r_osd->o_osd : -1);
+                       __unregister_request(osdc, req);
+                       __register_linger_request(osdc, req);
+                       continue;
+               }
+
                err = __map_request(osdc, req, force_resend);
                if (err < 0)
                        continue;  /* error */
@@ -1298,17 +1316,6 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
                                req->r_flags |= CEPH_OSD_FLAG_RETRY;
                        }
                }
-               if (req->r_linger && list_empty(&req->r_linger_item)) {
-                       /*
-                        * register as a linger so that we will
-                        * re-submit below and get a new tid
-                        */
-                       dout("%p tid %llu restart on osd%d\n",
-                            req, req->r_tid,
-                            req->r_osd ? req->r_osd->o_osd : -1);
-                       __register_linger_request(osdc, req);
-                       __unregister_request(osdc, req);
-               }
        }
 
        list_for_each_entry_safe(req, nreq, &osdc->req_linger,
@@ -1316,6 +1323,7 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
                dout("linger req=%p req->r_osd=%p\n", req, req->r_osd);
 
                err = __map_request(osdc, req, force_resend);
+               dout("__map_request returned %d\n", err);
                if (err == 0)
                        continue;  /* no change and no osd was specified */
                if (err < 0)
@@ -1337,6 +1345,7 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend)
                dout("%d requests for down osds, need new map\n", needmap);
                ceph_monc_request_next_osdmap(&osdc->client->monc);
        }
+       reset_changed_osds(osdc);
 }
 
 
@@ -1393,7 +1402,6 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
                                osdc->osdmap = newmap;
                        }
                        kick_requests(osdc, 0);
-                       reset_changed_osds(osdc);
                } else {
                        dout("ignoring incremental map %u len %d\n",
                             epoch, maplen);
index a51ccf46e8b737e07683f08b1b9f298b8177f033..c69cd8721b284051ee29febdb3f778ba1df2935a 100644 (file)
 #include <linux/cpu_rmap.h>
 #include <linux/net_tstamp.h>
 #include <linux/static_key.h>
-#include <net/flow_keys.h>
 
 #include "net-sysfs.h"
 
@@ -1857,6 +1856,228 @@ static void netif_setup_tc(struct net_device *dev, unsigned int txq)
        }
 }
 
+#ifdef CONFIG_XPS
+static DEFINE_MUTEX(xps_map_mutex);
+#define xmap_dereference(P)            \
+       rcu_dereference_protected((P), lockdep_is_held(&xps_map_mutex))
+
+static struct xps_map *remove_xps_queue(struct xps_dev_maps *dev_maps,
+                                       int cpu, u16 index)
+{
+       struct xps_map *map = NULL;
+       int pos;
+
+       if (dev_maps)
+               map = xmap_dereference(dev_maps->cpu_map[cpu]);
+
+       for (pos = 0; map && pos < map->len; pos++) {
+               if (map->queues[pos] == index) {
+                       if (map->len > 1) {
+                               map->queues[pos] = map->queues[--map->len];
+                       } else {
+                               RCU_INIT_POINTER(dev_maps->cpu_map[cpu], NULL);
+                               kfree_rcu(map, rcu);
+                               map = NULL;
+                       }
+                       break;
+               }
+       }
+
+       return map;
+}
+
+static void netif_reset_xps_queues_gt(struct net_device *dev, u16 index)
+{
+       struct xps_dev_maps *dev_maps;
+       int cpu, i;
+       bool active = false;
+
+       mutex_lock(&xps_map_mutex);
+       dev_maps = xmap_dereference(dev->xps_maps);
+
+       if (!dev_maps)
+               goto out_no_maps;
+
+       for_each_possible_cpu(cpu) {
+               for (i = index; i < dev->num_tx_queues; i++) {
+                       if (!remove_xps_queue(dev_maps, cpu, i))
+                               break;
+               }
+               if (i == dev->num_tx_queues)
+                       active = true;
+       }
+
+       if (!active) {
+               RCU_INIT_POINTER(dev->xps_maps, NULL);
+               kfree_rcu(dev_maps, rcu);
+       }
+
+       for (i = index; i < dev->num_tx_queues; i++)
+               netdev_queue_numa_node_write(netdev_get_tx_queue(dev, i),
+                                            NUMA_NO_NODE);
+
+out_no_maps:
+       mutex_unlock(&xps_map_mutex);
+}
+
+static struct xps_map *expand_xps_map(struct xps_map *map,
+                                     int cpu, u16 index)
+{
+       struct xps_map *new_map;
+       int alloc_len = XPS_MIN_MAP_ALLOC;
+       int i, pos;
+
+       for (pos = 0; map && pos < map->len; pos++) {
+               if (map->queues[pos] != index)
+                       continue;
+               return map;
+       }
+
+       /* Need to add queue to this CPU's existing map */
+       if (map) {
+               if (pos < map->alloc_len)
+                       return map;
+
+               alloc_len = map->alloc_len * 2;
+       }
+
+       /* Need to allocate new map to store queue on this CPU's map */
+       new_map = kzalloc_node(XPS_MAP_SIZE(alloc_len), GFP_KERNEL,
+                              cpu_to_node(cpu));
+       if (!new_map)
+               return NULL;
+
+       for (i = 0; i < pos; i++)
+               new_map->queues[i] = map->queues[i];
+       new_map->alloc_len = alloc_len;
+       new_map->len = pos;
+
+       return new_map;
+}
+
+int netif_set_xps_queue(struct net_device *dev, struct cpumask *mask, u16 index)
+{
+       struct xps_dev_maps *dev_maps, *new_dev_maps = NULL;
+       struct xps_map *map, *new_map;
+       int maps_sz = max_t(unsigned int, XPS_DEV_MAPS_SIZE, L1_CACHE_BYTES);
+       int cpu, numa_node_id = -2;
+       bool active = false;
+
+       mutex_lock(&xps_map_mutex);
+
+       dev_maps = xmap_dereference(dev->xps_maps);
+
+       /* allocate memory for queue storage */
+       for_each_online_cpu(cpu) {
+               if (!cpumask_test_cpu(cpu, mask))
+                       continue;
+
+               if (!new_dev_maps)
+                       new_dev_maps = kzalloc(maps_sz, GFP_KERNEL);
+               if (!new_dev_maps)
+                       return -ENOMEM;
+
+               map = dev_maps ? xmap_dereference(dev_maps->cpu_map[cpu]) :
+                                NULL;
+
+               map = expand_xps_map(map, cpu, index);
+               if (!map)
+                       goto error;
+
+               RCU_INIT_POINTER(new_dev_maps->cpu_map[cpu], map);
+       }
+
+       if (!new_dev_maps)
+               goto out_no_new_maps;
+
+       for_each_possible_cpu(cpu) {
+               if (cpumask_test_cpu(cpu, mask) && cpu_online(cpu)) {
+                       /* add queue to CPU maps */
+                       int pos = 0;
+
+                       map = xmap_dereference(new_dev_maps->cpu_map[cpu]);
+                       while ((pos < map->len) && (map->queues[pos] != index))
+                               pos++;
+
+                       if (pos == map->len)
+                               map->queues[map->len++] = index;
+#ifdef CONFIG_NUMA
+                       if (numa_node_id == -2)
+                               numa_node_id = cpu_to_node(cpu);
+                       else if (numa_node_id != cpu_to_node(cpu))
+                               numa_node_id = -1;
+#endif
+               } else if (dev_maps) {
+                       /* fill in the new device map from the old device map */
+                       map = xmap_dereference(dev_maps->cpu_map[cpu]);
+                       RCU_INIT_POINTER(new_dev_maps->cpu_map[cpu], map);
+               }
+
+       }
+
+       rcu_assign_pointer(dev->xps_maps, new_dev_maps);
+
+       /* Cleanup old maps */
+       if (dev_maps) {
+               for_each_possible_cpu(cpu) {
+                       new_map = xmap_dereference(new_dev_maps->cpu_map[cpu]);
+                       map = xmap_dereference(dev_maps->cpu_map[cpu]);
+                       if (map && map != new_map)
+                               kfree_rcu(map, rcu);
+               }
+
+               kfree_rcu(dev_maps, rcu);
+       }
+
+       dev_maps = new_dev_maps;
+       active = true;
+
+out_no_new_maps:
+       /* update Tx queue numa node */
+       netdev_queue_numa_node_write(netdev_get_tx_queue(dev, index),
+                                    (numa_node_id >= 0) ? numa_node_id :
+                                    NUMA_NO_NODE);
+
+       if (!dev_maps)
+               goto out_no_maps;
+
+       /* removes queue from unused CPUs */
+       for_each_possible_cpu(cpu) {
+               if (cpumask_test_cpu(cpu, mask) && cpu_online(cpu))
+                       continue;
+
+               if (remove_xps_queue(dev_maps, cpu, index))
+                       active = true;
+       }
+
+       /* free map if not active */
+       if (!active) {
+               RCU_INIT_POINTER(dev->xps_maps, NULL);
+               kfree_rcu(dev_maps, rcu);
+       }
+
+out_no_maps:
+       mutex_unlock(&xps_map_mutex);
+
+       return 0;
+error:
+       /* remove any maps that we added */
+       for_each_possible_cpu(cpu) {
+               new_map = xmap_dereference(new_dev_maps->cpu_map[cpu]);
+               map = dev_maps ? xmap_dereference(dev_maps->cpu_map[cpu]) :
+                                NULL;
+               if (new_map && new_map != map)
+                       kfree(new_map);
+       }
+
+       mutex_unlock(&xps_map_mutex);
+
+       kfree(new_dev_maps);
+       return -ENOMEM;
+}
+EXPORT_SYMBOL(netif_set_xps_queue);
+
+#endif
 /*
  * Routine to help set real_num_tx_queues. To avoid skbs mapped to queues
  * greater then real_num_tx_queues stale skbs on the qdisc must be flushed.
@@ -1880,8 +2101,12 @@ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
                if (dev->num_tc)
                        netif_setup_tc(dev, txq);
 
-               if (txq < dev->real_num_tx_queues)
+               if (txq < dev->real_num_tx_queues) {
                        qdisc_reset_all_tx_gt(dev, txq);
+#ifdef CONFIG_XPS
+                       netif_reset_xps_queues_gt(dev, txq);
+#endif
+               }
        }
 
        dev->real_num_tx_queues = txq;
@@ -2410,126 +2635,28 @@ out:
        return rc;
 }
 
-static u32 hashrnd __read_mostly;
-
-/*
- * Returns a Tx hash based on the given packet descriptor a Tx queues' number
- * to be used as a distribution range.
- */
-u16 __skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb,
-                 unsigned int num_tx_queues)
-{
-       u32 hash;
-       u16 qoffset = 0;
-       u16 qcount = num_tx_queues;
-
-       if (skb_rx_queue_recorded(skb)) {
-               hash = skb_get_rx_queue(skb);
-               while (unlikely(hash >= num_tx_queues))
-                       hash -= num_tx_queues;
-               return hash;
-       }
-
-       if (dev->num_tc) {
-               u8 tc = netdev_get_prio_tc_map(dev, skb->priority);
-               qoffset = dev->tc_to_txq[tc].offset;
-               qcount = dev->tc_to_txq[tc].count;
-       }
-
-       if (skb->sk && skb->sk->sk_hash)
-               hash = skb->sk->sk_hash;
-       else
-               hash = (__force u16) skb->protocol;
-       hash = jhash_1word(hash, hashrnd);
-
-       return (u16) (((u64) hash * qcount) >> 32) + qoffset;
-}
-EXPORT_SYMBOL(__skb_tx_hash);
-
-static inline u16 dev_cap_txqueue(struct net_device *dev, u16 queue_index)
-{
-       if (unlikely(queue_index >= dev->real_num_tx_queues)) {
-               net_warn_ratelimited("%s selects TX queue %d, but real number of TX queues is %d\n",
-                                    dev->name, queue_index,
-                                    dev->real_num_tx_queues);
-               return 0;
-       }
-       return queue_index;
-}
-
-static inline int get_xps_queue(struct net_device *dev, struct sk_buff *skb)
+static void qdisc_pkt_len_init(struct sk_buff *skb)
 {
-#ifdef CONFIG_XPS
-       struct xps_dev_maps *dev_maps;
-       struct xps_map *map;
-       int queue_index = -1;
+       const struct skb_shared_info *shinfo = skb_shinfo(skb);
 
-       rcu_read_lock();
-       dev_maps = rcu_dereference(dev->xps_maps);
-       if (dev_maps) {
-               map = rcu_dereference(
-                   dev_maps->cpu_map[raw_smp_processor_id()]);
-               if (map) {
-                       if (map->len == 1)
-                               queue_index = map->queues[0];
-                       else {
-                               u32 hash;
-                               if (skb->sk && skb->sk->sk_hash)
-                                       hash = skb->sk->sk_hash;
-                               else
-                                       hash = (__force u16) skb->protocol ^
-                                           skb->rxhash;
-                               hash = jhash_1word(hash, hashrnd);
-                               queue_index = map->queues[
-                                   ((u64)hash * map->len) >> 32];
-                       }
-                       if (unlikely(queue_index >= dev->real_num_tx_queues))
-                               queue_index = -1;
-               }
-       }
-       rcu_read_unlock();
-
-       return queue_index;
-#else
-       return -1;
-#endif
-}
-
-struct netdev_queue *netdev_pick_tx(struct net_device *dev,
-                                   struct sk_buff *skb)
-{
-       int queue_index;
-       const struct net_device_ops *ops = dev->netdev_ops;
-
-       if (dev->real_num_tx_queues == 1)
-               queue_index = 0;
-       else if (ops->ndo_select_queue) {
-               queue_index = ops->ndo_select_queue(dev, skb);
-               queue_index = dev_cap_txqueue(dev, queue_index);
-       } else {
-               struct sock *sk = skb->sk;
-               queue_index = sk_tx_queue_get(sk);
-
-               if (queue_index < 0 || skb->ooo_okay ||
-                   queue_index >= dev->real_num_tx_queues) {
-                       int old_index = queue_index;
+       qdisc_skb_cb(skb)->pkt_len = skb->len;
 
-                       queue_index = get_xps_queue(dev, skb);
-                       if (queue_index < 0)
-                               queue_index = skb_tx_hash(dev, skb);
+       /* To get more precise estimation of bytes sent on wire,
+        * we add to pkt_len the headers size of all segments
+        */
+       if (shinfo->gso_size)  {
+               unsigned int hdr_len;
 
-                       if (queue_index != old_index && sk) {
-                               struct dst_entry *dst =
-                                   rcu_dereference_check(sk->sk_dst_cache, 1);
+               /* mac layer + network layer */
+               hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
 
-                               if (dst && skb_dst(skb) == dst)
-                                       sk_tx_queue_set(sk, queue_index);
-                       }
-               }
+               /* + transport layer */
+               if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)))
+                       hdr_len += tcp_hdrlen(skb);
+               else
+                       hdr_len += sizeof(struct udphdr);
+               qdisc_skb_cb(skb)->pkt_len += (shinfo->gso_segs - 1) * hdr_len;
        }
-
-       skb_set_queue_mapping(skb, queue_index);
-       return netdev_get_tx_queue(dev, queue_index);
 }
 
 static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q,
@@ -2540,7 +2667,7 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q,
        bool contended;
        int rc;
 
-       qdisc_skb_cb(skb)->pkt_len = skb->len;
+       qdisc_pkt_len_init(skb);
        qdisc_calculate_pkt_len(skb, q);
        /*
         * Heuristic to force contended enqueues to serialize on a
@@ -2757,41 +2884,6 @@ static inline void ____napi_schedule(struct softnet_data *sd,
        __raise_softirq_irqoff(NET_RX_SOFTIRQ);
 }
 
-/*
- * __skb_get_rxhash: calculate a flow hash based on src/dst addresses
- * and src/dst port numbers.  Sets rxhash in skb to non-zero hash value
- * on success, zero indicates no valid hash.  Also, sets l4_rxhash in skb
- * if hash is a canonical 4-tuple hash over transport ports.
- */
-void __skb_get_rxhash(struct sk_buff *skb)
-{
-       struct flow_keys keys;
-       u32 hash;
-
-       if (!skb_flow_dissect(skb, &keys))
-               return;
-
-       if (keys.ports)
-               skb->l4_rxhash = 1;
-
-       /* get a consistent hash (same value on both flow directions) */
-       if (((__force u32)keys.dst < (__force u32)keys.src) ||
-           (((__force u32)keys.dst == (__force u32)keys.src) &&
-            ((__force u16)keys.port16[1] < (__force u16)keys.port16[0]))) {
-               swap(keys.dst, keys.src);
-               swap(keys.port16[0], keys.port16[1]);
-       }
-
-       hash = jhash_3words((__force u32)keys.dst,
-                           (__force u32)keys.src,
-                           (__force u32)keys.ports, hashrnd);
-       if (!hash)
-               hash = 1;
-
-       skb->rxhash = hash;
-}
-EXPORT_SYMBOL(__skb_get_rxhash);
-
 #ifdef CONFIG_RPS
 
 /* One global table that all flow-based protocols share. */
@@ -3352,7 +3444,8 @@ static int __netif_receive_skb(struct sk_buff *skb)
        orig_dev = skb->dev;
 
        skb_reset_network_header(skb);
-       skb_reset_transport_header(skb);
+       if (!skb_transport_header_was_set(skb))
+               skb_reset_transport_header(skb);
        skb_reset_mac_len(skb);
 
        pt_prev = NULL;
@@ -5675,6 +5768,10 @@ static void rollback_registered_many(struct list_head *head)
 
                /* Remove entries from kobject tree */
                netdev_unregister_kobject(dev);
+#ifdef CONFIG_XPS
+               /* Remove XPS queueing entries */
+               netif_reset_xps_queues_gt(dev, 0);
+#endif
        }
 
        synchronize_net();
@@ -6003,6 +6100,13 @@ int register_netdevice(struct net_device *dev)
        list_netdevice(dev);
        add_device_randomness(dev->dev_addr, dev->addr_len);
 
+       /* If the device has permanent device address, driver should
+        * set dev_addr and also addr_assign_type should be set to
+        * NET_ADDR_PERM (default value).
+        */
+       if (dev->addr_assign_type == NET_ADDR_PERM)
+               memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
+
        /* Notify protocols, that a new device appeared. */
        ret = call_netdevice_notifiers(NETDEV_REGISTER, dev);
        ret = notifier_to_errno(ret);
@@ -6309,6 +6413,14 @@ struct netdev_queue *dev_ingress_queue_create(struct net_device *dev)
 
 static const struct ethtool_ops default_ethtool_ops;
 
+void netdev_set_default_ethtool_ops(struct net_device *dev,
+                                   const struct ethtool_ops *ops)
+{
+       if (dev->ethtool_ops == &default_ethtool_ops)
+               dev->ethtool_ops = ops;
+}
+EXPORT_SYMBOL_GPL(netdev_set_default_ethtool_ops);
+
 /**
  *     alloc_netdev_mqs - allocate network device
  *     @sizeof_priv:   size of private data to allocate space for
@@ -7030,12 +7142,3 @@ out:
 }
 
 subsys_initcall(net_dev_init);
-
-static int __init initialize_hashrnd(void)
-{
-       get_random_bytes(&hashrnd, sizeof(hashrnd));
-       return 0;
-}
-
-late_initcall_sync(initialize_hashrnd);
-
index a8705432e4b1923073b5ed3565daa3baa9d39fa7..d9d55209db679ba4e0e16789a9a988e147fd1022 100644 (file)
@@ -175,7 +175,7 @@ static int __ethtool_get_sset_count(struct net_device *dev, int sset)
        if (sset == ETH_SS_FEATURES)
                return ARRAY_SIZE(netdev_features_strings);
 
-       if (ops && ops->get_sset_count && ops->get_strings)
+       if (ops->get_sset_count && ops->get_strings)
                return ops->get_sset_count(dev, sset);
        else
                return -EOPNOTSUPP;
@@ -311,7 +311,7 @@ int __ethtool_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
        ASSERT_RTNL();
 
-       if (!dev->ethtool_ops || !dev->ethtool_ops->get_settings)
+       if (!dev->ethtool_ops->get_settings)
                return -EOPNOTSUPP;
 
        memset(cmd, 0, sizeof(struct ethtool_cmd));
@@ -355,7 +355,7 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
 
        memset(&info, 0, sizeof(info));
        info.cmd = ETHTOOL_GDRVINFO;
-       if (ops && ops->get_drvinfo) {
+       if (ops->get_drvinfo) {
                ops->get_drvinfo(dev, &info);
        } else if (dev->dev.parent && dev->dev.parent->driver) {
                strlcpy(info.bus_info, dev_name(dev->dev.parent),
@@ -370,7 +370,7 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
         * this method of obtaining string set info is deprecated;
         * Use ETHTOOL_GSSET_INFO instead.
         */
-       if (ops && ops->get_sset_count) {
+       if (ops->get_sset_count) {
                int rc;
 
                rc = ops->get_sset_count(dev, ETH_SS_TEST);
@@ -383,9 +383,9 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
                if (rc >= 0)
                        info.n_priv_flags = rc;
        }
-       if (ops && ops->get_regs_len)
+       if (ops->get_regs_len)
                info.regdump_len = ops->get_regs_len(dev);
-       if (ops && ops->get_eeprom_len)
+       if (ops->get_eeprom_len)
                info.eedump_len = ops->get_eeprom_len(dev);
 
        if (copy_to_user(useraddr, &info, sizeof(info)))
@@ -590,13 +590,14 @@ static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
        struct ethtool_rxnfc rx_rings;
        u32 user_size, dev_size, i;
        u32 *indir;
+       const struct ethtool_ops *ops = dev->ethtool_ops;
        int ret;
 
-       if (!dev->ethtool_ops->get_rxfh_indir_size ||
-           !dev->ethtool_ops->set_rxfh_indir ||
-           !dev->ethtool_ops->get_rxnfc)
+       if (!ops->get_rxfh_indir_size || !ops->set_rxfh_indir ||
+           !ops->get_rxnfc)
                return -EOPNOTSUPP;
-       dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
+
+       dev_size = ops->get_rxfh_indir_size(dev);
        if (dev_size == 0)
                return -EOPNOTSUPP;
 
@@ -613,7 +614,7 @@ static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
                return -ENOMEM;
 
        rx_rings.cmd = ETHTOOL_GRXRINGS;
-       ret = dev->ethtool_ops->get_rxnfc(dev, &rx_rings, NULL);
+       ret = ops->get_rxnfc(dev, &rx_rings, NULL);
        if (ret)
                goto out;
 
@@ -639,7 +640,7 @@ static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
                }
        }
 
-       ret = dev->ethtool_ops->set_rxfh_indir(dev, indir);
+       ret = ops->set_rxfh_indir(dev, indir);
 
 out:
        kfree(indir);
@@ -1082,9 +1083,10 @@ static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
 {
        struct ethtool_value id;
        static bool busy;
+       const struct ethtool_ops *ops = dev->ethtool_ops;
        int rc;
 
-       if (!dev->ethtool_ops->set_phys_id)
+       if (!ops->set_phys_id)
                return -EOPNOTSUPP;
 
        if (busy)
@@ -1093,7 +1095,7 @@ static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
        if (copy_from_user(&id, useraddr, sizeof(id)))
                return -EFAULT;
 
-       rc = dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_ACTIVE);
+       rc = ops->set_phys_id(dev, ETHTOOL_ID_ACTIVE);
        if (rc < 0)
                return rc;
 
@@ -1118,7 +1120,7 @@ static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
                        i = n;
                        do {
                                rtnl_lock();
-                               rc = dev->ethtool_ops->set_phys_id(dev,
+                               rc = ops->set_phys_id(dev,
                                    (i & 1) ? ETHTOOL_ID_OFF : ETHTOOL_ID_ON);
                                rtnl_unlock();
                                if (rc)
@@ -1133,7 +1135,7 @@ static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
        dev_put(dev);
        busy = false;
 
-       (void)dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_INACTIVE);
+       (void) ops->set_phys_id(dev, ETHTOOL_ID_INACTIVE);
        return rc;
 }
 
@@ -1275,7 +1277,7 @@ static int ethtool_get_dump_flag(struct net_device *dev,
        struct ethtool_dump dump;
        const struct ethtool_ops *ops = dev->ethtool_ops;
 
-       if (!dev->ethtool_ops->get_dump_flag)
+       if (!ops->get_dump_flag)
                return -EOPNOTSUPP;
 
        if (copy_from_user(&dump, useraddr, sizeof(dump)))
@@ -1299,8 +1301,7 @@ static int ethtool_get_dump_data(struct net_device *dev,
        const struct ethtool_ops *ops = dev->ethtool_ops;
        void *data = NULL;
 
-       if (!dev->ethtool_ops->get_dump_data ||
-               !dev->ethtool_ops->get_dump_flag)
+       if (!ops->get_dump_data || !ops->get_dump_flag)
                return -EOPNOTSUPP;
 
        if (copy_from_user(&dump, useraddr, sizeof(dump)))
@@ -1346,13 +1347,9 @@ static int ethtool_get_ts_info(struct net_device *dev, void __user *useraddr)
        info.cmd = ETHTOOL_GET_TS_INFO;
 
        if (phydev && phydev->drv && phydev->drv->ts_info) {
-
                err = phydev->drv->ts_info(phydev, &info);
-
-       } else if (dev->ethtool_ops && dev->ethtool_ops->get_ts_info) {
-
+       } else if (ops->get_ts_info) {
                err = ops->get_ts_info(dev, &info);
-
        } else {
                info.so_timestamping =
                        SOF_TIMESTAMPING_RX_SOFTWARE |
index 2ead2a9b1859bd08d73114121f6f4ea9600d8f27..2e20b55a7830c43e25bdd4221cc134f374d7148e 100644 (file)
@@ -721,6 +721,9 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
        unsigned int fsize = sizeof(struct sock_filter) * fprog->len;
        int err;
 
+       if (sock_flag(sk, SOCK_FILTER_LOCKED))
+               return -EPERM;
+
        /* Make sure new filter is there and in the right amounts. */
        if (fprog->filter == NULL)
                return -EINVAL;
@@ -757,6 +760,9 @@ int sk_detach_filter(struct sock *sk)
        int ret = -ENOENT;
        struct sk_filter *filter;
 
+       if (sock_flag(sk, SOCK_FILTER_LOCKED))
+               return -EPERM;
+
        filter = rcu_dereference_protected(sk->sk_filter,
                                           sock_owned_by_user(sk));
        if (filter) {
index b0901ee5a0025f93e32287c1acbb3ef0ded0f47a..43f7495df27a932659c714fbf7b897ab6eca2716 100644 (file)
@@ -286,7 +286,7 @@ nocache:
                else
                        fle->genid--;
        } else {
-               if (flo && !IS_ERR(flo))
+               if (!IS_ERR_OR_NULL(flo))
                        flo->ops->delete(flo);
        }
 ret_object:
index 466820b6e34400787a18fb0be5f26845c2fc0629..9d4c7201400d154ab2fd00ccfab4f22f8bddb5ff 100644 (file)
@@ -143,3 +143,176 @@ ipv6:
        return true;
 }
 EXPORT_SYMBOL(skb_flow_dissect);
+
+static u32 hashrnd __read_mostly;
+
+/*
+ * __skb_get_rxhash: calculate a flow hash based on src/dst addresses
+ * and src/dst port numbers.  Sets rxhash in skb to non-zero hash value
+ * on success, zero indicates no valid hash.  Also, sets l4_rxhash in skb
+ * if hash is a canonical 4-tuple hash over transport ports.
+ */
+void __skb_get_rxhash(struct sk_buff *skb)
+{
+       struct flow_keys keys;
+       u32 hash;
+
+       if (!skb_flow_dissect(skb, &keys))
+               return;
+
+       if (keys.ports)
+               skb->l4_rxhash = 1;
+
+       /* get a consistent hash (same value on both flow directions) */
+       if (((__force u32)keys.dst < (__force u32)keys.src) ||
+           (((__force u32)keys.dst == (__force u32)keys.src) &&
+            ((__force u16)keys.port16[1] < (__force u16)keys.port16[0]))) {
+               swap(keys.dst, keys.src);
+               swap(keys.port16[0], keys.port16[1]);
+       }
+
+       hash = jhash_3words((__force u32)keys.dst,
+                           (__force u32)keys.src,
+                           (__force u32)keys.ports, hashrnd);
+       if (!hash)
+               hash = 1;
+
+       skb->rxhash = hash;
+}
+EXPORT_SYMBOL(__skb_get_rxhash);
+
+/*
+ * Returns a Tx hash based on the given packet descriptor a Tx queues' number
+ * to be used as a distribution range.
+ */
+u16 __skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb,
+                 unsigned int num_tx_queues)
+{
+       u32 hash;
+       u16 qoffset = 0;
+       u16 qcount = num_tx_queues;
+
+       if (skb_rx_queue_recorded(skb)) {
+               hash = skb_get_rx_queue(skb);
+               while (unlikely(hash >= num_tx_queues))
+                       hash -= num_tx_queues;
+               return hash;
+       }
+
+       if (dev->num_tc) {
+               u8 tc = netdev_get_prio_tc_map(dev, skb->priority);
+               qoffset = dev->tc_to_txq[tc].offset;
+               qcount = dev->tc_to_txq[tc].count;
+       }
+
+       if (skb->sk && skb->sk->sk_hash)
+               hash = skb->sk->sk_hash;
+       else
+               hash = (__force u16) skb->protocol;
+       hash = jhash_1word(hash, hashrnd);
+
+       return (u16) (((u64) hash * qcount) >> 32) + qoffset;
+}
+EXPORT_SYMBOL(__skb_tx_hash);
+
+static inline u16 dev_cap_txqueue(struct net_device *dev, u16 queue_index)
+{
+       if (unlikely(queue_index >= dev->real_num_tx_queues)) {
+               net_warn_ratelimited("%s selects TX queue %d, but real number of TX queues is %d\n",
+                                    dev->name, queue_index,
+                                    dev->real_num_tx_queues);
+               return 0;
+       }
+       return queue_index;
+}
+
+static inline int get_xps_queue(struct net_device *dev, struct sk_buff *skb)
+{
+#ifdef CONFIG_XPS
+       struct xps_dev_maps *dev_maps;
+       struct xps_map *map;
+       int queue_index = -1;
+
+       rcu_read_lock();
+       dev_maps = rcu_dereference(dev->xps_maps);
+       if (dev_maps) {
+               map = rcu_dereference(
+                   dev_maps->cpu_map[raw_smp_processor_id()]);
+               if (map) {
+                       if (map->len == 1)
+                               queue_index = map->queues[0];
+                       else {
+                               u32 hash;
+                               if (skb->sk && skb->sk->sk_hash)
+                                       hash = skb->sk->sk_hash;
+                               else
+                                       hash = (__force u16) skb->protocol ^
+                                           skb->rxhash;
+                               hash = jhash_1word(hash, hashrnd);
+                               queue_index = map->queues[
+                                   ((u64)hash * map->len) >> 32];
+                       }
+                       if (unlikely(queue_index >= dev->real_num_tx_queues))
+                               queue_index = -1;
+               }
+       }
+       rcu_read_unlock();
+
+       return queue_index;
+#else
+       return -1;
+#endif
+}
+
+u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb)
+{
+       struct sock *sk = skb->sk;
+       int queue_index = sk_tx_queue_get(sk);
+
+       if (queue_index < 0 || skb->ooo_okay ||
+           queue_index >= dev->real_num_tx_queues) {
+               int new_index = get_xps_queue(dev, skb);
+               if (new_index < 0)
+                       new_index = skb_tx_hash(dev, skb);
+
+               if (queue_index != new_index && sk) {
+                       struct dst_entry *dst =
+                                   rcu_dereference_check(sk->sk_dst_cache, 1);
+
+                       if (dst && skb_dst(skb) == dst)
+                               sk_tx_queue_set(sk, queue_index);
+
+               }
+
+               queue_index = new_index;
+       }
+
+       return queue_index;
+}
+EXPORT_SYMBOL(__netdev_pick_tx);
+
+struct netdev_queue *netdev_pick_tx(struct net_device *dev,
+                                   struct sk_buff *skb)
+{
+       int queue_index = 0;
+
+       if (dev->real_num_tx_queues != 1) {
+               const struct net_device_ops *ops = dev->netdev_ops;
+               if (ops->ndo_select_queue)
+                       queue_index = ops->ndo_select_queue(dev, skb);
+               else
+                       queue_index = __netdev_pick_tx(dev, skb);
+               queue_index = dev_cap_txqueue(dev, queue_index);
+       }
+
+       skb_set_queue_mapping(skb, queue_index);
+       return netdev_get_tx_queue(dev, queue_index);
+}
+
+static int __init initialize_hashrnd(void)
+{
+       get_random_bytes(&hashrnd, sizeof(hashrnd));
+       return 0;
+}
+
+late_initcall_sync(initialize_hashrnd);
index c815f285e5ab76e354dd7752f7ef1c1049154570..7bd0eedb357fe0dd9e81eda5b9d7c36e2ca3e54c 100644 (file)
@@ -778,6 +778,9 @@ static void neigh_periodic_work(struct work_struct *work)
        nht = rcu_dereference_protected(tbl->nht,
                                        lockdep_is_held(&tbl->lock));
 
+       if (atomic_read(&tbl->entries) < tbl->gc_thresh1)
+               goto out;
+
        /*
         *      periodically recompute ReachableTime from random function
         */
@@ -832,6 +835,7 @@ next_elt:
                nht = rcu_dereference_protected(tbl->nht,
                                                lockdep_is_held(&tbl->lock));
        }
+out:
        /* Cycle through all hash buckets every base_reachable_time/2 ticks.
         * ARP entry timeouts range from 1/2 base_reachable_time to 3/2
         * base_reachable_time.
index 29c884a74c38ceb036366b5de7f5162b822efad8..a5b89a6fec6d990bd49caf4fa258fc916a11ed14 100644 (file)
@@ -1002,68 +1002,14 @@ static ssize_t show_xps_map(struct netdev_queue *queue,
        return len;
 }
 
-static DEFINE_MUTEX(xps_map_mutex);
-#define xmap_dereference(P)            \
-       rcu_dereference_protected((P), lockdep_is_held(&xps_map_mutex))
-
-static void xps_queue_release(struct netdev_queue *queue)
-{
-       struct net_device *dev = queue->dev;
-       struct xps_dev_maps *dev_maps;
-       struct xps_map *map;
-       unsigned long index;
-       int i, pos, nonempty = 0;
-
-       index = get_netdev_queue_index(queue);
-
-       mutex_lock(&xps_map_mutex);
-       dev_maps = xmap_dereference(dev->xps_maps);
-
-       if (dev_maps) {
-               for_each_possible_cpu(i) {
-                       map = xmap_dereference(dev_maps->cpu_map[i]);
-                       if (!map)
-                               continue;
-
-                       for (pos = 0; pos < map->len; pos++)
-                               if (map->queues[pos] == index)
-                                       break;
-
-                       if (pos < map->len) {
-                               if (map->len > 1)
-                                       map->queues[pos] =
-                                           map->queues[--map->len];
-                               else {
-                                       RCU_INIT_POINTER(dev_maps->cpu_map[i],
-                                           NULL);
-                                       kfree_rcu(map, rcu);
-                                       map = NULL;
-                               }
-                       }
-                       if (map)
-                               nonempty = 1;
-               }
-
-               if (!nonempty) {
-                       RCU_INIT_POINTER(dev->xps_maps, NULL);
-                       kfree_rcu(dev_maps, rcu);
-               }
-       }
-       mutex_unlock(&xps_map_mutex);
-}
-
 static ssize_t store_xps_map(struct netdev_queue *queue,
                      struct netdev_queue_attribute *attribute,
                      const char *buf, size_t len)
 {
        struct net_device *dev = queue->dev;
-       cpumask_var_t mask;
-       int err, i, cpu, pos, map_len, alloc_len, need_set;
        unsigned long index;
-       struct xps_map *map, *new_map;
-       struct xps_dev_maps *dev_maps, *new_dev_maps;
-       int nonempty = 0;
-       int numa_node_id = -2;
+       cpumask_var_t mask;
+       int err;
 
        if (!capable(CAP_NET_ADMIN))
                return -EPERM;
@@ -1079,105 +1025,11 @@ static ssize_t store_xps_map(struct netdev_queue *queue,
                return err;
        }
 
-       new_dev_maps = kzalloc(max_t(unsigned int,
-           XPS_DEV_MAPS_SIZE, L1_CACHE_BYTES), GFP_KERNEL);
-       if (!new_dev_maps) {
-               free_cpumask_var(mask);
-               return -ENOMEM;
-       }
-
-       mutex_lock(&xps_map_mutex);
-
-       dev_maps = xmap_dereference(dev->xps_maps);
-
-       for_each_possible_cpu(cpu) {
-               map = dev_maps ?
-                       xmap_dereference(dev_maps->cpu_map[cpu]) : NULL;
-               new_map = map;
-               if (map) {
-                       for (pos = 0; pos < map->len; pos++)
-                               if (map->queues[pos] == index)
-                                       break;
-                       map_len = map->len;
-                       alloc_len = map->alloc_len;
-               } else
-                       pos = map_len = alloc_len = 0;
-
-               need_set = cpumask_test_cpu(cpu, mask) && cpu_online(cpu);
-#ifdef CONFIG_NUMA
-               if (need_set) {
-                       if (numa_node_id == -2)
-                               numa_node_id = cpu_to_node(cpu);
-                       else if (numa_node_id != cpu_to_node(cpu))
-                               numa_node_id = -1;
-               }
-#endif
-               if (need_set && pos >= map_len) {
-                       /* Need to add queue to this CPU's map */
-                       if (map_len >= alloc_len) {
-                               alloc_len = alloc_len ?
-                                   2 * alloc_len : XPS_MIN_MAP_ALLOC;
-                               new_map = kzalloc_node(XPS_MAP_SIZE(alloc_len),
-                                                      GFP_KERNEL,
-                                                      cpu_to_node(cpu));
-                               if (!new_map)
-                                       goto error;
-                               new_map->alloc_len = alloc_len;
-                               for (i = 0; i < map_len; i++)
-                                       new_map->queues[i] = map->queues[i];
-                               new_map->len = map_len;
-                       }
-                       new_map->queues[new_map->len++] = index;
-               } else if (!need_set && pos < map_len) {
-                       /* Need to remove queue from this CPU's map */
-                       if (map_len > 1)
-                               new_map->queues[pos] =
-                                   new_map->queues[--new_map->len];
-                       else
-                               new_map = NULL;
-               }
-               RCU_INIT_POINTER(new_dev_maps->cpu_map[cpu], new_map);
-       }
-
-       /* Cleanup old maps */
-       for_each_possible_cpu(cpu) {
-               map = dev_maps ?
-                       xmap_dereference(dev_maps->cpu_map[cpu]) : NULL;
-               if (map && xmap_dereference(new_dev_maps->cpu_map[cpu]) != map)
-                       kfree_rcu(map, rcu);
-               if (new_dev_maps->cpu_map[cpu])
-                       nonempty = 1;
-       }
-
-       if (nonempty) {
-               rcu_assign_pointer(dev->xps_maps, new_dev_maps);
-       } else {
-               kfree(new_dev_maps);
-               RCU_INIT_POINTER(dev->xps_maps, NULL);
-       }
-
-       if (dev_maps)
-               kfree_rcu(dev_maps, rcu);
-
-       netdev_queue_numa_node_write(queue, (numa_node_id >= 0) ? numa_node_id :
-                                           NUMA_NO_NODE);
-
-       mutex_unlock(&xps_map_mutex);
+       err = netif_set_xps_queue(dev, mask, index);
 
        free_cpumask_var(mask);
-       return len;
 
-error:
-       mutex_unlock(&xps_map_mutex);
-
-       if (new_dev_maps)
-               for_each_possible_cpu(i)
-                       kfree(rcu_dereference_protected(
-                               new_dev_maps->cpu_map[i],
-                               1));
-       kfree(new_dev_maps);
-       free_cpumask_var(mask);
-       return -ENOMEM;
+       return err ? : len;
 }
 
 static struct netdev_queue_attribute xps_cpus_attribute =
@@ -1196,10 +1048,6 @@ static void netdev_queue_release(struct kobject *kobj)
 {
        struct netdev_queue *queue = to_netdev_queue(kobj);
 
-#ifdef CONFIG_XPS
-       xps_queue_release(queue);
-#endif
-
        memset(kobj, 0, sizeof(*kobj));
        dev_put(queue->dev);
 }
index d2bda8eb08ecb12095e571faba5b68e689ffb224..e2f79a14625c4bb718e3db82538febc8e6677ce1 100644 (file)
@@ -29,6 +29,9 @@
 #include <linux/if_vlan.h>
 #include <net/tcp.h>
 #include <net/udp.h>
+#include <net/addrconf.h>
+#include <net/ndisc.h>
+#include <net/ip6_checksum.h>
 #include <asm/unaligned.h>
 #include <trace/events/napi.h>
 
@@ -55,7 +58,7 @@ static atomic_t trapped;
         MAX_UDP_CHUNK)
 
 static void zap_completion_queue(void);
-static void netpoll_arp_reply(struct sk_buff *skb, struct netpoll_info *npinfo);
+static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo);
 
 static unsigned int carrier_timeout = 4;
 module_param(carrier_timeout, uint, 0644);
@@ -181,13 +184,13 @@ static void poll_napi(struct net_device *dev)
        }
 }
 
-static void service_arp_queue(struct netpoll_info *npi)
+static void service_neigh_queue(struct netpoll_info *npi)
 {
        if (npi) {
                struct sk_buff *skb;
 
-               while ((skb = skb_dequeue(&npi->arp_tx)))
-                       netpoll_arp_reply(skb, npi);
+               while ((skb = skb_dequeue(&npi->neigh_tx)))
+                       netpoll_neigh_reply(skb, npi);
        }
 }
 
@@ -216,14 +219,14 @@ static void netpoll_poll_dev(struct net_device *dev)
 
                        bond_dev = netdev_master_upper_dev_get_rcu(dev);
                        bond_ni = rcu_dereference_bh(bond_dev->npinfo);
-                       while ((skb = skb_dequeue(&ni->arp_tx))) {
+                       while ((skb = skb_dequeue(&ni->neigh_tx))) {
                                skb->dev = bond_dev;
-                               skb_queue_tail(&bond_ni->arp_tx, skb);
+                               skb_queue_tail(&bond_ni->neigh_tx, skb);
                        }
                }
        }
 
-       service_arp_queue(ni);
+       service_neigh_queue(ni);
 
        zap_completion_queue();
 }
@@ -384,9 +387,14 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
        struct iphdr *iph;
        struct ethhdr *eth;
        static atomic_t ip_ident;
+       struct ipv6hdr *ip6h;
 
        udp_len = len + sizeof(*udph);
-       ip_len = udp_len + sizeof(*iph);
+       if (np->ipv6)
+               ip_len = udp_len + sizeof(*ip6h);
+       else
+               ip_len = udp_len + sizeof(*iph);
+
        total_len = ip_len + LL_RESERVED_SPACE(np->dev);
 
        skb = find_skb(np, total_len + np->dev->needed_tailroom,
@@ -403,34 +411,66 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
        udph->source = htons(np->local_port);
        udph->dest = htons(np->remote_port);
        udph->len = htons(udp_len);
-       udph->check = 0;
-       udph->check = csum_tcpudp_magic(np->local_ip,
-                                       np->remote_ip,
-                                       udp_len, IPPROTO_UDP,
-                                       csum_partial(udph, udp_len, 0));
-       if (udph->check == 0)
-               udph->check = CSUM_MANGLED_0;
-
-       skb_push(skb, sizeof(*iph));
-       skb_reset_network_header(skb);
-       iph = ip_hdr(skb);
-
-       /* iph->version = 4; iph->ihl = 5; */
-       put_unaligned(0x45, (unsigned char *)iph);
-       iph->tos      = 0;
-       put_unaligned(htons(ip_len), &(iph->tot_len));
-       iph->id       = htons(atomic_inc_return(&ip_ident));
-       iph->frag_off = 0;
-       iph->ttl      = 64;
-       iph->protocol = IPPROTO_UDP;
-       iph->check    = 0;
-       put_unaligned(np->local_ip, &(iph->saddr));
-       put_unaligned(np->remote_ip, &(iph->daddr));
-       iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
-
-       eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
-       skb_reset_mac_header(skb);
-       skb->protocol = eth->h_proto = htons(ETH_P_IP);
+
+       if (np->ipv6) {
+               udph->check = 0;
+               udph->check = csum_ipv6_magic(&np->local_ip.in6,
+                                             &np->remote_ip.in6,
+                                             udp_len, IPPROTO_UDP,
+                                             csum_partial(udph, udp_len, 0));
+               if (udph->check == 0)
+                       udph->check = CSUM_MANGLED_0;
+
+               skb_push(skb, sizeof(*ip6h));
+               skb_reset_network_header(skb);
+               ip6h = ipv6_hdr(skb);
+
+               /* ip6h->version = 6; ip6h->priority = 0; */
+               put_unaligned(0x60, (unsigned char *)ip6h);
+               ip6h->flow_lbl[0] = 0;
+               ip6h->flow_lbl[1] = 0;
+               ip6h->flow_lbl[2] = 0;
+
+               ip6h->payload_len = htons(sizeof(struct udphdr) + len);
+               ip6h->nexthdr = IPPROTO_UDP;
+               ip6h->hop_limit = 32;
+               ip6h->saddr = np->local_ip.in6;
+               ip6h->daddr = np->remote_ip.in6;
+
+               eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
+               skb_reset_mac_header(skb);
+               skb->protocol = eth->h_proto = htons(ETH_P_IPV6);
+       } else {
+               udph->check = 0;
+               udph->check = csum_tcpudp_magic(np->local_ip.ip,
+                                               np->remote_ip.ip,
+                                               udp_len, IPPROTO_UDP,
+                                               csum_partial(udph, udp_len, 0));
+               if (udph->check == 0)
+                       udph->check = CSUM_MANGLED_0;
+
+               skb_push(skb, sizeof(*iph));
+               skb_reset_network_header(skb);
+               iph = ip_hdr(skb);
+
+               /* iph->version = 4; iph->ihl = 5; */
+               put_unaligned(0x45, (unsigned char *)iph);
+               iph->tos      = 0;
+               put_unaligned(htons(ip_len), &(iph->tot_len));
+               iph->id       = htons(atomic_inc_return(&ip_ident));
+               iph->frag_off = 0;
+               iph->ttl      = 64;
+               iph->protocol = IPPROTO_UDP;
+               iph->check    = 0;
+               put_unaligned(np->local_ip.ip, &(iph->saddr));
+               put_unaligned(np->remote_ip.ip, &(iph->daddr));
+               iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
+
+               eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
+               skb_reset_mac_header(skb);
+               skb->protocol = eth->h_proto = htons(ETH_P_IP);
+       }
+
        memcpy(eth->h_source, np->dev->dev_addr, ETH_ALEN);
        memcpy(eth->h_dest, np->remote_mac, ETH_ALEN);
 
@@ -440,18 +480,16 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
 }
 EXPORT_SYMBOL(netpoll_send_udp);
 
-static void netpoll_arp_reply(struct sk_buff *skb, struct netpoll_info *npinfo)
+static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo)
 {
-       struct arphdr *arp;
-       unsigned char *arp_ptr;
-       int size, type = ARPOP_REPLY, ptype = ETH_P_ARP;
+       int size, type = ARPOP_REPLY;
        __be32 sip, tip;
        unsigned char *sha;
        struct sk_buff *send_skb;
        struct netpoll *np, *tmp;
        unsigned long flags;
        int hlen, tlen;
-       int hits = 0;
+       int hits = 0, proto;
 
        if (list_empty(&npinfo->rx_np))
                return;
@@ -469,94 +507,214 @@ static void netpoll_arp_reply(struct sk_buff *skb, struct netpoll_info *npinfo)
        if (!hits)
                return;
 
-       /* No arp on this interface */
-       if (skb->dev->flags & IFF_NOARP)
-               return;
-
-       if (!pskb_may_pull(skb, arp_hdr_len(skb->dev)))
-               return;
+       proto = ntohs(eth_hdr(skb)->h_proto);
+       if (proto == ETH_P_IP) {
+               struct arphdr *arp;
+               unsigned char *arp_ptr;
+               /* No arp on this interface */
+               if (skb->dev->flags & IFF_NOARP)
+                       return;
 
-       skb_reset_network_header(skb);
-       skb_reset_transport_header(skb);
-       arp = arp_hdr(skb);
+               if (!pskb_may_pull(skb, arp_hdr_len(skb->dev)))
+                       return;
 
-       if ((arp->ar_hrd != htons(ARPHRD_ETHER) &&
-            arp->ar_hrd != htons(ARPHRD_IEEE802)) ||
-           arp->ar_pro != htons(ETH_P_IP) ||
-           arp->ar_op != htons(ARPOP_REQUEST))
-               return;
+               skb_reset_network_header(skb);
+               skb_reset_transport_header(skb);
+               arp = arp_hdr(skb);
 
-       arp_ptr = (unsigned char *)(arp+1);
-       /* save the location of the src hw addr */
-       sha = arp_ptr;
-       arp_ptr += skb->dev->addr_len;
-       memcpy(&sip, arp_ptr, 4);
-       arp_ptr += 4;
-       /* If we actually cared about dst hw addr,
-          it would get copied here */
-       arp_ptr += skb->dev->addr_len;
-       memcpy(&tip, arp_ptr, 4);
-
-       /* Should we ignore arp? */
-       if (ipv4_is_loopback(tip) || ipv4_is_multicast(tip))
-               return;
+               if ((arp->ar_hrd != htons(ARPHRD_ETHER) &&
+                    arp->ar_hrd != htons(ARPHRD_IEEE802)) ||
+                   arp->ar_pro != htons(ETH_P_IP) ||
+                   arp->ar_op != htons(ARPOP_REQUEST))
+                       return;
 
-       size = arp_hdr_len(skb->dev);
+               arp_ptr = (unsigned char *)(arp+1);
+               /* save the location of the src hw addr */
+               sha = arp_ptr;
+               arp_ptr += skb->dev->addr_len;
+               memcpy(&sip, arp_ptr, 4);
+               arp_ptr += 4;
+               /* If we actually cared about dst hw addr,
+                  it would get copied here */
+               arp_ptr += skb->dev->addr_len;
+               memcpy(&tip, arp_ptr, 4);
 
-       spin_lock_irqsave(&npinfo->rx_lock, flags);
-       list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) {
-               if (tip != np->local_ip)
-                       continue;
+               /* Should we ignore arp? */
+               if (ipv4_is_loopback(tip) || ipv4_is_multicast(tip))
+                       return;
 
-               hlen = LL_RESERVED_SPACE(np->dev);
-               tlen = np->dev->needed_tailroom;
-               send_skb = find_skb(np, size + hlen + tlen, hlen);
-               if (!send_skb)
-                       continue;
+               size = arp_hdr_len(skb->dev);
 
-               skb_reset_network_header(send_skb);
-               arp = (struct arphdr *) skb_put(send_skb, size);
-               send_skb->dev = skb->dev;
-               send_skb->protocol = htons(ETH_P_ARP);
+               spin_lock_irqsave(&npinfo->rx_lock, flags);
+               list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) {
+                       if (tip != np->local_ip.ip)
+                               continue;
+
+                       hlen = LL_RESERVED_SPACE(np->dev);
+                       tlen = np->dev->needed_tailroom;
+                       send_skb = find_skb(np, size + hlen + tlen, hlen);
+                       if (!send_skb)
+                               continue;
+
+                       skb_reset_network_header(send_skb);
+                       arp = (struct arphdr *) skb_put(send_skb, size);
+                       send_skb->dev = skb->dev;
+                       send_skb->protocol = htons(ETH_P_ARP);
+
+                       /* Fill the device header for the ARP frame */
+                       if (dev_hard_header(send_skb, skb->dev, ETH_P_ARP,
+                                           sha, np->dev->dev_addr,
+                                           send_skb->len) < 0) {
+                               kfree_skb(send_skb);
+                               continue;
+                       }
 
-               /* Fill the device header for the ARP frame */
-               if (dev_hard_header(send_skb, skb->dev, ptype,
-                                   sha, np->dev->dev_addr,
-                                   send_skb->len) < 0) {
-                       kfree_skb(send_skb);
-                       continue;
+                       /*
+                        * Fill out the arp protocol part.
+                        *
+                        * we only support ethernet device type,
+                        * which (according to RFC 1390) should
+                        * always equal 1 (Ethernet).
+                        */
+
+                       arp->ar_hrd = htons(np->dev->type);
+                       arp->ar_pro = htons(ETH_P_IP);
+                       arp->ar_hln = np->dev->addr_len;
+                       arp->ar_pln = 4;
+                       arp->ar_op = htons(type);
+
+                       arp_ptr = (unsigned char *)(arp + 1);
+                       memcpy(arp_ptr, np->dev->dev_addr, np->dev->addr_len);
+                       arp_ptr += np->dev->addr_len;
+                       memcpy(arp_ptr, &tip, 4);
+                       arp_ptr += 4;
+                       memcpy(arp_ptr, sha, np->dev->addr_len);
+                       arp_ptr += np->dev->addr_len;
+                       memcpy(arp_ptr, &sip, 4);
+
+                       netpoll_send_skb(np, send_skb);
+
+                       /* If there are several rx_hooks for the same address,
+                          we're fine by sending a single reply */
+                       break;
                }
+               spin_unlock_irqrestore(&npinfo->rx_lock, flags);
+       } else if( proto == ETH_P_IPV6) {
+#if IS_ENABLED(CONFIG_IPV6)
+               struct nd_msg *msg;
+               u8 *lladdr = NULL;
+               struct ipv6hdr *hdr;
+               struct icmp6hdr *icmp6h;
+               const struct in6_addr *saddr;
+               const struct in6_addr *daddr;
+               struct inet6_dev *in6_dev = NULL;
+               struct in6_addr *target;
+
+               in6_dev = in6_dev_get(skb->dev);
+               if (!in6_dev || !in6_dev->cnf.accept_ra)
+                       return;
 
-               /*
-                * Fill out the arp protocol part.
-                *
-                * we only support ethernet device type,
-                * which (according to RFC 1390) should
-                * always equal 1 (Ethernet).
-                */
+               if (!pskb_may_pull(skb, skb->len))
+                       return;
 
-               arp->ar_hrd = htons(np->dev->type);
-               arp->ar_pro = htons(ETH_P_IP);
-               arp->ar_hln = np->dev->addr_len;
-               arp->ar_pln = 4;
-               arp->ar_op = htons(type);
+               msg = (struct nd_msg *)skb_transport_header(skb);
 
-               arp_ptr = (unsigned char *)(arp + 1);
-               memcpy(arp_ptr, np->dev->dev_addr, np->dev->addr_len);
-               arp_ptr += np->dev->addr_len;
-               memcpy(arp_ptr, &tip, 4);
-               arp_ptr += 4;
-               memcpy(arp_ptr, sha, np->dev->addr_len);
-               arp_ptr += np->dev->addr_len;
-               memcpy(arp_ptr, &sip, 4);
+               __skb_push(skb, skb->data - skb_transport_header(skb));
+
+               if (ipv6_hdr(skb)->hop_limit != 255)
+                       return;
+               if (msg->icmph.icmp6_code != 0)
+                       return;
+               if (msg->icmph.icmp6_type != NDISC_NEIGHBOUR_SOLICITATION)
+                       return;
 
-               netpoll_send_skb(np, send_skb);
+               saddr = &ipv6_hdr(skb)->saddr;
+               daddr = &ipv6_hdr(skb)->daddr;
 
-               /* If there are several rx_hooks for the same address,
-                  we're fine by sending a single reply */
-               break;
+               size = sizeof(struct icmp6hdr) + sizeof(struct in6_addr);
+
+               spin_lock_irqsave(&npinfo->rx_lock, flags);
+               list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) {
+                       if (memcmp(daddr, &np->local_ip, sizeof(*daddr)))
+                               continue;
+
+                       hlen = LL_RESERVED_SPACE(np->dev);
+                       tlen = np->dev->needed_tailroom;
+                       send_skb = find_skb(np, size + hlen + tlen, hlen);
+                       if (!send_skb)
+                               continue;
+
+                       send_skb->protocol = htons(ETH_P_IPV6);
+                       send_skb->dev = skb->dev;
+
+                       skb_reset_network_header(send_skb);
+                       skb_put(send_skb, sizeof(struct ipv6hdr));
+                       hdr = ipv6_hdr(send_skb);
+
+                       *(__be32*)hdr = htonl(0x60000000);
+
+                       hdr->payload_len = htons(size);
+                       hdr->nexthdr = IPPROTO_ICMPV6;
+                       hdr->hop_limit = 255;
+                       hdr->saddr = *saddr;
+                       hdr->daddr = *daddr;
+
+                       send_skb->transport_header = send_skb->tail;
+                       skb_put(send_skb, size);
+
+                       icmp6h = (struct icmp6hdr *)skb_transport_header(skb);
+                       icmp6h->icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT;
+                       icmp6h->icmp6_router = 0;
+                       icmp6h->icmp6_solicited = 1;
+                       target = (struct in6_addr *)skb_transport_header(send_skb) + sizeof(struct icmp6hdr);
+                       *target = msg->target;
+                       icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, size,
+                                                             IPPROTO_ICMPV6,
+                                                             csum_partial(icmp6h,
+                                                                          size, 0));
+
+                       if (dev_hard_header(send_skb, skb->dev, ETH_P_IPV6,
+                                           lladdr, np->dev->dev_addr,
+                                           send_skb->len) < 0) {
+                               kfree_skb(send_skb);
+                               continue;
+                       }
+
+                       netpoll_send_skb(np, send_skb);
+
+                       /* If there are several rx_hooks for the same address,
+                          we're fine by sending a single reply */
+                       break;
+               }
+               spin_unlock_irqrestore(&npinfo->rx_lock, flags);
+#endif
        }
-       spin_unlock_irqrestore(&npinfo->rx_lock, flags);
+}
+
+static bool pkt_is_ns(struct sk_buff *skb)
+{
+       struct nd_msg *msg;
+       struct ipv6hdr *hdr;
+
+       if (skb->protocol != htons(ETH_P_ARP))
+               return false;
+       if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + sizeof(struct nd_msg)))
+               return false;
+
+       msg = (struct nd_msg *)skb_transport_header(skb);
+       __skb_push(skb, skb->data - skb_transport_header(skb));
+       hdr = ipv6_hdr(skb);
+
+       if (hdr->nexthdr != IPPROTO_ICMPV6)
+               return false;
+       if (hdr->hop_limit != 255)
+               return false;
+       if (msg->icmph.icmp6_code != 0)
+               return false;
+       if (msg->icmph.icmp6_type != NDISC_NEIGHBOUR_SOLICITATION)
+               return false;
+
+       return true;
 }
 
 int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo)
@@ -574,9 +732,11 @@ int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo)
                goto out;
 
        /* check if netpoll clients need ARP */
-       if (skb->protocol == htons(ETH_P_ARP) &&
-           atomic_read(&trapped)) {
-               skb_queue_tail(&npinfo->arp_tx, skb);
+       if (skb->protocol == htons(ETH_P_ARP) && atomic_read(&trapped)) {
+               skb_queue_tail(&npinfo->neigh_tx, skb);
+               return 1;
+       } else if (pkt_is_ns(skb) && atomic_read(&trapped)) {
+               skb_queue_tail(&npinfo->neigh_tx, skb);
                return 1;
        }
 
@@ -587,60 +747,100 @@ int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo)
        }
 
        proto = ntohs(eth_hdr(skb)->h_proto);
-       if (proto != ETH_P_IP)
+       if (proto != ETH_P_IP && proto != ETH_P_IPV6)
                goto out;
        if (skb->pkt_type == PACKET_OTHERHOST)
                goto out;
        if (skb_shared(skb))
                goto out;
 
-       if (!pskb_may_pull(skb, sizeof(struct iphdr)))
-               goto out;
-       iph = (struct iphdr *)skb->data;
-       if (iph->ihl < 5 || iph->version != 4)
-               goto out;
-       if (!pskb_may_pull(skb, iph->ihl*4))
-               goto out;
-       iph = (struct iphdr *)skb->data;
-       if (ip_fast_csum((u8 *)iph, iph->ihl) != 0)
-               goto out;
-
-       len = ntohs(iph->tot_len);
-       if (skb->len < len || len < iph->ihl*4)
-               goto out;
+       if (proto == ETH_P_IP) {
+               if (!pskb_may_pull(skb, sizeof(struct iphdr)))
+                       goto out;
+               iph = (struct iphdr *)skb->data;
+               if (iph->ihl < 5 || iph->version != 4)
+                       goto out;
+               if (!pskb_may_pull(skb, iph->ihl*4))
+                       goto out;
+               iph = (struct iphdr *)skb->data;
+               if (ip_fast_csum((u8 *)iph, iph->ihl) != 0)
+                       goto out;
 
-       /*
-        * Our transport medium may have padded the buffer out.
-        * Now We trim to the true length of the frame.
-        */
-       if (pskb_trim_rcsum(skb, len))
-               goto out;
+               len = ntohs(iph->tot_len);
+               if (skb->len < len || len < iph->ihl*4)
+                       goto out;
 
-       iph = (struct iphdr *)skb->data;
-       if (iph->protocol != IPPROTO_UDP)
-               goto out;
+               /*
+                * Our transport medium may have padded the buffer out.
+                * Now We trim to the true length of the frame.
+                */
+               if (pskb_trim_rcsum(skb, len))
+                       goto out;
 
-       len -= iph->ihl*4;
-       uh = (struct udphdr *)(((char *)iph) + iph->ihl*4);
-       ulen = ntohs(uh->len);
+               iph = (struct iphdr *)skb->data;
+               if (iph->protocol != IPPROTO_UDP)
+                       goto out;
 
-       if (ulen != len)
-               goto out;
-       if (checksum_udp(skb, uh, ulen, iph->saddr, iph->daddr))
-               goto out;
+               len -= iph->ihl*4;
+               uh = (struct udphdr *)(((char *)iph) + iph->ihl*4);
+               ulen = ntohs(uh->len);
 
-       list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) {
-               if (np->local_ip && np->local_ip != iph->daddr)
-                       continue;
-               if (np->remote_ip && np->remote_ip != iph->saddr)
-                       continue;
-               if (np->local_port && np->local_port != ntohs(uh->dest))
-                       continue;
+               if (ulen != len)
+                       goto out;
+               if (checksum_udp(skb, uh, ulen, iph->saddr, iph->daddr))
+                       goto out;
+               list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) {
+                       if (np->local_ip.ip && np->local_ip.ip != iph->daddr)
+                               continue;
+                       if (np->remote_ip.ip && np->remote_ip.ip != iph->saddr)
+                               continue;
+                       if (np->local_port && np->local_port != ntohs(uh->dest))
+                               continue;
+
+                       np->rx_hook(np, ntohs(uh->source),
+                                      (char *)(uh+1),
+                                      ulen - sizeof(struct udphdr));
+                       hits++;
+               }
+       } else {
+#if IS_ENABLED(CONFIG_IPV6)
+               const struct ipv6hdr *ip6h;
 
-               np->rx_hook(np, ntohs(uh->source),
-                              (char *)(uh+1),
-                              ulen - sizeof(struct udphdr));
-               hits++;
+               if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
+                       goto out;
+               ip6h = (struct ipv6hdr *)skb->data;
+               if (ip6h->version != 6)
+                       goto out;
+               len = ntohs(ip6h->payload_len);
+               if (!len)
+                       goto out;
+               if (len + sizeof(struct ipv6hdr) > skb->len)
+                       goto out;
+               if (pskb_trim_rcsum(skb, len + sizeof(struct ipv6hdr)))
+                       goto out;
+               ip6h = ipv6_hdr(skb);
+               if (!pskb_may_pull(skb, sizeof(struct udphdr)))
+                       goto out;
+               uh = udp_hdr(skb);
+               ulen = ntohs(uh->len);
+               if (ulen != skb->len)
+                       goto out;
+               if (udp6_csum_init(skb, uh, IPPROTO_UDP))
+                       goto out;
+               list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) {
+                       if (memcmp(&np->local_ip.in6, &ip6h->daddr, sizeof(struct in6_addr)) != 0)
+                               continue;
+                       if (memcmp(&np->remote_ip.in6, &ip6h->saddr, sizeof(struct in6_addr)) != 0)
+                               continue;
+                       if (np->local_port && np->local_port != ntohs(uh->dest))
+                               continue;
+
+                       np->rx_hook(np, ntohs(uh->source),
+                                      (char *)(uh+1),
+                                      ulen - sizeof(struct udphdr));
+                       hits++;
+               }
+#endif
        }
 
        if (!hits)
@@ -661,17 +861,44 @@ out:
 void netpoll_print_options(struct netpoll *np)
 {
        np_info(np, "local port %d\n", np->local_port);
-       np_info(np, "local IP %pI4\n", &np->local_ip);
+       if (np->ipv6)
+               np_info(np, "local IPv6 address %pI6c\n", &np->local_ip.in6);
+       else
+               np_info(np, "local IPv4 address %pI4\n", &np->local_ip.ip);
        np_info(np, "interface '%s'\n", np->dev_name);
        np_info(np, "remote port %d\n", np->remote_port);
-       np_info(np, "remote IP %pI4\n", &np->remote_ip);
+       if (np->ipv6)
+               np_info(np, "remote IPv6 address %pI6c\n", &np->remote_ip.in6);
+       else
+               np_info(np, "remote IPv4 address %pI4\n", &np->remote_ip.ip);
        np_info(np, "remote ethernet address %pM\n", np->remote_mac);
 }
 EXPORT_SYMBOL(netpoll_print_options);
 
+static int netpoll_parse_ip_addr(const char *str, union inet_addr *addr)
+{
+       const char *end;
+
+       if (!strchr(str, ':') &&
+           in4_pton(str, -1, (void *)addr, -1, &end) > 0) {
+               if (!*end)
+                       return 0;
+       }
+       if (in6_pton(str, -1, addr->in6.s6_addr, -1, &end) > 0) {
+#if IS_ENABLED(CONFIG_IPV6)
+               if (!*end)
+                       return 1;
+#else
+               return -1;
+#endif
+       }
+       return -1;
+}
+
 int netpoll_parse_options(struct netpoll *np, char *opt)
 {
        char *cur=opt, *delim;
+       int ipv6;
 
        if (*cur != '@') {
                if ((delim = strchr(cur, '@')) == NULL)
@@ -687,7 +914,11 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
                if ((delim = strchr(cur, '/')) == NULL)
                        goto parse_failed;
                *delim = 0;
-               np->local_ip = in_aton(cur);
+               ipv6 = netpoll_parse_ip_addr(cur, &np->local_ip);
+               if (ipv6 < 0)
+                       goto parse_failed;
+               else
+                       np->ipv6 = (bool)ipv6;
                cur = delim;
        }
        cur++;
@@ -719,7 +950,13 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
        if ((delim = strchr(cur, '/')) == NULL)
                goto parse_failed;
        *delim = 0;
-       np->remote_ip = in_aton(cur);
+       ipv6 = netpoll_parse_ip_addr(cur, &np->remote_ip);
+       if (ipv6 < 0)
+               goto parse_failed;
+       else if (np->ipv6 != (bool)ipv6)
+               goto parse_failed;
+       else
+               np->ipv6 = (bool)ipv6;
        cur = delim + 1;
 
        if (*cur != 0) {
@@ -767,7 +1004,7 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev, gfp_t gfp)
                INIT_LIST_HEAD(&npinfo->rx_np);
 
                spin_lock_init(&npinfo->rx_lock);
-               skb_queue_head_init(&npinfo->arp_tx);
+               skb_queue_head_init(&npinfo->neigh_tx);
                skb_queue_head_init(&npinfo->txq);
                INIT_DELAYED_WORK(&npinfo->tx_work, queue_process);
 
@@ -811,12 +1048,15 @@ int netpoll_setup(struct netpoll *np)
        struct in_device *in_dev;
        int err;
 
+       rtnl_lock();
        if (np->dev_name)
-               ndev = dev_get_by_name(&init_net, np->dev_name);
+               ndev = __dev_get_by_name(&init_net, np->dev_name);
        if (!ndev) {
                np_err(np, "%s doesn't exist, aborting\n", np->dev_name);
-               return -ENODEV;
+               err = -ENODEV;
+               goto unlock;
        }
+       dev_hold(ndev);
 
        if (netdev_master_upper_dev_get(ndev)) {
                np_err(np, "%s is a slave device, aborting\n", np->dev_name);
@@ -829,15 +1069,14 @@ int netpoll_setup(struct netpoll *np)
 
                np_info(np, "device %s not up yet, forcing it\n", np->dev_name);
 
-               rtnl_lock();
                err = dev_open(ndev);
-               rtnl_unlock();
 
                if (err) {
                        np_err(np, "failed to open %s\n", ndev->name);
                        goto put;
                }
 
+               rtnl_unlock();
                atleast = jiffies + HZ/10;
                atmost = jiffies + carrier_timeout * HZ;
                while (!netif_carrier_ok(ndev)) {
@@ -857,39 +1096,70 @@ int netpoll_setup(struct netpoll *np)
                        np_notice(np, "carrier detect appears untrustworthy, waiting 4 seconds\n");
                        msleep(4000);
                }
+               rtnl_lock();
        }
 
-       if (!np->local_ip) {
-               rcu_read_lock();
-               in_dev = __in_dev_get_rcu(ndev);
+       if (!np->local_ip.ip) {
+               if (!np->ipv6) {
+                       in_dev = __in_dev_get_rtnl(ndev);
+
+                       if (!in_dev || !in_dev->ifa_list) {
+                               np_err(np, "no IP address for %s, aborting\n",
+                                      np->dev_name);
+                               err = -EDESTADDRREQ;
+                               goto put;
+                       }
+
+                       np->local_ip.ip = in_dev->ifa_list->ifa_local;
+                       np_info(np, "local IP %pI4\n", &np->local_ip.ip);
+               } else {
+#if IS_ENABLED(CONFIG_IPV6)
+                       struct inet6_dev *idev;
 
-               if (!in_dev || !in_dev->ifa_list) {
-                       rcu_read_unlock();
-                       np_err(np, "no IP address for %s, aborting\n",
-                              np->dev_name);
                        err = -EDESTADDRREQ;
+                       idev = __in6_dev_get(ndev);
+                       if (idev) {
+                               struct inet6_ifaddr *ifp;
+
+                               read_lock_bh(&idev->lock);
+                               list_for_each_entry(ifp, &idev->addr_list, if_list) {
+                                       if (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)
+                                               continue;
+                                       np->local_ip.in6 = ifp->addr;
+                                       err = 0;
+                                       break;
+                               }
+                               read_unlock_bh(&idev->lock);
+                       }
+                       if (err) {
+                               np_err(np, "no IPv6 address for %s, aborting\n",
+                                      np->dev_name);
+                               goto put;
+                       } else
+                               np_info(np, "local IPv6 %pI6c\n", &np->local_ip.in6);
+#else
+                       np_err(np, "IPv6 is not supported %s, aborting\n",
+                              np->dev_name);
+                       err = -EINVAL;
                        goto put;
+#endif
                }
-
-               np->local_ip = in_dev->ifa_list->ifa_local;
-               rcu_read_unlock();
-               np_info(np, "local IP %pI4\n", &np->local_ip);
        }
 
        /* fill up the skb queue */
        refill_skbs();
 
-       rtnl_lock();
        err = __netpoll_setup(np, ndev, GFP_KERNEL);
-       rtnl_unlock();
-
        if (err)
                goto put;
 
+       rtnl_unlock();
        return 0;
 
 put:
        dev_put(ndev);
+unlock:
+       rtnl_unlock();
        return err;
 }
 EXPORT_SYMBOL(netpoll_setup);
@@ -906,7 +1176,7 @@ static void rcu_cleanup_netpoll_info(struct rcu_head *rcu_head)
        struct netpoll_info *npinfo =
                        container_of(rcu_head, struct netpoll_info, rcu);
 
-       skb_queue_purge(&npinfo->arp_tx);
+       skb_queue_purge(&npinfo->neigh_tx);
        skb_queue_purge(&npinfo->txq);
 
        /* we can't call cancel_delayed_work_sync here, as we are in softirq */
index c31d9e8668c30346894adbf3be55eed4beeb1258..4425148d2b51592626b92a1451d9bc1208213fb8 100644 (file)
@@ -186,8 +186,6 @@ void reqsk_fastopen_remove(struct sock *sk, struct request_sock *req,
        struct fastopen_queue *fastopenq =
            inet_csk(lsk)->icsk_accept_queue.fastopenq;
 
-       BUG_ON(!spin_is_locked(&sk->sk_lock.slock) && !sock_owned_by_user(sk));
-
        tcp_sk(sk)->fastopen_rsk = NULL;
        spin_lock_bh(&fastopenq->lock);
        fastopenq->qlen--;
index b03fc0c6a952986fe144e7d19ba42e8338a379cb..2568c449fe36cb488269986402c31915d00ac647 100644 (file)
@@ -260,6 +260,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
        skb->end = skb->tail + size;
 #ifdef NET_SKBUFF_DATA_USES_OFFSET
        skb->mac_header = ~0U;
+       skb->transport_header = ~0U;
 #endif
 
        /* make sure we initialize shinfo sequentially */
@@ -328,6 +329,7 @@ struct sk_buff *build_skb(void *data, unsigned int frag_size)
        skb->end = skb->tail + size;
 #ifdef NET_SKBUFF_DATA_USES_OFFSET
        skb->mac_header = ~0U;
+       skb->transport_header = ~0U;
 #endif
 
        /* make sure we initialize shinfo sequentially */
@@ -1650,7 +1652,7 @@ static void sock_spd_release(struct splice_pipe_desc *spd, unsigned int i)
 
 static struct page *linear_to_page(struct page *page, unsigned int *len,
                                   unsigned int *offset,
-                                  struct sk_buff *skb, struct sock *sk)
+                                  struct sock *sk)
 {
        struct page_frag *pfrag = sk_page_frag(sk);
 
@@ -1683,14 +1685,14 @@ static bool spd_can_coalesce(const struct splice_pipe_desc *spd,
 static bool spd_fill_page(struct splice_pipe_desc *spd,
                          struct pipe_inode_info *pipe, struct page *page,
                          unsigned int *len, unsigned int offset,
-                         struct sk_buff *skb, bool linear,
+                         bool linear,
                          struct sock *sk)
 {
        if (unlikely(spd->nr_pages == MAX_SKB_FRAGS))
                return true;
 
        if (linear) {
-               page = linear_to_page(page, len, &offset, skb, sk);
+               page = linear_to_page(page, len, &offset, sk);
                if (!page)
                        return true;
        }
@@ -1709,13 +1711,11 @@ static bool spd_fill_page(struct splice_pipe_desc *spd,
 
 static bool __splice_segment(struct page *page, unsigned int poff,
                             unsigned int plen, unsigned int *off,
-                            unsigned int *len, struct sk_buff *skb,
+                            unsigned int *len,
                             struct splice_pipe_desc *spd, bool linear,
                             struct sock *sk,
                             struct pipe_inode_info *pipe)
 {
-       unsigned int flen;
-
        if (!*len)
                return true;
 
@@ -1730,12 +1730,16 @@ static bool __splice_segment(struct page *page, unsigned int poff,
        plen -= *off;
        *off = 0;
 
-       flen = min(*len, plen);
-
-       if (spd_fill_page(spd, pipe, page, &flen, poff, skb, linear, sk))
-               return true;
+       do {
+               unsigned int flen = min(*len, plen);
 
-       *len -= flen;
+               if (spd_fill_page(spd, pipe, page, &flen, poff,
+                                 linear, sk))
+                       return true;
+               poff += flen;
+               plen -= flen;
+               *len -= flen;
+       } while (*len && plen);
 
        return false;
 }
@@ -1758,7 +1762,7 @@ static bool __skb_splice_bits(struct sk_buff *skb, struct pipe_inode_info *pipe,
        if (__splice_segment(virt_to_page(skb->data),
                             (unsigned long) skb->data & (PAGE_SIZE - 1),
                             skb_headlen(skb),
-                            offset, len, skb, spd,
+                            offset, len, spd,
                             skb_head_is_locked(skb),
                             sk, pipe))
                return true;
@@ -1771,7 +1775,7 @@ static bool __skb_splice_bits(struct sk_buff *skb, struct pipe_inode_info *pipe,
 
                if (__splice_segment(skb_frag_page(f),
                                     f->page_offset, skb_frag_size(f),
-                                    offset, len, skb, spd, false, sk, pipe))
+                                    offset, len, spd, false, sk, pipe))
                        return true;
        }
 
index bc131d419683c11bd6f098c930e7d4f3cd9fb697..235fb89e8973a864978c00acfa0dbc0173762082 100644 (file)
@@ -665,6 +665,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
        case SO_REUSEADDR:
                sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);
                break;
+       case SO_REUSEPORT:
+               sk->sk_reuseport = valbool;
+               break;
        case SO_TYPE:
        case SO_PROTOCOL:
        case SO_DOMAIN:
@@ -861,6 +864,13 @@ set_rcvbuf:
                ret = sk_detach_filter(sk);
                break;
 
+       case SO_LOCK_FILTER:
+               if (sock_flag(sk, SOCK_FILTER_LOCKED) && !valbool)
+                       ret = -EPERM;
+               else
+                       sock_valbool_flag(sk, SOCK_FILTER_LOCKED, valbool);
+               break;
+
        case SO_PASSSEC:
                if (valbool)
                        set_bit(SOCK_PASSSEC, &sock->flags);
@@ -965,6 +975,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                v.val = sk->sk_reuse;
                break;
 
+       case SO_REUSEPORT:
+               v.val = sk->sk_reuseport;
+               break;
+
        case SO_KEEPALIVE:
                v.val = sock_flag(sk, SOCK_KEEPOPEN);
                break;
@@ -1140,6 +1154,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
 
                goto lenout;
 
+       case SO_LOCK_FILTER:
+               v.val = sock_flag(sk, SOCK_FILTER_LOCKED);
+               break;
+
        default:
                return -ENOPROTOOPT;
        }
index 45295ca095717314294e1be8172a6e852fe1a679..2bc62ea857c8b6842c27ed9d6ee12b564fb2d1e6 100644 (file)
@@ -80,6 +80,7 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
        int ret;
        char *name;
        int i;
+       bool valid_name_found = false;
 
        /*
         * Probe for switch model.
@@ -131,8 +132,13 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
                } else {
                        ds->phys_port_mask |= 1 << i;
                }
+               valid_name_found = true;
        }
 
+       if (!valid_name_found && i == DSA_MAX_PORTS) {
+               ret = -EINVAL;
+               goto out;
+       }
 
        /*
         * If the CPU connects to this switch, set the switch tree
index f795b0ca7ee66c8a3ee6a11a4ad4803299eefe41..6ebd8fbd92855763013b5feefbb8123e0ee7fe3e 100644 (file)
@@ -41,8 +41,8 @@ void dsa_slave_mii_bus_init(struct dsa_switch *ds)
        ds->slave_mii_bus->name = "dsa slave smi";
        ds->slave_mii_bus->read = dsa_slave_phy_read;
        ds->slave_mii_bus->write = dsa_slave_phy_write;
-       snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "%s:%.2x",
-                       ds->master_mii_bus->id, ds->pd->sw_addr);
+       snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d:%.2x",
+                       ds->index, ds->pd->sw_addr);
        ds->slave_mii_bus->parent = &ds->master_mii_bus->dev;
 }
 
@@ -391,7 +391,7 @@ dsa_slave_create(struct dsa_switch *ds, struct device *parent,
 
        if (p->phy != NULL) {
                phy_attach(slave_dev, dev_name(&p->phy->dev),
-                          0, PHY_INTERFACE_MODE_GMII);
+                          PHY_INTERFACE_MODE_GMII);
 
                p->phy->autoneg = AUTONEG_ENABLE;
                p->phy->speed = 0;
index bc39c8c8f589483f42780f2633d51ebe91e3c04d..a36c85eab5b4ebf9992794f3822fd8553f7458c9 100644 (file)
@@ -271,6 +271,36 @@ void eth_header_cache_update(struct hh_cache *hh,
 }
 EXPORT_SYMBOL(eth_header_cache_update);
 
+/**
+ * eth_prepare_mac_addr_change - prepare for mac change
+ * @dev: network device
+ * @p: socket address
+ */
+int eth_prepare_mac_addr_change(struct net_device *dev, void *p)
+{
+       struct sockaddr *addr = p;
+
+       if (!(dev->priv_flags & IFF_LIVE_ADDR_CHANGE) && netif_running(dev))
+               return -EBUSY;
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EADDRNOTAVAIL;
+       return 0;
+}
+EXPORT_SYMBOL(eth_prepare_mac_addr_change);
+
+/**
+ * eth_commit_mac_addr_change - commit mac change
+ * @dev: network device
+ * @p: socket address
+ */
+void eth_commit_mac_addr_change(struct net_device *dev, void *p)
+{
+       struct sockaddr *addr = p;
+
+       memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+}
+EXPORT_SYMBOL(eth_commit_mac_addr_change);
+
 /**
  * eth_mac_addr - set new Ethernet hardware address
  * @dev: network device
@@ -283,13 +313,12 @@ EXPORT_SYMBOL(eth_header_cache_update);
  */
 int eth_mac_addr(struct net_device *dev, void *p)
 {
-       struct sockaddr *addr = p;
+       int ret;
 
-       if (!(dev->priv_flags & IFF_LIVE_ADDR_CHANGE) && netif_running(dev))
-               return -EBUSY;
-       if (!is_valid_ether_addr(addr->sa_data))
-               return -EADDRNOTAVAIL;
-       memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+       ret = eth_prepare_mac_addr_change(dev, p);
+       if (ret < 0)
+               return ret;
+       eth_commit_mac_addr_change(dev, p);
        return 0;
 }
 EXPORT_SYMBOL(eth_mac_addr);
index f651da60f1618f089c2d21eef069ac5b3648218d..09cba81d2c4ab65f18963a34f9a7857fc4860367 100644 (file)
@@ -594,10 +594,32 @@ static int lowpan_header_create(struct sk_buff *skb,
        }
 }
 
+static int lowpan_give_skb_to_devices(struct sk_buff *skb)
+{
+       struct lowpan_dev_record *entry;
+       struct sk_buff *skb_cp;
+       int stat = NET_RX_SUCCESS;
+
+       rcu_read_lock();
+       list_for_each_entry_rcu(entry, &lowpan_devices, list)
+               if (lowpan_dev_info(entry->ldev)->real_dev == skb->dev) {
+                       skb_cp = skb_copy(skb, GFP_ATOMIC);
+                       if (!skb_cp) {
+                               stat = -ENOMEM;
+                               break;
+                       }
+
+                       skb_cp->dev = entry->ldev;
+                       stat = netif_rx(skb_cp);
+               }
+       rcu_read_unlock();
+
+       return stat;
+}
+
 static int lowpan_skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr)
 {
        struct sk_buff *new;
-       struct lowpan_dev_record *entry;
        int stat = NET_RX_SUCCESS;
 
        new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
@@ -614,19 +636,7 @@ static int lowpan_skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr)
        new->protocol = htons(ETH_P_IPV6);
        new->pkt_type = PACKET_HOST;
 
-       rcu_read_lock();
-       list_for_each_entry_rcu(entry, &lowpan_devices, list)
-               if (lowpan_dev_info(entry->ldev)->real_dev == new->dev) {
-                       skb = skb_copy(new, GFP_ATOMIC);
-                       if (!skb) {
-                               stat = -ENOMEM;
-                               break;
-                       }
-
-                       skb->dev = entry->ldev;
-                       stat = netif_rx(skb);
-               }
-       rcu_read_unlock();
+       stat = lowpan_give_skb_to_devices(new);
 
        kfree_skb(new);
 
@@ -1137,19 +1147,42 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,
                goto drop;
 
        /* check that it's our buffer */
-       switch (skb->data[0] & 0xe0) {
-       case LOWPAN_DISPATCH_IPHC:      /* ipv6 datagram */
-       case LOWPAN_DISPATCH_FRAG1:     /* first fragment header */
-       case LOWPAN_DISPATCH_FRAGN:     /* next fragments headers */
-               local_skb = skb_clone(skb, GFP_ATOMIC);
+       if (skb->data[0] == LOWPAN_DISPATCH_IPV6) {
+               /* Copy the packet so that the IPv6 header is
+                * properly aligned.
+                */
+               local_skb = skb_copy_expand(skb, NET_SKB_PAD - 1,
+                                           skb_tailroom(skb), GFP_ATOMIC);
                if (!local_skb)
                        goto drop;
-               lowpan_process_data(local_skb);
 
+               local_skb->protocol = htons(ETH_P_IPV6);
+               local_skb->pkt_type = PACKET_HOST;
+
+               /* Pull off the 1-byte of 6lowpan header. */
+               skb_pull(local_skb, 1);
+               skb_reset_network_header(local_skb);
+               skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));
+
+               lowpan_give_skb_to_devices(local_skb);
+
+               kfree_skb(local_skb);
                kfree_skb(skb);
-               break;
-       default:
-               break;
+       } else {
+               switch (skb->data[0] & 0xe0) {
+               case LOWPAN_DISPATCH_IPHC:      /* ipv6 datagram */
+               case LOWPAN_DISPATCH_FRAG1:     /* first fragment header */
+               case LOWPAN_DISPATCH_FRAGN:     /* next fragments headers */
+                       local_skb = skb_clone(skb, GFP_ATOMIC);
+                       if (!local_skb)
+                               goto drop;
+                       lowpan_process_data(local_skb);
+
+                       kfree_skb(skb);
+                       break;
+               default:
+                       break;
+               }
        }
 
        return NET_RX_SUCCESS;
index 24b384b7903ea7a59a11e7a4cbf06db996498924..4b70539199765de41e9356dfca738cb63ba7c16a 100644 (file)
@@ -1333,7 +1333,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
                segs = ops->callbacks.gso_segment(skb, features);
        rcu_read_unlock();
 
-       if (!segs || IS_ERR(segs))
+       if (IS_ERR_OR_NULL(segs))
                goto out;
 
        skb = segs;
@@ -1705,12 +1705,11 @@ static struct packet_type ip_packet_type __read_mostly = {
 
 static int __init inet_init(void)
 {
-       struct sk_buff *dummy_skb;
        struct inet_protosw *q;
        struct list_head *r;
        int rc = -EINVAL;
 
-       BUILD_BUG_ON(sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb));
+       BUILD_BUG_ON(sizeof(struct inet_skb_parm) > FIELD_SIZEOF(struct sk_buff, cb));
 
        sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL);
        if (!sysctl_local_reserved_ports)
index cc06a47f12163ad8b93cae060a8c211bb13fcc73..a8e4f2665d5e6687c28438de69586673be9b3484 100644 (file)
@@ -823,9 +823,9 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
                if (!ifa) {
                        ret = -ENOBUFS;
                        ifa = inet_alloc_ifa();
-                       INIT_HLIST_NODE(&ifa->hash);
                        if (!ifa)
                                break;
+                       INIT_HLIST_NODE(&ifa->hash);
                        if (colon)
                                memcpy(ifa->ifa_label, ifr.ifr_name, IFNAMSIZ);
                        else
index 5cd75e2dab2c17377d7250680c6b32717fe9cce9..99f00d39d10b7a9873ba565c45a485620c418c83 100644 (file)
@@ -974,7 +974,7 @@ static void nl_fib_input(struct sk_buff *skb)
 
        nl_fib_lookup(frn, tb);
 
-       portid = NETLINK_CB(skb).portid;      /* pid of sending process */
+       portid = NETLINK_CB(skb).portid;      /* netlink portid */
        NETLINK_CB(skb).portid = 0;        /* from kernel */
        NETLINK_CB(skb).dst_group = 0;  /* unicast */
        netlink_unicast(net->ipv4.fibnl, skb, portid, MSG_DONTWAIT);
index d0670f00d5243f95bec4536f60edf32fa2ded850..8bb623d357adf9c1ec2b88010338f5be1b3182ae 100644 (file)
@@ -59,6 +59,8 @@ int inet_csk_bind_conflict(const struct sock *sk,
        struct sock *sk2;
        struct hlist_node *node;
        int reuse = sk->sk_reuse;
+       int reuseport = sk->sk_reuseport;
+       kuid_t uid = sock_i_uid((struct sock *)sk);
 
        /*
         * Unlike other sk lookup places we do not check
@@ -73,8 +75,11 @@ int inet_csk_bind_conflict(const struct sock *sk,
                    (!sk->sk_bound_dev_if ||
                     !sk2->sk_bound_dev_if ||
                     sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) {
-                       if (!reuse || !sk2->sk_reuse ||
-                           sk2->sk_state == TCP_LISTEN) {
+                       if ((!reuse || !sk2->sk_reuse ||
+                           sk2->sk_state == TCP_LISTEN) &&
+                           (!reuseport || !sk2->sk_reuseport ||
+                           (sk2->sk_state != TCP_TIME_WAIT &&
+                            !uid_eq(uid, sock_i_uid(sk2))))) {
                                const __be32 sk2_rcv_saddr = sk_rcv_saddr(sk2);
                                if (!sk2_rcv_saddr || !sk_rcv_saddr(sk) ||
                                    sk2_rcv_saddr == sk_rcv_saddr(sk))
@@ -106,6 +111,7 @@ int inet_csk_get_port(struct sock *sk, unsigned short snum)
        int ret, attempts = 5;
        struct net *net = sock_net(sk);
        int smallest_size = -1, smallest_rover;
+       kuid_t uid = sock_i_uid(sk);
 
        local_bh_disable();
        if (!snum) {
@@ -125,9 +131,12 @@ again:
                        spin_lock(&head->lock);
                        inet_bind_bucket_for_each(tb, node, &head->chain)
                                if (net_eq(ib_net(tb), net) && tb->port == rover) {
-                                       if (tb->fastreuse > 0 &&
-                                           sk->sk_reuse &&
-                                           sk->sk_state != TCP_LISTEN &&
+                                       if (((tb->fastreuse > 0 &&
+                                             sk->sk_reuse &&
+                                             sk->sk_state != TCP_LISTEN) ||
+                                            (tb->fastreuseport > 0 &&
+                                             sk->sk_reuseport &&
+                                             uid_eq(tb->fastuid, uid))) &&
                                            (tb->num_owners < smallest_size || smallest_size == -1)) {
                                                smallest_size = tb->num_owners;
                                                smallest_rover = rover;
@@ -185,14 +194,17 @@ tb_found:
                if (sk->sk_reuse == SK_FORCE_REUSE)
                        goto success;
 
-               if (tb->fastreuse > 0 &&
-                   sk->sk_reuse && sk->sk_state != TCP_LISTEN &&
+               if (((tb->fastreuse > 0 &&
+                     sk->sk_reuse && sk->sk_state != TCP_LISTEN) ||
+                    (tb->fastreuseport > 0 &&
+                     sk->sk_reuseport && uid_eq(tb->fastuid, uid))) &&
                    smallest_size == -1) {
                        goto success;
                } else {
                        ret = 1;
                        if (inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb, true)) {
-                               if (sk->sk_reuse && sk->sk_state != TCP_LISTEN &&
+                               if (((sk->sk_reuse && sk->sk_state != TCP_LISTEN) ||
+                                    (sk->sk_reuseport && uid_eq(tb->fastuid, uid))) &&
                                    smallest_size != -1 && --attempts >= 0) {
                                        spin_unlock(&head->lock);
                                        goto again;
@@ -212,9 +224,23 @@ tb_not_found:
                        tb->fastreuse = 1;
                else
                        tb->fastreuse = 0;
-       } else if (tb->fastreuse &&
-                  (!sk->sk_reuse || sk->sk_state == TCP_LISTEN))
-               tb->fastreuse = 0;
+               if (sk->sk_reuseport) {
+                       tb->fastreuseport = 1;
+                       tb->fastuid = uid;
+               } else {
+                       tb->fastreuseport = 0;
+                       tb->fastuid = 0;
+               }
+       } else {
+               if (tb->fastreuse &&
+                   (!sk->sk_reuse || sk->sk_state == TCP_LISTEN))
+                       tb->fastreuse = 0;
+               if (tb->fastreuseport &&
+                   (!sk->sk_reuseport || !uid_eq(tb->fastuid, uid))) {
+                       tb->fastreuseport = 0;
+                       tb->fastuid = 0;
+               }
+       }
 success:
        if (!inet_csk(sk)->icsk_bind_hash)
                inet_bind_hash(sk, tb, snum);
index fa3ae814871082e22121855a4033ddc4ec21b1c7..0ce0595d98618492ce17c285aadba6076dcec9ce 100644 (file)
@@ -39,6 +39,7 @@ struct inet_bind_bucket *inet_bind_bucket_create(struct kmem_cache *cachep,
                write_pnet(&tb->ib_net, hold_net(net));
                tb->port      = snum;
                tb->fastreuse = 0;
+               tb->fastreuseport = 0;
                tb->num_owners = 0;
                INIT_HLIST_HEAD(&tb->owners);
                hlist_add_head(&tb->node, &head->chain);
@@ -151,16 +152,16 @@ static inline int compute_score(struct sock *sk, struct net *net,
        if (net_eq(sock_net(sk), net) && inet->inet_num == hnum &&
                        !ipv6_only_sock(sk)) {
                __be32 rcv_saddr = inet->inet_rcv_saddr;
-               score = sk->sk_family == PF_INET ? 1 : 0;
+               score = sk->sk_family == PF_INET ? 2 : 1;
                if (rcv_saddr) {
                        if (rcv_saddr != daddr)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
                if (sk->sk_bound_dev_if) {
                        if (sk->sk_bound_dev_if != dif)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
        }
        return score;
@@ -176,6 +177,7 @@ static inline int compute_score(struct sock *sk, struct net *net,
 
 struct sock *__inet_lookup_listener(struct net *net,
                                    struct inet_hashinfo *hashinfo,
+                                   const __be32 saddr, __be16 sport,
                                    const __be32 daddr, const unsigned short hnum,
                                    const int dif)
 {
@@ -183,17 +185,29 @@ struct sock *__inet_lookup_listener(struct net *net,
        struct hlist_nulls_node *node;
        unsigned int hash = inet_lhashfn(net, hnum);
        struct inet_listen_hashbucket *ilb = &hashinfo->listening_hash[hash];
-       int score, hiscore;
+       int score, hiscore, matches = 0, reuseport = 0;
+       u32 phash = 0;
 
        rcu_read_lock();
 begin:
        result = NULL;
-       hiscore = -1;
+       hiscore = 0;
        sk_nulls_for_each_rcu(sk, node, &ilb->head) {
                score = compute_score(sk, net, hnum, daddr, dif);
                if (score > hiscore) {
                        result = sk;
                        hiscore = score;
+                       reuseport = sk->sk_reuseport;
+                       if (reuseport) {
+                               phash = inet_ehashfn(net, daddr, hnum,
+                                                    saddr, sport);
+                               matches = 1;
+                       }
+               } else if (score == hiscore && reuseport) {
+                       matches++;
+                       if (((u64)phash * matches) >> 32 == 0)
+                               result = sk;
+                       phash = next_pseudo_random32(phash);
                }
        }
        /*
@@ -501,7 +515,8 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
                        inet_bind_bucket_for_each(tb, node, &head->chain) {
                                if (net_eq(ib_net(tb), net) &&
                                    tb->port == port) {
-                                       if (tb->fastreuse >= 0)
+                                       if (tb->fastreuse >= 0 ||
+                                           tb->fastreuseport >= 0)
                                                goto next_port;
                                        WARN_ON(hlist_empty(&tb->owners));
                                        if (!check_established(death_row, sk,
@@ -518,6 +533,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
                                break;
                        }
                        tb->fastreuse = -1;
+                       tb->fastreuseport = -1;
                        goto ok;
 
                next_port:
index eb9d63a570cd1ce595076096d9b2aea3723a4c38..f55a4e61bfb8b702962507e54a6b31ec99f0d294 100644 (file)
@@ -851,14 +851,22 @@ static inline void ip4_frags_ctl_register(void)
 
 static int __net_init ipv4_frags_init_net(struct net *net)
 {
-       /*
-        * Fragment cache limits. We will commit 256K at one time. Should we
-        * cross that limit we will prune down to 192K. This should cope with
-        * even the most extreme cases without allowing an attacker to
-        * measurably harm machine performance.
+       /* Fragment cache limits.
+        *
+        * The fragment memory accounting code, (tries to) account for
+        * the real memory usage, by measuring both the size of frag
+        * queue struct (inet_frag_queue (ipv4:ipq/ipv6:frag_queue))
+        * and the SKB's truesize.
+        *
+        * A 64K fragment consumes 129736 bytes (44*2944)+200
+        * (1500 truesize == 2944, sizeof(struct ipq) == 200)
+        *
+        * We will commit 4MB at one time. Should we cross that limit
+        * we will prune down to 3MB, making room for approx 8 big 64K
+        * fragments 8x128k.
         */
-       net->ipv4.frags.high_thresh = 256 * 1024;
-       net->ipv4.frags.low_thresh = 192 * 1024;
+       net->ipv4.frags.high_thresh = 4 * 1024 * 1024;
+       net->ipv4.frags.low_thresh  = 3 * 1024 * 1024;
        /*
         * Important NOTE! Fragment queue must be destroyed before MSL expires.
         * RFC791 is wrong proposing to prolongate timer each fragment arrival
index 3c9d20880283de0f9b5244eae8184e76d9a20dcd..d9c4f113d7093bba7eba2beefc31cd0af4b9bb95 100644 (file)
@@ -590,7 +590,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
        case IP_TTL:
                if (optlen < 1)
                        goto e_inval;
-               if (val != -1 && (val < 0 || val > 255))
+               if (val != -1 && (val < 1 || val > 255))
                        goto e_inval;
                inet->uc_ttl = val;
                break;
index d763701cff1b4aca032e60f335a4208e054a4e06..a2e50ae80b53361ca30c718dce7e85b5e4e7c66c 100644 (file)
@@ -136,6 +136,8 @@ __be32 ic_myaddr = NONE;            /* My IP address */
 static __be32 ic_netmask = NONE;       /* Netmask for local subnet */
 __be32 ic_gateway = NONE;      /* Gateway IP address */
 
+__be32 ic_addrservaddr = NONE; /* IP Address of the IP addresses'server */
+
 __be32 ic_servaddr = NONE;     /* Boot server IP address */
 
 __be32 root_server_addr = NONE;        /* Address of NFS server */
@@ -558,6 +560,7 @@ ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt
        if (ic_myaddr == NONE)
                ic_myaddr = tip;
        ic_servaddr = sip;
+       ic_addrservaddr = sip;
        ic_got_reply = IC_RARP;
 
 drop_unlock:
@@ -1068,7 +1071,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str
                                ic_servaddr = server_id;
 #ifdef IPCONFIG_DEBUG
                                printk("DHCP: Offered address %pI4 by server %pI4\n",
-                                      &ic_myaddr, &ic_servaddr);
+                                      &ic_myaddr, &b->iph.saddr);
 #endif
                                /* The DHCP indicated server address takes
                                 * precedence over the bootp header one if
@@ -1113,6 +1116,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str
        ic_dev = dev;
        ic_myaddr = b->your_ip;
        ic_servaddr = b->server_ip;
+       ic_addrservaddr = b->iph.saddr;
        if (ic_gateway == NONE && b->relay_ip)
                ic_gateway = b->relay_ip;
        if (ic_nameservers[0] == NONE)
@@ -1268,7 +1272,7 @@ static int __init ic_dynamic(void)
        printk("IP-Config: Got %s answer from %pI4, ",
                ((ic_got_reply & IC_RARP) ? "RARP"
                 : (ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP"),
-              &ic_servaddr);
+              &ic_addrservaddr);
        pr_cont("my address is %pI4\n", &ic_myaddr);
 
        return 0;
index a9454cbd953ce700139fdb010a333128b565b800..7085b9b51e7f9eba5fd249ee8b5ec92096f10ca5 100644 (file)
@@ -828,6 +828,49 @@ static struct mfc_cache *ipmr_cache_find(struct mr_table *mrt,
        return NULL;
 }
 
+/* Look for a (*,*,oif) entry */
+static struct mfc_cache *ipmr_cache_find_any_parent(struct mr_table *mrt,
+                                                   int vifi)
+{
+       int line = MFC_HASH(htonl(INADDR_ANY), htonl(INADDR_ANY));
+       struct mfc_cache *c;
+
+       list_for_each_entry_rcu(c, &mrt->mfc_cache_array[line], list)
+               if (c->mfc_origin == htonl(INADDR_ANY) &&
+                   c->mfc_mcastgrp == htonl(INADDR_ANY) &&
+                   c->mfc_un.res.ttls[vifi] < 255)
+                       return c;
+
+       return NULL;
+}
+
+/* Look for a (*,G) entry */
+static struct mfc_cache *ipmr_cache_find_any(struct mr_table *mrt,
+                                            __be32 mcastgrp, int vifi)
+{
+       int line = MFC_HASH(mcastgrp, htonl(INADDR_ANY));
+       struct mfc_cache *c, *proxy;
+
+       if (mcastgrp == htonl(INADDR_ANY))
+               goto skip;
+
+       list_for_each_entry_rcu(c, &mrt->mfc_cache_array[line], list)
+               if (c->mfc_origin == htonl(INADDR_ANY) &&
+                   c->mfc_mcastgrp == mcastgrp) {
+                       if (c->mfc_un.res.ttls[vifi] < 255)
+                               return c;
+
+                       /* It's ok if the vifi is part of the static tree */
+                       proxy = ipmr_cache_find_any_parent(mrt,
+                                                          c->mfc_parent);
+                       if (proxy && proxy->mfc_un.res.ttls[vifi] < 255)
+                               return c;
+               }
+
+skip:
+       return ipmr_cache_find_any_parent(mrt, vifi);
+}
+
 /*
  *     Allocate a multicast cache entry
  */
@@ -1053,7 +1096,7 @@ ipmr_cache_unresolved(struct mr_table *mrt, vifi_t vifi, struct sk_buff *skb)
  *     MFC cache manipulation by user space mroute daemon
  */
 
-static int ipmr_mfc_delete(struct mr_table *mrt, struct mfcctl *mfc)
+static int ipmr_mfc_delete(struct mr_table *mrt, struct mfcctl *mfc, int parent)
 {
        int line;
        struct mfc_cache *c, *next;
@@ -1062,7 +1105,8 @@ static int ipmr_mfc_delete(struct mr_table *mrt, struct mfcctl *mfc)
 
        list_for_each_entry_safe(c, next, &mrt->mfc_cache_array[line], list) {
                if (c->mfc_origin == mfc->mfcc_origin.s_addr &&
-                   c->mfc_mcastgrp == mfc->mfcc_mcastgrp.s_addr) {
+                   c->mfc_mcastgrp == mfc->mfcc_mcastgrp.s_addr &&
+                   (parent == -1 || parent == c->mfc_parent)) {
                        list_del_rcu(&c->list);
                        mroute_netlink_event(mrt, c, RTM_DELROUTE);
                        ipmr_cache_free(c);
@@ -1073,7 +1117,7 @@ static int ipmr_mfc_delete(struct mr_table *mrt, struct mfcctl *mfc)
 }
 
 static int ipmr_mfc_add(struct net *net, struct mr_table *mrt,
-                       struct mfcctl *mfc, int mrtsock)
+                       struct mfcctl *mfc, int mrtsock, int parent)
 {
        bool found = false;
        int line;
@@ -1086,7 +1130,8 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt,
 
        list_for_each_entry(c, &mrt->mfc_cache_array[line], list) {
                if (c->mfc_origin == mfc->mfcc_origin.s_addr &&
-                   c->mfc_mcastgrp == mfc->mfcc_mcastgrp.s_addr) {
+                   c->mfc_mcastgrp == mfc->mfcc_mcastgrp.s_addr &&
+                   (parent == -1 || parent == c->mfc_parent)) {
                        found = true;
                        break;
                }
@@ -1103,7 +1148,8 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt,
                return 0;
        }
 
-       if (!ipv4_is_multicast(mfc->mfcc_mcastgrp.s_addr))
+       if (mfc->mfcc_mcastgrp.s_addr != htonl(INADDR_ANY) &&
+           !ipv4_is_multicast(mfc->mfcc_mcastgrp.s_addr))
                return -EINVAL;
 
        c = ipmr_cache_alloc();
@@ -1218,7 +1264,7 @@ static void mrtsock_destruct(struct sock *sk)
 
 int ip_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, unsigned int optlen)
 {
-       int ret;
+       int ret, parent = 0;
        struct vifctl vif;
        struct mfcctl mfc;
        struct net *net = sock_net(sk);
@@ -1287,16 +1333,22 @@ int ip_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, unsi
                 */
        case MRT_ADD_MFC:
        case MRT_DEL_MFC:
+               parent = -1;
+       case MRT_ADD_MFC_PROXY:
+       case MRT_DEL_MFC_PROXY:
                if (optlen != sizeof(mfc))
                        return -EINVAL;
                if (copy_from_user(&mfc, optval, sizeof(mfc)))
                        return -EFAULT;
+               if (parent == 0)
+                       parent = mfc.mfcc_parent;
                rtnl_lock();
-               if (optname == MRT_DEL_MFC)
-                       ret = ipmr_mfc_delete(mrt, &mfc);
+               if (optname == MRT_DEL_MFC || optname == MRT_DEL_MFC_PROXY)
+                       ret = ipmr_mfc_delete(mrt, &mfc, parent);
                else
                        ret = ipmr_mfc_add(net, mrt, &mfc,
-                                          sk == rtnl_dereference(mrt->mroute_sk));
+                                          sk == rtnl_dereference(mrt->mroute_sk),
+                                          parent);
                rtnl_unlock();
                return ret;
                /*
@@ -1749,17 +1801,28 @@ static int ip_mr_forward(struct net *net, struct mr_table *mrt,
 {
        int psend = -1;
        int vif, ct;
+       int true_vifi = ipmr_find_vif(mrt, skb->dev);
 
        vif = cache->mfc_parent;
        cache->mfc_un.res.pkt++;
        cache->mfc_un.res.bytes += skb->len;
 
+       if (cache->mfc_origin == htonl(INADDR_ANY) && true_vifi >= 0) {
+               struct mfc_cache *cache_proxy;
+
+               /* For an (*,G) entry, we only check that the incomming
+                * interface is part of the static tree.
+                */
+               cache_proxy = ipmr_cache_find_any_parent(mrt, vif);
+               if (cache_proxy &&
+                   cache_proxy->mfc_un.res.ttls[true_vifi] < 255)
+                       goto forward;
+       }
+
        /*
         * Wrong interface: drop packet and (maybe) send PIM assert.
         */
        if (mrt->vif_table[vif].dev != skb->dev) {
-               int true_vifi;
-
                if (rt_is_output_route(skb_rtable(skb))) {
                        /* It is our own packet, looped back.
                         * Very complicated situation...
@@ -1776,7 +1839,6 @@ static int ip_mr_forward(struct net *net, struct mr_table *mrt,
                }
 
                cache->mfc_un.res.wrong_if++;
-               true_vifi = ipmr_find_vif(mrt, skb->dev);
 
                if (true_vifi >= 0 && mrt->mroute_do_assert &&
                    /* pimsm uses asserts, when switching from RPT to SPT,
@@ -1794,15 +1856,34 @@ static int ip_mr_forward(struct net *net, struct mr_table *mrt,
                goto dont_forward;
        }
 
+forward:
        mrt->vif_table[vif].pkt_in++;
        mrt->vif_table[vif].bytes_in += skb->len;
 
        /*
         *      Forward the frame
         */
+       if (cache->mfc_origin == htonl(INADDR_ANY) &&
+           cache->mfc_mcastgrp == htonl(INADDR_ANY)) {
+               if (true_vifi >= 0 &&
+                   true_vifi != cache->mfc_parent &&
+                   ip_hdr(skb)->ttl >
+                               cache->mfc_un.res.ttls[cache->mfc_parent]) {
+                       /* It's an (*,*) entry and the packet is not coming from
+                        * the upstream: forward the packet to the upstream
+                        * only.
+                        */
+                       psend = cache->mfc_parent;
+                       goto last_forward;
+               }
+               goto dont_forward;
+       }
        for (ct = cache->mfc_un.res.maxvif - 1;
             ct >= cache->mfc_un.res.minvif; ct--) {
-               if (ip_hdr(skb)->ttl > cache->mfc_un.res.ttls[ct]) {
+               /* For (*,G) entry, don't forward to the incoming interface */
+               if ((cache->mfc_origin != htonl(INADDR_ANY) ||
+                    ct != true_vifi) &&
+                   ip_hdr(skb)->ttl > cache->mfc_un.res.ttls[ct]) {
                        if (psend != -1) {
                                struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
 
@@ -1813,6 +1894,7 @@ static int ip_mr_forward(struct net *net, struct mr_table *mrt,
                        psend = ct;
                }
        }
+last_forward:
        if (psend != -1) {
                if (local) {
                        struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
@@ -1902,6 +1984,13 @@ int ip_mr_input(struct sk_buff *skb)
 
        /* already under rcu_read_lock() */
        cache = ipmr_cache_find(mrt, ip_hdr(skb)->saddr, ip_hdr(skb)->daddr);
+       if (cache == NULL) {
+               int vif = ipmr_find_vif(mrt, skb->dev);
+
+               if (vif >= 0)
+                       cache = ipmr_cache_find_any(mrt, ip_hdr(skb)->daddr,
+                                                   vif);
+       }
 
        /*
         *      No usable cache entry
@@ -2107,7 +2196,12 @@ int ipmr_get_route(struct net *net, struct sk_buff *skb,
 
        rcu_read_lock();
        cache = ipmr_cache_find(mrt, saddr, daddr);
+       if (cache == NULL && skb->dev) {
+               int vif = ipmr_find_vif(mrt, skb->dev);
 
+               if (vif >= 0)
+                       cache = ipmr_cache_find_any(mrt, daddr, vif);
+       }
        if (cache == NULL) {
                struct sk_buff *skb2;
                struct iphdr *iph;
index 3ea4127404d662f6756155128054d4a4c9b4ba0a..7dc6a97435925d1b56a918906553b423accee999 100644 (file)
@@ -901,7 +901,7 @@ static int get_info(struct net *net, void __user *user,
 #endif
        t = try_then_request_module(xt_find_table_lock(net, NFPROTO_ARP, name),
                                    "arptable_%s", name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                struct arpt_getinfo info;
                const struct xt_table_info *private = t->private;
 #ifdef CONFIG_COMPAT
@@ -958,7 +958,7 @@ static int get_entries(struct net *net, struct arpt_get_entries __user *uptr,
        }
 
        t = xt_find_table_lock(net, NFPROTO_ARP, get.name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                const struct xt_table_info *private = t->private;
 
                duprintf("t->private->number = %u\n",
@@ -1001,7 +1001,7 @@ static int __do_replace(struct net *net, const char *name,
 
        t = try_then_request_module(xt_find_table_lock(net, NFPROTO_ARP, name),
                                    "arptable_%s", name);
-       if (!t || IS_ERR(t)) {
+       if (IS_ERR_OR_NULL(t)) {
                ret = t ? PTR_ERR(t) : -ENOENT;
                goto free_newinfo_counters_untrans;
        }
@@ -1158,7 +1158,7 @@ static int do_add_counters(struct net *net, const void __user *user,
        }
 
        t = xt_find_table_lock(net, NFPROTO_ARP, name);
-       if (!t || IS_ERR(t)) {
+       if (IS_ERR_OR_NULL(t)) {
                ret = t ? PTR_ERR(t) : -ENOENT;
                goto free;
        }
@@ -1646,7 +1646,7 @@ static int compat_get_entries(struct net *net,
 
        xt_compat_lock(NFPROTO_ARP);
        t = xt_find_table_lock(net, NFPROTO_ARP, get.name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                const struct xt_table_info *private = t->private;
                struct xt_table_info info;
 
index 17c5e06da6628b7ec12495471d3bfcc943acf969..3efcf87400c3420f7d2d877b7472f2d4aeea00a1 100644 (file)
@@ -1090,7 +1090,7 @@ static int get_info(struct net *net, void __user *user,
 #endif
        t = try_then_request_module(xt_find_table_lock(net, AF_INET, name),
                                    "iptable_%s", name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                struct ipt_getinfo info;
                const struct xt_table_info *private = t->private;
 #ifdef CONFIG_COMPAT
@@ -1149,7 +1149,7 @@ get_entries(struct net *net, struct ipt_get_entries __user *uptr,
        }
 
        t = xt_find_table_lock(net, AF_INET, get.name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                const struct xt_table_info *private = t->private;
                duprintf("t->private->number = %u\n", private->number);
                if (get.size == private->size)
@@ -1189,7 +1189,7 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,
 
        t = try_then_request_module(xt_find_table_lock(net, AF_INET, name),
                                    "iptable_%s", name);
-       if (!t || IS_ERR(t)) {
+       if (IS_ERR_OR_NULL(t)) {
                ret = t ? PTR_ERR(t) : -ENOENT;
                goto free_newinfo_counters_untrans;
        }
@@ -1347,7 +1347,7 @@ do_add_counters(struct net *net, const void __user *user,
        }
 
        t = xt_find_table_lock(net, AF_INET, name);
-       if (!t || IS_ERR(t)) {
+       if (IS_ERR_OR_NULL(t)) {
                ret = t ? PTR_ERR(t) : -ENOENT;
                goto free;
        }
@@ -1931,7 +1931,7 @@ compat_get_entries(struct net *net, struct compat_ipt_get_entries __user *uptr,
 
        xt_compat_lock(AF_INET);
        t = xt_find_table_lock(net, AF_INET, get.name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                const struct xt_table_info *private = t->private;
                struct xt_table_info info;
                duprintf("t->private->number = %u\n", private->number);
index 51f13f8ec724f8c5dad543073e8a0d82639b555a..04b18c1ac3458503a2b5d79bd7fd1547c13e76d7 100644 (file)
@@ -81,6 +81,7 @@ static void send_reset(struct sk_buff *oldskb, int hook)
        niph->saddr     = oiph->daddr;
        niph->daddr     = oiph->saddr;
 
+       skb_reset_transport_header(nskb);
        tcph = (struct tcphdr *)skb_put(nskb, sizeof(struct tcphdr));
        memset(tcph, 0, sizeof(*tcph));
        tcph->source    = oth->dest;
index da2c8a368f68d9c6b72c605593aa5b83e0622344..eeaff7e4acb5c8da1c042769ac4c805579260bef 100644 (file)
@@ -124,23 +124,28 @@ nf_nat_ipv4_fn(unsigned int hooknum,
                        ret = nf_nat_rule_find(skb, hooknum, in, out, ct);
                        if (ret != NF_ACCEPT)
                                return ret;
-               } else
+               } else {
                        pr_debug("Already setup manip %s for ct %p\n",
                                 maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST",
                                 ct);
+                       if (nf_nat_oif_changed(hooknum, ctinfo, nat, out))
+                               goto oif_changed;
+               }
                break;
 
        default:
                /* ESTABLISHED */
                NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED ||
                             ctinfo == IP_CT_ESTABLISHED_REPLY);
-               if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) {
-                       nf_ct_kill_acct(ct, ctinfo, skb);
-                       return NF_DROP;
-               }
+               if (nf_nat_oif_changed(hooknum, ctinfo, nat, out))
+                       goto oif_changed;
        }
 
        return nf_nat_packet(ct, ctinfo, hooknum, skb);
+
+oif_changed:
+       nf_ct_kill_acct(ct, ctinfo, skb);
+       return NF_DROP;
 }
 
 static unsigned int
index 1ca253635f7acdda23624c28ae1ead4645bd0dd5..52271947a471355cad0688e061e731e7298121f6 100644 (file)
@@ -1428,12 +1428,12 @@ static void tcp_service_net_dma(struct sock *sk, bool wait)
 }
 #endif
 
-static inline struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off)
+static struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off)
 {
        struct sk_buff *skb;
        u32 offset;
 
-       skb_queue_walk(&sk->sk_receive_queue, skb) {
+       while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) {
                offset = seq - TCP_SKB_CB(skb)->seq;
                if (tcp_hdr(skb)->syn)
                        offset--;
@@ -1441,6 +1441,11 @@ static inline struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off)
                        *off = offset;
                        return skb;
                }
+               /* This looks weird, but this can happen if TCP collapsing
+                * splitted a fat GRO packet, while we released socket lock
+                * in skb_splice_bits()
+                */
+               sk_eat_skb(sk, skb, false);
        }
        return NULL;
 }
@@ -1482,7 +1487,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
                                        break;
                        }
                        used = recv_actor(desc, skb, offset, len);
-                       if (used < 0) {
+                       if (used <= 0) {
                                if (!copied)
                                        copied = used;
                                break;
@@ -1520,8 +1525,10 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
        tcp_rcv_space_adjust(sk);
 
        /* Clean up data we have read: This will do ACK frames. */
-       if (copied > 0)
+       if (copied > 0) {
+               tcp_recv_skb(sk, seq, &offset);
                tcp_cleanup_rbuf(sk, copied);
+       }
        return copied;
 }
 EXPORT_SYMBOL(tcp_read_sock);
@@ -3236,7 +3243,7 @@ __tcp_alloc_md5sig_pool(struct sock *sk)
                struct crypto_hash *hash;
 
                hash = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
-               if (!hash || IS_ERR(hash))
+               if (IS_ERR_OR_NULL(hash))
                        goto out_free;
 
                per_cpu_ptr(pool, cpu)->md5_desc.tfm = hash;
index 38e11841be0971b8f6fa8c5d7ca24ec6cf695534..0905997e5873338d10f6a1d6bd22ece551cd5fb8 100644 (file)
@@ -5541,7 +5541,7 @@ slow_path:
        if (len < (th->doff << 2) || tcp_checksum_complete_user(sk, skb))
                goto csum_error;
 
-       if (!th->ack)
+       if (!th->ack && !th->rst)
                goto discard;
 
        /*
@@ -5986,7 +5986,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                        goto discard;
        }
 
-       if (!th->ack)
+       if (!th->ack && !th->rst)
                goto discard;
 
        if (!tcp_validate_incoming(sk, skb, th, 0))
index c6ce9ca98d23781e83659de51aecd8808ad4adb3..bbbdcc5c19731d596955eadde274e6385f950828 100644 (file)
@@ -657,7 +657,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
                 * no RST generated if md5 hash doesn't match.
                 */
                sk1 = __inet_lookup_listener(dev_net(skb_dst(skb)->dev),
-                                            &tcp_hashinfo, ip_hdr(skb)->daddr,
+                                            &tcp_hashinfo, ip_hdr(skb)->saddr,
+                                            th->source, ip_hdr(skb)->daddr,
                                             ntohs(th->source), inet_iif(skb));
                /* don't send rst if it can't find key */
                if (!sk1)
@@ -2074,6 +2075,7 @@ do_time_wait:
        case TCP_TW_SYN: {
                struct sock *sk2 = inet_lookup_listener(dev_net(skb->dev),
                                                        &tcp_hashinfo,
+                                                       iph->saddr, th->source,
                                                        iph->daddr, th->dest,
                                                        inet_iif(skb));
                if (sk2) {
index 79c8dbe59b5474bdc3e23ba8adc227e1bee016a4..e0610e4b51588179b27f32fd2f4d09dd29f754fe 100644 (file)
@@ -139,6 +139,7 @@ static int udp_lib_lport_inuse(struct net *net, __u16 num,
 {
        struct sock *sk2;
        struct hlist_nulls_node *node;
+       kuid_t uid = sock_i_uid(sk);
 
        sk_nulls_for_each(sk2, node, &hslot->head)
                if (net_eq(sock_net(sk2), net) &&
@@ -147,6 +148,8 @@ static int udp_lib_lport_inuse(struct net *net, __u16 num,
                    (!sk2->sk_reuse || !sk->sk_reuse) &&
                    (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if ||
                     sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
+                   (!sk2->sk_reuseport || !sk->sk_reuseport ||
+                     !uid_eq(uid, sock_i_uid(sk2))) &&
                    (*saddr_comp)(sk, sk2)) {
                        if (bitmap)
                                __set_bit(udp_sk(sk2)->udp_port_hash >> log,
@@ -169,6 +172,7 @@ static int udp_lib_lport_inuse2(struct net *net, __u16 num,
 {
        struct sock *sk2;
        struct hlist_nulls_node *node;
+       kuid_t uid = sock_i_uid(sk);
        int res = 0;
 
        spin_lock(&hslot2->lock);
@@ -179,6 +183,8 @@ static int udp_lib_lport_inuse2(struct net *net, __u16 num,
                    (!sk2->sk_reuse || !sk->sk_reuse) &&
                    (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if ||
                     sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
+                   (!sk2->sk_reuseport || !sk->sk_reuseport ||
+                     !uid_eq(uid, sock_i_uid(sk2))) &&
                    (*saddr_comp)(sk, sk2)) {
                        res = 1;
                        break;
@@ -337,26 +343,26 @@ static inline int compute_score(struct sock *sk, struct net *net, __be32 saddr,
                        !ipv6_only_sock(sk)) {
                struct inet_sock *inet = inet_sk(sk);
 
-               score = (sk->sk_family == PF_INET ? 1 : 0);
+               score = (sk->sk_family == PF_INET ? 2 : 1);
                if (inet->inet_rcv_saddr) {
                        if (inet->inet_rcv_saddr != daddr)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
                if (inet->inet_daddr) {
                        if (inet->inet_daddr != saddr)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
                if (inet->inet_dport) {
                        if (inet->inet_dport != sport)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
                if (sk->sk_bound_dev_if) {
                        if (sk->sk_bound_dev_if != dif)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
        }
        return score;
@@ -365,7 +371,6 @@ static inline int compute_score(struct sock *sk, struct net *net, __be32 saddr,
 /*
  * In this second variant, we check (daddr, dport) matches (inet_rcv_sadd, inet_num)
  */
-#define SCORE2_MAX (1 + 2 + 2 + 2)
 static inline int compute_score2(struct sock *sk, struct net *net,
                                 __be32 saddr, __be16 sport,
                                 __be32 daddr, unsigned int hnum, int dif)
@@ -380,21 +385,21 @@ static inline int compute_score2(struct sock *sk, struct net *net,
                if (inet->inet_num != hnum)
                        return -1;
 
-               score = (sk->sk_family == PF_INET ? 1 : 0);
+               score = (sk->sk_family == PF_INET ? 2 : 1);
                if (inet->inet_daddr) {
                        if (inet->inet_daddr != saddr)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
                if (inet->inet_dport) {
                        if (inet->inet_dport != sport)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
                if (sk->sk_bound_dev_if) {
                        if (sk->sk_bound_dev_if != dif)
                                return -1;
-                       score += 2;
+                       score += 4;
                }
        }
        return score;
@@ -409,19 +414,29 @@ static struct sock *udp4_lib_lookup2(struct net *net,
 {
        struct sock *sk, *result;
        struct hlist_nulls_node *node;
-       int score, badness;
+       int score, badness, matches = 0, reuseport = 0;
+       u32 hash = 0;
 
 begin:
        result = NULL;
-       badness = -1;
+       badness = 0;
        udp_portaddr_for_each_entry_rcu(sk, node, &hslot2->head) {
                score = compute_score2(sk, net, saddr, sport,
                                      daddr, hnum, dif);
                if (score > badness) {
                        result = sk;
                        badness = score;
-                       if (score == SCORE2_MAX)
-                               goto exact_match;
+                       reuseport = sk->sk_reuseport;
+                       if (reuseport) {
+                               hash = inet_ehashfn(net, daddr, hnum,
+                                                   saddr, htons(sport));
+                               matches = 1;
+                       }
+               } else if (score == badness && reuseport) {
+                       matches++;
+                       if (((u64)hash * matches) >> 32 == 0)
+                               result = sk;
+                       hash = next_pseudo_random32(hash);
                }
        }
        /*
@@ -431,9 +446,7 @@ begin:
         */
        if (get_nulls_value(node) != slot2)
                goto begin;
-
        if (result) {
-exact_match:
                if (unlikely(!atomic_inc_not_zero_hint(&result->sk_refcnt, 2)))
                        result = NULL;
                else if (unlikely(compute_score2(result, net, saddr, sport,
@@ -457,7 +470,8 @@ struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
        unsigned short hnum = ntohs(dport);
        unsigned int hash2, slot2, slot = udp_hashfn(net, hnum, udptable->mask);
        struct udp_hslot *hslot2, *hslot = &udptable->hash[slot];
-       int score, badness;
+       int score, badness, matches = 0, reuseport = 0;
+       u32 hash = 0;
 
        rcu_read_lock();
        if (hslot->count > 10) {
@@ -486,13 +500,24 @@ struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
        }
 begin:
        result = NULL;
-       badness = -1;
+       badness = 0;
        sk_nulls_for_each_rcu(sk, node, &hslot->head) {
                score = compute_score(sk, net, saddr, hnum, sport,
                                      daddr, dport, dif);
                if (score > badness) {
                        result = sk;
                        badness = score;
+                       reuseport = sk->sk_reuseport;
+                       if (reuseport) {
+                               hash = inet_ehashfn(net, daddr, hnum,
+                                                   saddr, htons(sport));
+                               matches = 1;
+                       }
+               } else if (score == badness && reuseport) {
+                       matches++;
+                       if (((u64)hash * matches) >> 32 == 0)
+                               result = sk;
+                       hash = next_pseudo_random32(hash);
                }
        }
        /*
@@ -971,7 +996,7 @@ back_from_confirm:
                                  sizeof(struct udphdr), &ipc, &rt,
                                  msg->msg_flags);
                err = PTR_ERR(skb);
-               if (skb && !IS_ERR(skb))
+               if (!IS_ERR_OR_NULL(skb))
                        err = udp_send_skb(skb, fl4);
                goto out;
        }
index 4ea244891b58283189e8b9de501173d8ef2261f7..309af19a0a0a6eb69ee1852b993c4173d2b32c49 100644 (file)
@@ -40,7 +40,7 @@ obj-$(CONFIG_IPV6_SIT) += sit.o
 obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o
 obj-$(CONFIG_IPV6_GRE) += ip6_gre.o
 
-obj-y += addrconf_core.o exthdrs_core.o
+obj-y += addrconf_core.o exthdrs_core.o ip6_checksum.o
 obj-$(CONFIG_INET) += output_core.o protocol.o $(ipv6-offload)
 
 obj-$(subst m,y,$(CONFIG_IPV6)) += inet6_hashtables.o
index 408cac4ae00a41129e4bf89506e96f646c607380..80d59802d964abc9b7a2f6d2bdefa86161bd1249 100644 (file)
@@ -154,6 +154,11 @@ static void addrconf_type_change(struct net_device *dev,
                                 unsigned long event);
 static int addrconf_ifdown(struct net_device *dev, int how);
 
+static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
+                                                 int plen,
+                                                 const struct net_device *dev,
+                                                 u32 flags, u32 noflags);
+
 static void addrconf_dad_start(struct inet6_ifaddr *ifp);
 static void addrconf_dad_timer(unsigned long data);
 static void addrconf_dad_completed(struct inet6_ifaddr *ifp);
@@ -250,12 +255,6 @@ static inline bool addrconf_qdisc_ok(const struct net_device *dev)
        return !qdisc_tx_is_noop(dev);
 }
 
-/* Check if a route is valid prefix route */
-static inline int addrconf_is_prefix_route(const struct rt6_info *rt)
-{
-       return (rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0;
-}
-
 static void addrconf_del_timer(struct inet6_ifaddr *ifp)
 {
        if (del_timer(&ifp->timer))
@@ -941,17 +940,15 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
        if ((ifp->flags & IFA_F_PERMANENT) && onlink < 1) {
                struct in6_addr prefix;
                struct rt6_info *rt;
-               struct net *net = dev_net(ifp->idev->dev);
-               struct flowi6 fl6 = {};
 
                ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len);
-               fl6.flowi6_oif = ifp->idev->dev->ifindex;
-               fl6.daddr = prefix;
-               rt = (struct rt6_info *)ip6_route_lookup(net, &fl6,
-                                                        RT6_LOOKUP_F_IFACE);
 
-               if (rt != net->ipv6.ip6_null_entry &&
-                   addrconf_is_prefix_route(rt)) {
+               rt = addrconf_get_prefix_route(&prefix,
+                                              ifp->prefix_len,
+                                              ifp->idev->dev,
+                                              0, RTF_GATEWAY | RTF_DEFAULT);
+
+               if (rt) {
                        if (onlink == 0) {
                                ip6_del_rt(rt);
                                rt = NULL;
@@ -1054,7 +1051,7 @@ retry:
                ipv6_add_addr(idev, &addr, tmp_plen,
                              ipv6_addr_type(&addr)&IPV6_ADDR_SCOPE_MASK,
                              addr_flags) : NULL;
-       if (!ift || IS_ERR(ift)) {
+       if (IS_ERR_OR_NULL(ift)) {
                in6_ifa_put(ifp);
                in6_dev_put(idev);
                pr_info("%s: retry temporary address regeneration\n", __func__);
@@ -1877,7 +1874,7 @@ static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
                        continue;
                if ((rt->rt6i_flags & flags) != flags)
                        continue;
-               if ((noflags != 0) && ((rt->rt6i_flags & flags) != 0))
+               if ((rt->rt6i_flags & noflags) != 0)
                        continue;
                dst_hold(&rt->dst);
                break;
@@ -2082,7 +2079,7 @@ ok:
                                                    addr_type&IPV6_ADDR_SCOPE_MASK,
                                                    addr_flags);
 
-                       if (!ifp || IS_ERR(ifp)) {
+                       if (IS_ERR_OR_NULL(ifp)) {
                                in6_dev_put(in6_dev);
                                return;
                        }
index b043c60429bd45529111d56893dac55aae91427a..6b793bfc0e10b4fc42a5d7887e613d00e545ee70 100644 (file)
@@ -811,11 +811,10 @@ static struct pernet_operations inet6_net_ops = {
 
 static int __init inet6_init(void)
 {
-       struct sk_buff *dummy_skb;
        struct list_head *r;
        int err = 0;
 
-       BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb));
+       BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > FIELD_SIZEOF(struct sk_buff, cb));
 
        /* Register the socket-side information for inet6_create.  */
        for (r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
index 8edf2601065af07790500809b8dee9fad0fc8eaa..33be36398a786d0143ce8a8da0995f7966a22103 100644 (file)
@@ -30,6 +30,7 @@
 #include <net/transp_v6.h>
 #include <net/ip6_route.h>
 #include <net/tcp_states.h>
+#include <net/dsfield.h>
 
 #include <linux/errqueue.h>
 #include <asm/uaccess.h>
@@ -356,12 +357,11 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
                sin->sin6_port = serr->port;
                sin->sin6_scope_id = 0;
                if (skb->protocol == htons(ETH_P_IPV6)) {
-                       sin->sin6_addr =
-                               *(struct in6_addr *)(nh + serr->addr_offset);
+                       const struct ipv6hdr *ip6h = container_of((struct in6_addr *)(nh + serr->addr_offset),
+                                                                 struct ipv6hdr, daddr);
+                       sin->sin6_addr = ip6h->daddr;
                        if (np->sndflow)
-                               sin->sin6_flowinfo =
-                                       (*(__be32 *)(nh + serr->addr_offset - 24) &
-                                        IPV6_FLOWINFO_MASK);
+                               sin->sin6_flowinfo = ip6_flowinfo(ip6h);
                        if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL)
                                sin->sin6_scope_id = IP6CB(skb)->iif;
                } else {
@@ -488,13 +488,14 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
        }
 
        if (np->rxopt.bits.rxtclass) {
-               int tclass = ipv6_tclass(ipv6_hdr(skb));
+               int tclass = ipv6_get_dsfield(ipv6_hdr(skb));
                put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass);
        }
 
-       if (np->rxopt.bits.rxflow && (*(__be32 *)nh & IPV6_FLOWINFO_MASK)) {
-               __be32 flowinfo = *(__be32 *)nh & IPV6_FLOWINFO_MASK;
-               put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo);
+       if (np->rxopt.bits.rxflow) {
+               __be32 flowinfo = ip6_flowinfo((struct ipv6hdr *)nh);
+               if (flowinfo)
+                       put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo);
        }
 
        /* HbH is allowed only once */
index 473f628f9f203d2e0c58466f32603ce50a330402..07a7d65a7cb6757bdac702b01e8284ad2402bf46 100644 (file)
@@ -553,7 +553,8 @@ static bool ipv6_hop_ra(struct sk_buff *skb, int optoff)
        const unsigned char *nh = skb_network_header(skb);
 
        if (nh[optoff + 1] == 2) {
-               IP6CB(skb)->ra = optoff;
+               IP6CB(skb)->flags |= IP6SKB_ROUTERALERT;
+               memcpy(&IP6CB(skb)->ra, nh + optoff + 2, sizeof(IP6CB(skb)->ra));
                return true;
        }
        LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n",
index 30647857a375bce469c50071636b5aef6c5a33d7..e4297a393678c5e7fadcd3119f3ce53301da07a0 100644 (file)
@@ -32,6 +32,9 @@ int inet6_csk_bind_conflict(const struct sock *sk,
 {
        const struct sock *sk2;
        const struct hlist_node *node;
+       int reuse = sk->sk_reuse;
+       int reuseport = sk->sk_reuseport;
+       int uid = sock_i_uid((struct sock *)sk);
 
        /* We must walk the whole port owner list in this case. -DaveM */
        /*
@@ -42,11 +45,17 @@ int inet6_csk_bind_conflict(const struct sock *sk,
                if (sk != sk2 &&
                    (!sk->sk_bound_dev_if ||
                     !sk2->sk_bound_dev_if ||
-                    sk->sk_bound_dev_if == sk2->sk_bound_dev_if) &&
-                   (!sk->sk_reuse || !sk2->sk_reuse ||
-                    sk2->sk_state == TCP_LISTEN) &&
-                    ipv6_rcv_saddr_equal(sk, sk2))
-                       break;
+                    sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) {
+                       if ((!reuse || !sk2->sk_reuse ||
+                            sk2->sk_state == TCP_LISTEN) &&
+                           (!reuseport || !sk2->sk_reuseport ||
+                            (sk2->sk_state != TCP_TIME_WAIT &&
+                             !uid_eq(uid,
+                                     sock_i_uid((struct sock *)sk2))))) {
+                               if (ipv6_rcv_saddr_equal(sk, sk2))
+                                       break;
+                       }
+               }
        }
 
        return node != NULL;
index dea17fd28e5037295d56cf517671b479a1bca825..32b4a1675d826d8ce50e36dbf314456075e1660e 100644 (file)
@@ -158,25 +158,38 @@ static inline int compute_score(struct sock *sk, struct net *net,
 }
 
 struct sock *inet6_lookup_listener(struct net *net,
-               struct inet_hashinfo *hashinfo, const struct in6_addr *daddr,
+               struct inet_hashinfo *hashinfo, const struct in6_addr *saddr,
+               const __be16 sport, const struct in6_addr *daddr,
                const unsigned short hnum, const int dif)
 {
        struct sock *sk;
        const struct hlist_nulls_node *node;
        struct sock *result;
-       int score, hiscore;
+       int score, hiscore, matches = 0, reuseport = 0;
+       u32 phash = 0;
        unsigned int hash = inet_lhashfn(net, hnum);
        struct inet_listen_hashbucket *ilb = &hashinfo->listening_hash[hash];
 
        rcu_read_lock();
 begin:
        result = NULL;
-       hiscore = -1;
+       hiscore = 0;
        sk_nulls_for_each(sk, node, &ilb->head) {
                score = compute_score(sk, net, hnum, daddr, dif);
                if (score > hiscore) {
                        hiscore = score;
                        result = sk;
+                       reuseport = sk->sk_reuseport;
+                       if (reuseport) {
+                               phash = inet6_ehashfn(net, daddr, hnum,
+                                                     saddr, sport);
+                               matches = 1;
+                       }
+               } else if (score == hiscore && reuseport) {
+                       matches++;
+                       if (((u64)phash * matches) >> 32 == 0)
+                               result = sk;
+                       phash = next_pseudo_random32(phash);
                }
        }
        /*
diff --git a/net/ipv6/ip6_checksum.c b/net/ipv6/ip6_checksum.c
new file mode 100644 (file)
index 0000000..72d198b
--- /dev/null
@@ -0,0 +1,97 @@
+#include <net/ip.h>
+#include <net/udp.h>
+#include <net/udplite.h>
+#include <asm/checksum.h>
+
+#ifndef _HAVE_ARCH_IPV6_CSUM
+__sum16 csum_ipv6_magic(const struct in6_addr *saddr,
+                       const struct in6_addr *daddr,
+                       __u32 len, unsigned short proto,
+                       __wsum csum)
+{
+
+       int carry;
+       __u32 ulen;
+       __u32 uproto;
+       __u32 sum = (__force u32)csum;
+
+       sum += (__force u32)saddr->s6_addr32[0];
+       carry = (sum < (__force u32)saddr->s6_addr32[0]);
+       sum += carry;
+
+       sum += (__force u32)saddr->s6_addr32[1];
+       carry = (sum < (__force u32)saddr->s6_addr32[1]);
+       sum += carry;
+
+       sum += (__force u32)saddr->s6_addr32[2];
+       carry = (sum < (__force u32)saddr->s6_addr32[2]);
+       sum += carry;
+
+       sum += (__force u32)saddr->s6_addr32[3];
+       carry = (sum < (__force u32)saddr->s6_addr32[3]);
+       sum += carry;
+
+       sum += (__force u32)daddr->s6_addr32[0];
+       carry = (sum < (__force u32)daddr->s6_addr32[0]);
+       sum += carry;
+
+       sum += (__force u32)daddr->s6_addr32[1];
+       carry = (sum < (__force u32)daddr->s6_addr32[1]);
+       sum += carry;
+
+       sum += (__force u32)daddr->s6_addr32[2];
+       carry = (sum < (__force u32)daddr->s6_addr32[2]);
+       sum += carry;
+
+       sum += (__force u32)daddr->s6_addr32[3];
+       carry = (sum < (__force u32)daddr->s6_addr32[3]);
+       sum += carry;
+
+       ulen = (__force u32)htonl((__u32) len);
+       sum += ulen;
+       carry = (sum < ulen);
+       sum += carry;
+
+       uproto = (__force u32)htonl(proto);
+       sum += uproto;
+       carry = (sum < uproto);
+       sum += carry;
+
+       return csum_fold((__force __wsum)sum);
+}
+EXPORT_SYMBOL(csum_ipv6_magic);
+#endif
+
+int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto)
+{
+       int err;
+
+       UDP_SKB_CB(skb)->partial_cov = 0;
+       UDP_SKB_CB(skb)->cscov = skb->len;
+
+       if (proto == IPPROTO_UDPLITE) {
+               err = udplite_checksum_init(skb, uh);
+               if (err)
+                       return err;
+       }
+
+       if (uh->check == 0) {
+               /* RFC 2460 section 8.1 says that we SHOULD log
+                  this error. Well, it is reasonable.
+                */
+               LIMIT_NETDEBUG(KERN_INFO "IPv6: udp checksum is 0\n");
+               return 1;
+       }
+       if (skb->ip_summed == CHECKSUM_COMPLETE &&
+           !csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
+                            skb->len, proto, skb->csum))
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+
+       if (!skb_csum_unnecessary(skb))
+               skb->csum = ~csum_unfold(csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
+                                                        &ipv6_hdr(skb)->daddr,
+                                                        skb->len, proto, 0));
+
+       return 0;
+}
+EXPORT_SYMBOL(udp6_csum_init);
index c727e471275199ef27039f79b95755803435211a..db91fe3466a3c1dc02df7d2b864c6b17b1218cb1 100644 (file)
@@ -772,9 +772,7 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
         *      Push down and install the IP header.
         */
        ipv6h = ipv6_hdr(skb);
-       *(__be32 *)ipv6h = fl6->flowlabel | htonl(0x60000000);
-       dsfield = INET_ECN_encapsulate(0, dsfield);
-       ipv6_change_dsfield(ipv6h, ~INET_ECN_MASK, dsfield);
+       ip6_flow_hdr(ipv6h, INET_ECN_encapsulate(0, dsfield), fl6->flowlabel);
        ipv6h->hop_limit = tunnel->parms.hop_limit;
        ipv6h->nexthdr = proto;
        ipv6h->saddr = fl6->saddr;
@@ -1240,7 +1238,7 @@ static int ip6gre_header(struct sk_buff *skb, struct net_device *dev,
        struct ipv6hdr *ipv6h = (struct ipv6hdr *)skb_push(skb, t->hlen);
        __be16 *p = (__be16 *)(ipv6h+1);
 
-       *(__be32 *)ipv6h = t->fl.u.ip6.flowlabel | htonl(0x60000000);
+       ip6_flow_hdr(ipv6h, 0, t->fl.u.ip6.flowlabel);
        ipv6h->hop_limit = t->parms.hop_limit;
        ipv6h->nexthdr = NEXTHDR_GRE;
        ipv6h->saddr = t->parms.laddr;
index a52d864d562b4067e8f70db9e0fabbafe76b7fea..4ac5bf30e16adae9a2fe1e271f6e3a39adf2cbb2 100644 (file)
@@ -212,7 +212,7 @@ resubmit:
                        if (ipv6_addr_is_multicast(&hdr->daddr) &&
                            !ipv6_chk_mcast_addr(skb->dev, &hdr->daddr,
                            &hdr->saddr) &&
-                           !ipv6_is_mld(skb, nexthdr))
+                           !ipv6_is_mld(skb, nexthdr, skb_network_header_len(skb)))
                                goto discard;
                }
                if (!(ipprot->flags & INET6_PROTO_NOPOLICY) &&
@@ -280,10 +280,8 @@ int ip6_mc_input(struct sk_buff *skb)
                struct inet6_skb_parm *opt = IP6CB(skb);
 
                /* Check for MLD */
-               if (unlikely(opt->ra)) {
+               if (unlikely(opt->flags & IP6SKB_ROUTERALERT)) {
                        /* Check if this is a mld message */
-                       u8 *ptr = skb_network_header(skb) + opt->ra;
-                       struct icmp6hdr *icmp6;
                        u8 nexthdr = hdr->nexthdr;
                        __be16 frag_off;
                        int offset;
@@ -291,7 +289,7 @@ int ip6_mc_input(struct sk_buff *skb)
                        /* Check if the value of Router Alert
                         * is for MLD (0x0000).
                         */
-                       if ((ptr[2] | ptr[3]) == 0) {
+                       if (opt->ra == htons(IPV6_OPT_ROUTERALERT_MLD)) {
                                deliver = false;
 
                                if (!ipv6_ext_hdr(nexthdr)) {
@@ -303,24 +301,10 @@ int ip6_mc_input(struct sk_buff *skb)
                                if (offset < 0)
                                        goto out;
 
-                               if (nexthdr != IPPROTO_ICMPV6)
+                               if (!ipv6_is_mld(skb, nexthdr, offset))
                                        goto out;
 
-                               if (!pskb_may_pull(skb, (skb_network_header(skb) +
-                                                  offset + 1 - skb->data)))
-                                       goto out;
-
-                               icmp6 = (struct icmp6hdr *)(skb_network_header(skb) + offset);
-
-                               switch (icmp6->icmp6_type) {
-                               case ICMPV6_MGM_QUERY:
-                               case ICMPV6_MGM_REPORT:
-                               case ICMPV6_MGM_REDUCTION:
-                               case ICMPV6_MLD2_REPORT:
-                                       deliver = true;
-                                       break;
-                               }
-                               goto out;
+                               deliver = true;
                        }
                        /* unknown RA - process it normally */
                }
index 5552d13ae92f8554c04ec912b82317dfeef065a5..7dea45af66d3497e78805d7cb2be5badf74c06f1 100644 (file)
@@ -56,8 +56,6 @@
 #include <net/checksum.h>
 #include <linux/mroute6.h>
 
-int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
-
 int __ip6_local_out(struct sk_buff *skb)
 {
        int len;
@@ -88,7 +86,8 @@ static int ip6_finish_output2(struct sk_buff *skb)
        struct dst_entry *dst = skb_dst(skb);
        struct net_device *dev = dst->dev;
        struct neighbour *neigh;
-       struct rt6_info *rt;
+       struct in6_addr *nexthop;
+       int ret;
 
        skb->protocol = htons(ETH_P_IPV6);
        skb->dev = dev;
@@ -123,10 +122,17 @@ static int ip6_finish_output2(struct sk_buff *skb)
                                skb->len);
        }
 
-       rt = (struct rt6_info *) dst;
-       neigh = rt->n;
-       if (neigh)
-               return dst_neigh_output(dst, neigh, skb);
+       rcu_read_lock_bh();
+       nexthop = rt6_nexthop((struct rt6_info *)dst, &ipv6_hdr(skb)->daddr);
+       neigh = __ipv6_neigh_lookup_noref(dst->dev, nexthop);
+       if (unlikely(!neigh))
+               neigh = __neigh_create(&nd_tbl, nexthop, dst->dev, false);
+       if (!IS_ERR(neigh)) {
+               ret = dst_neigh_output(dst, neigh, skb);
+               rcu_read_unlock_bh();
+               return ret;
+       }
+       rcu_read_unlock_bh();
 
        IP6_INC_STATS_BH(dev_net(dst->dev),
                         ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES);
@@ -216,7 +222,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
        if (hlimit < 0)
                hlimit = ip6_dst_hoplimit(dst);
 
-       *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl6->flowlabel;
+       ip6_flow_hdr(hdr, tclass, fl6->flowlabel);
 
        hdr->payload_len = htons(seg_len);
        hdr->nexthdr = proto;
@@ -246,39 +252,6 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
 
 EXPORT_SYMBOL(ip6_xmit);
 
-/*
- *     To avoid extra problems ND packets are send through this
- *     routine. It's code duplication but I really want to avoid
- *     extra checks since ipv6_build_header is used by TCP (which
- *     is for us performance critical)
- */
-
-int ip6_nd_hdr(struct sock *sk, struct sk_buff *skb, struct net_device *dev,
-              const struct in6_addr *saddr, const struct in6_addr *daddr,
-              int proto, int len)
-{
-       struct ipv6_pinfo *np = inet6_sk(sk);
-       struct ipv6hdr *hdr;
-
-       skb->protocol = htons(ETH_P_IPV6);
-       skb->dev = dev;
-
-       skb_reset_network_header(skb);
-       skb_put(skb, sizeof(struct ipv6hdr));
-       hdr = ipv6_hdr(skb);
-
-       *(__be32*)hdr = htonl(0x60000000);
-
-       hdr->payload_len = htons(len);
-       hdr->nexthdr = proto;
-       hdr->hop_limit = np->hop_limit;
-
-       hdr->saddr = *saddr;
-       hdr->daddr = *daddr;
-
-       return 0;
-}
-
 static int ip6_call_ra_chain(struct sk_buff *skb, int sel)
 {
        struct ip6_ra_chain *ra;
@@ -913,8 +886,12 @@ static int ip6_dst_lookup_tail(struct sock *sk,
         * dst entry of the nexthop router
         */
        rt = (struct rt6_info *) *dst;
-       n = rt->n;
-       if (n && !(n->nud_state & NUD_VALID)) {
+       rcu_read_lock_bh();
+       n = __ipv6_neigh_lookup_noref(rt->dst.dev, rt6_nexthop(rt, &fl6->daddr));
+       err = n && !(n->nud_state & NUD_VALID) ? -EINVAL : 0;
+       rcu_read_unlock_bh();
+
+       if (err) {
                struct inet6_ifaddr *ifp;
                struct flowi6 fl_gw6;
                int redirect;
@@ -1548,9 +1525,7 @@ int ip6_push_pending_frames(struct sock *sk)
        skb_reset_network_header(skb);
        hdr = ipv6_hdr(skb);
 
-       *(__be32*)hdr = fl6->flowlabel |
-                    htonl(0x60000000 | ((int)np->cork.tclass << 20));
-
+       ip6_flow_hdr(hdr, np->cork.tclass, fl6->flowlabel);
        hdr->hop_limit = np->cork.hop_limit;
        hdr->nexthdr = proto;
        hdr->saddr = fl6->saddr;
index a14f28b280f57a040e3d499955419f6c949c5c93..fff83cbc197f1cc22149698d0b8f54fea0d107e8 100644 (file)
@@ -1030,9 +1030,7 @@ static int ip6_tnl_xmit2(struct sk_buff *skb,
        skb_push(skb, sizeof(struct ipv6hdr));
        skb_reset_network_header(skb);
        ipv6h = ipv6_hdr(skb);
-       *(__be32*)ipv6h = fl6->flowlabel | htonl(0x60000000);
-       dsfield = INET_ECN_encapsulate(0, dsfield);
-       ipv6_change_dsfield(ipv6h, ~INET_ECN_MASK, dsfield);
+       ip6_flow_hdr(ipv6h, INET_ECN_encapsulate(0, dsfield), fl6->flowlabel);
        ipv6h->hop_limit = t->parms.hop_limit;
        ipv6h->nexthdr = proto;
        ipv6h->saddr = fl6->saddr;
index 26dcdec9e3a5f6cbbe799402c39bb5d09c9d561d..acc32494006a2ccf5a1993ba7f6c9b9c325aaf17 100644 (file)
@@ -1017,6 +1017,50 @@ static struct mfc6_cache *ip6mr_cache_find(struct mr6_table *mrt,
        return NULL;
 }
 
+/* Look for a (*,*,oif) entry */
+static struct mfc6_cache *ip6mr_cache_find_any_parent(struct mr6_table *mrt,
+                                                     mifi_t mifi)
+{
+       int line = MFC6_HASH(&in6addr_any, &in6addr_any);
+       struct mfc6_cache *c;
+
+       list_for_each_entry(c, &mrt->mfc6_cache_array[line], list)
+               if (ipv6_addr_any(&c->mf6c_origin) &&
+                   ipv6_addr_any(&c->mf6c_mcastgrp) &&
+                   (c->mfc_un.res.ttls[mifi] < 255))
+                       return c;
+
+       return NULL;
+}
+
+/* Look for a (*,G) entry */
+static struct mfc6_cache *ip6mr_cache_find_any(struct mr6_table *mrt,
+                                              struct in6_addr *mcastgrp,
+                                              mifi_t mifi)
+{
+       int line = MFC6_HASH(mcastgrp, &in6addr_any);
+       struct mfc6_cache *c, *proxy;
+
+       if (ipv6_addr_any(mcastgrp))
+               goto skip;
+
+       list_for_each_entry(c, &mrt->mfc6_cache_array[line], list)
+               if (ipv6_addr_any(&c->mf6c_origin) &&
+                   ipv6_addr_equal(&c->mf6c_mcastgrp, mcastgrp)) {
+                       if (c->mfc_un.res.ttls[mifi] < 255)
+                               return c;
+
+                       /* It's ok if the mifi is part of the static tree */
+                       proxy = ip6mr_cache_find_any_parent(mrt,
+                                                           c->mf6c_parent);
+                       if (proxy && proxy->mfc_un.res.ttls[mifi] < 255)
+                               return c;
+               }
+
+skip:
+       return ip6mr_cache_find_any_parent(mrt, mifi);
+}
+
 /*
  *     Allocate a multicast cache entry
  */
@@ -1247,7 +1291,8 @@ ip6mr_cache_unresolved(struct mr6_table *mrt, mifi_t mifi, struct sk_buff *skb)
  *     MFC6 cache manipulation by user space
  */
 
-static int ip6mr_mfc_delete(struct mr6_table *mrt, struct mf6cctl *mfc)
+static int ip6mr_mfc_delete(struct mr6_table *mrt, struct mf6cctl *mfc,
+                           int parent)
 {
        int line;
        struct mfc6_cache *c, *next;
@@ -1256,7 +1301,9 @@ static int ip6mr_mfc_delete(struct mr6_table *mrt, struct mf6cctl *mfc)
 
        list_for_each_entry_safe(c, next, &mrt->mfc6_cache_array[line], list) {
                if (ipv6_addr_equal(&c->mf6c_origin, &mfc->mf6cc_origin.sin6_addr) &&
-                   ipv6_addr_equal(&c->mf6c_mcastgrp, &mfc->mf6cc_mcastgrp.sin6_addr)) {
+                   ipv6_addr_equal(&c->mf6c_mcastgrp,
+                                   &mfc->mf6cc_mcastgrp.sin6_addr) &&
+                   (parent == -1 || parent == c->mf6c_parent)) {
                        write_lock_bh(&mrt_lock);
                        list_del(&c->list);
                        write_unlock_bh(&mrt_lock);
@@ -1391,7 +1438,7 @@ void ip6_mr_cleanup(void)
 }
 
 static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt,
-                        struct mf6cctl *mfc, int mrtsock)
+                        struct mf6cctl *mfc, int mrtsock, int parent)
 {
        bool found = false;
        int line;
@@ -1413,7 +1460,9 @@ static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt,
 
        list_for_each_entry(c, &mrt->mfc6_cache_array[line], list) {
                if (ipv6_addr_equal(&c->mf6c_origin, &mfc->mf6cc_origin.sin6_addr) &&
-                   ipv6_addr_equal(&c->mf6c_mcastgrp, &mfc->mf6cc_mcastgrp.sin6_addr)) {
+                   ipv6_addr_equal(&c->mf6c_mcastgrp,
+                                   &mfc->mf6cc_mcastgrp.sin6_addr) &&
+                   (parent == -1 || parent == mfc->mf6cc_parent)) {
                        found = true;
                        break;
                }
@@ -1430,7 +1479,8 @@ static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt,
                return 0;
        }
 
-       if (!ipv6_addr_is_multicast(&mfc->mf6cc_mcastgrp.sin6_addr))
+       if (!ipv6_addr_any(&mfc->mf6cc_mcastgrp.sin6_addr) &&
+           !ipv6_addr_is_multicast(&mfc->mf6cc_mcastgrp.sin6_addr))
                return -EINVAL;
 
        c = ip6mr_cache_alloc();
@@ -1596,7 +1646,7 @@ struct sock *mroute6_socket(struct net *net, struct sk_buff *skb)
 
 int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, unsigned int optlen)
 {
-       int ret;
+       int ret, parent = 0;
        struct mif6ctl vif;
        struct mf6cctl mfc;
        mifi_t mifi;
@@ -1653,15 +1703,21 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
         */
        case MRT6_ADD_MFC:
        case MRT6_DEL_MFC:
+               parent = -1;
+       case MRT6_ADD_MFC_PROXY:
+       case MRT6_DEL_MFC_PROXY:
                if (optlen < sizeof(mfc))
                        return -EINVAL;
                if (copy_from_user(&mfc, optval, sizeof(mfc)))
                        return -EFAULT;
+               if (parent == 0)
+                       parent = mfc.mf6cc_parent;
                rtnl_lock();
-               if (optname == MRT6_DEL_MFC)
-                       ret = ip6mr_mfc_delete(mrt, &mfc);
+               if (optname == MRT6_DEL_MFC || optname == MRT6_DEL_MFC_PROXY)
+                       ret = ip6mr_mfc_delete(mrt, &mfc, parent);
                else
-                       ret = ip6mr_mfc_add(net, mrt, &mfc, sk == mrt->mroute6_sk);
+                       ret = ip6mr_mfc_add(net, mrt, &mfc,
+                                           sk == mrt->mroute6_sk, parent);
                rtnl_unlock();
                return ret;
 
@@ -2015,19 +2071,29 @@ static int ip6_mr_forward(struct net *net, struct mr6_table *mrt,
 {
        int psend = -1;
        int vif, ct;
+       int true_vifi = ip6mr_find_vif(mrt, skb->dev);
 
        vif = cache->mf6c_parent;
        cache->mfc_un.res.pkt++;
        cache->mfc_un.res.bytes += skb->len;
 
+       if (ipv6_addr_any(&cache->mf6c_origin) && true_vifi >= 0) {
+               struct mfc6_cache *cache_proxy;
+
+               /* For an (*,G) entry, we only check that the incomming
+                * interface is part of the static tree.
+                */
+               cache_proxy = ip6mr_cache_find_any_parent(mrt, vif);
+               if (cache_proxy &&
+                   cache_proxy->mfc_un.res.ttls[true_vifi] < 255)
+                       goto forward;
+       }
+
        /*
         * Wrong interface: drop packet and (maybe) send PIM assert.
         */
        if (mrt->vif6_table[vif].dev != skb->dev) {
-               int true_vifi;
-
                cache->mfc_un.res.wrong_if++;
-               true_vifi = ip6mr_find_vif(mrt, skb->dev);
 
                if (true_vifi >= 0 && mrt->mroute_do_assert &&
                    /* pimsm uses asserts, when switching from RPT to SPT,
@@ -2045,14 +2111,32 @@ static int ip6_mr_forward(struct net *net, struct mr6_table *mrt,
                goto dont_forward;
        }
 
+forward:
        mrt->vif6_table[vif].pkt_in++;
        mrt->vif6_table[vif].bytes_in += skb->len;
 
        /*
         *      Forward the frame
         */
+       if (ipv6_addr_any(&cache->mf6c_origin) &&
+           ipv6_addr_any(&cache->mf6c_mcastgrp)) {
+               if (true_vifi >= 0 &&
+                   true_vifi != cache->mf6c_parent &&
+                   ipv6_hdr(skb)->hop_limit >
+                               cache->mfc_un.res.ttls[cache->mf6c_parent]) {
+                       /* It's an (*,*) entry and the packet is not coming from
+                        * the upstream: forward the packet to the upstream
+                        * only.
+                        */
+                       psend = cache->mf6c_parent;
+                       goto last_forward;
+               }
+               goto dont_forward;
+       }
        for (ct = cache->mfc_un.res.maxvif - 1; ct >= cache->mfc_un.res.minvif; ct--) {
-               if (ipv6_hdr(skb)->hop_limit > cache->mfc_un.res.ttls[ct]) {
+               /* For (*,G) entry, don't forward to the incoming interface */
+               if ((!ipv6_addr_any(&cache->mf6c_origin) || ct != true_vifi) &&
+                   ipv6_hdr(skb)->hop_limit > cache->mfc_un.res.ttls[ct]) {
                        if (psend != -1) {
                                struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
                                if (skb2)
@@ -2061,6 +2145,7 @@ static int ip6_mr_forward(struct net *net, struct mr6_table *mrt,
                        psend = ct;
                }
        }
+last_forward:
        if (psend != -1) {
                ip6mr_forward2(net, mrt, skb, cache, psend);
                return 0;
@@ -2096,6 +2181,14 @@ int ip6_mr_input(struct sk_buff *skb)
        read_lock(&mrt_lock);
        cache = ip6mr_cache_find(mrt,
                                 &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr);
+       if (cache == NULL) {
+               int vif = ip6mr_find_vif(mrt, skb->dev);
+
+               if (vif >= 0)
+                       cache = ip6mr_cache_find_any(mrt,
+                                                    &ipv6_hdr(skb)->daddr,
+                                                    vif);
+       }
 
        /*
         *      No usable cache entry
@@ -2183,6 +2276,13 @@ int ip6mr_get_route(struct net *net,
 
        read_lock(&mrt_lock);
        cache = ip6mr_cache_find(mrt, &rt->rt6i_src.addr, &rt->rt6i_dst.addr);
+       if (!cache && skb->dev) {
+               int vif = ip6mr_find_vif(mrt, skb->dev);
+
+               if (vif >= 0)
+                       cache = ip6mr_cache_find_any(mrt, &rt->rt6i_dst.addr,
+                                                    vif);
+       }
 
        if (!cache) {
                struct sk_buff *skb2;
index 28dfa5f3801febb37cfd4ab17e010be4cc936e24..f25002aaf624dd4bca40e7303930bc773e2132f5 100644 (file)
@@ -934,33 +934,6 @@ int ipv6_dev_mc_dec(struct net_device *dev, const struct in6_addr *addr)
        return err;
 }
 
-/*
- * identify MLD packets for MLD filter exceptions
- */
-bool ipv6_is_mld(struct sk_buff *skb, int nexthdr)
-{
-       struct icmp6hdr *pic;
-
-       if (nexthdr != IPPROTO_ICMPV6)
-               return false;
-
-       if (!pskb_may_pull(skb, sizeof(struct icmp6hdr)))
-               return false;
-
-       pic = icmp6_hdr(skb);
-
-       switch (pic->icmp6_type) {
-       case ICMPV6_MGM_QUERY:
-       case ICMPV6_MGM_REPORT:
-       case ICMPV6_MGM_REDUCTION:
-       case ICMPV6_MLD2_REPORT:
-               return true;
-       default:
-               break;
-       }
-       return false;
-}
-
 /*
  *     check if the interface/address pair is valid
  */
@@ -1340,6 +1313,31 @@ mld_scount(struct ifmcaddr6 *pmc, int type, int gdeleted, int sdeleted)
        return scount;
 }
 
+static void ip6_mc_hdr(struct sock *sk, struct sk_buff *skb,
+                      struct net_device *dev,
+                      const struct in6_addr *saddr,
+                      const struct in6_addr *daddr,
+                      int proto, int len)
+{
+       struct ipv6hdr *hdr;
+
+       skb->protocol = htons(ETH_P_IPV6);
+       skb->dev = dev;
+
+       skb_reset_network_header(skb);
+       skb_put(skb, sizeof(struct ipv6hdr));
+       hdr = ipv6_hdr(skb);
+
+       ip6_flow_hdr(hdr, 0, 0);
+
+       hdr->payload_len = htons(len);
+       hdr->nexthdr = proto;
+       hdr->hop_limit = inet6_sk(sk)->hop_limit;
+
+       hdr->saddr = *saddr;
+       hdr->daddr = *daddr;
+}
+
 static struct sk_buff *mld_newpack(struct net_device *dev, int size)
 {
        struct net *net = dev_net(dev);
@@ -1375,7 +1373,7 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
        } else
                saddr = &addr_buf;
 
-       ip6_nd_hdr(sk, skb, dev, saddr, &mld2_all_mcr, NEXTHDR_HOP, 0);
+       ip6_mc_hdr(sk, skb, dev, saddr, &mld2_all_mcr, NEXTHDR_HOP, 0);
 
        memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra));
 
@@ -1418,7 +1416,7 @@ static void mld_sendpack(struct sk_buff *skb)
        icmpv6_flow_init(net->ipv6.igmp_sk, &fl6, ICMPV6_MLD2_REPORT,
                         &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
                         skb->dev->ifindex);
-       dst = icmp6_dst_alloc(skb->dev, NULL, &fl6);
+       dst = icmp6_dst_alloc(skb->dev, &fl6);
 
        err = 0;
        if (IS_ERR(dst)) {
@@ -1767,7 +1765,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
        } else
                saddr = &addr_buf;
 
-       ip6_nd_hdr(sk, skb, dev, saddr, snd_addr, NEXTHDR_HOP, payload_len);
+       ip6_mc_hdr(sk, skb, dev, saddr, snd_addr, NEXTHDR_HOP, payload_len);
 
        memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra));
 
@@ -1786,7 +1784,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
        icmpv6_flow_init(sk, &fl6, type,
                         &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
                         skb->dev->ifindex);
-       dst = icmp6_dst_alloc(skb->dev, NULL, &fl6);
+       dst = icmp6_dst_alloc(skb->dev, &fl6);
        if (IS_ERR(dst)) {
                err = PTR_ERR(dst);
                goto err_out;
index 5733cd27f4a3c719d3f88e72d55f7bfab9350e4e..76ef4353d51872c1688b52531eadf1f4f446a8a4 100644 (file)
@@ -143,16 +143,12 @@ struct neigh_table nd_tbl = {
        .gc_thresh3 =   1024,
 };
 
-static inline int ndisc_opt_addr_space(struct net_device *dev)
+static void ndisc_fill_addr_option(struct sk_buff *skb, int type, void *data)
 {
-       return NDISC_OPT_SPACE(dev->addr_len + ndisc_addr_option_pad(dev->type));
-}
-
-static u8 *ndisc_fill_addr_option(u8 *opt, int type, void *data, int data_len,
-                                 unsigned short addr_type)
-{
-       int pad   = ndisc_addr_option_pad(addr_type);
-       int space = NDISC_OPT_SPACE(data_len + pad);
+       int pad   = ndisc_addr_option_pad(skb->dev->type);
+       int data_len = skb->dev->addr_len;
+       int space = ndisc_opt_addr_space(skb->dev);
+       u8 *opt = skb_put(skb, space);
 
        opt[0] = type;
        opt[1] = space>>3;
@@ -166,7 +162,6 @@ static u8 *ndisc_fill_addr_option(u8 *opt, int type, void *data, int data_len,
        opt += data_len;
        if ((space -= data_len) > 0)
                memset(opt, 0, space);
-       return opt + space;
 }
 
 static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur,
@@ -370,91 +365,88 @@ static void pndisc_destructor(struct pneigh_entry *n)
        ipv6_dev_mc_dec(dev, &maddr);
 }
 
-static struct sk_buff *ndisc_build_skb(struct net_device *dev,
-                                      const struct in6_addr *daddr,
-                                      const struct in6_addr *saddr,
-                                      struct icmp6hdr *icmp6h,
-                                      const struct in6_addr *target,
-                                      int llinfo)
+static struct sk_buff *ndisc_alloc_skb(struct net_device *dev,
+                                      int len)
 {
-       struct net *net = dev_net(dev);
-       struct sock *sk = net->ipv6.ndisc_sk;
-       struct sk_buff *skb;
-       struct icmp6hdr *hdr;
        int hlen = LL_RESERVED_SPACE(dev);
        int tlen = dev->needed_tailroom;
-       int len;
+       struct sock *sk = dev_net(dev)->ipv6.ndisc_sk;
+       struct sk_buff *skb;
        int err;
-       u8 *opt;
-
-       if (!dev->addr_len)
-               llinfo = 0;
-
-       len = sizeof(struct icmp6hdr) + (target ? sizeof(*target) : 0);
-       if (llinfo)
-               len += ndisc_opt_addr_space(dev);
 
        skb = sock_alloc_send_skb(sk,
-                                 (sizeof(struct ipv6hdr) +
-                                  len + hlen + tlen),
+                                 hlen + sizeof(struct ipv6hdr) + len + tlen,
                                  1, &err);
        if (!skb) {
-               ND_PRINTK(0, err, "ND: %s failed to allocate an skb, err=%d\n",
+               ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb, err=%d\n",
                          __func__, err);
                return NULL;
        }
 
-       skb_reserve(skb, hlen);
-       ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len);
+       skb->protocol = htons(ETH_P_IPV6);
+       skb->dev = dev;
 
-       skb->transport_header = skb->tail;
-       skb_put(skb, len);
+       skb_reserve(skb, hlen + sizeof(struct ipv6hdr));
+       skb_reset_transport_header(skb);
 
-       hdr = (struct icmp6hdr *)skb_transport_header(skb);
-       memcpy(hdr, icmp6h, sizeof(*hdr));
+       return skb;
+}
 
-       opt = skb_transport_header(skb) + sizeof(struct icmp6hdr);
-       if (target) {
-               *(struct in6_addr *)opt = *target;
-               opt += sizeof(*target);
-       }
+static void ip6_nd_hdr(struct sk_buff *skb,
+                      const struct in6_addr *saddr,
+                      const struct in6_addr *daddr,
+                      int hop_limit, int len)
+{
+       struct ipv6hdr *hdr;
 
-       if (llinfo)
-               ndisc_fill_addr_option(opt, llinfo, dev->dev_addr,
-                                      dev->addr_len, dev->type);
+       skb_push(skb, sizeof(*hdr));
+       skb_reset_network_header(skb);
+       hdr = ipv6_hdr(skb);
 
-       hdr->icmp6_cksum = csum_ipv6_magic(saddr, daddr, len,
-                                          IPPROTO_ICMPV6,
-                                          csum_partial(hdr,
-                                                       len, 0));
+       ip6_flow_hdr(hdr, 0, 0);
 
-       return skb;
+       hdr->payload_len = htons(len);
+       hdr->nexthdr = IPPROTO_ICMPV6;
+       hdr->hop_limit = hop_limit;
+
+       hdr->saddr = *saddr;
+       hdr->daddr = *daddr;
 }
 
-static void ndisc_send_skb(struct sk_buff *skb, struct net_device *dev,
-                          struct neighbour *neigh,
+static void ndisc_send_skb(struct sk_buff *skb,
                           const struct in6_addr *daddr,
-                          const struct in6_addr *saddr,
-                          struct icmp6hdr *icmp6h)
+                          const struct in6_addr *saddr)
 {
-       struct flowi6 fl6;
-       struct dst_entry *dst;
-       struct net *net = dev_net(dev);
+       struct dst_entry *dst = skb_dst(skb);
+       struct net *net = dev_net(skb->dev);
        struct sock *sk = net->ipv6.ndisc_sk;
        struct inet6_dev *idev;
        int err;
+       struct icmp6hdr *icmp6h = icmp6_hdr(skb);
        u8 type;
 
        type = icmp6h->icmp6_type;
 
-       icmpv6_flow_init(sk, &fl6, type, saddr, daddr, dev->ifindex);
-       dst = icmp6_dst_alloc(dev, neigh, &fl6);
-       if (IS_ERR(dst)) {
-               kfree_skb(skb);
-               return;
+       if (!dst) {
+               struct sock *sk = net->ipv6.ndisc_sk;
+               struct flowi6 fl6;
+
+               icmpv6_flow_init(sk, &fl6, type, saddr, daddr, skb->dev->ifindex);
+               dst = icmp6_dst_alloc(skb->dev, &fl6);
+               if (IS_ERR(dst)) {
+                       kfree_skb(skb);
+                       return;
+               }
+
+               skb_dst_set(skb, dst);
        }
 
-       skb_dst_set(skb, dst);
+       icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len,
+                                             IPPROTO_ICMPV6,
+                                             csum_partial(icmp6h,
+                                                          skb->len, 0));
+
+       ip6_nd_hdr(skb, saddr, daddr, inet6_sk(sk)->hop_limit, skb->len);
 
        rcu_read_lock();
        idev = __in6_dev_get(dst->dev);
@@ -470,36 +462,17 @@ static void ndisc_send_skb(struct sk_buff *skb, struct net_device *dev,
        rcu_read_unlock();
 }
 
-/*
- *     Send a Neighbour Discover packet
- */
-static void __ndisc_send(struct net_device *dev,
-                        struct neighbour *neigh,
-                        const struct in6_addr *daddr,
-                        const struct in6_addr *saddr,
-                        struct icmp6hdr *icmp6h, const struct in6_addr *target,
-                        int llinfo)
-{
-       struct sk_buff *skb;
-
-       skb = ndisc_build_skb(dev, daddr, saddr, icmp6h, target, llinfo);
-       if (!skb)
-               return;
-
-       ndisc_send_skb(skb, dev, neigh, daddr, saddr, icmp6h);
-}
-
 static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
                          const struct in6_addr *daddr,
                          const struct in6_addr *solicited_addr,
-                         int router, int solicited, int override, int inc_opt)
+                         bool router, bool solicited, bool override, bool inc_opt)
 {
+       struct sk_buff *skb;
        struct in6_addr tmpaddr;
        struct inet6_ifaddr *ifp;
        const struct in6_addr *src_addr;
-       struct icmp6hdr icmp6h = {
-               .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
-       };
+       struct nd_msg *msg;
+       int optlen = 0;
 
        /* for anycast or proxy, solicited_addr != src_addr */
        ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
@@ -517,13 +490,32 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
                src_addr = &tmpaddr;
        }
 
-       icmp6h.icmp6_router = router;
-       icmp6h.icmp6_solicited = solicited;
-       icmp6h.icmp6_override = override;
+       if (!dev->addr_len)
+               inc_opt = 0;
+       if (inc_opt)
+               optlen += ndisc_opt_addr_space(dev);
+
+       skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
+       if (!skb)
+               return;
 
-       __ndisc_send(dev, neigh, daddr, src_addr,
-                    &icmp6h, solicited_addr,
-                    inc_opt ? ND_OPT_TARGET_LL_ADDR : 0);
+       msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
+       *msg = (struct nd_msg) {
+               .icmph = {
+                       .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
+                       .icmp6_router = router,
+                       .icmp6_solicited = solicited,
+                       .icmp6_override = override,
+               },
+               .target = *solicited_addr,
+       };
+
+       if (inc_opt)
+               ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
+                                      dev->dev_addr);
+
+
+       ndisc_send_skb(skb, daddr, src_addr);
 }
 
 static void ndisc_send_unsol_na(struct net_device *dev)
@@ -551,10 +543,11 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
                   const struct in6_addr *solicit,
                   const struct in6_addr *daddr, const struct in6_addr *saddr)
 {
+       struct sk_buff *skb;
        struct in6_addr addr_buf;
-       struct icmp6hdr icmp6h = {
-               .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
-       };
+       int inc_opt = dev->addr_len;
+       int optlen = 0;
+       struct nd_msg *msg;
 
        if (saddr == NULL) {
                if (ipv6_get_lladdr(dev, &addr_buf,
@@ -563,18 +556,37 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
                saddr = &addr_buf;
        }
 
-       __ndisc_send(dev, neigh, daddr, saddr,
-                    &icmp6h, solicit,
-                    !ipv6_addr_any(saddr) ? ND_OPT_SOURCE_LL_ADDR : 0);
+       if (ipv6_addr_any(saddr))
+               inc_opt = 0;
+       if (inc_opt)
+               optlen += ndisc_opt_addr_space(dev);
+
+       skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
+       if (!skb)
+               return;
+
+       msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
+       *msg = (struct nd_msg) {
+               .icmph = {
+                       .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
+               },
+               .target = *solicit,
+       };
+
+       if (inc_opt)
+               ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
+                                      dev->dev_addr);
+
+       ndisc_send_skb(skb, daddr, saddr);
 }
 
 void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
                   const struct in6_addr *daddr)
 {
-       struct icmp6hdr icmp6h = {
-               .icmp6_type = NDISC_ROUTER_SOLICITATION,
-       };
+       struct sk_buff *skb;
+       struct rs_msg *msg;
        int send_sllao = dev->addr_len;
+       int optlen = 0;
 
 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
        /*
@@ -598,9 +610,27 @@ void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
                }
        }
 #endif
-       __ndisc_send(dev, NULL, daddr, saddr,
-                    &icmp6h, NULL,
-                    send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0);
+       if (!dev->addr_len)
+               send_sllao = 0;
+       if (send_sllao)
+               optlen += ndisc_opt_addr_space(dev);
+
+       skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
+       if (!skb)
+               return;
+
+       msg = (struct rs_msg *)skb_put(skb, sizeof(*msg));
+       *msg = (struct rs_msg) {
+               .icmph = {
+                       .icmp6_type = NDISC_ROUTER_SOLICITATION,
+               },
+       };
+
+       if (send_sllao)
+               ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
+                                      dev->dev_addr);
+
+       ndisc_send_skb(skb, daddr, saddr);
 }
 
 
@@ -676,6 +706,11 @@ static void ndisc_recv_ns(struct sk_buff *skb)
        bool inc;
        int is_router = -1;
 
+       if (skb->len < sizeof(struct nd_msg)) {
+               ND_PRINTK(2, warn, "NS: packet too short\n");
+               return;
+       }
+
        if (ipv6_addr_is_multicast(&msg->target)) {
                ND_PRINTK(2, warn, "NS: multicast target address\n");
                return;
@@ -685,11 +720,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
         * RFC2461 7.1.1:
         * DAD has to be destined for solicited node multicast address.
         */
-       if (dad &&
-           !(daddr->s6_addr32[0] == htonl(0xff020000) &&
-             daddr->s6_addr32[1] == htonl(0x00000000) &&
-             daddr->s6_addr32[2] == htonl(0x00000001) &&
-             daddr->s6_addr [12] == 0xff )) {
+       if (dad && !ipv6_addr_is_solict_mult(daddr)) {
                ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n");
                return;
        }
@@ -780,11 +811,11 @@ static void ndisc_recv_ns(struct sk_buff *skb)
        }
 
        if (is_router < 0)
-               is_router = !!idev->cnf.forwarding;
+               is_router = idev->cnf.forwarding;
 
        if (dad) {
                ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &msg->target,
-                             is_router, 0, (ifp != NULL), 1);
+                             !!is_router, false, (ifp != NULL), true);
                goto out;
        }
 
@@ -805,8 +836,8 @@ static void ndisc_recv_ns(struct sk_buff *skb)
                             NEIGH_UPDATE_F_OVERRIDE);
        if (neigh || !dev->header_ops) {
                ndisc_send_na(dev, neigh, saddr, &msg->target,
-                             is_router,
-                             1, (ifp != NULL && inc), inc);
+                             !!is_router,
+                             true, (ifp != NULL && inc), inc);
                if (neigh)
                        neigh_release(neigh);
        }
@@ -1350,24 +1381,34 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
        icmpv6_notify(skb, NDISC_REDIRECT, 0, 0);
 }
 
+static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb,
+                                          struct sk_buff *orig_skb,
+                                          int rd_len)
+{
+       u8 *opt = skb_put(skb, rd_len);
+
+       memset(opt, 0, 8);
+       *(opt++) = ND_OPT_REDIRECT_HDR;
+       *(opt++) = (rd_len >> 3);
+       opt += 6;
+
+       memcpy(opt, ipv6_hdr(orig_skb), rd_len - 8);
+}
+
 void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
 {
        struct net_device *dev = skb->dev;
        struct net *net = dev_net(dev);
        struct sock *sk = net->ipv6.ndisc_sk;
-       int len = sizeof(struct rd_msg);
+       int optlen = 0;
        struct inet_peer *peer;
        struct sk_buff *buff;
        struct rd_msg *msg;
        struct in6_addr saddr_buf;
        struct rt6_info *rt;
        struct dst_entry *dst;
-       struct inet6_dev *idev;
        struct flowi6 fl6;
-       u8 *opt;
-       int hlen, tlen;
        int rd_len;
-       int err;
        u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
        bool ret;
 
@@ -1423,7 +1464,7 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
                        memcpy(ha_buf, neigh->ha, dev->addr_len);
                        read_unlock_bh(&neigh->lock);
                        ha = ha_buf;
-                       len += ndisc_opt_addr_space(dev);
+                       optlen += ndisc_opt_addr_space(dev);
                } else
                        read_unlock_bh(&neigh->lock);
 
@@ -1431,78 +1472,40 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
        }
 
        rd_len = min_t(unsigned int,
-                    IPV6_MIN_MTU-sizeof(struct ipv6hdr)-len, skb->len + 8);
+                      IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen,
+                      skb->len + 8);
        rd_len &= ~0x7;
-       len += rd_len;
-
-       hlen = LL_RESERVED_SPACE(dev);
-       tlen = dev->needed_tailroom;
-       buff = sock_alloc_send_skb(sk,
-                                  (sizeof(struct ipv6hdr) +
-                                   len + hlen + tlen),
-                                  1, &err);
-       if (buff == NULL) {
-               ND_PRINTK(0, err,
-                         "Redirect: %s failed to allocate an skb, err=%d\n",
-                         __func__, err);
-               goto release;
-       }
-
-       skb_reserve(buff, hlen);
-       ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
-                  IPPROTO_ICMPV6, len);
-
-       skb_set_transport_header(buff, skb_tail_pointer(buff) - buff->data);
-       skb_put(buff, len);
-       msg = (struct rd_msg *)icmp6_hdr(buff);
-
-       memset(&msg->icmph, 0, sizeof(struct icmp6hdr));
-       msg->icmph.icmp6_type = NDISC_REDIRECT;
+       optlen += rd_len;
 
-       /*
-        *      copy target and destination addresses
-        */
-
-       msg->target = *target;
-       msg->dest = ipv6_hdr(skb)->daddr;
+       buff = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
+       if (!buff)
+               goto release;
 
-       opt = msg->opt;
+       msg = (struct rd_msg *)skb_put(buff, sizeof(*msg));
+       *msg = (struct rd_msg) {
+               .icmph = {
+                       .icmp6_type = NDISC_REDIRECT,
+               },
+               .target = *target,
+               .dest = ipv6_hdr(skb)->daddr,
+       };
 
        /*
         *      include target_address option
         */
 
        if (ha)
-               opt = ndisc_fill_addr_option(opt, ND_OPT_TARGET_LL_ADDR, ha,
-                                            dev->addr_len, dev->type);
+               ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR, ha);
 
        /*
         *      build redirect option and copy skb over to the new packet.
         */
 
-       memset(opt, 0, 8);
-       *(opt++) = ND_OPT_REDIRECT_HDR;
-       *(opt++) = (rd_len >> 3);
-       opt += 6;
-
-       memcpy(opt, ipv6_hdr(skb), rd_len - 8);
-
-       msg->icmph.icmp6_cksum = csum_ipv6_magic(&saddr_buf, &ipv6_hdr(skb)->saddr,
-                                                len, IPPROTO_ICMPV6,
-                                                csum_partial(msg, len, 0));
+       if (rd_len)
+               ndisc_fill_redirect_hdr_option(buff, skb, rd_len);
 
        skb_dst_set(buff, dst);
-       rcu_read_lock();
-       idev = __in6_dev_get(dst->dev);
-       IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
-       err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev,
-                     dst_output);
-       if (!err) {
-               ICMP6MSGOUT_INC_STATS(net, idev, NDISC_REDIRECT);
-               ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
-       }
-
-       rcu_read_unlock();
+       ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf);
        return;
 
 release:
@@ -1519,7 +1522,7 @@ int ndisc_rcv(struct sk_buff *skb)
 {
        struct nd_msg *msg;
 
-       if (!pskb_may_pull(skb, skb->len))
+       if (skb_linearize(skb))
                return 0;
 
        msg = (struct nd_msg *)skb_transport_header(skb);
index 125a90d6a795967f13fcdfd19b3c24e24ce02504..341b54ade72cd045472e5957c33370c84d3338b0 100644 (file)
@@ -1098,7 +1098,7 @@ static int get_info(struct net *net, void __user *user,
 #endif
        t = try_then_request_module(xt_find_table_lock(net, AF_INET6, name),
                                    "ip6table_%s", name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                struct ip6t_getinfo info;
                const struct xt_table_info *private = t->private;
 #ifdef CONFIG_COMPAT
@@ -1157,7 +1157,7 @@ get_entries(struct net *net, struct ip6t_get_entries __user *uptr,
        }
 
        t = xt_find_table_lock(net, AF_INET6, get.name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                struct xt_table_info *private = t->private;
                duprintf("t->private->number = %u\n", private->number);
                if (get.size == private->size)
@@ -1197,7 +1197,7 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,
 
        t = try_then_request_module(xt_find_table_lock(net, AF_INET6, name),
                                    "ip6table_%s", name);
-       if (!t || IS_ERR(t)) {
+       if (IS_ERR_OR_NULL(t)) {
                ret = t ? PTR_ERR(t) : -ENOENT;
                goto free_newinfo_counters_untrans;
        }
@@ -1355,7 +1355,7 @@ do_add_counters(struct net *net, const void __user *user, unsigned int len,
        }
 
        t = xt_find_table_lock(net, AF_INET6, name);
-       if (!t || IS_ERR(t)) {
+       if (IS_ERR_OR_NULL(t)) {
                ret = t ? PTR_ERR(t) : -ENOENT;
                goto free;
        }
@@ -1939,7 +1939,7 @@ compat_get_entries(struct net *net, struct compat_ip6t_get_entries __user *uptr,
 
        xt_compat_lock(AF_INET6);
        t = xt_find_table_lock(net, AF_INET6, get.name);
-       if (t && !IS_ERR(t)) {
+       if (!IS_ERR_OR_NULL(t)) {
                const struct xt_table_info *private = t->private;
                struct xt_table_info info;
                duprintf("t->private->number = %u\n", private->number);
index e9486915eff6e9b8e71038e48e3bc85c483dee02..7302b0b7b642e91257b119c5b89938f4ac2846e6 100644 (file)
 #include <linux/netfilter_ipv6/ip6t_NPT.h>
 #include <linux/netfilter/x_tables.h>
 
-static __sum16 csum16_complement(__sum16 a)
-{
-       return (__force __sum16)(0xffff - (__force u16)a);
-}
-
-static __sum16 csum16_add(__sum16 a, __sum16 b)
-{
-       u16 sum;
-
-       sum = (__force u16)a + (__force u16)b;
-       sum += (__force u16)a < (__force u16)b;
-       return (__force __sum16)sum;
-}
-
-static __sum16 csum16_sub(__sum16 a, __sum16 b)
-{
-       return csum16_add(a, csum16_complement(b));
-}
-
 static int ip6t_npt_checkentry(const struct xt_tgchk_param *par)
 {
        struct ip6t_npt_tginfo *npt = par->targinfo;
-       __sum16 src_sum = 0, dst_sum = 0;
+       __wsum src_sum = 0, dst_sum = 0;
        unsigned int i;
 
        if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64)
                return -EINVAL;
 
        for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) {
-               src_sum = csum16_add(src_sum,
-                               (__force __sum16)npt->src_pfx.in6.s6_addr16[i]);
-               dst_sum = csum16_add(dst_sum,
-                               (__force __sum16)npt->dst_pfx.in6.s6_addr16[i]);
+               src_sum = csum_add(src_sum,
+                               (__force __wsum)npt->src_pfx.in6.s6_addr16[i]);
+               dst_sum = csum_add(dst_sum,
+                               (__force __wsum)npt->dst_pfx.in6.s6_addr16[i]);
        }
 
-       npt->adjustment = csum16_sub(src_sum, dst_sum);
+       npt->adjustment = (__force __sum16) csum_sub(src_sum, dst_sum);
        return 0;
 }
 
@@ -85,7 +66,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
                        return false;
        }
 
-       sum = csum16_add((__force __sum16)addr->s6_addr16[idx],
+       sum = (__force __sum16) csum_add((__force __wsum)addr->s6_addr16[idx],
                         npt->adjustment);
        if (sum == CSUM_MANGLED_0)
                sum = 0;
index fd4fb34c51c7f5b9bd62294de2abb6da943ee494..ed3b427b284142c037d66d63ee3fa7e205925708 100644 (file)
@@ -126,12 +126,13 @@ static void send_reset(struct net *net, struct sk_buff *oldskb)
        skb_put(nskb, sizeof(struct ipv6hdr));
        skb_reset_network_header(nskb);
        ip6h = ipv6_hdr(nskb);
-       *(__be32 *)ip6h =  htonl(0x60000000 | (tclass << 20));
+       ip6_flow_hdr(ip6h, tclass, 0);
        ip6h->hop_limit = ip6_dst_hoplimit(dst);
        ip6h->nexthdr = IPPROTO_TCP;
        ip6h->saddr = oip6h->daddr;
        ip6h->daddr = oip6h->saddr;
 
+       skb_reset_transport_header(nskb);
        tcph = (struct tcphdr *)skb_put(nskb, sizeof(struct tcphdr));
        /* Truncate to length (no data) */
        tcph->doff = sizeof(struct tcphdr)/4;
index 6c8ae24b85eb15f525e2e43a1b0e7f93068e8d85..e0e788d25b1431624ae9470f0af904803fe5d92a 100644 (file)
@@ -127,23 +127,28 @@ nf_nat_ipv6_fn(unsigned int hooknum,
                        ret = nf_nat_rule_find(skb, hooknum, in, out, ct);
                        if (ret != NF_ACCEPT)
                                return ret;
-               } else
+               } else {
                        pr_debug("Already setup manip %s for ct %p\n",
                                 maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST",
                                 ct);
+                       if (nf_nat_oif_changed(hooknum, ctinfo, nat, out))
+                               goto oif_changed;
+               }
                break;
 
        default:
                /* ESTABLISHED */
                NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED ||
                             ctinfo == IP_CT_ESTABLISHED_REPLY);
-               if (nf_nat_oif_changed(hooknum, ctinfo, nat, out)) {
-                       nf_ct_kill_acct(ct, ctinfo, skb);
-                       return NF_DROP;
-               }
+               if (nf_nat_oif_changed(hooknum, ctinfo, nat, out))
+                       goto oif_changed;
        }
 
        return nf_nat_packet(ct, ctinfo, hooknum, skb);
+
+oif_changed:
+       nf_ct_kill_acct(ct, ctinfo, skb);
+       return NF_DROP;
 }
 
 static unsigned int
index 00ee17c3e8939b1076ae2c2026ed6dfa1b3f68de..137e245860ab41a9ec923a8655f538c8cc8d4e52 100644 (file)
@@ -81,8 +81,8 @@ static int ipv6_get_l4proto(const struct sk_buff *skb, unsigned int nhoff,
        }
        protoff = ipv6_skip_exthdr(skb, extoff, &nexthdr, &frag_off);
        /*
-        * (protoff == skb->len) mean that the packet doesn't have no data
-        * except of IPv6 & ext headers. but it's tracked anyway. - YK
+        * (protoff == skb->len) means the packet has not data, just
+        * IPv6 and possibly extensions headers, but it is tracked anyway
         */
        if (protoff < 0 || (frag_off & htons(~0x7)) != 0) {
                pr_debug("ip6_conntrack_core: can't find proto in pkt\n");
index 22c8ea9511852e963b982ad68ed7066bda262ad2..3dacecc9906597e3f44fa9475dda0afb8f4981c2 100644 (file)
@@ -311,7 +311,10 @@ found:
        else
                fq->q.fragments = skb;
 
-       skb->dev = NULL;
+       if (skb->dev) {
+               fq->iif = skb->dev->ifindex;
+               skb->dev = NULL;
+       }
        fq->q.stamp = skb->tstamp;
        fq->q.meat += skb->len;
        if (payload_len > fq->q.max_size)
index 621b68ecf16f5c86cb01cace5a0659969a9855b8..f3328bc1174f0d3d7825c17bc76e4ae9b5c0a9f2 100644 (file)
@@ -145,25 +145,12 @@ static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst,
        struct neighbour *n;
 
        daddr = choose_neigh_daddr(rt, skb, daddr);
-       n = __ipv6_neigh_lookup(&nd_tbl, dst->dev, daddr);
+       n = __ipv6_neigh_lookup(dst->dev, daddr);
        if (n)
                return n;
        return neigh_create(&nd_tbl, daddr, dst->dev);
 }
 
-static int rt6_bind_neighbour(struct rt6_info *rt, struct net_device *dev)
-{
-       struct neighbour *n = __ipv6_neigh_lookup(&nd_tbl, dev, &rt->rt6i_gateway);
-       if (!n) {
-               n = neigh_create(&nd_tbl, &rt->rt6i_gateway, dev);
-               if (IS_ERR(n))
-                       return PTR_ERR(n);
-       }
-       rt->n = n;
-
-       return 0;
-}
-
 static struct dst_ops ip6_dst_ops_template = {
        .family                 =       AF_INET6,
        .protocol               =       cpu_to_be16(ETH_P_IPV6),
@@ -301,9 +288,6 @@ static void ip6_dst_destroy(struct dst_entry *dst)
        struct rt6_info *rt = (struct rt6_info *)dst;
        struct inet6_dev *idev = rt->rt6i_idev;
 
-       if (rt->n)
-               neigh_release(rt->n);
-
        if (!(rt->dst.flags & DST_HOST))
                dst_destroy_metrics_generic(dst);
 
@@ -354,11 +338,6 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
                                in6_dev_put(idev);
                        }
                }
-               if (rt->n && rt->n->dev == dev) {
-                       rt->n->dev = loopback_dev;
-                       dev_hold(loopback_dev);
-                       dev_put(dev);
-               }
        }
 }
 
@@ -388,15 +367,8 @@ static int rt6_info_hash_nhsfn(unsigned int candidate_count,
 {
        unsigned int val = fl6->flowi6_proto;
 
-       val ^= (__force u32)fl6->daddr.s6_addr32[0];
-       val ^= (__force u32)fl6->daddr.s6_addr32[1];
-       val ^= (__force u32)fl6->daddr.s6_addr32[2];
-       val ^= (__force u32)fl6->daddr.s6_addr32[3];
-
-       val ^= (__force u32)fl6->saddr.s6_addr32[0];
-       val ^= (__force u32)fl6->saddr.s6_addr32[1];
-       val ^= (__force u32)fl6->saddr.s6_addr32[2];
-       val ^= (__force u32)fl6->saddr.s6_addr32[3];
+       val ^= ipv6_addr_hash(&fl6->daddr);
+       val ^= ipv6_addr_hash(&fl6->saddr);
 
        /* Work only if this not encapsulated */
        switch (fl6->flowi6_proto) {
@@ -505,24 +477,34 @@ static void rt6_probe(struct rt6_info *rt)
         * Router Reachability Probe MUST be rate-limited
         * to no more than one per minute.
         */
-       neigh = rt ? rt->n : NULL;
-       if (!neigh || (neigh->nud_state & NUD_VALID))
+       if (!rt || !(rt->rt6i_flags & RTF_GATEWAY))
                return;
-       read_lock_bh(&neigh->lock);
-       if (!(neigh->nud_state & NUD_VALID) &&
+       rcu_read_lock_bh();
+       neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
+       if (neigh) {
+               write_lock(&neigh->lock);
+               if (neigh->nud_state & NUD_VALID)
+                       goto out;
+       }
+
+       if (!neigh ||
            time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) {
                struct in6_addr mcaddr;
                struct in6_addr *target;
 
-               neigh->updated = jiffies;
-               read_unlock_bh(&neigh->lock);
+               if (neigh) {
+                       neigh->updated = jiffies;
+                       write_unlock(&neigh->lock);
+               }
 
-               target = (struct in6_addr *)&neigh->primary_key;
+               target = (struct in6_addr *)&rt->rt6i_gateway;
                addrconf_addr_solict_mult(target, &mcaddr);
                ndisc_send_ns(rt->dst.dev, NULL, target, &mcaddr, NULL);
        } else {
-               read_unlock_bh(&neigh->lock);
+out:
+               write_unlock(&neigh->lock);
        }
+       rcu_read_unlock_bh();
 }
 #else
 static inline void rt6_probe(struct rt6_info *rt)
@@ -549,20 +531,24 @@ static inline bool rt6_check_neigh(struct rt6_info *rt)
        struct neighbour *neigh;
        bool ret = false;
 
-       neigh = rt->n;
        if (rt->rt6i_flags & RTF_NONEXTHOP ||
            !(rt->rt6i_flags & RTF_GATEWAY))
-               ret = true;
-       else if (neigh) {
-               read_lock_bh(&neigh->lock);
+               return true;
+
+       rcu_read_lock_bh();
+       neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
+       if (neigh) {
+               read_lock(&neigh->lock);
                if (neigh->nud_state & NUD_VALID)
                        ret = true;
 #ifdef CONFIG_IPV6_ROUTER_PREF
                else if (!(neigh->nud_state & NUD_FAILED))
                        ret = true;
 #endif
-               read_unlock_bh(&neigh->lock);
+               read_unlock(&neigh->lock);
        }
+       rcu_read_unlock_bh();
+
        return ret;
 }
 
@@ -838,8 +824,6 @@ static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort,
        rt = ip6_rt_copy(ort, daddr);
 
        if (rt) {
-               int attempts = !in_softirq();
-
                if (!(rt->rt6i_flags & RTF_GATEWAY)) {
                        if (ort->rt6i_dst.plen != 128 &&
                            ipv6_addr_equal(&ort->rt6i_dst.addr, daddr))
@@ -855,32 +839,6 @@ static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort,
                        rt->rt6i_src.plen = 128;
                }
 #endif
-
-       retry:
-               if (rt6_bind_neighbour(rt, rt->dst.dev)) {
-                       struct net *net = dev_net(rt->dst.dev);
-                       int saved_rt_min_interval =
-                               net->ipv6.sysctl.ip6_rt_gc_min_interval;
-                       int saved_rt_elasticity =
-                               net->ipv6.sysctl.ip6_rt_gc_elasticity;
-
-                       if (attempts-- > 0) {
-                               net->ipv6.sysctl.ip6_rt_gc_elasticity = 1;
-                               net->ipv6.sysctl.ip6_rt_gc_min_interval = 0;
-
-                               ip6_dst_gc(&net->ipv6.ip6_dst_ops);
-
-                               net->ipv6.sysctl.ip6_rt_gc_elasticity =
-                                       saved_rt_elasticity;
-                               net->ipv6.sysctl.ip6_rt_gc_min_interval =
-                                       saved_rt_min_interval;
-                               goto retry;
-                       }
-
-                       net_warn_ratelimited("Neighbour table overflow\n");
-                       dst_free(&rt->dst);
-                       return NULL;
-               }
        }
 
        return rt;
@@ -891,10 +849,8 @@ static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort,
 {
        struct rt6_info *rt = ip6_rt_copy(ort, daddr);
 
-       if (rt) {
+       if (rt)
                rt->rt6i_flags |= RTF_CACHE;
-               rt->n = neigh_clone(ort->n);
-       }
        return rt;
 }
 
@@ -928,7 +884,7 @@ restart:
        dst_hold(&rt->dst);
        read_unlock_bh(&table->tb6_lock);
 
-       if (!rt->n && !(rt->rt6i_flags & RTF_NONEXTHOP))
+       if (!(rt->rt6i_flags & (RTF_NONEXTHOP | RTF_GATEWAY)))
                nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr);
        else if (!(rt->dst.flags & DST_HOST))
                nrt = rt6_alloc_clone(rt, &fl6->daddr);
@@ -994,7 +950,7 @@ void ip6_route_input(struct sk_buff *skb)
                .flowi6_iif = skb->dev->ifindex,
                .daddr = iph->daddr,
                .saddr = iph->saddr,
-               .flowlabel = (* (__be32 *) iph) & IPV6_FLOWINFO_MASK,
+               .flowlabel = ip6_flowinfo(iph),
                .flowi6_mark = skb->mark,
                .flowi6_proto = iph->nexthdr,
        };
@@ -1159,7 +1115,7 @@ void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
        fl6.flowi6_flags = 0;
        fl6.daddr = iph->daddr;
        fl6.saddr = iph->saddr;
-       fl6.flowlabel = (*(__be32 *) iph) & IPV6_FLOWINFO_MASK;
+       fl6.flowlabel = ip6_flowinfo(iph);
 
        dst = ip6_route_output(net, NULL, &fl6);
        if (!dst->error)
@@ -1187,7 +1143,7 @@ void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark)
        fl6.flowi6_flags = 0;
        fl6.daddr = iph->daddr;
        fl6.saddr = iph->saddr;
-       fl6.flowlabel = (*(__be32 *) iph) & IPV6_FLOWINFO_MASK;
+       fl6.flowlabel = ip6_flowinfo(iph);
 
        dst = ip6_route_output(net, NULL, &fl6);
        if (!dst->error)
@@ -1247,7 +1203,6 @@ static struct dst_entry *icmp6_dst_gc_list;
 static DEFINE_SPINLOCK(icmp6_dst_lock);
 
 struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
-                                 struct neighbour *neigh,
                                  struct flowi6 *fl6)
 {
        struct dst_entry *dst;
@@ -1265,20 +1220,8 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
                goto out;
        }
 
-       if (neigh)
-               neigh_hold(neigh);
-       else {
-               neigh = ip6_neigh_lookup(&rt->dst, NULL, &fl6->daddr);
-               if (IS_ERR(neigh)) {
-                       in6_dev_put(idev);
-                       dst_free(&rt->dst);
-                       return ERR_CAST(neigh);
-               }
-       }
-
        rt->dst.flags |= DST_HOST;
        rt->dst.output  = ip6_output;
-       rt->n = neigh;
        atomic_set(&rt->dst.__refcnt, 1);
        rt->rt6i_dst.addr = fl6->daddr;
        rt->rt6i_dst.plen = 128;
@@ -1587,12 +1530,6 @@ int ip6_route_add(struct fib6_config *cfg)
        } else
                rt->rt6i_prefsrc.plen = 0;
 
-       if (cfg->fc_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) {
-               err = rt6_bind_neighbour(rt, dev);
-               if (err)
-                       goto out;
-       }
-
        rt->rt6i_flags = cfg->fc_flags;
 
 install_route:
@@ -1706,7 +1643,6 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
        struct netevent_redirect netevent;
        struct rt6_info *rt, *nrt = NULL;
        struct ndisc_options ndopts;
-       struct neighbour *old_neigh;
        struct inet6_dev *in6_dev;
        struct neighbour *neigh;
        struct rd_msg *msg;
@@ -1779,11 +1715,6 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
        if (!neigh)
                return;
 
-       /* Duplicate redirect: silently ignore. */
-       old_neigh = rt->n;
-       if (neigh == old_neigh)
-               goto out;
-
        /*
         *      We have finally decided to accept it.
         */
@@ -1804,16 +1735,14 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
                nrt->rt6i_flags &= ~RTF_GATEWAY;
 
        nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
-       nrt->n = neigh_clone(neigh);
 
        if (ip6_ins_rt(nrt))
                goto out;
 
        netevent.old = &rt->dst;
-       netevent.old_neigh = old_neigh;
        netevent.new = &nrt->dst;
-       netevent.new_neigh = neigh;
        netevent.daddr = &msg->dest;
+       netevent.neigh = neigh;
        call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
 
        if (rt->rt6i_flags & RTF_CACHE) {
@@ -2119,7 +2048,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
 {
        struct net *net = dev_net(idev->dev);
        struct rt6_info *rt = ip6_dst_alloc(net, net->loopback_dev, 0, NULL);
-       int err;
 
        if (!rt) {
                net_warn_ratelimited("Maximum number of routes reached, consider increasing route/max_size\n");
@@ -2138,11 +2066,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
                rt->rt6i_flags |= RTF_ANYCAST;
        else
                rt->rt6i_flags |= RTF_LOCAL;
-       err = rt6_bind_neighbour(rt, rt->dst.dev);
-       if (err) {
-               dst_free(&rt->dst);
-               return ERR_PTR(err);
-       }
 
        rt->rt6i_dst.addr = *addr;
        rt->rt6i_dst.plen = 128;
@@ -2488,7 +2411,6 @@ static int rt6_fill_node(struct net *net,
        struct nlmsghdr *nlh;
        long expires;
        u32 table;
-       struct neighbour *n;
 
        if (prefix) {   /* user wants prefix routes only */
                if (!(rt->rt6i_flags & RTF_PREFIX_RT)) {
@@ -2601,9 +2523,8 @@ static int rt6_fill_node(struct net *net,
        if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0)
                goto nla_put_failure;
 
-       n = rt->n;
-       if (n) {
-               if (nla_put(skb, RTA_GATEWAY, 16, &n->primary_key) < 0)
+       if (rt->rt6i_flags & RTF_GATEWAY) {
+               if (nla_put(skb, RTA_GATEWAY, 16, &rt->rt6i_gateway) < 0)
                        goto nla_put_failure;
        }
 
@@ -2798,7 +2719,6 @@ struct rt6_proc_arg
 static int rt6_info_route(struct rt6_info *rt, void *p_arg)
 {
        struct seq_file *m = p_arg;
-       struct neighbour *n;
 
        seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen);
 
@@ -2807,9 +2727,8 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg)
 #else
        seq_puts(m, "00000000000000000000000000000000 00 ");
 #endif
-       n = rt->n;
-       if (n) {
-               seq_printf(m, "%pi6", n->primary_key);
+       if (rt->rt6i_flags & RTF_GATEWAY) {
+               seq_printf(m, "%pi6", &rt->rt6i_gateway);
        } else {
                seq_puts(m, "00000000000000000000000000000000");
        }
index cfba99b2c2a4958144ff4c2a2faa1d98192d7310..98fe53694a6563f30c8c972032b5a24ef2403bce 100644 (file)
@@ -592,15 +592,10 @@ out:
 
 static int ipip6_rcv(struct sk_buff *skb)
 {
-       const struct iphdr *iph;
+       const struct iphdr *iph = ip_hdr(skb);
        struct ip_tunnel *tunnel;
        int err;
 
-       if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
-               goto out;
-
-       iph = ip_hdr(skb);
-
        tunnel = ipip6_tunnel_lookup(dev_net(skb->dev), skb->dev,
                                     iph->saddr, iph->daddr);
        if (tunnel != NULL) {
index 3164ad272a74411661930ec19309af14589347c1..06087e58738a553ce2ff050cb6bbbcac5d393014 100644 (file)
@@ -834,7 +834,8 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
                 * no RST generated if md5 hash doesn't match.
                 */
                sk1 = inet6_lookup_listener(dev_net(skb_dst(skb)->dev),
-                                          &tcp_hashinfo, &ipv6h->daddr,
+                                          &tcp_hashinfo, &ipv6h->saddr,
+                                          th->source, &ipv6h->daddr,
                                           ntohs(th->source), inet6_iif(skb));
                if (!sk1)
                        return;
@@ -1163,7 +1164,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                newnp->opt         = NULL;
                newnp->mcast_oif   = inet6_iif(skb);
                newnp->mcast_hops  = ipv6_hdr(skb)->hop_limit;
-               newnp->rcv_tclass  = ipv6_tclass(ipv6_hdr(skb));
+               newnp->rcv_tclass  = ipv6_get_dsfield(ipv6_hdr(skb));
 
                /*
                 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
@@ -1243,7 +1244,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        newnp->opt        = NULL;
        newnp->mcast_oif  = inet6_iif(skb);
        newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
-       newnp->rcv_tclass = ipv6_tclass(ipv6_hdr(skb));
+       newnp->rcv_tclass = ipv6_get_dsfield(ipv6_hdr(skb));
 
        /* Clone native IPv6 options from listening socket (if any)
 
@@ -1456,7 +1457,7 @@ ipv6_pktoptions:
                if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
                        np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
                if (np->rxopt.bits.rxtclass)
-                       np->rcv_tclass = ipv6_tclass(ipv6_hdr(skb));
+                       np->rcv_tclass = ipv6_get_dsfield(ipv6_hdr(skb));
                if (ipv6_opt_accepted(sk, opt_skb)) {
                        skb_set_owner_r(opt_skb, sk);
                        opt_skb = xchg(&np->pktoptions, opt_skb);
@@ -1598,6 +1599,7 @@ do_time_wait:
                struct sock *sk2;
 
                sk2 = inet6_lookup_listener(dev_net(skb->dev), &tcp_hashinfo,
+                                           &ipv6_hdr(skb)->saddr, th->source,
                                            &ipv6_hdr(skb)->daddr,
                                            ntohs(th->dest), inet6_iif(skb));
                if (sk2 != NULL) {
index dfaa29b8b2939c03fef13fa416f6fdaef031bf5d..cb5bf497c09c4e1ebffa8d2c2ad84c9fca678a15 100644 (file)
@@ -45,6 +45,7 @@
 #include <net/tcp_states.h>
 #include <net/ip6_checksum.h>
 #include <net/xfrm.h>
+#include <net/inet6_hashtables.h>
 
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
@@ -203,7 +204,8 @@ static struct sock *udp6_lib_lookup2(struct net *net,
 {
        struct sock *sk, *result;
        struct hlist_nulls_node *node;
-       int score, badness;
+       int score, badness, matches = 0, reuseport = 0;
+       u32 hash = 0;
 
 begin:
        result = NULL;
@@ -214,8 +216,18 @@ begin:
                if (score > badness) {
                        result = sk;
                        badness = score;
-                       if (score == SCORE2_MAX)
+                       reuseport = sk->sk_reuseport;
+                       if (reuseport) {
+                               hash = inet6_ehashfn(net, daddr, hnum,
+                                                    saddr, sport);
+                               matches = 1;
+                       } else if (score == SCORE2_MAX)
                                goto exact_match;
+               } else if (score == badness && reuseport) {
+                       matches++;
+                       if (((u64)hash * matches) >> 32 == 0)
+                               result = sk;
+                       hash = next_pseudo_random32(hash);
                }
        }
        /*
@@ -249,7 +261,8 @@ struct sock *__udp6_lib_lookup(struct net *net,
        unsigned short hnum = ntohs(dport);
        unsigned int hash2, slot2, slot = udp_hashfn(net, hnum, udptable->mask);
        struct udp_hslot *hslot2, *hslot = &udptable->hash[slot];
-       int score, badness;
+       int score, badness, matches = 0, reuseport = 0;
+       u32 hash = 0;
 
        rcu_read_lock();
        if (hslot->count > 10) {
@@ -284,6 +297,17 @@ begin:
                if (score > badness) {
                        result = sk;
                        badness = score;
+                       reuseport = sk->sk_reuseport;
+                       if (reuseport) {
+                               hash = inet6_ehashfn(net, daddr, hnum,
+                                                    saddr, sport);
+                               matches = 1;
+                       }
+               } else if (score == badness && reuseport) {
+                       matches++;
+                       if (((u64)hash * matches) >> 32 == 0)
+                               result = sk;
+                       hash = next_pseudo_random32(hash);
                }
        }
        /*
@@ -752,40 +776,6 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
        return 0;
 }
 
-static inline int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh,
-                                int proto)
-{
-       int err;
-
-       UDP_SKB_CB(skb)->partial_cov = 0;
-       UDP_SKB_CB(skb)->cscov = skb->len;
-
-       if (proto == IPPROTO_UDPLITE) {
-               err = udplite_checksum_init(skb, uh);
-               if (err)
-                       return err;
-       }
-
-       if (uh->check == 0) {
-               /* RFC 2460 section 8.1 says that we SHOULD log
-                  this error. Well, it is reasonable.
-                */
-               LIMIT_NETDEBUG(KERN_INFO "IPv6: udp checksum is 0\n");
-               return 1;
-       }
-       if (skb->ip_summed == CHECKSUM_COMPLETE &&
-           !csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
-                            skb->len, proto, skb->csum))
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-       if (!skb_csum_unnecessary(skb))
-               skb->csum = ~csum_unfold(csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
-                                                        &ipv6_hdr(skb)->daddr,
-                                                        skb->len, proto, 0));
-
-       return 0;
-}
-
 int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
                   int proto)
 {
index c9844135c9caea041bd9a680e39da7bba4cf0997..128273744332bef4f8d661bc559c8c8e5f0fb407 100644 (file)
@@ -110,7 +110,6 @@ static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
 
        /* Sheit... I remember I did this right. Apparently,
         * it was magically lost, so this code needs audit */
-       xdst->u.rt6.n = neigh_clone(rt->n);
        xdst->u.rt6.rt6i_flags = rt->rt6i_flags & (RTF_ANYCAST |
                                                   RTF_LOCAL);
        xdst->u.rt6.rt6i_metric = rt->rt6i_metric;
index ee5a7065aaccec7fa690af1c72a5785b94e6d6aa..babd1674388a962b86c63fce58a79bdd7f27b522 100644 (file)
@@ -72,7 +72,7 @@ static inline unsigned int xfrm6_tunnel_spi_hash_byaddr(const xfrm_address_t *ad
 {
        unsigned int h;
 
-       h = (__force u32)(addr->a6[0] ^ addr->a6[1] ^ addr->a6[2] ^ addr->a6[3]);
+       h = ipv6_addr_hash((const struct in6_addr *)addr);
        h ^= h >> 16;
        h ^= h >> 8;
        h &= XFRM6_TUNNEL_SPI_BYADDR_HSIZE - 1;
index 3ad1f9db5f8b697167c8ed1ed249567f36ccf008..df082508362d892e623a80b57c732504e0b78581 100644 (file)
@@ -1806,7 +1806,7 @@ static void iucv_external_interrupt(struct ext_code ext_code,
        struct iucv_irq_data *p;
        struct iucv_irq_list *work;
 
-       kstat_cpu(smp_processor_id()).irqs[EXTINT_IUC]++;
+       inc_irq_stat(IRQEXT_IUC);
        p = iucv_irq_data[smp_processor_id()];
        if (p->ippathid >= iucv_max_pathid) {
                WARN_ON(p->ippathid >= iucv_max_pathid);
index 5c61677487cf831324994e24e22528d15f35aa3a..47e0aca614b78462e876cbdb5cbd31695af630c5 100644 (file)
@@ -1009,6 +1009,8 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
        if (old_probe_resp)
                kfree_rcu(old_probe_resp, rcu_head);
 
+       list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
+               sta_info_flush(local, vlan);
        sta_info_flush(local, sdata);
        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
 
index 53f03120db55dc3d2c1e8c775a054182d21dac69..80e55527504b91cd71b6d33a946507ad10b59c7e 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <linux/nl80211.h>
 #include <linux/export.h>
+#include <linux/rtnetlink.h>
 #include <net/cfg80211.h>
 #include "ieee80211_i.h"
 #include "driver-ops.h"
@@ -197,6 +198,15 @@ static void __ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata)
 
        ctx = container_of(conf, struct ieee80211_chanctx, conf);
 
+       if (sdata->vif.type == NL80211_IFTYPE_AP) {
+               struct ieee80211_sub_if_data *vlan;
+
+               /* for the VLAN list */
+               ASSERT_RTNL();
+               list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
+                       rcu_assign_pointer(vlan->vif.chanctx_conf, NULL);
+       }
+
        ieee80211_unassign_vif_chanctx(sdata, ctx);
        if (ctx->refcount == 0)
                ieee80211_free_chanctx(local, ctx);
@@ -316,6 +326,15 @@ int ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata,
                goto out;
        }
 
+       if (sdata->vif.type == NL80211_IFTYPE_AP) {
+               struct ieee80211_sub_if_data *vlan;
+
+               /* for the VLAN list */
+               ASSERT_RTNL();
+               list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
+                       rcu_assign_pointer(vlan->vif.chanctx_conf, &ctx->conf);
+       }
+
        ieee80211_recalc_smps_chanctx(local, ctx);
  out:
        mutex_unlock(&local->chanctx_mtx);
@@ -331,6 +350,25 @@ void ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata)
        mutex_unlock(&sdata->local->chanctx_mtx);
 }
 
+void ieee80211_vif_vlan_copy_chanctx(struct ieee80211_sub_if_data *sdata)
+{
+       struct ieee80211_local *local = sdata->local;
+       struct ieee80211_sub_if_data *ap;
+       struct ieee80211_chanctx_conf *conf;
+
+       if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->bss))
+               return;
+
+       ap = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap);
+
+       mutex_lock(&local->chanctx_mtx);
+
+       conf = rcu_dereference_protected(ap->vif.chanctx_conf,
+                                        lockdep_is_held(&local->chanctx_mtx));
+       rcu_assign_pointer(sdata->vif.chanctx_conf, conf);
+       mutex_unlock(&local->chanctx_mtx);
+}
+
 void ieee80211_iter_chan_contexts_atomic(
        struct ieee80211_hw *hw,
        void (*iter)(struct ieee80211_hw *hw,
index 8881fc77fb1324c50d79ca6dcc2dd5423d7a18c9..6b7644e818d8f30629513318d4f9a17e4e622606 100644 (file)
@@ -703,8 +703,8 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
        sdata_info(sdata,
                   "No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)\n");
 
-       ieee80211_request_internal_scan(sdata,
-                       ifibss->ssid, ifibss->ssid_len, NULL);
+       ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
+                                   NULL);
 }
 
 static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
@@ -802,9 +802,8 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
                                        IEEE80211_SCAN_INTERVAL)) {
                sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
 
-               ieee80211_request_internal_scan(sdata,
-                               ifibss->ssid, ifibss->ssid_len,
-                               ifibss->fixed_channel ? ifibss->channel : NULL);
+               ieee80211_request_ibss_scan(sdata, ifibss->ssid,
+                                           ifibss->ssid_len, chan);
        } else {
                int interval = IEEE80211_SCAN_INTERVAL;
 
index 42d0d026773090633aec6cecf21d5c6065a4b69d..8563b9a5cac325aa8ddb5fe817712462de2b6561 100644 (file)
@@ -92,8 +92,6 @@ struct ieee80211_bss {
 
        u32 device_ts;
 
-       u8 dtim_period;
-
        bool wmm_used;
        bool uapsd_supported;
 
@@ -140,7 +138,6 @@ enum ieee80211_bss_corrupt_data_flags {
 
 /**
  * enum ieee80211_valid_data_flags - BSS valid data flags
- * @IEEE80211_BSS_VALID_DTIM: DTIM data was gathered from non-corrupt IE
  * @IEEE80211_BSS_VALID_WMM: WMM/UAPSD data was gathered from non-corrupt IE
  * @IEEE80211_BSS_VALID_RATES: Supported rates were gathered from non-corrupt IE
  * @IEEE80211_BSS_VALID_ERP: ERP flag was gathered from non-corrupt IE
@@ -151,7 +148,6 @@ enum ieee80211_bss_corrupt_data_flags {
  * beacon/probe response.
  */
 enum ieee80211_bss_valid_data_flags {
-       IEEE80211_BSS_VALID_DTIM                = BIT(0),
        IEEE80211_BSS_VALID_WMM                 = BIT(1),
        IEEE80211_BSS_VALID_RATES               = BIT(2),
        IEEE80211_BSS_VALID_ERP                 = BIT(3)
@@ -440,6 +436,7 @@ struct ieee80211_if_managed {
        unsigned long timers_running; /* used for quiesce/restart */
        bool powersave; /* powersave requested for this iface */
        bool broken_ap; /* AP is broken -- turn off powersave */
+       u8 dtim_period;
        enum ieee80211_smps_mode req_smps, /* requested smps mode */
                                 driver_smps_mode; /* smps mode request */
 
@@ -773,6 +770,10 @@ struct ieee80211_sub_if_data {
                u32 mntr_flags;
        } u;
 
+       spinlock_t cleanup_stations_lock;
+       struct list_head cleanup_stations;
+       struct work_struct cleanup_stations_wk;
+
 #ifdef CONFIG_MAC80211_DEBUGFS
        struct {
                struct dentry *dir;
@@ -1329,9 +1330,9 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
 
 /* scan/BSS handling */
 void ieee80211_scan_work(struct work_struct *work);
-int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
-                                   const u8 *ssid, u8 ssid_len,
-                                   struct ieee80211_channel *chan);
+int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
+                               const u8 *ssid, u8 ssid_len,
+                               struct ieee80211_channel *chan);
 int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
                           struct cfg80211_scan_request *req);
 void ieee80211_scan_cancel(struct ieee80211_local *local);
@@ -1628,6 +1629,7 @@ ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata,
                          const struct cfg80211_chan_def *chandef,
                          enum ieee80211_chanctx_mode mode);
 void ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata);
+void ieee80211_vif_vlan_copy_chanctx(struct ieee80211_sub_if_data *sdata);
 
 void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
                                   struct ieee80211_chanctx *chanctx);
index 09a80b55cf5a1ffaf06fdbe892ac469f6790b2bf..8be854e86cd987d61e01cc7eabc8f7ddb068eff3 100644 (file)
@@ -207,17 +207,8 @@ void ieee80211_recalc_idle(struct ieee80211_local *local)
 
 static int ieee80211_change_mtu(struct net_device *dev, int new_mtu)
 {
-       int meshhdrlen;
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-
-       meshhdrlen = (sdata->vif.type == NL80211_IFTYPE_MESH_POINT) ? 5 : 0;
-
-       /* FIX: what would be proper limits for MTU?
-        * This interface uses 802.3 frames. */
-       if (new_mtu < 256 ||
-           new_mtu > IEEE80211_MAX_DATA_LEN - 24 - 6 - meshhdrlen) {
+       if (new_mtu < 256 || new_mtu > IEEE80211_MAX_DATA_LEN)
                return -EINVAL;
-       }
 
        dev->mtu = new_mtu;
        return 0;
@@ -586,11 +577,13 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
 
        switch (sdata->vif.type) {
        case NL80211_IFTYPE_AP_VLAN:
-               /* no need to tell driver, but set carrier */
-               if (rtnl_dereference(sdata->bss->beacon))
+               /* no need to tell driver, but set carrier and chanctx */
+               if (rtnl_dereference(sdata->bss->beacon)) {
+                       ieee80211_vif_vlan_copy_chanctx(sdata);
                        netif_carrier_on(dev);
-               else
+               } else {
                        netif_carrier_off(dev);
+               }
                break;
        case NL80211_IFTYPE_MONITOR:
                if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) {
@@ -839,6 +832,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
        switch (sdata->vif.type) {
        case NL80211_IFTYPE_AP_VLAN:
                list_del(&sdata->u.vlan.list);
+               rcu_assign_pointer(sdata->vif.chanctx_conf, NULL);
                /* no need to tell driver */
                break;
        case NL80211_IFTYPE_MONITOR:
@@ -865,20 +859,11 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
                cancel_work_sync(&sdata->work);
                /*
                 * When we get here, the interface is marked down.
-                * Call rcu_barrier() to wait both for the RX path
+                * Call synchronize_rcu() to wait for the RX path
                 * should it be using the interface and enqueuing
-                * frames at this very time on another CPU, and
-                * for the sta free call_rcu callbacks.
-                */
-               rcu_barrier();
-
-               /*
-                * free_sta_rcu() enqueues a work for the actual
-                * sta cleanup, so we need to flush it while
-                * sdata is still valid.
+                * frames at this very time on another CPU.
                 */
-               flush_workqueue(local->workqueue);
-
+               synchronize_rcu();
                skb_queue_purge(&sdata->skb_queue);
 
                /*
@@ -1498,6 +1483,15 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
        mutex_unlock(&local->iflist_mtx);
 }
 
+static void ieee80211_cleanup_sdata_stas_wk(struct work_struct *wk)
+{
+       struct ieee80211_sub_if_data *sdata;
+
+       sdata = container_of(wk, struct ieee80211_sub_if_data, cleanup_stations_wk);
+
+       ieee80211_cleanup_sdata_stas(sdata);
+}
+
 int ieee80211_if_add(struct ieee80211_local *local, const char *name,
                     struct wireless_dev **new_wdev, enum nl80211_iftype type,
                     struct vif_params *params)
@@ -1573,6 +1567,10 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
 
        INIT_LIST_HEAD(&sdata->key_list);
 
+       spin_lock_init(&sdata->cleanup_stations_lock);
+       INIT_LIST_HEAD(&sdata->cleanup_stations);
+       INIT_WORK(&sdata->cleanup_stations_wk, ieee80211_cleanup_sdata_stas_wk);
+
        for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
                struct ieee80211_supported_band *sband;
                sband = local->hw.wiphy->bands[i];
index 1bf03f9ff3ba74394fb26201dfba3b3fd2e86a01..649ad513547f99728d43dbeeabcd2b58d7862c30 100644 (file)
@@ -163,7 +163,7 @@ int mesh_rmc_init(struct ieee80211_sub_if_data *sdata)
                return -ENOMEM;
        sdata->u.mesh.rmc->idx_mask = RMC_BUCKETS - 1;
        for (i = 0; i < RMC_BUCKETS; i++)
-               INIT_LIST_HEAD(&sdata->u.mesh.rmc->bucket[i].list);
+               INIT_LIST_HEAD(&sdata->u.mesh.rmc->bucket[i]);
        return 0;
 }
 
@@ -177,7 +177,7 @@ void mesh_rmc_free(struct ieee80211_sub_if_data *sdata)
                return;
 
        for (i = 0; i < RMC_BUCKETS; i++)
-               list_for_each_entry_safe(p, n, &rmc->bucket[i].list, list) {
+               list_for_each_entry_safe(p, n, &rmc->bucket[i], list) {
                        list_del(&p->list);
                        kmem_cache_free(rm_cache, p);
                }
@@ -210,7 +210,7 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
        /* Don't care about endianness since only match matters */
        memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
        idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
-       list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
+       list_for_each_entry_safe(p, n, &rmc->bucket[idx], list) {
                ++entries;
                if (time_after(jiffies, p->exp_time) ||
                                (entries == RMC_QUEUE_MAX_LEN)) {
@@ -229,7 +229,7 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
        p->seqnum = seqnum;
        p->exp_time = jiffies + RMC_TIMEOUT;
        memcpy(p->sa, sa, ETH_ALEN);
-       list_add(&p->list, &rmc->bucket[idx].list);
+       list_add(&p->list, &rmc->bucket[idx]);
        return 0;
 }
 
index 7c9215fb2ac84ec5c17d3ee3d372a7a6bb4feedc..84c28c6101cdd2ef832920677d05b7f02b27ada2 100644 (file)
@@ -184,7 +184,7 @@ struct rmc_entry {
 };
 
 struct mesh_rmc {
-       struct rmc_entry bucket[RMC_BUCKETS];
+       struct list_head bucket[RMC_BUCKETS];
        u32 idx_mask;
 };
 
index 7753a9ca98a6c67870f68bd40b22f3af453a3945..a3552929a21d68f469696c4131ffb6296becd5df 100644 (file)
@@ -1074,12 +1074,8 @@ void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency)
                if (beaconint_us > latency) {
                        local->ps_sdata = NULL;
                } else {
-                       struct ieee80211_bss *bss;
                        int maxslp = 1;
-                       u8 dtimper;
-
-                       bss = (void *)found->u.mgd.associated->priv;
-                       dtimper = bss->dtim_period;
+                       u8 dtimper = found->u.mgd.dtim_period;
 
                        /* If the TIM IE is invalid, pretend the value is 1 */
                        if (!dtimper)
@@ -1410,10 +1406,17 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
 
        ieee80211_led_assoc(local, 1);
 
-       if (local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD)
-               bss_conf->dtim_period = bss->dtim_period;
-       else
+       if (local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) {
+               /*
+                * If the AP is buggy we may get here with no DTIM period
+                * known, so assume it's 1 which is the only safe assumption
+                * in that case, although if the TIM IE is broken powersave
+                * probably just won't work at all.
+                */
+               bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1;
+       } else {
                bss_conf->dtim_period = 0;
+       }
 
        bss_conf->assoc = 1;
 
@@ -1562,6 +1565,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
 
        sdata->u.mgd.timers_running = 0;
 
+       sdata->vif.bss_conf.dtim_period = 0;
+
        ifmgd->flags = 0;
        ieee80211_vif_release_channel(sdata);
 }
@@ -2373,11 +2378,18 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_channel *channel;
        bool need_ps = false;
 
-       if (sdata->u.mgd.associated &&
-           ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) {
-               bss = (void *)sdata->u.mgd.associated->priv;
+       if ((sdata->u.mgd.associated &&
+            ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) ||
+           (sdata->u.mgd.assoc_data &&
+            ether_addr_equal(mgmt->bssid,
+                             sdata->u.mgd.assoc_data->bss->bssid))) {
                /* not previously set so we may need to recalc */
-               need_ps = !bss->dtim_period;
+               need_ps = sdata->u.mgd.associated && !sdata->u.mgd.dtim_period;
+
+               if (elems->tim && !elems->parse_error) {
+                       struct ieee80211_tim_ie *tim_ie = elems->tim;
+                       sdata->u.mgd.dtim_period = tim_ie->dtim_period;
+               }
        }
 
        if (elems->ds_params && elems->ds_params_len == 1)
@@ -3896,20 +3908,41 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
        /* kick off associate process */
 
        ifmgd->assoc_data = assoc_data;
+       ifmgd->dtim_period = 0;
 
        err = ieee80211_prep_connection(sdata, req->bss, true);
        if (err)
                goto err_clear;
 
-       if (!bss->dtim_period &&
-           sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) {
-               /*
-                * Wait up to one beacon interval ...
-                * should this be more if we miss one?
-                */
-               sdata_info(sdata, "waiting for beacon from %pM\n",
-                          ifmgd->bssid);
-               assoc_data->timeout = TU_TO_EXP_TIME(req->bss->beacon_interval);
+       if (sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) {
+               const struct cfg80211_bss_ies *beacon_ies;
+
+               rcu_read_lock();
+               beacon_ies = rcu_dereference(req->bss->beacon_ies);
+               if (!beacon_ies) {
+                       /*
+                        * Wait up to one beacon interval ...
+                        * should this be more if we miss one?
+                        */
+                       sdata_info(sdata, "waiting for beacon from %pM\n",
+                                  ifmgd->bssid);
+                       assoc_data->timeout =
+                               TU_TO_EXP_TIME(req->bss->beacon_interval);
+               } else {
+                       const u8 *tim_ie = cfg80211_find_ie(WLAN_EID_TIM,
+                                                           beacon_ies->data,
+                                                           beacon_ies->len);
+                       if (tim_ie && tim_ie[1] >=
+                                       sizeof(struct ieee80211_tim_ie)) {
+                               const struct ieee80211_tim_ie *tim;
+                               tim = (void *)(tim_ie + 2);
+                               ifmgd->dtim_period = tim->dtim_period;
+                       }
+                       assoc_data->have_beacon = true;
+                       assoc_data->sent_assoc = false;
+                       assoc_data->timeout = jiffies;
+               }
+               rcu_read_unlock();
        } else {
                assoc_data->have_beacon = true;
                assoc_data->sent_assoc = false;
index 8ed83dcc149fc7f38ca9beaf83a2c67a82c336ec..d59fc6818b1cc7c8d239e579166c04aa56461553 100644 (file)
@@ -113,18 +113,6 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
                        bss->valid_data |= IEEE80211_BSS_VALID_ERP;
        }
 
-       if (elems->tim && (!elems->parse_error ||
-                          !(bss->valid_data & IEEE80211_BSS_VALID_DTIM))) {
-               struct ieee80211_tim_ie *tim_ie = elems->tim;
-               bss->dtim_period = tim_ie->dtim_period;
-               if (!elems->parse_error)
-                       bss->valid_data |= IEEE80211_BSS_VALID_DTIM;
-       }
-
-       /* If the beacon had no TIM IE, or it was invalid, use 1 */
-       if (beacon && !bss->dtim_period)
-               bss->dtim_period = 1;
-
        /* replace old supported rates if we get new values */
        if (!elems->parse_error ||
            !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
@@ -832,9 +820,9 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
        return res;
 }
 
-int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
-                                   const u8 *ssid, u8 ssid_len,
-                                   struct ieee80211_channel *chan)
+int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
+                               const u8 *ssid, u8 ssid_len,
+                               struct ieee80211_channel *chan)
 {
        struct ieee80211_local *local = sdata->local;
        int ret = -EBUSY;
@@ -848,22 +836,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
 
        /* fill internal scan request */
        if (!chan) {
-               int i, nchan = 0;
+               int i, max_n;
+               int n_ch = 0;
 
                for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
                        if (!local->hw.wiphy->bands[band])
                                continue;
-                       for (i = 0;
-                            i < local->hw.wiphy->bands[band]->n_channels;
-                            i++) {
-                               local->int_scan_req->channels[nchan] =
+
+                       max_n = local->hw.wiphy->bands[band]->n_channels;
+                       for (i = 0; i < max_n; i++) {
+                               struct ieee80211_channel *tmp_ch =
                                    &local->hw.wiphy->bands[band]->channels[i];
-                               nchan++;
+
+                               if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS |
+                                                    IEEE80211_CHAN_DISABLED))
+                                       continue;
+
+                               local->int_scan_req->channels[n_ch] = tmp_ch;
+                               n_ch++;
                        }
                }
 
-               local->int_scan_req->n_channels = nchan;
+               if (WARN_ON_ONCE(n_ch == 0))
+                       goto unlock;
+
+               local->int_scan_req->n_channels = n_ch;
        } else {
+               if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS |
+                                               IEEE80211_CHAN_DISABLED)))
+                       goto unlock;
+
                local->int_scan_req->channels[0] = chan;
                local->int_scan_req->n_channels = 1;
        }
index f3e502502fee27374dc4c183733cbcc95217aed5..ca9fde1981889a559efa6b49385f071f1475a06f 100644 (file)
@@ -91,9 +91,8 @@ static int sta_info_hash_del(struct ieee80211_local *local,
        return -ENOENT;
 }
 
-static void free_sta_work(struct work_struct *wk)
+static void cleanup_single_sta(struct sta_info *sta)
 {
-       struct sta_info *sta = container_of(wk, struct sta_info, free_sta_wk);
        int ac, i;
        struct tid_ampdu_tx *tid_tx;
        struct ieee80211_sub_if_data *sdata = sta->sdata;
@@ -153,11 +152,35 @@ static void free_sta_work(struct work_struct *wk)
        sta_info_free(local, sta);
 }
 
+void ieee80211_cleanup_sdata_stas(struct ieee80211_sub_if_data *sdata)
+{
+       struct sta_info *sta;
+
+       spin_lock_bh(&sdata->cleanup_stations_lock);
+       while (!list_empty(&sdata->cleanup_stations)) {
+               sta = list_first_entry(&sdata->cleanup_stations,
+                                      struct sta_info, list);
+               list_del(&sta->list);
+               spin_unlock_bh(&sdata->cleanup_stations_lock);
+
+               cleanup_single_sta(sta);
+
+               spin_lock_bh(&sdata->cleanup_stations_lock);
+       }
+
+       spin_unlock_bh(&sdata->cleanup_stations_lock);
+}
+
 static void free_sta_rcu(struct rcu_head *h)
 {
        struct sta_info *sta = container_of(h, struct sta_info, rcu_head);
+       struct ieee80211_sub_if_data *sdata = sta->sdata;
 
-       ieee80211_queue_work(&sta->local->hw, &sta->free_sta_wk);
+       spin_lock(&sdata->cleanup_stations_lock);
+       list_add_tail(&sta->list, &sdata->cleanup_stations);
+       spin_unlock(&sdata->cleanup_stations_lock);
+
+       ieee80211_queue_work(&sdata->local->hw, &sdata->cleanup_stations_wk);
 }
 
 /* protected by RCU */
@@ -310,7 +333,6 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
 
        spin_lock_init(&sta->lock);
        INIT_WORK(&sta->drv_unblock_wk, sta_unblock);
-       INIT_WORK(&sta->free_sta_wk, free_sta_work);
        INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
        mutex_init(&sta->ampdu_mlme.mtx);
 
@@ -862,7 +884,7 @@ void sta_info_init(struct ieee80211_local *local)
 
 void sta_info_stop(struct ieee80211_local *local)
 {
-       del_timer(&local->sta_cleanup);
+       del_timer_sync(&local->sta_cleanup);
        sta_info_flush(local, NULL);
 }
 
@@ -891,6 +913,20 @@ int sta_info_flush(struct ieee80211_local *local,
        }
        mutex_unlock(&local->sta_mtx);
 
+       rcu_barrier();
+
+       if (sdata) {
+               ieee80211_cleanup_sdata_stas(sdata);
+               cancel_work_sync(&sdata->cleanup_stations_wk);
+       } else {
+               mutex_lock(&local->iflist_mtx);
+               list_for_each_entry(sdata, &local->interfaces, list) {
+                       ieee80211_cleanup_sdata_stas(sdata);
+                       cancel_work_sync(&sdata->cleanup_stations_wk);
+               }
+               mutex_unlock(&local->iflist_mtx);
+       }
+
        return ret;
 }
 
index 1489bca9ea97c19ee525ea44c0d1af794ec94cca..37c1889afd3ae02f9d9d5f2573738a28d26c266e 100644 (file)
@@ -299,7 +299,6 @@ struct sta_info {
        spinlock_t lock;
 
        struct work_struct drv_unblock_wk;
-       struct work_struct free_sta_wk;
 
        u16 listen_interval;
 
@@ -563,4 +562,6 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta);
 void ieee80211_sta_ps_deliver_poll_response(struct sta_info *sta);
 void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta);
 
+void ieee80211_cleanup_sdata_stas(struct ieee80211_sub_if_data *sdata);
+
 #endif /* STA_INFO_H */
index 1191039c2b1bc38bda25402dd395d7e3b1bbe7b4..199b92261e94281b7f774d30ba254d0468d204bc 100644 (file)
@@ -389,7 +389,7 @@ void mac802154_wpan_setup(struct net_device *dev)
 
 static int mac802154_process_data(struct net_device *dev, struct sk_buff *skb)
 {
-       return netif_rx(skb);
+       return netif_rx_ni(skb);
 }
 
 static int
index fefa514b99170aae55620e4007565b0ad3e814b4..49e96df5fbc4b38e842540f65c5b23309440c597 100644 (file)
@@ -680,6 +680,13 @@ config NETFILTER_XT_TARGET_NFQUEUE
 
          To compile it as a module, choose M here.  If unsure, say N.
 
+config NETFILTER_XT_TARGET_NOTRACK
+       tristate  '"NOTRACK" target support (DEPRECATED)'
+       depends on NF_CONNTRACK
+       depends on IP_NF_RAW || IP6_NF_RAW
+       depends on NETFILTER_ADVANCED
+       select NETFILTER_XT_TARGET_CT
+
 config NETFILTER_XT_TARGET_RATEEST
        tristate '"RATEEST" target support'
        depends on NETFILTER_ADVANCED
index 08cdc71d8e8714b75782379929fa6b050dafa7f4..e4a0c4fb3a7cef64d1f15c9173d5a3e62ad616b4 100644 (file)
@@ -1376,11 +1376,12 @@ void nf_conntrack_cleanup(struct net *net)
        synchronize_net();
        nf_conntrack_proto_fini(net);
        nf_conntrack_cleanup_net(net);
+}
 
-       if (net_eq(net, &init_net)) {
-               RCU_INIT_POINTER(nf_ct_destroy, NULL);
-               nf_conntrack_cleanup_init_net();
-       }
+void nf_conntrack_cleanup_end(void)
+{
+       RCU_INIT_POINTER(nf_ct_destroy, NULL);
+       nf_conntrack_cleanup_init_net();
 }
 
 void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls)
@@ -1526,6 +1527,7 @@ err_extend:
  */
 #define UNCONFIRMED_NULLS_VAL  ((1<<30)+0)
 #define DYING_NULLS_VAL                ((1<<30)+1)
+#define TEMPLATE_NULLS_VAL     ((1<<30)+2)
 
 static int nf_conntrack_init_net(struct net *net)
 {
@@ -1534,6 +1536,7 @@ static int nf_conntrack_init_net(struct net *net)
        atomic_set(&net->ct.count, 0);
        INIT_HLIST_NULLS_HEAD(&net->ct.unconfirmed, UNCONFIRMED_NULLS_VAL);
        INIT_HLIST_NULLS_HEAD(&net->ct.dying, DYING_NULLS_VAL);
+       INIT_HLIST_NULLS_HEAD(&net->ct.tmpl, TEMPLATE_NULLS_VAL);
        net->ct.stat = alloc_percpu(struct ip_conntrack_stat);
        if (!net->ct.stat) {
                ret = -ENOMEM;
index 4e078cd84d83c2c15c70ab4270b87a05e590f4ad..627b0e50b2389120e86ed107a3af01d690e07a29 100644 (file)
@@ -2624,7 +2624,7 @@ ctnetlink_create_expect(struct net *net, u16 zone,
        if (!help) {
                if (!cda[CTA_EXPECT_TIMEOUT]) {
                        err = -EINVAL;
-                       goto out;
+                       goto err_out;
                }
                exp->timeout.expires =
                  jiffies + ntohl(nla_get_be32(cda[CTA_EXPECT_TIMEOUT])) * HZ;
index 363285d544a1c7402152e6a7da3a7129d94b83ae..e7185c68481659445b571ab5e7866728dd3947ec 100644 (file)
@@ -575,6 +575,7 @@ static int __init nf_conntrack_standalone_init(void)
 static void __exit nf_conntrack_standalone_fini(void)
 {
        unregister_pernet_subsys(&nf_conntrack_net_ops);
+       nf_conntrack_cleanup_end();
 }
 
 module_init(nf_conntrack_standalone_init);
index 9f199f2e31fae16ff667e7a1f230e6826d015794..92fd8eca0d315ff241b066e3fab3c6f9fcdaa1bb 100644 (file)
@@ -13,6 +13,7 @@
  */
 #include <linux/module.h>
 #include <linux/skbuff.h>
+#include <linux/if_arp.h>
 #include <linux/init.h>
 #include <linux/ip.h>
 #include <linux/ipv6.h>
@@ -384,6 +385,7 @@ __build_packet_message(struct nfulnl_instance *inst,
        struct nfgenmsg *nfmsg;
        sk_buff_data_t old_tail = inst->skb->tail;
        struct sock *sk;
+       const unsigned char *hwhdrp;
 
        nlh = nlmsg_put(inst->skb, 0, 0,
                        NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET,
@@ -485,9 +487,17 @@ __build_packet_message(struct nfulnl_instance *inst,
        if (indev && skb_mac_header_was_set(skb)) {
                if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) ||
                    nla_put_be16(inst->skb, NFULA_HWLEN,
-                                htons(skb->dev->hard_header_len)) ||
-                   nla_put(inst->skb, NFULA_HWHEADER, skb->dev->hard_header_len,
-                           skb_mac_header(skb)))
+                                htons(skb->dev->hard_header_len)))
+                       goto nla_put_failure;
+
+               hwhdrp = skb_mac_header(skb);
+
+               if (skb->dev->type == ARPHRD_SIT)
+                       hwhdrp -= ETH_HLEN;
+
+               if (hwhdrp >= skb->head &&
+                   nla_put(inst->skb, NFULA_HWHEADER,
+                           skb->dev->hard_header_len, hwhdrp))
                        goto nla_put_failure;
        }
 
index 8d987c3573fd4ca9e1708e188d487e53ebd7dfd7..7b3a9e5999c0664cebe524fefba7130a6df003ce 100644 (file)
@@ -345,19 +345,27 @@ int xt_find_revision(u8 af, const char *name, u8 revision, int target,
 }
 EXPORT_SYMBOL_GPL(xt_find_revision);
 
-static char *textify_hooks(char *buf, size_t size, unsigned int mask)
+static char *
+textify_hooks(char *buf, size_t size, unsigned int mask, uint8_t nfproto)
 {
-       static const char *const names[] = {
+       static const char *const inetbr_names[] = {
                "PREROUTING", "INPUT", "FORWARD",
                "OUTPUT", "POSTROUTING", "BROUTING",
        };
-       unsigned int i;
+       static const char *const arp_names[] = {
+               "INPUT", "FORWARD", "OUTPUT",
+       };
+       const char *const *names;
+       unsigned int i, max;
        char *p = buf;
        bool np = false;
        int res;
 
+       names = (nfproto == NFPROTO_ARP) ? arp_names : inetbr_names;
+       max   = (nfproto == NFPROTO_ARP) ? ARRAY_SIZE(arp_names) :
+                                          ARRAY_SIZE(inetbr_names);
        *p = '\0';
-       for (i = 0; i < ARRAY_SIZE(names); ++i) {
+       for (i = 0; i < max; ++i) {
                if (!(mask & (1 << i)))
                        continue;
                res = snprintf(p, size, "%s%s", np ? "/" : "", names[i]);
@@ -402,8 +410,10 @@ int xt_check_match(struct xt_mtchk_param *par,
                pr_err("%s_tables: %s match: used from hooks %s, but only "
                       "valid from %s\n",
                       xt_prefix[par->family], par->match->name,
-                      textify_hooks(used, sizeof(used), par->hook_mask),
-                      textify_hooks(allow, sizeof(allow), par->match->hooks));
+                      textify_hooks(used, sizeof(used), par->hook_mask,
+                                    par->family),
+                      textify_hooks(allow, sizeof(allow), par->match->hooks,
+                                    par->family));
                return -EINVAL;
        }
        if (par->match->proto && (par->match->proto != proto || inv_proto)) {
@@ -575,8 +585,10 @@ int xt_check_target(struct xt_tgchk_param *par,
                pr_err("%s_tables: %s target: used from hooks %s, but only "
                       "usable from %s\n",
                       xt_prefix[par->family], par->target->name,
-                      textify_hooks(used, sizeof(used), par->hook_mask),
-                      textify_hooks(allow, sizeof(allow), par->target->hooks));
+                      textify_hooks(used, sizeof(used), par->hook_mask,
+                                    par->family),
+                      textify_hooks(allow, sizeof(allow), par->target->hooks,
+                                    par->family));
                return -EINVAL;
        }
        if (par->target->proto && (par->target->proto != proto || inv_proto)) {
index ae7f5daeee4362bff5aee9a30a85347de70a2ccc..bde009ed8d3bf36d6defdbdbad8aca991c539281 100644 (file)
@@ -109,7 +109,7 @@ static int xt_ct_tg_check_v0(const struct xt_tgchk_param *par)
        struct xt_ct_target_info *info = par->targinfo;
        struct nf_conntrack_tuple t;
        struct nf_conn *ct;
-       int ret;
+       int ret = -EOPNOTSUPP;
 
        if (info->flags & ~XT_CT_NOTRACK)
                return -EINVAL;
@@ -149,6 +149,10 @@ static int xt_ct_tg_check_v0(const struct xt_tgchk_param *par)
 
        __set_bit(IPS_TEMPLATE_BIT, &ct->status);
        __set_bit(IPS_CONFIRMED_BIT, &ct->status);
+
+       /* Overload tuple linked list to put us in template list. */
+       hlist_nulls_add_head_rcu(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode,
+                                &par->net->ct.tmpl);
 out:
        info->ct = ct;
        return 0;
@@ -243,7 +247,7 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par)
        struct xt_ct_target_info_v1 *info = par->targinfo;
        struct nf_conntrack_tuple t;
        struct nf_conn *ct;
-       int ret;
+       int ret = -EOPNOTSUPP;
 
        if (info->flags & ~XT_CT_NOTRACK)
                return -EINVAL;
@@ -289,6 +293,10 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par)
 
        __set_bit(IPS_TEMPLATE_BIT, &ct->status);
        __set_bit(IPS_CONFIRMED_BIT, &ct->status);
+
+       /* Overload tuple linked list to put us in template list. */
+       hlist_nulls_add_head_rcu(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode,
+                                &par->net->ct.tmpl);
 out:
        info->ct = ct;
        return 0;
@@ -377,14 +385,60 @@ static struct xt_target xt_ct_tg_reg[] __read_mostly = {
        },
 };
 
+static unsigned int
+notrack_tg(struct sk_buff *skb, const struct xt_action_param *par)
+{
+       /* Previously seen (loopback)? Ignore. */
+       if (skb->nfct != NULL)
+               return XT_CONTINUE;
+
+       skb->nfct = &nf_ct_untracked_get()->ct_general;
+       skb->nfctinfo = IP_CT_NEW;
+       nf_conntrack_get(skb->nfct);
+
+       return XT_CONTINUE;
+}
+
+static int notrack_chk(const struct xt_tgchk_param *par)
+{
+       if (!par->net->xt.notrack_deprecated_warning) {
+               pr_info("netfilter: NOTRACK target is deprecated, "
+                       "use CT instead or upgrade iptables\n");
+               par->net->xt.notrack_deprecated_warning = true;
+       }
+       return 0;
+}
+
+static struct xt_target notrack_tg_reg __read_mostly = {
+       .name           = "NOTRACK",
+       .revision       = 0,
+       .family         = NFPROTO_UNSPEC,
+       .checkentry     = notrack_chk,
+       .target         = notrack_tg,
+       .table          = "raw",
+       .me             = THIS_MODULE,
+};
+
 static int __init xt_ct_tg_init(void)
 {
-       return xt_register_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg));
+       int ret;
+
+       ret = xt_register_target(&notrack_tg_reg);
+       if (ret < 0)
+               return ret;
+
+       ret = xt_register_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg));
+       if (ret < 0) {
+               xt_unregister_target(&notrack_tg_reg);
+               return ret;
+       }
+       return 0;
 }
 
 static void __exit xt_ct_tg_exit(void)
 {
        xt_unregister_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg));
+       xt_unregister_target(&notrack_tg_reg);
 }
 
 module_init(xt_ct_tg_init);
@@ -394,3 +448,5 @@ MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Xtables: connection tracking target");
 MODULE_ALIAS("ipt_CT");
 MODULE_ALIAS("ip6t_CT");
+MODULE_ALIAS("ipt_NOTRACK");
+MODULE_ALIAS("ip6t_NOTRACK");
index 26a668a84aa288a82dc3eb243df2728a3169b2a2..a9d7af953ceb8bcd1d961eef21d0f3cb3ee22919 100644 (file)
@@ -157,11 +157,22 @@ dsthash_find(const struct xt_hashlimit_htable *ht,
 /* allocate dsthash_ent, initialize dst, put in htable and lock it */
 static struct dsthash_ent *
 dsthash_alloc_init(struct xt_hashlimit_htable *ht,
-                  const struct dsthash_dst *dst)
+                  const struct dsthash_dst *dst, bool *race)
 {
        struct dsthash_ent *ent;
 
        spin_lock(&ht->lock);
+
+       /* Two or more packets may race to create the same entry in the
+        * hashtable, double check if this packet lost race.
+        */
+       ent = dsthash_find(ht, dst);
+       if (ent != NULL) {
+               spin_unlock(&ht->lock);
+               *race = true;
+               return ent;
+       }
+
        /* initialize hash with random val at the time we allocate
         * the first hashtable entry */
        if (unlikely(!ht->rnd_initialized)) {
@@ -318,7 +329,10 @@ static void htable_destroy(struct xt_hashlimit_htable *hinfo)
                parent = hashlimit_net->ipt_hashlimit;
        else
                parent = hashlimit_net->ip6t_hashlimit;
-       remove_proc_entry(hinfo->pde->name, parent);
+
+       if(parent != NULL)
+               remove_proc_entry(hinfo->pde->name, parent);
+
        htable_selective_cleanup(hinfo, select_all);
        vfree(hinfo);
 }
@@ -585,6 +599,7 @@ hashlimit_mt(const struct sk_buff *skb, struct xt_action_param *par)
        unsigned long now = jiffies;
        struct dsthash_ent *dh;
        struct dsthash_dst dst;
+       bool race = false;
        u32 cost;
 
        if (hashlimit_init_dst(hinfo, &dst, skb, par->thoff) < 0)
@@ -593,13 +608,18 @@ hashlimit_mt(const struct sk_buff *skb, struct xt_action_param *par)
        rcu_read_lock_bh();
        dh = dsthash_find(hinfo, &dst);
        if (dh == NULL) {
-               dh = dsthash_alloc_init(hinfo, &dst);
+               dh = dsthash_alloc_init(hinfo, &dst, &race);
                if (dh == NULL) {
                        rcu_read_unlock_bh();
                        goto hotdrop;
+               } else if (race) {
+                       /* Already got an entry, update expiration timeout */
+                       dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire);
+                       rateinfo_recalc(dh, now, hinfo->cfg.mode);
+               } else {
+                       dh->expires = jiffies + msecs_to_jiffies(hinfo->cfg.expire);
+                       rateinfo_init(dh, hinfo);
                }
-               dh->expires = jiffies + msecs_to_jiffies(hinfo->cfg.expire);
-               rateinfo_init(dh, hinfo);
        } else {
                /* update expiration timeout */
                dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire);
@@ -856,6 +876,27 @@ static int __net_init hashlimit_proc_net_init(struct net *net)
 
 static void __net_exit hashlimit_proc_net_exit(struct net *net)
 {
+       struct xt_hashlimit_htable *hinfo;
+       struct hlist_node *pos;
+       struct proc_dir_entry *pde;
+       struct hashlimit_net *hashlimit_net = hashlimit_pernet(net);
+
+       /* recent_net_exit() is called before recent_mt_destroy(). Make sure
+        * that the parent xt_recent proc entry is is empty before trying to
+        * remove it.
+        */
+       mutex_lock(&hashlimit_mutex);
+       pde = hashlimit_net->ipt_hashlimit;
+       if (pde == NULL)
+               pde = hashlimit_net->ip6t_hashlimit;
+
+       hlist_for_each_entry(hinfo, pos, &hashlimit_net->htables, node)
+               remove_proc_entry(hinfo->pde->name, pde);
+
+       hashlimit_net->ipt_hashlimit = NULL;
+       hashlimit_net->ip6t_hashlimit = NULL;
+       mutex_unlock(&hashlimit_mutex);
+
        proc_net_remove(net, "ipt_hashlimit");
 #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
        proc_net_remove(net, "ip6t_hashlimit");
@@ -872,9 +913,6 @@ static int __net_init hashlimit_net_init(struct net *net)
 
 static void __net_exit hashlimit_net_exit(struct net *net)
 {
-       struct hashlimit_net *hashlimit_net = hashlimit_pernet(net);
-
-       BUG_ON(!hlist_empty(&hashlimit_net->htables));
        hashlimit_proc_net_exit(net);
 }
 
index 4635c9b0045981d862cb3b31a34ac9ab735eb85e..978efc9b555a3e1936cb5e49c0537055e3b642f9 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/skbuff.h>
 #include <linux/inet.h>
 #include <linux/slab.h>
+#include <linux/vmalloc.h>
 #include <net/net_namespace.h>
 #include <net/netns/generic.h>
 
@@ -310,6 +311,14 @@ out:
        return ret;
 }
 
+static void recent_table_free(void *addr)
+{
+       if (is_vmalloc_addr(addr))
+               vfree(addr);
+       else
+               kfree(addr);
+}
+
 static int recent_mt_check(const struct xt_mtchk_param *par,
                           const struct xt_recent_mtinfo_v1 *info)
 {
@@ -322,6 +331,7 @@ static int recent_mt_check(const struct xt_mtchk_param *par,
 #endif
        unsigned int i;
        int ret = -EINVAL;
+       size_t sz;
 
        if (unlikely(!hash_rnd_inited)) {
                get_random_bytes(&hash_rnd, sizeof(hash_rnd));
@@ -360,8 +370,11 @@ static int recent_mt_check(const struct xt_mtchk_param *par,
                goto out;
        }
 
-       t = kzalloc(sizeof(*t) + sizeof(t->iphash[0]) * ip_list_hash_size,
-                   GFP_KERNEL);
+       sz = sizeof(*t) + sizeof(t->iphash[0]) * ip_list_hash_size;
+       if (sz <= PAGE_SIZE)
+               t = kzalloc(sz, GFP_KERNEL);
+       else
+               t = vzalloc(sz);
        if (t == NULL) {
                ret = -ENOMEM;
                goto out;
@@ -377,14 +390,14 @@ static int recent_mt_check(const struct xt_mtchk_param *par,
        uid = make_kuid(&init_user_ns, ip_list_uid);
        gid = make_kgid(&init_user_ns, ip_list_gid);
        if (!uid_valid(uid) || !gid_valid(gid)) {
-               kfree(t);
+               recent_table_free(t);
                ret = -EINVAL;
                goto out;
        }
        pde = proc_create_data(t->name, ip_list_perms, recent_net->xt_recent,
                  &recent_mt_fops, t);
        if (pde == NULL) {
-               kfree(t);
+               recent_table_free(t);
                ret = -ENOMEM;
                goto out;
        }
@@ -431,10 +444,11 @@ static void recent_mt_destroy(const struct xt_mtdtor_param *par)
                list_del(&t->list);
                spin_unlock_bh(&recent_lock);
 #ifdef CONFIG_PROC_FS
-               remove_proc_entry(t->name, recent_net->xt_recent);
+               if (recent_net->xt_recent != NULL)
+                       remove_proc_entry(t->name, recent_net->xt_recent);
 #endif
                recent_table_flush(t);
-               kfree(t);
+               recent_table_free(t);
        }
        mutex_unlock(&recent_mutex);
 }
@@ -615,6 +629,20 @@ static int __net_init recent_proc_net_init(struct net *net)
 
 static void __net_exit recent_proc_net_exit(struct net *net)
 {
+       struct recent_net *recent_net = recent_pernet(net);
+       struct recent_table *t;
+
+       /* recent_net_exit() is called before recent_mt_destroy(). Make sure
+        * that the parent xt_recent proc entry is is empty before trying to
+        * remove it.
+        */
+       spin_lock_bh(&recent_lock);
+       list_for_each_entry(t, &recent_net->tables, list)
+               remove_proc_entry(t->name, recent_net->xt_recent);
+
+       recent_net->xt_recent = NULL;
+       spin_unlock_bh(&recent_lock);
+
        proc_net_remove(net, "xt_recent");
 }
 #else
@@ -638,9 +666,6 @@ static int __net_init recent_net_init(struct net *net)
 
 static void __net_exit recent_net_exit(struct net *net)
 {
-       struct recent_net *recent_net = recent_pernet(net);
-
-       BUG_ON(!list_empty(&recent_net->tables));
        recent_proc_net_exit(net);
 }
 
index c0353d55d56fc4221d72153c6f54849cb89f292b..74827e3b26a1b2da78e0029d250d2e20309ab895 100644 (file)
@@ -2185,7 +2185,6 @@ static struct pernet_operations __net_initdata netlink_net_ops = {
 
 static int __init netlink_proto_init(void)
 {
-       struct sk_buff *dummy_skb;
        int i;
        unsigned long limit;
        unsigned int order;
@@ -2194,7 +2193,7 @@ static int __init netlink_proto_init(void)
        if (err != 0)
                goto out;
 
-       BUILD_BUG_ON(sizeof(struct netlink_skb_parms) > sizeof(dummy_skb->cb));
+       BUILD_BUG_ON(sizeof(struct netlink_skb_parms) > FIELD_SIZEOF(struct sk_buff, cb));
 
        nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);
        if (!nl_table)
index f996db343247aab3b155a27df330252de35761db..d8c13a965459cd60af3a799621ecb4686aefe93b 100644 (file)
@@ -1989,10 +1989,9 @@ static struct pernet_operations ovs_net_ops = {
 
 static int __init dp_init(void)
 {
-       struct sk_buff *dummy_skb;
        int err;
 
-       BUILD_BUG_ON(sizeof(struct ovs_skb_cb) > sizeof(dummy_skb->cb));
+       BUILD_BUG_ON(sizeof(struct ovs_skb_cb) > FIELD_SIZEOF(struct sk_buff, cb));
 
        pr_info("Open vSwitch switching datapath\n");
 
index 05996d0dd828f57793441214831d88e0cf367b3e..5b0fd291babb9c1de343a0bfdd28b4054e392b4d 100644 (file)
@@ -10,6 +10,7 @@
  */
 
 #include <linux/module.h>
+#include <linux/kernel.h>
 #include <linux/net.h>
 #include <linux/slab.h>
 #include <linux/skbuff.h>
@@ -792,10 +793,9 @@ static const struct net_proto_family rxrpc_family_ops = {
  */
 static int __init af_rxrpc_init(void)
 {
-       struct sk_buff *dummy_skb;
        int ret = -1;
 
-       BUILD_BUG_ON(sizeof(struct rxrpc_skb_priv) > sizeof(dummy_skb->cb));
+       BUILD_BUG_ON(sizeof(struct rxrpc_skb_priv) > FIELD_SIZEOF(struct sk_buff, cb));
 
        rxrpc_epoch = htonl(get_seconds());
 
index 65d240cbf74b7513e7dc42effdc7f126bb4fff65..8579c4bb20c9daf093adf0b33b8bd13a94f5c6e0 100644 (file)
@@ -485,8 +485,9 @@ errout:
        return err;
 }
 
-struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est,
-                                   char *name, int ovr, int bind)
+struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla,
+                                   struct nlattr *est, char *name, int ovr,
+                                   int bind)
 {
        struct tc_action *a;
        struct tc_action_ops *a_o;
@@ -542,9 +543,9 @@ struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est,
 
        /* backward compatibility for policer */
        if (name == NULL)
-               err = a_o->init(tb[TCA_ACT_OPTIONS], est, a, ovr, bind);
+               err = a_o->init(net, tb[TCA_ACT_OPTIONS], est, a, ovr, bind);
        else
-               err = a_o->init(nla, est, a, ovr, bind);
+               err = a_o->init(net, nla, est, a, ovr, bind);
        if (err < 0)
                goto err_free;
 
@@ -566,8 +567,9 @@ err_out:
        return ERR_PTR(err);
 }
 
-struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est,
-                                 char *name, int ovr, int bind)
+struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla,
+                                 struct nlattr *est, char *name, int ovr,
+                                 int bind)
 {
        struct nlattr *tb[TCA_ACT_MAX_PRIO + 1];
        struct tc_action *head = NULL, *act, *act_prev = NULL;
@@ -579,7 +581,7 @@ struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est,
                return ERR_PTR(err);
 
        for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) {
-               act = tcf_action_init_1(tb[i], est, name, ovr, bind);
+               act = tcf_action_init_1(net, tb[i], est, name, ovr, bind);
                if (IS_ERR(act))
                        goto err;
                act->order = i;
@@ -960,7 +962,7 @@ tcf_action_add(struct net *net, struct nlattr *nla, struct nlmsghdr *n,
        struct tc_action *a;
        u32 seq = n->nlmsg_seq;
 
-       act = tcf_action_init(nla, NULL, NULL, ovr, 0);
+       act = tcf_action_init(net, nla, NULL, NULL, ovr, 0);
        if (act == NULL)
                goto done;
        if (IS_ERR(act)) {
index 2c8ad7c86e4340e246394e075e18fcffc26ca722..08fa1e8a4ca4a5a0d45e399103cd680622b870bd 100644 (file)
@@ -51,7 +51,7 @@ static const struct nla_policy csum_policy[TCA_CSUM_MAX + 1] = {
        [TCA_CSUM_PARMS] = { .len = sizeof(struct tc_csum), },
 };
 
-static int tcf_csum_init(struct nlattr *nla, struct nlattr *est,
+static int tcf_csum_init(struct net *n, struct nlattr *nla, struct nlattr *est,
                         struct tc_action *a, int ovr, int bind)
 {
        struct nlattr *tb[TCA_CSUM_MAX + 1];
index 05d60859d8e3d1c2eb700ff7d1d63d81d9f98894..fd2b3cff5fa28cf4da25690da9e7bad410c60a78 100644 (file)
@@ -58,8 +58,9 @@ static const struct nla_policy gact_policy[TCA_GACT_MAX + 1] = {
        [TCA_GACT_PROB]         = { .len = sizeof(struct tc_gact_p) },
 };
 
-static int tcf_gact_init(struct nlattr *nla, struct nlattr *est,
-                        struct tc_action *a, int ovr, int bind)
+static int tcf_gact_init(struct net *net, struct nlattr *nla,
+                        struct nlattr *est, struct tc_action *a,
+                        int ovr, int bind)
 {
        struct nlattr *tb[TCA_GACT_MAX + 1];
        struct tc_gact *parm;
index 58fb3c7aab9eea8a0e65851948dd3d81da4fe3b8..0fb9e3f567e62340ee5b3d707d34591e54e7c7f2 100644 (file)
@@ -102,7 +102,7 @@ static const struct nla_policy ipt_policy[TCA_IPT_MAX + 1] = {
        [TCA_IPT_TARG]  = { .len = sizeof(struct xt_entry_target) },
 };
 
-static int tcf_ipt_init(struct nlattr *nla, struct nlattr *est,
+static int tcf_ipt_init(struct net *net, struct nlattr *nla, struct nlattr *est,
                        struct tc_action *a, int ovr, int bind)
 {
        struct nlattr *tb[TCA_IPT_MAX + 1];
index 9c0fd0c788145c0b6fa877463022f5ec90a707e2..5d676edc22a66010ee93eea8b4663a45f60b4c75 100644 (file)
@@ -62,8 +62,9 @@ static const struct nla_policy mirred_policy[TCA_MIRRED_MAX + 1] = {
        [TCA_MIRRED_PARMS]      = { .len = sizeof(struct tc_mirred) },
 };
 
-static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est,
-                          struct tc_action *a, int ovr, int bind)
+static int tcf_mirred_init(struct net *net, struct nlattr *nla,
+                          struct nlattr *est, struct tc_action *a, int ovr,
+                          int bind)
 {
        struct nlattr *tb[TCA_MIRRED_MAX + 1];
        struct tc_mirred *parm;
@@ -88,7 +89,7 @@ static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est,
                return -EINVAL;
        }
        if (parm->ifindex) {
-               dev = __dev_get_by_index(&init_net, parm->ifindex);
+               dev = __dev_get_by_index(net, parm->ifindex);
                if (dev == NULL)
                        return -ENODEV;
                switch (dev->type) {
index b5d029eb44f23216cce377506b39e9bbf7997dc3..876f0ef29694a3f28260a221d0862d4fe3756f8d 100644 (file)
@@ -44,7 +44,7 @@ static const struct nla_policy nat_policy[TCA_NAT_MAX + 1] = {
        [TCA_NAT_PARMS] = { .len = sizeof(struct tc_nat) },
 };
 
-static int tcf_nat_init(struct nlattr *nla, struct nlattr *est,
+static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est,
                        struct tc_action *a, int ovr, int bind)
 {
        struct nlattr *tb[TCA_NAT_MAX + 1];
index 45c53ab067a63240357a970e15ab2633802211d6..0c3faddf3f2c75f1505f5c7c1862f24a4c769dfa 100644 (file)
@@ -38,8 +38,9 @@ static const struct nla_policy pedit_policy[TCA_PEDIT_MAX + 1] = {
        [TCA_PEDIT_PARMS]       = { .len = sizeof(struct tc_pedit) },
 };
 
-static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est,
-                         struct tc_action *a, int ovr, int bind)
+static int tcf_pedit_init(struct net *net, struct nlattr *nla,
+                         struct nlattr *est, struct tc_action *a,
+                         int ovr, int bind)
 {
        struct nlattr *tb[TCA_PEDIT_MAX + 1];
        struct tc_pedit *parm;
index a9de23297d47759f3fa50113b1bf190f51bf4063..8dbd695c160bc7c1e55c3d07a41d150b963dc032 100644 (file)
@@ -130,8 +130,9 @@ static const struct nla_policy police_policy[TCA_POLICE_MAX + 1] = {
        [TCA_POLICE_RESULT]     = { .type = NLA_U32 },
 };
 
-static int tcf_act_police_locate(struct nlattr *nla, struct nlattr *est,
-                                struct tc_action *a, int ovr, int bind)
+static int tcf_act_police_locate(struct net *net, struct nlattr *nla,
+                                struct nlattr *est, struct tc_action *a,
+                                int ovr, int bind)
 {
        unsigned int h;
        int ret = 0, err;
index 3714f60f0b3c5869725e449de8456ec9bd6b20fe..7725eb4ab756caa841eca2e0f4778880c310e5c4 100644 (file)
@@ -95,8 +95,9 @@ static const struct nla_policy simple_policy[TCA_DEF_MAX + 1] = {
        [TCA_DEF_DATA]  = { .type = NLA_STRING, .len = SIMP_MAX_DATA },
 };
 
-static int tcf_simp_init(struct nlattr *nla, struct nlattr *est,
-                        struct tc_action *a, int ovr, int bind)
+static int tcf_simp_init(struct net *net, struct nlattr *nla,
+                        struct nlattr *est, struct tc_action *a,
+                        int ovr, int bind)
 {
        struct nlattr *tb[TCA_DEF_MAX + 1];
        struct tc_defact *parm;
index 476e0fac6712292a133d5645f98ca889af52a8c4..cb4221171f93f0c5b8fbb98f41b11241aa17d02a 100644 (file)
@@ -67,8 +67,9 @@ static const struct nla_policy skbedit_policy[TCA_SKBEDIT_MAX + 1] = {
        [TCA_SKBEDIT_MARK]              = { .len = sizeof(u32) },
 };
 
-static int tcf_skbedit_init(struct nlattr *nla, struct nlattr *est,
-                        struct tc_action *a, int ovr, int bind)
+static int tcf_skbedit_init(struct net *net, struct nlattr *nla,
+                           struct nlattr *est, struct tc_action *a,
+                           int ovr, int bind)
 {
        struct nlattr *tb[TCA_SKBEDIT_MAX + 1];
        struct tc_skbedit *parm;
index ff55ed6c49b24115f4dc78b505da368a34e06b6b..964f5e4f4b8ac641f3f96b1b5a69d3c64aa70d48 100644 (file)
@@ -321,7 +321,7 @@ replay:
                }
        }
 
-       err = tp->ops->change(skb, tp, cl, t->tcm_handle, tca, &fh);
+       err = tp->ops->change(net, skb, tp, cl, t->tcm_handle, tca, &fh);
        if (err == 0) {
                if (tp_created) {
                        spin_lock_bh(root_lock);
@@ -508,7 +508,7 @@ void tcf_exts_destroy(struct tcf_proto *tp, struct tcf_exts *exts)
 }
 EXPORT_SYMBOL(tcf_exts_destroy);
 
-int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb,
+int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
                  struct nlattr *rate_tlv, struct tcf_exts *exts,
                  const struct tcf_ext_map *map)
 {
@@ -519,7 +519,7 @@ int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb,
                struct tc_action *act;
 
                if (map->police && tb[map->police]) {
-                       act = tcf_action_init_1(tb[map->police], rate_tlv,
+                       act = tcf_action_init_1(net, tb[map->police], rate_tlv,
                                                "police", TCA_ACT_NOREPLACE,
                                                TCA_ACT_BIND);
                        if (IS_ERR(act))
@@ -528,8 +528,9 @@ int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb,
                        act->type = TCA_OLD_COMPAT;
                        exts->action = act;
                } else if (map->action && tb[map->action]) {
-                       act = tcf_action_init(tb[map->action], rate_tlv, NULL,
-                                             TCA_ACT_NOREPLACE, TCA_ACT_BIND);
+                       act = tcf_action_init(net, tb[map->action], rate_tlv,
+                                             NULL, TCA_ACT_NOREPLACE,
+                                             TCA_ACT_BIND);
                        if (IS_ERR(act))
                                return PTR_ERR(act);
 
index 344a11b342e5ad333430ba68605bec6ce5f27f5c..d76a35d0dc85b82ddd9b8f2cc037b1ff0d31f5d5 100644 (file)
@@ -132,15 +132,16 @@ static const struct nla_policy basic_policy[TCA_BASIC_MAX + 1] = {
        [TCA_BASIC_EMATCHES]    = { .type = NLA_NESTED },
 };
 
-static int basic_set_parms(struct tcf_proto *tp, struct basic_filter *f,
-                          unsigned long base, struct nlattr **tb,
+static int basic_set_parms(struct net *net, struct tcf_proto *tp,
+                          struct basic_filter *f, unsigned long base,
+                          struct nlattr **tb,
                           struct nlattr *est)
 {
        int err = -EINVAL;
        struct tcf_exts e;
        struct tcf_ematch_tree t;
 
-       err = tcf_exts_validate(tp, tb, est, &e, &basic_ext_map);
+       err = tcf_exts_validate(net, tp, tb, est, &e, &basic_ext_map);
        if (err < 0)
                return err;
 
@@ -162,7 +163,7 @@ errout:
        return err;
 }
 
-static int basic_change(struct sk_buff *in_skb,
+static int basic_change(struct net *net, struct sk_buff *in_skb,
                        struct tcf_proto *tp, unsigned long base, u32 handle,
                        struct nlattr **tca, unsigned long *arg)
 {
@@ -182,7 +183,7 @@ static int basic_change(struct sk_buff *in_skb,
        if (f != NULL) {
                if (handle && f->handle != handle)
                        return -EINVAL;
-               return basic_set_parms(tp, f, base, tb, tca[TCA_RATE]);
+               return basic_set_parms(net, tp, f, base, tb, tca[TCA_RATE]);
        }
 
        err = -ENOBUFS;
@@ -208,7 +209,7 @@ static int basic_change(struct sk_buff *in_skb,
                f->handle = head->hgenerator;
        }
 
-       err = basic_set_parms(tp, f, base, tb, tca[TCA_RATE]);
+       err = basic_set_parms(net, tp, f, base, tb, tca[TCA_RATE]);
        if (err < 0)
                goto errout;
 
index 6db7855b9029ee26dcd97d73c43862a93c35b6c4..3a294eb98d6178733edc49c98da4069ccf643a39 100644 (file)
@@ -178,7 +178,7 @@ static const struct nla_policy cgroup_policy[TCA_CGROUP_MAX + 1] = {
        [TCA_CGROUP_EMATCHES]   = { .type = NLA_NESTED },
 };
 
-static int cls_cgroup_change(struct sk_buff *in_skb,
+static int cls_cgroup_change(struct net *net, struct sk_buff *in_skb,
                             struct tcf_proto *tp, unsigned long base,
                             u32 handle, struct nlattr **tca,
                             unsigned long *arg)
@@ -215,7 +215,8 @@ static int cls_cgroup_change(struct sk_buff *in_skb,
        if (err < 0)
                return err;
 
-       err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &cgroup_ext_map);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e,
+                               &cgroup_ext_map);
        if (err < 0)
                return err;
 
index ce82d0cb1b4762e8ffcc58d8e46beacd86e31db0..aa36a8c8b33bf27e286443f23ba27393e7156cda 100644 (file)
@@ -351,7 +351,7 @@ static const struct nla_policy flow_policy[TCA_FLOW_MAX + 1] = {
        [TCA_FLOW_PERTURB]      = { .type = NLA_U32 },
 };
 
-static int flow_change(struct sk_buff *in_skb, 
+static int flow_change(struct net *net, struct sk_buff *in_skb,
                       struct tcf_proto *tp, unsigned long base,
                       u32 handle, struct nlattr **tca,
                       unsigned long *arg)
@@ -397,7 +397,7 @@ static int flow_change(struct sk_buff *in_skb,
                        return -EOPNOTSUPP;
        }
 
-       err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &flow_ext_map);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &flow_ext_map);
        if (err < 0)
                return err;
 
index 4075a0aef2aa2e83fdf167c056e216c3abfc6204..1135d8227f9bf1811a2c45c211b80e6b9a69706f 100644 (file)
@@ -192,7 +192,7 @@ static const struct nla_policy fw_policy[TCA_FW_MAX + 1] = {
 };
 
 static int
-fw_change_attrs(struct tcf_proto *tp, struct fw_filter *f,
+fw_change_attrs(struct net *net, struct tcf_proto *tp, struct fw_filter *f,
        struct nlattr **tb, struct nlattr **tca, unsigned long base)
 {
        struct fw_head *head = (struct fw_head *)tp->root;
@@ -200,7 +200,7 @@ fw_change_attrs(struct tcf_proto *tp, struct fw_filter *f,
        u32 mask;
        int err;
 
-       err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &fw_ext_map);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &fw_ext_map);
        if (err < 0)
                return err;
 
@@ -233,7 +233,7 @@ errout:
        return err;
 }
 
-static int fw_change(struct sk_buff *in_skb,
+static int fw_change(struct net *net, struct sk_buff *in_skb,
                     struct tcf_proto *tp, unsigned long base,
                     u32 handle,
                     struct nlattr **tca,
@@ -255,7 +255,7 @@ static int fw_change(struct sk_buff *in_skb,
        if (f != NULL) {
                if (f->id != handle && handle)
                        return -EINVAL;
-               return fw_change_attrs(tp, f, tb, tca, base);
+               return fw_change_attrs(net, tp, f, tb, tca, base);
        }
 
        if (!handle)
@@ -282,7 +282,7 @@ static int fw_change(struct sk_buff *in_skb,
 
        f->id = handle;
 
-       err = fw_change_attrs(tp, f, tb, tca, base);
+       err = fw_change_attrs(net, tp, f, tb, tca, base);
        if (err < 0)
                goto errout;
 
index c10d57bf98f2aa036434633db10a03fa530688da..37da567d833eff8368a3f881e2741e772f19c052 100644 (file)
@@ -335,9 +335,10 @@ static const struct nla_policy route4_policy[TCA_ROUTE4_MAX + 1] = {
        [TCA_ROUTE4_IIF]        = { .type = NLA_U32 },
 };
 
-static int route4_set_parms(struct tcf_proto *tp, unsigned long base,
-       struct route4_filter *f, u32 handle, struct route4_head *head,
-       struct nlattr **tb, struct nlattr *est, int new)
+static int route4_set_parms(struct net *net, struct tcf_proto *tp,
+                           unsigned long base, struct route4_filter *f,
+                           u32 handle, struct route4_head *head,
+                           struct nlattr **tb, struct nlattr *est, int new)
 {
        int err;
        u32 id = 0, to = 0, nhandle = 0x8000;
@@ -346,7 +347,7 @@ static int route4_set_parms(struct tcf_proto *tp, unsigned long base,
        struct route4_bucket *b;
        struct tcf_exts e;
 
-       err = tcf_exts_validate(tp, tb, est, &e, &route_ext_map);
+       err = tcf_exts_validate(net, tp, tb, est, &e, &route_ext_map);
        if (err < 0)
                return err;
 
@@ -427,7 +428,7 @@ errout:
        return err;
 }
 
-static int route4_change(struct sk_buff *in_skb,
+static int route4_change(struct net *net, struct sk_buff *in_skb,
                       struct tcf_proto *tp, unsigned long base,
                       u32 handle,
                       struct nlattr **tca,
@@ -457,7 +458,7 @@ static int route4_change(struct sk_buff *in_skb,
                if (f->bkt)
                        old_handle = f->handle;
 
-               err = route4_set_parms(tp, base, f, handle, head, tb,
+               err = route4_set_parms(net, tp, base, f, handle, head, tb,
                        tca[TCA_RATE], 0);
                if (err < 0)
                        return err;
@@ -480,7 +481,7 @@ static int route4_change(struct sk_buff *in_skb,
        if (f == NULL)
                goto errout;
 
-       err = route4_set_parms(tp, base, f, handle, head, tb,
+       err = route4_set_parms(net, tp, base, f, handle, head, tb,
                tca[TCA_RATE], 1);
        if (err < 0)
                goto errout;
index 494bbb90924a36445d73ef5c921112b685722128..252d8b05872e511f029eab85d2e498ca4eb6d18a 100644 (file)
@@ -416,7 +416,7 @@ static const struct nla_policy rsvp_policy[TCA_RSVP_MAX + 1] = {
        [TCA_RSVP_PINFO]        = { .len = sizeof(struct tc_rsvp_pinfo) },
 };
 
-static int rsvp_change(struct sk_buff *in_skb,
+static int rsvp_change(struct net *net, struct sk_buff *in_skb,
                       struct tcf_proto *tp, unsigned long base,
                       u32 handle,
                       struct nlattr **tca,
@@ -440,7 +440,7 @@ static int rsvp_change(struct sk_buff *in_skb,
        if (err < 0)
                return err;
 
-       err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &rsvp_ext_map);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &rsvp_ext_map);
        if (err < 0)
                return err;
 
index a1293b4ab7a13a38ae2653bc91bf48527cfdee7a..b86535a401695259ab9a765573180c33eb72fe00 100644 (file)
@@ -197,9 +197,10 @@ static const struct nla_policy tcindex_policy[TCA_TCINDEX_MAX + 1] = {
 };
 
 static int
-tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
-                 struct tcindex_data *p, struct tcindex_filter_result *r,
-                 struct nlattr **tb, struct nlattr *est)
+tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
+                 u32 handle, struct tcindex_data *p,
+                 struct tcindex_filter_result *r, struct nlattr **tb,
+                struct nlattr *est)
 {
        int err, balloc = 0;
        struct tcindex_filter_result new_filter_result, *old_r = r;
@@ -208,7 +209,7 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
        struct tcindex_filter *f = NULL; /* make gcc behave */
        struct tcf_exts e;
 
-       err = tcf_exts_validate(tp, tb, est, &e, &tcindex_ext_map);
+       err = tcf_exts_validate(net, tp, tb, est, &e, &tcindex_ext_map);
        if (err < 0)
                return err;
 
@@ -332,7 +333,7 @@ errout:
 }
 
 static int
-tcindex_change(struct sk_buff *in_skb,
+tcindex_change(struct net *net, struct sk_buff *in_skb,
               struct tcf_proto *tp, unsigned long base, u32 handle,
               struct nlattr **tca, unsigned long *arg)
 {
@@ -353,7 +354,8 @@ tcindex_change(struct sk_buff *in_skb,
        if (err < 0)
                return err;
 
-       return tcindex_set_parms(tp, base, handle, p, r, tb, tca[TCA_RATE]);
+       return tcindex_set_parms(net, tp, base, handle, p, r, tb,
+                                tca[TCA_RATE]);
 }
 
 
index c7c27bc91b5af300e74fe8434f7fcedb30635df6..eb07a1e536e6cb6f0b1f44099f130119490e9f52 100644 (file)
@@ -488,15 +488,15 @@ static const struct nla_policy u32_policy[TCA_U32_MAX + 1] = {
        [TCA_U32_MARK]          = { .len = sizeof(struct tc_u32_mark) },
 };
 
-static int u32_set_parms(struct tcf_proto *tp, unsigned long base,
-                        struct tc_u_hnode *ht,
+static int u32_set_parms(struct net *net, struct tcf_proto *tp,
+                        unsigned long base, struct tc_u_hnode *ht,
                         struct tc_u_knode *n, struct nlattr **tb,
                         struct nlattr *est)
 {
        int err;
        struct tcf_exts e;
 
-       err = tcf_exts_validate(tp, tb, est, &e, &u32_ext_map);
+       err = tcf_exts_validate(net, tp, tb, est, &e, &u32_ext_map);
        if (err < 0)
                return err;
 
@@ -544,7 +544,7 @@ errout:
        return err;
 }
 
-static int u32_change(struct sk_buff *in_skb,
+static int u32_change(struct net *net, struct sk_buff *in_skb,
                      struct tcf_proto *tp, unsigned long base, u32 handle,
                      struct nlattr **tca,
                      unsigned long *arg)
@@ -570,7 +570,8 @@ static int u32_change(struct sk_buff *in_skb,
                if (TC_U32_KEY(n->handle) == 0)
                        return -EINVAL;
 
-               return u32_set_parms(tp, base, n->ht_up, n, tb, tca[TCA_RATE]);
+               return u32_set_parms(net, tp, base, n->ht_up, n, tb,
+                                    tca[TCA_RATE]);
        }
 
        if (tb[TCA_U32_DIVISOR]) {
@@ -656,7 +657,7 @@ static int u32_change(struct sk_buff *in_skb,
        }
 #endif
 
-       err = u32_set_parms(tp, base, ht, n, tb, tca[TCA_RATE]);
+       err = u32_set_parms(net, tp, base, ht, n, tb, tca[TCA_RATE]);
        if (err == 0) {
                struct tc_u_knode **ins;
                for (ins = &ht->ht[TC_U32_HASH(handle)]; *ins; ins = &(*ins)->next)
index c26210618e14cadca832f933a886a1250f0490db..7521d944c0fb1c57de545938320c3b7ce4439a3e 100644 (file)
@@ -68,7 +68,7 @@ config SCTP_DBG_OBJCNT
          If unsure, say N
 choice
        prompt "Default SCTP cookie HMAC encoding"
-       default SCTP_COOKIE_HMAC_MD5
+       default SCTP_DEFAULT_COOKIE_HMAC_MD5
        help
          This option sets the default sctp cookie hmac algorithm
          when in doubt select 'md5'
index 822f020fa7f458e07a8e216e6609447daefb8747..507b5e84fbdb26f88fab789e37f65a976ef6f198 100644 (file)
@@ -555,7 +555,7 @@ EXPORT_SYMBOL_GPL(rpc_clone_client);
  * rpc_clone_client_set_auth - Clone an RPC client structure and set its auth
  *
  * @clnt: RPC client whose parameters are copied
- * @auth: security flavor for new client
+ * @flavor: security flavor for new client
  *
  * Returns a fresh RPC client or an ERR_PTR.
  */
@@ -610,11 +610,6 @@ EXPORT_SYMBOL_GPL(rpc_killall_tasks);
  */
 void rpc_shutdown_client(struct rpc_clnt *clnt)
 {
-       /*
-        * To avoid deadlock, never call rpc_shutdown_client from a
-        * workqueue context!
-        */
-       WARN_ON_ONCE(current->flags & PF_WQ_WORKER);
        might_sleep();
 
        dprintk_rcu("RPC:       shutting down %s client for %s\n",
index d17a704aaf5f2251674b3fa23421fa087b8ddd14..bfa31714581f52e27f51c312aa0288a9cb4fd411 100644 (file)
@@ -934,16 +934,35 @@ struct rpc_task *rpc_new_task(const struct rpc_task_setup *setup_data)
        return task;
 }
 
+/*
+ * rpc_free_task - release rpc task and perform cleanups
+ *
+ * Note that we free up the rpc_task _after_ rpc_release_calldata()
+ * in order to work around a workqueue dependency issue.
+ *
+ * Tejun Heo states:
+ * "Workqueue currently considers two work items to be the same if they're
+ * on the same address and won't execute them concurrently - ie. it
+ * makes a work item which is queued again while being executed wait
+ * for the previous execution to complete.
+ *
+ * If a work function frees the work item, and then waits for an event
+ * which should be performed by another work item and *that* work item
+ * recycles the freed work item, it can create a false dependency loop.
+ * There really is no reliable way to detect this short of verifying
+ * every memory free."
+ *
+ */
 static void rpc_free_task(struct rpc_task *task)
 {
-       const struct rpc_call_ops *tk_ops = task->tk_ops;
-       void *calldata = task->tk_calldata;
+       unsigned short tk_flags = task->tk_flags;
+
+       rpc_release_calldata(task->tk_ops, task->tk_calldata);
 
-       if (task->tk_flags & RPC_TASK_DYNAMIC) {
+       if (tk_flags & RPC_TASK_DYNAMIC) {
                dprintk("RPC: %5u freeing task\n", task->tk_pid);
                mempool_free(task, rpc_task_mempool);
        }
-       rpc_release_calldata(tk_ops, calldata);
 }
 
 static void rpc_async_release(struct work_struct *work)
@@ -953,8 +972,7 @@ static void rpc_async_release(struct work_struct *work)
 
 static void rpc_release_resources_task(struct rpc_task *task)
 {
-       if (task->tk_rqstp)
-               xprt_release(task);
+       xprt_release(task);
        if (task->tk_msg.rpc_cred) {
                put_rpccred(task->tk_msg.rpc_cred);
                task->tk_msg.rpc_cred = NULL;
index bd462a532acfa695906887db429896ae569eac26..33811db8788a2e74e5781a0c20bdbceb829b5018 100644 (file)
@@ -1136,10 +1136,18 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)
 void xprt_release(struct rpc_task *task)
 {
        struct rpc_xprt *xprt;
-       struct rpc_rqst *req;
+       struct rpc_rqst *req = task->tk_rqstp;
 
-       if (!(req = task->tk_rqstp))
+       if (req == NULL) {
+               if (task->tk_client) {
+                       rcu_read_lock();
+                       xprt = rcu_dereference(task->tk_client->cl_xprt);
+                       if (xprt->snd_task == task)
+                               xprt_release_write(xprt, task);
+                       rcu_read_unlock();
+               }
                return;
+       }
 
        xprt = req->rq_xprt;
        if (task->tk_ops->rpc_count_stats != NULL)
index 5b5c876c80e9b543bd7b773c1a1f45f83f696e7b..0c612361c1534fa3edaaa0961873f2351371ee5e 100644 (file)
@@ -2426,9 +2426,8 @@ static struct pernet_operations unix_net_ops = {
 static int __init af_unix_init(void)
 {
        int rc = -1;
-       struct sk_buff *dummy_skb;
 
-       BUILD_BUG_ON(sizeof(struct unix_skb_parms) > sizeof(dummy_skb->cb));
+       BUILD_BUG_ON(sizeof(struct unix_skb_parms) > FIELD_SIZEOF(struct sk_buff, cb));
 
        rc = proto_register(&unix_proto, 1);
        if (rc != 0) {
index 14d990400354200056e99d14132d6e7ab2504ccb..b677eab55b68465494bffae68a2c38c2321f18ca 100644 (file)
@@ -866,8 +866,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
                /* allow mac80211 to determine the timeout */
                wdev->ps_timeout = -1;
 
-               if (!dev->ethtool_ops)
-                       dev->ethtool_ops = &cfg80211_ethtool_ops;
+               netdev_set_default_ethtool_ops(dev, &cfg80211_ethtool_ops);
 
                if ((wdev->iftype == NL80211_IFTYPE_STATION ||
                     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
index 23ea9f2ae11dab8040d70884adff6c35d318ca16..59b13440813d59da2f4fd7869e960da29739c3b9 100644 (file)
@@ -64,7 +64,7 @@ static int rpmsg_sample_probe(struct rpmsg_channel *rpdev)
        return 0;
 }
 
-static void __devexit rpmsg_sample_remove(struct rpmsg_channel *rpdev)
+static void rpmsg_sample_remove(struct rpmsg_channel *rpdev)
 {
        dev_info(&rpdev->dev, "rpmsg sample client driver is removed\n");
 }
@@ -81,7 +81,7 @@ static struct rpmsg_driver rpmsg_sample_client = {
        .id_table       = rpmsg_driver_sample_id_table,
        .probe          = rpmsg_sample_probe,
        .callback       = rpmsg_sample_cb,
-       .remove         = __devexit_p(rpmsg_sample_remove),
+       .remove         = rpmsg_sample_remove,
 };
 
 static int __init rpmsg_client_sample_init(void)
index 6c353ae8a4517b1e7ab4b2b4fa28012e96de9921..581ca99c96f29829507c6b43fdd278781fc3b2a9 100644 (file)
@@ -42,9 +42,9 @@ foreach my $filename (@files) {
                $line =~ s/(^|\s)(inline)\b/$1__$2__/g;
                $line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g;
                $line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g;
-               $line =~ s/#ifndef _UAPI/#ifndef /;
-               $line =~ s/#define _UAPI/#define /;
-               $line =~ s!#endif /[*] _UAPI!#endif /* !;
+               $line =~ s/#ifndef\s+_UAPI/#ifndef /;
+               $line =~ s/#define\s+_UAPI/#define /;
+               $line =~ s!#endif\s+/[*]\s*_UAPI!#endif /* !;
                printf {$out} "%s", $line;
        }
        close $out;
index 28b7615678154180c16d950252dea460c2e8e29e..f565536a2bef17a8f6b88193d0b2db01e12dd716 100755 (executable)
@@ -2079,7 +2079,6 @@ sub dump_function($$) {
     $prototype =~ s/^__inline +//;
     $prototype =~ s/^__always_inline +//;
     $prototype =~ s/^noinline +//;
-    $prototype =~ s/__devinit +//;
     $prototype =~ s/__init +//;
     $prototype =~ s/__init_or_module +//;
     $prototype =~ s/__must_check +//;
index 0fe5a026aef8d22ac83619dd0bbc2ba50965b63e..579775088967fdb11a044beb75c70de48d572ad6 100644 (file)
@@ -709,16 +709,31 @@ static void cap_req_classify_flow(const struct request_sock *req,
 {
 }
 
+static int cap_tun_dev_alloc_security(void **security)
+{
+       return 0;
+}
+
+static void cap_tun_dev_free_security(void *security)
+{
+}
+
 static int cap_tun_dev_create(void)
 {
        return 0;
 }
 
-static void cap_tun_dev_post_create(struct sock *sk)
+static int cap_tun_dev_attach_queue(void *security)
+{
+       return 0;
+}
+
+static int cap_tun_dev_attach(struct sock *sk, void *security)
 {
+       return 0;
 }
 
-static int cap_tun_dev_attach(struct sock *sk)
+static int cap_tun_dev_open(void *security)
 {
        return 0;
 }
@@ -1050,8 +1065,11 @@ void __init security_fixup_ops(struct security_operations *ops)
        set_to_cap_if_null(ops, secmark_refcount_inc);
        set_to_cap_if_null(ops, secmark_refcount_dec);
        set_to_cap_if_null(ops, req_classify_flow);
+       set_to_cap_if_null(ops, tun_dev_alloc_security);
+       set_to_cap_if_null(ops, tun_dev_free_security);
        set_to_cap_if_null(ops, tun_dev_create);
-       set_to_cap_if_null(ops, tun_dev_post_create);
+       set_to_cap_if_null(ops, tun_dev_open);
+       set_to_cap_if_null(ops, tun_dev_attach_queue);
        set_to_cap_if_null(ops, tun_dev_attach);
 #endif /* CONFIG_SECURITY_NETWORK */
 #ifdef CONFIG_SECURITY_NETWORK_XFRM
index 3b2adb794f15506311a52b2ec5442297907ee8e2..079a85dc37b2ba9fd7d649a1a0da0e2843a9252c 100644 (file)
@@ -139,6 +139,7 @@ void ima_delete_rules(void);
 /* Appraise integrity measurements */
 #define IMA_APPRAISE_ENFORCE   0x01
 #define IMA_APPRAISE_FIX       0x02
+#define IMA_APPRAISE_MODULES   0x04
 
 #ifdef CONFIG_IMA_APPRAISE
 int ima_appraise_measurement(struct integrity_iint_cache *iint,
index 45de18e9a6f224aac3b90512fb1e4b6453b795be..dba965de90d3f838c82e1a93202bf585fa1e5cd6 100644 (file)
@@ -291,11 +291,15 @@ EXPORT_SYMBOL_GPL(ima_file_check);
  */
 int ima_module_check(struct file *file)
 {
-       int rc;
+       int rc = 0;
 
-       if (!file)
-               rc = INTEGRITY_UNKNOWN;
-       else
+       if (!file) {
+               if (ima_appraise & IMA_APPRAISE_MODULES) {
+#ifndef CONFIG_MODULE_SIG_FORCE
+                       rc = -EACCES;   /* INTEGRITY_UNKNOWN */
+#endif
+               }
+       } else
                rc = process_measurement(file, file->f_dentry->d_name.name,
                                         MAY_EXEC, MODULE_CHECK);
        return (ima_appraise & IMA_APPRAISE_ENFORCE) ? rc : 0;
index af7d182d5a46123ca9308cf2e231f006aa71215d..479fca940bb5552df6591723f09408c3325054f0 100644 (file)
@@ -523,7 +523,8 @@ static int ima_parse_rule(char *rule, struct ima_rule_entry *entry)
        }
        if (!result && (entry->action == UNKNOWN))
                result = -EINVAL;
-
+       else if (entry->func == MODULE_CHECK)
+               ima_appraise |= IMA_APPRAISE_MODULES;
        audit_log_format(ab, "res=%d", !result);
        audit_log_end(ab);
        return result;
index daa97f4ac9d13515909028bf1ffa6903d8aed0c7..7b88c6aeaed43e5f37b449fd8ec87610b3b69a93 100644 (file)
@@ -1254,24 +1254,42 @@ void security_secmark_refcount_dec(void)
 }
 EXPORT_SYMBOL(security_secmark_refcount_dec);
 
+int security_tun_dev_alloc_security(void **security)
+{
+       return security_ops->tun_dev_alloc_security(security);
+}
+EXPORT_SYMBOL(security_tun_dev_alloc_security);
+
+void security_tun_dev_free_security(void *security)
+{
+       security_ops->tun_dev_free_security(security);
+}
+EXPORT_SYMBOL(security_tun_dev_free_security);
+
 int security_tun_dev_create(void)
 {
        return security_ops->tun_dev_create();
 }
 EXPORT_SYMBOL(security_tun_dev_create);
 
-void security_tun_dev_post_create(struct sock *sk)
+int security_tun_dev_attach_queue(void *security)
 {
-       return security_ops->tun_dev_post_create(sk);
+       return security_ops->tun_dev_attach_queue(security);
 }
-EXPORT_SYMBOL(security_tun_dev_post_create);
+EXPORT_SYMBOL(security_tun_dev_attach_queue);
 
-int security_tun_dev_attach(struct sock *sk)
+int security_tun_dev_attach(struct sock *sk, void *security)
 {
-       return security_ops->tun_dev_attach(sk);
+       return security_ops->tun_dev_attach(sk, security);
 }
 EXPORT_SYMBOL(security_tun_dev_attach);
 
+int security_tun_dev_open(void *security)
+{
+       return security_ops->tun_dev_open(security);
+}
+EXPORT_SYMBOL(security_tun_dev_open);
+
 #endif /* CONFIG_SECURITY_NETWORK */
 
 #ifdef CONFIG_SECURITY_NETWORK_XFRM
index 61a53367d0292600fbb2d11da95c21118164fca4..ef26e9611ffbab91ad50faefa81a56a425cefb93 100644 (file)
@@ -4399,6 +4399,24 @@ static void selinux_req_classify_flow(const struct request_sock *req,
        fl->flowi_secid = req->secid;
 }
 
+static int selinux_tun_dev_alloc_security(void **security)
+{
+       struct tun_security_struct *tunsec;
+
+       tunsec = kzalloc(sizeof(*tunsec), GFP_KERNEL);
+       if (!tunsec)
+               return -ENOMEM;
+       tunsec->sid = current_sid();
+
+       *security = tunsec;
+       return 0;
+}
+
+static void selinux_tun_dev_free_security(void *security)
+{
+       kfree(security);
+}
+
 static int selinux_tun_dev_create(void)
 {
        u32 sid = current_sid();
@@ -4414,8 +4432,17 @@ static int selinux_tun_dev_create(void)
                            NULL);
 }
 
-static void selinux_tun_dev_post_create(struct sock *sk)
+static int selinux_tun_dev_attach_queue(void *security)
 {
+       struct tun_security_struct *tunsec = security;
+
+       return avc_has_perm(current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET,
+                           TUN_SOCKET__ATTACH_QUEUE, NULL);
+}
+
+static int selinux_tun_dev_attach(struct sock *sk, void *security)
+{
+       struct tun_security_struct *tunsec = security;
        struct sk_security_struct *sksec = sk->sk_security;
 
        /* we don't currently perform any NetLabel based labeling here and it
@@ -4425,20 +4452,19 @@ static void selinux_tun_dev_post_create(struct sock *sk)
         * cause confusion to the TUN user that had no idea network labeling
         * protocols were being used */
 
-       /* see the comments in selinux_tun_dev_create() about why we don't use
-        * the sockcreate SID here */
-
-       sksec->sid = current_sid();
+       sksec->sid = tunsec->sid;
        sksec->sclass = SECCLASS_TUN_SOCKET;
+
+       return 0;
 }
 
-static int selinux_tun_dev_attach(struct sock *sk)
+static int selinux_tun_dev_open(void *security)
 {
-       struct sk_security_struct *sksec = sk->sk_security;
+       struct tun_security_struct *tunsec = security;
        u32 sid = current_sid();
        int err;
 
-       err = avc_has_perm(sid, sksec->sid, SECCLASS_TUN_SOCKET,
+       err = avc_has_perm(sid, tunsec->sid, SECCLASS_TUN_SOCKET,
                           TUN_SOCKET__RELABELFROM, NULL);
        if (err)
                return err;
@@ -4446,8 +4472,7 @@ static int selinux_tun_dev_attach(struct sock *sk)
                           TUN_SOCKET__RELABELTO, NULL);
        if (err)
                return err;
-
-       sksec->sid = sid;
+       tunsec->sid = sid;
 
        return 0;
 }
@@ -5642,9 +5667,12 @@ static struct security_operations selinux_ops = {
        .secmark_refcount_inc =         selinux_secmark_refcount_inc,
        .secmark_refcount_dec =         selinux_secmark_refcount_dec,
        .req_classify_flow =            selinux_req_classify_flow,
+       .tun_dev_alloc_security =       selinux_tun_dev_alloc_security,
+       .tun_dev_free_security =        selinux_tun_dev_free_security,
        .tun_dev_create =               selinux_tun_dev_create,
-       .tun_dev_post_create =          selinux_tun_dev_post_create,
+       .tun_dev_attach_queue =         selinux_tun_dev_attach_queue,
        .tun_dev_attach =               selinux_tun_dev_attach,
+       .tun_dev_open =                 selinux_tun_dev_open,
 
 #ifdef CONFIG_SECURITY_NETWORK_XFRM
        .xfrm_policy_alloc_security =   selinux_xfrm_policy_alloc,
index df2de54a958debfab56caf3483cd5d93856e5be4..14d04e63b1f0e09ef15b4cf64057bd7cc861ed1d 100644 (file)
@@ -150,6 +150,6 @@ struct security_class_mapping secclass_map[] = {
            NULL } },
        { "kernel_service", { "use_as_override", "create_files_as", NULL } },
        { "tun_socket",
-         { COMMON_SOCK_PERMS, NULL } },
+         { COMMON_SOCK_PERMS, "attach_queue", NULL } },
        { NULL }
   };
index 26c7eee1c309b0a2f45a23c8b70d2157841c1670..aa47bcabb5f65e728aadbaa39cdecfa55d20aa16 100644 (file)
@@ -110,6 +110,10 @@ struct sk_security_struct {
        u16 sclass;                     /* sock security class */
 };
 
+struct tun_security_struct {
+       u32 sid;                        /* SID for the tun device sockets */
+};
+
 struct key_security_struct {
        u32 sid;        /* SID of key */
 };
index 6fc0ae90e5b1de99992b288d35035e2a0d061df2..fff7753e35c15ba6f82612594fbda19e7203b66e 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/io.h>
+#include <linux/gpio.h>
 
 #include <sound/ac97_codec.h>
 #include <sound/pxa2xx-lib.h>
@@ -148,6 +149,8 @@ static inline void pxa_ac97_warm_pxa27x(void)
 
 static inline void pxa_ac97_cold_pxa27x(void)
 {
+       unsigned int timeout;
+
        GCR &=  GCR_COLD_RST;  /* clear everything but nCRST */
        GCR &= ~GCR_COLD_RST;  /* then assert nCRST */
 
@@ -157,8 +160,10 @@ static inline void pxa_ac97_cold_pxa27x(void)
        clk_enable(ac97conf_clk);
        udelay(5);
        clk_disable(ac97conf_clk);
-       GCR = GCR_COLD_RST;
-       udelay(50);
+       GCR = GCR_COLD_RST | GCR_WARM_RST;
+       timeout = 100;     /* wait for the codec-ready bit to be set */
+       while (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)) && timeout--)
+               mdelay(1);
 }
 #endif
 
@@ -340,8 +345,21 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
        }
 
        if (cpu_is_pxa27x()) {
-               /* Use GPIO 113 as AC97 Reset on Bulverde */
+               /*
+                * This gpio is needed for a work-around to a bug in the ac97
+                * controller during warm reset.  The direction and level is set
+                * here so that it is an output driven high when switching from
+                * AC97_nRESET alt function to generic gpio.
+                */
+               ret = gpio_request_one(reset_gpio, GPIOF_OUT_INIT_HIGH,
+                                      "pxa27x ac97 reset");
+               if (ret < 0) {
+                       pr_err("%s: gpio_request_one() failed: %d\n",
+                              __func__, ret);
+                       goto err_conf;
+               }
                pxa27x_assert_ac97reset(reset_gpio, 0);
+
                ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK");
                if (IS_ERR(ac97conf_clk)) {
                        ret = PTR_ERR(ac97conf_clk);
@@ -384,6 +402,8 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_hw_probe);
 
 void pxa2xx_ac97_hw_remove(struct platform_device *dev)
 {
+       if (cpu_is_pxa27x())
+               gpio_free(reset_gpio);
        GCR |= GCR_ACLINK_OFF;
        free_irq(IRQ_AC97, NULL);
        if (ac97conf_clk) {
index dabf8a871dcc26b75166712e3ee109136f7babd6..7004e24d209f167c196e231ffc1f883033eb8d54 100644 (file)
@@ -333,6 +333,11 @@ static void __init attach_pas_card(struct address_info *hw_config)
                {
                        char            temp[100];
 
+                       if (pas_model < 0 ||
+                           pas_model >= ARRAY_SIZE(pas_model_names)) {
+                               printk(KERN_ERR "pas2 unrecognized model.\n");
+                               return;
+                       }
                        sprintf(temp,
                            "%s rev %d", pas_model_names[(int) pas_model],
                                    pas_read(0x2789));
index 2805e34bd41d715a44c3ba645165a71295260095..8bef47311e45025aeeb6552054c50dd520a8ad9d 100644 (file)
@@ -58,7 +58,7 @@ static void vortex_wt_setdsout(vortex_t * vortex, u32 wt, int en)
        if (en)
                temp |= (1 << (wt & 0x1f));
        else
-               temp &= (1 << ~(wt & 0x1f));
+               temp &= ~(1 << (wt & 0x1f));
        hwwrite(vortex->mmio, WT_DSREG((wt >= 0x20) ? 1 : 0), temp);
 }
 
index 8353c77536ac51c0e9ed13ff6fb94732c9e80469..b8fb0a5adb9b54a67c687d5da6b142a917bcb261 100644 (file)
@@ -2531,7 +2531,7 @@ static int vmaster_mute_mode_info(struct snd_kcontrol *kcontrol,
                                  struct snd_ctl_elem_info *uinfo)
 {
        static const char * const texts[] = {
-               "Off", "On", "Follow Master"
+               "On", "Off", "Follow Master"
        };
        unsigned int index;
 
index cca87277baf088b273279c6b1621aa52a981a47e..0b6aebacc56b6bb2df187dbaf3604e2c28aef784 100644 (file)
@@ -573,9 +573,12 @@ enum {
 #define AZX_DCAPS_PM_RUNTIME   (1 << 26)       /* runtime PM support */
 
 /* quirks for Intel PCH */
-#define AZX_DCAPS_INTEL_PCH \
+#define AZX_DCAPS_INTEL_PCH_NOPM \
        (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
-        AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME)
+        AZX_DCAPS_COUNT_LPIB_DELAY)
+
+#define AZX_DCAPS_INTEL_PCH \
+       (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME)
 
 /* quirks for ATI SB / AMD Hudson */
 #define AZX_DCAPS_PRESET_ATI_SB \
@@ -3586,13 +3589,13 @@ static void azx_remove(struct pci_dev *pci)
 static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
        /* CPT */
        { PCI_DEVICE(0x8086, 0x1c20),
-         .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
+         .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
        /* PBG */
        { PCI_DEVICE(0x8086, 0x1d20),
-         .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
+         .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
        /* Panther Point */
        { PCI_DEVICE(0x8086, 0x1e20),
-         .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
+         .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
        /* Lynx Point */
        { PCI_DEVICE(0x8086, 0x8c20),
          .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
index 60890bfecc196600ffa15ab5979c06aef8891f9b..dd798c3196ff224f71bad57b1ca357c820e7fc35 100644 (file)
@@ -558,24 +558,12 @@ static int conexant_build_controls(struct hda_codec *codec)
        return 0;
 }
 
-#ifdef CONFIG_PM
-static int conexant_suspend(struct hda_codec *codec)
-{
-       snd_hda_shutup_pins(codec);
-       return 0;
-}
-#endif
-
 static const struct hda_codec_ops conexant_patch_ops = {
        .build_controls = conexant_build_controls,
        .build_pcms = conexant_build_pcms,
        .init = conexant_init,
        .free = conexant_free,
        .set_power_state = conexant_set_power,
-#ifdef CONFIG_PM
-       .suspend = conexant_suspend,
-#endif
-       .reboot_notify = snd_hda_shutup_pins,
 };
 
 #ifdef CONFIG_SND_HDA_INPUT_BEEP
@@ -4405,10 +4393,6 @@ static const struct hda_codec_ops cx_auto_patch_ops = {
        .init = cx_auto_init,
        .free = conexant_free,
        .unsol_event = snd_hda_jack_unsol_event,
-#ifdef CONFIG_PM
-       .suspend = conexant_suspend,
-#endif
-       .reboot_notify = snd_hda_shutup_pins,
 };
 
 /*
index 6ee34593774a4d155cd595ab96bbc7318f2dc6d9..f5196277b6e986b73226cfbef4663ac0c96f0faa 100644 (file)
@@ -5817,6 +5817,9 @@ enum {
        ALC269_TYPE_ALC269VB,
        ALC269_TYPE_ALC269VC,
        ALC269_TYPE_ALC269VD,
+       ALC269_TYPE_ALC280,
+       ALC269_TYPE_ALC282,
+       ALC269_TYPE_ALC284,
 };
 
 /*
@@ -5833,10 +5836,13 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
        switch (spec->codec_variant) {
        case ALC269_TYPE_ALC269VA:
        case ALC269_TYPE_ALC269VC:
+       case ALC269_TYPE_ALC280:
+       case ALC269_TYPE_ALC284:
                ssids = alc269va_ssids;
                break;
        case ALC269_TYPE_ALC269VB:
        case ALC269_TYPE_ALC269VD:
+       case ALC269_TYPE_ALC282:
                ssids = alc269_ssids;
                break;
        default:
@@ -5992,6 +5998,30 @@ static void alc269_fixup_quanta_mute(struct hda_codec *codec,
        spec->automute_hook = alc269_quanta_automute;
 }
 
+/* update mute-LED according to the speaker mute state via mic1 VREF pin */
+static void alc269_fixup_mic1_mute_hook(void *private_data, int enabled)
+{
+       struct hda_codec *codec = private_data;
+       unsigned int pinval = AC_PINCTL_IN_EN + (enabled ?
+                             AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80);
+       snd_hda_set_pin_ctl_cache(codec, 0x18, pinval);
+}
+
+static void alc269_fixup_mic1_mute(struct hda_codec *codec,
+                                  const struct alc_fixup *fix, int action)
+{
+       struct alc_spec *spec = codec->spec;
+       switch (action) {
+       case ALC_FIXUP_ACT_BUILD:
+               spec->vmaster_mute.hook = alc269_fixup_mic1_mute_hook;
+               snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute, true);
+               /* fallthru */
+       case ALC_FIXUP_ACT_INIT:
+               snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
+               break;
+       }
+}
+
 /* update mute-LED according to the speaker mute state via mic2 VREF pin */
 static void alc269_fixup_mic2_mute_hook(void *private_data, int enabled)
 {
@@ -6043,6 +6073,7 @@ enum {
        ALC269_FIXUP_DMIC,
        ALC269VB_FIXUP_AMIC,
        ALC269VB_FIXUP_DMIC,
+       ALC269_FIXUP_MIC1_MUTE_LED,
        ALC269_FIXUP_MIC2_MUTE_LED,
        ALC269_FIXUP_INV_DMIC,
        ALC269_FIXUP_LENOVO_DOCK,
@@ -6171,6 +6202,10 @@ static const struct alc_fixup alc269_fixups[] = {
                        { }
                },
        },
+       [ALC269_FIXUP_MIC1_MUTE_LED] = {
+               .type = ALC_FIXUP_FUNC,
+               .v.func = alc269_fixup_mic1_mute,
+       },
        [ALC269_FIXUP_MIC2_MUTE_LED] = {
                .type = ALC_FIXUP_FUNC,
                .v.func = alc269_fixup_mic2_mute,
@@ -6215,6 +6250,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
        SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
        SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_MIC2_MUTE_LED),
+       SND_PCI_QUIRK(0x103c, 0x1972, "HP Pavilion 17", ALC269_FIXUP_MIC1_MUTE_LED),
        SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_DMIC),
        SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_DMIC),
        SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
@@ -6370,7 +6406,8 @@ static int patch_alc269(struct hda_codec *codec)
 
        alc_auto_parse_customize_define(codec);
 
-       if (codec->vendor_id == 0x10ec0269) {
+       switch (codec->vendor_id) {
+       case 0x10ec0269:
                spec->codec_variant = ALC269_TYPE_ALC269VA;
                switch (alc_get_coef0(codec) & 0x00f0) {
                case 0x0010:
@@ -6395,6 +6432,20 @@ static int patch_alc269(struct hda_codec *codec)
                        goto error;
                spec->init_hook = alc269_fill_coef;
                alc269_fill_coef(codec);
+               break;
+
+       case 0x10ec0280:
+       case 0x10ec0290:
+               spec->codec_variant = ALC269_TYPE_ALC280;
+               break;
+       case 0x10ec0282:
+       case 0x10ec0283:
+               spec->codec_variant = ALC269_TYPE_ALC282;
+               break;
+       case 0x10ec0284:
+       case 0x10ec0292:
+               spec->codec_variant = ALC269_TYPE_ALC284;
+               break;
        }
 
        /* automatic parse from the BIOS config */
@@ -7099,6 +7150,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {
        { .id = 0x10ec0280, .name = "ALC280", .patch = patch_alc269 },
        { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 },
        { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 },
+       { .id = 0x10ec0284, .name = "ALC284", .patch = patch_alc269 },
        { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 },
        { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 },
        { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
index 6e02e064d7b43df1159554899f1007a9f223bc7b..223c3d9cc69efa1af38e6dee6c45ffc0f3733c55 100644 (file)
@@ -441,6 +441,7 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
 */
 /* status */
 #define HDSPM_AES32_wcLock     0x0200000
+#define HDSPM_AES32_wcSync     0x0100000
 #define HDSPM_AES32_wcFreq_bit  22
 /* (status >> HDSPM_AES32_wcFreq_bit) & 0xF gives WC frequency (cf function
   HDSPM_bit2freq */
@@ -3467,10 +3468,12 @@ static int hdspm_wc_sync_check(struct hdspm *hdspm)
        switch (hdspm->io_type) {
        case AES32:
                status = hdspm_read(hdspm, HDSPM_statusRegister);
-               if (status & HDSPM_wcSync)
-                       return 2;
-               else if (status & HDSPM_wcLock)
-                       return 1;
+               if (status & HDSPM_AES32_wcLock) {
+                       if (status & HDSPM_AES32_wcSync)
+                               return 2;
+                       else
+                               return 1;
+               }
                return 0;
                break;
 
@@ -4658,6 +4661,7 @@ snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
        unsigned int status;
        unsigned int status2;
        unsigned int timecode;
+       unsigned int wcLock, wcSync;
        int pref_syncref;
        char *autosync_ref;
        int x;
@@ -4751,8 +4755,11 @@ snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
 
        snd_iprintf(buffer, "--- Status:\n");
 
+       wcLock = status & HDSPM_AES32_wcLock;
+       wcSync = wcLock && (status & HDSPM_AES32_wcSync);
+
        snd_iprintf(buffer, "Word: %s  Frequency: %d\n",
-                   (status & HDSPM_AES32_wcLock) ? "Sync   " : "No Lock",
+                   (wcLock) ? (wcSync ? "Sync   " : "Lock   ") : "No Lock",
                    HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
 
        for (x = 0; x < 8; x++) {
index adf397b9d0e650eb19768e7bc6c592352014a595..1d8bb591759435d5bca70cee52f81c6bbe81ed94 100644 (file)
@@ -446,15 +446,9 @@ static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        case SND_SOC_DAIFMT_DSP_A:
                mode = 0;
                break;
-       case SND_SOC_DAIFMT_DSP_B:
-               mode = 1;
-               break;
        case SND_SOC_DAIFMT_I2S:
                mode = 2;
                break;
-       case SND_SOC_DAIFMT_LEFT_J:
-               mode = 3;
-               break;
        default:
                arizona_aif_err(dai, "Unsupported DAI format %d\n",
                                fmt & SND_SOC_DAIFMT_FORMAT_MASK);
@@ -714,7 +708,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
                snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1,
                                    ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val);
                snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL,
-                                   ARIZONA_AIF1_RATE_MASK, 8);
+                                   ARIZONA_AIF1_RATE_MASK,
+                                   8 << ARIZONA_AIF1_RATE_SHIFT);
                break;
        default:
                arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk);
index 41dae1ed3b714a4734448b1d3c99938af1fe9d9a..4deebeb0717754085edceb38e7c00b141f4502fb 100644 (file)
 
 #define ARIZONA_FLL_SRC_MCLK1      0
 #define ARIZONA_FLL_SRC_MCLK2      1
-#define ARIZONA_FLL_SRC_SLIMCLK    2
-#define ARIZONA_FLL_SRC_FLL1       3
-#define ARIZONA_FLL_SRC_FLL2       4
-#define ARIZONA_FLL_SRC_AIF1BCLK   5
-#define ARIZONA_FLL_SRC_AIF2BCLK   6
-#define ARIZONA_FLL_SRC_AIF3BCLK   7
-#define ARIZONA_FLL_SRC_AIF1LRCLK  8
-#define ARIZONA_FLL_SRC_AIF2LRCLK  9
-#define ARIZONA_FLL_SRC_AIF3LRCLK 10
+#define ARIZONA_FLL_SRC_SLIMCLK    3
+#define ARIZONA_FLL_SRC_FLL1       4
+#define ARIZONA_FLL_SRC_FLL2       5
+#define ARIZONA_FLL_SRC_AIF1BCLK   8
+#define ARIZONA_FLL_SRC_AIF2BCLK   9
+#define ARIZONA_FLL_SRC_AIF3BCLK  10
+#define ARIZONA_FLL_SRC_AIF1LRCLK 12
+#define ARIZONA_FLL_SRC_AIF2LRCLK 13
+#define ARIZONA_FLL_SRC_AIF3LRCLK 14
 
 #define ARIZONA_MIXER_VOL_MASK             0x00FE
 #define ARIZONA_MIXER_VOL_SHIFT                 1
index 4f1127935fdf5f9578970b13fcf73b8815d469e5..ac8742a1f25ab7c69fcca2b22458ae02acf3d67e 100644 (file)
@@ -474,16 +474,16 @@ static int cs4271_probe(struct snd_soc_codec *codec)
        struct cs4271_platform_data *cs4271plat = codec->dev->platform_data;
        int ret;
        int gpio_nreset = -EINVAL;
-       int amutec_eq_bmutec = 0;
+       bool amutec_eq_bmutec = false;
 
 #ifdef CONFIG_OF
        if (of_match_device(cs4271_dt_ids, codec->dev)) {
                gpio_nreset = of_get_named_gpio(codec->dev->of_node,
                                                "reset-gpio", 0);
 
-               if (!of_get_property(codec->dev->of_node,
+               if (of_get_property(codec->dev->of_node,
                                     "cirrus,amutec-eq-bmutec", NULL))
-                       amutec_eq_bmutec = 1;
+                       amutec_eq_bmutec = true;
        }
 #endif
 
index 99bb1c69499e42a6791ae12c55dde2d53efb7f49..9811a5478c87649da6c42806a3a43bfcc5a5767e 100644 (file)
@@ -737,7 +737,7 @@ static const struct cs42l52_clk_para clk_map_table[] = {
 
 static int cs42l52_get_clk(int mclk, int rate)
 {
-       int i, ret = 0;
+       int i, ret = -EINVAL;
        u_int mclk1, mclk2 = 0;
 
        for (i = 0; i < ARRAY_SIZE(clk_map_table); i++) {
@@ -749,8 +749,6 @@ static int cs42l52_get_clk(int mclk, int rate)
                        }
                }
        }
-       if (ret > ARRAY_SIZE(clk_map_table))
-               return -EINVAL;
        return ret;
 }
 
index d75257d40a496d26e9bb513f6fd000abe6f13a76..e19490cfb3a8bde2036e61d877b3a8c407cc510c 100644 (file)
@@ -111,9 +111,9 @@ static struct reg_default lm49453_reg_defs[] = {
        { 101, 0x00 },
        { 102, 0x00 },
        { 103, 0x01 },
-       { 105, 0x01 },
-       { 106, 0x00 },
-       { 107, 0x01 },
+       { 104, 0x01 },
+       { 105, 0x00 },
+       { 106, 0x01 },
        { 107, 0x00 },
        { 108, 0x00 },
        { 109, 0x00 },
@@ -163,56 +163,25 @@ static struct reg_default lm49453_reg_defs[] = {
        { 184, 0x00 },
        { 185, 0x00 },
        { 186, 0x00 },
-       { 189, 0x00 },
+       { 187, 0x00 },
        { 188, 0x00 },
-       { 194, 0x00 },
-       { 195, 0x00 },
-       { 196, 0x00 },
-       { 197, 0x00 },
-       { 200, 0x00 },
-       { 201, 0x00 },
-       { 202, 0x00 },
-       { 203, 0x00 },
-       { 204, 0x00 },
-       { 205, 0x00 },
-       { 208, 0x00 },
+       { 189, 0x00 },
+       { 208, 0x06 },
        { 209, 0x00 },
-       { 210, 0x00 },
-       { 211, 0x00 },
-       { 213, 0x00 },
-       { 214, 0x00 },
-       { 215, 0x00 },
-       { 216, 0x00 },
-       { 217, 0x00 },
-       { 218, 0x00 },
-       { 219, 0x00 },
+       { 210, 0x08 },
+       { 211, 0x54 },
+       { 212, 0x14 },
+       { 213, 0x0d },
+       { 214, 0x0d },
+       { 215, 0x14 },
+       { 216, 0x60 },
        { 221, 0x00 },
        { 222, 0x00 },
+       { 223, 0x00 },
        { 224, 0x00 },
-       { 225, 0x00 },
-       { 226, 0x00 },
-       { 227, 0x00 },
-       { 228, 0x00 },
-       { 229, 0x00 },
-       { 230, 0x13 },
-       { 231, 0x00 },
-       { 232, 0x80 },
-       { 233, 0x0C },
-       { 234, 0xDD },
-       { 235, 0x00 },
-       { 236, 0x04 },
-       { 237, 0x00 },
-       { 238, 0x00 },
-       { 239, 0x00 },
-       { 240, 0x00 },
-       { 241, 0x00 },
-       { 242, 0x00 },
-       { 243, 0x00 },
-       { 244, 0x00 },
-       { 245, 0x00 },
        { 248, 0x00 },
        { 249, 0x00 },
-       { 254, 0x00 },
+       { 250, 0x00 },
        { 255, 0x00 },
 };
 
@@ -525,36 +494,41 @@ SOC_DAPM_SINGLE("Port2_2 Switch", LM49453_P0_PORT2_TX2_REG, 7, 1, 0),
 };
 
 /* TLV Declarations */
-static const DECLARE_TLV_DB_SCALE(digital_tlv, -7650, 150, 1);
-static const DECLARE_TLV_DB_SCALE(port_tlv, 0, 600, 0);
+static const DECLARE_TLV_DB_SCALE(adc_dac_tlv, -7650, 150, 1);
+static const DECLARE_TLV_DB_SCALE(mic_tlv, 0, 200, 1);
+static const DECLARE_TLV_DB_SCALE(port_tlv, -1800, 600, 0);
+static const DECLARE_TLV_DB_SCALE(stn_tlv, -7200, 150, 0);
 
 static const struct snd_kcontrol_new lm49453_sidetone_mixer_controls[] = {
 /* Sidetone supports mono only */
 SOC_DAPM_SINGLE_TLV("Sidetone ADCL Volume", LM49453_P0_STN_VOL_ADCL_REG,
-                    0, 0x3F, 0, digital_tlv),
+                    0, 0x3F, 0, stn_tlv),
 SOC_DAPM_SINGLE_TLV("Sidetone ADCR Volume", LM49453_P0_STN_VOL_ADCR_REG,
-                    0, 0x3F, 0, digital_tlv),
+                    0, 0x3F, 0, stn_tlv),
 SOC_DAPM_SINGLE_TLV("Sidetone DMIC1L Volume", LM49453_P0_STN_VOL_DMIC1L_REG,
-                    0, 0x3F, 0, digital_tlv),
+                    0, 0x3F, 0, stn_tlv),
 SOC_DAPM_SINGLE_TLV("Sidetone DMIC1R Volume", LM49453_P0_STN_VOL_DMIC1R_REG,
-                    0, 0x3F, 0, digital_tlv),
+                    0, 0x3F, 0, stn_tlv),
 SOC_DAPM_SINGLE_TLV("Sidetone DMIC2L Volume", LM49453_P0_STN_VOL_DMIC2L_REG,
-                    0, 0x3F, 0, digital_tlv),
+                    0, 0x3F, 0, stn_tlv),
 SOC_DAPM_SINGLE_TLV("Sidetone DMIC2R Volume", LM49453_P0_STN_VOL_DMIC2R_REG,
-                    0, 0x3F, 0, digital_tlv),
+                    0, 0x3F, 0, stn_tlv),
 };
 
 static const struct snd_kcontrol_new lm49453_snd_controls[] = {
        /* mic1 and mic2 supports mono only */
-       SOC_SINGLE_TLV("Mic1 Volume", LM49453_P0_ADC_LEVELL_REG, 0, 6,
-                       0, digital_tlv),
-       SOC_SINGLE_TLV("Mic2 Volume", LM49453_P0_ADC_LEVELR_REG, 0, 6,
-                       0, digital_tlv),
+       SOC_SINGLE_TLV("Mic1 Volume", LM49453_P0_MICL_REG, 0, 15, 0, mic_tlv),
+       SOC_SINGLE_TLV("Mic2 Volume", LM49453_P0_MICR_REG, 0, 15, 0, mic_tlv),
+
+       SOC_SINGLE_TLV("ADCL Volume", LM49453_P0_ADC_LEVELL_REG, 0, 63,
+                       0, adc_dac_tlv),
+       SOC_SINGLE_TLV("ADCR Volume", LM49453_P0_ADC_LEVELR_REG, 0, 63,
+                       0, adc_dac_tlv),
 
        SOC_DOUBLE_R_TLV("DMIC1 Volume", LM49453_P0_DMIC1_LEVELL_REG,
-                         LM49453_P0_DMIC1_LEVELR_REG, 0, 6, 0, digital_tlv),
+                         LM49453_P0_DMIC1_LEVELR_REG, 0, 63, 0, adc_dac_tlv),
        SOC_DOUBLE_R_TLV("DMIC2 Volume", LM49453_P0_DMIC2_LEVELL_REG,
-                         LM49453_P0_DMIC2_LEVELR_REG, 0, 6, 0, digital_tlv),
+                         LM49453_P0_DMIC2_LEVELR_REG, 0, 63, 0, adc_dac_tlv),
 
        SOC_DAPM_ENUM("Mic2Mode", lm49453_mic2mode_enum),
        SOC_DAPM_ENUM("DMIC12 SRC", lm49453_dmic12_cfg_enum),
@@ -569,16 +543,16 @@ static const struct snd_kcontrol_new lm49453_snd_controls[] = {
                                          2, 1, 0),
 
        SOC_DOUBLE_R_TLV("DAC HP Volume", LM49453_P0_DAC_HP_LEVELL_REG,
-                         LM49453_P0_DAC_HP_LEVELR_REG, 0, 6, 0, digital_tlv),
+                         LM49453_P0_DAC_HP_LEVELR_REG, 0, 63, 0, adc_dac_tlv),
        SOC_DOUBLE_R_TLV("DAC LO Volume", LM49453_P0_DAC_LO_LEVELL_REG,
-                         LM49453_P0_DAC_LO_LEVELR_REG, 0, 6, 0, digital_tlv),
+                         LM49453_P0_DAC_LO_LEVELR_REG, 0, 63, 0, adc_dac_tlv),
        SOC_DOUBLE_R_TLV("DAC LS Volume", LM49453_P0_DAC_LS_LEVELL_REG,
-                         LM49453_P0_DAC_LS_LEVELR_REG, 0, 6, 0, digital_tlv),
+                         LM49453_P0_DAC_LS_LEVELR_REG, 0, 63, 0, adc_dac_tlv),
        SOC_DOUBLE_R_TLV("DAC HA Volume", LM49453_P0_DAC_HA_LEVELL_REG,
-                         LM49453_P0_DAC_HA_LEVELR_REG, 0, 6, 0, digital_tlv),
+                         LM49453_P0_DAC_HA_LEVELR_REG, 0, 63, 0, adc_dac_tlv),
 
        SOC_SINGLE_TLV("EP Volume", LM49453_P0_DAC_LS_LEVELL_REG,
-                       0, 6, 0, digital_tlv),
+                       0, 63, 0, adc_dac_tlv),
 
        SOC_SINGLE_TLV("PORT1_1_RX_LVL Volume", LM49453_P0_PORT1_RX_LVL1_REG,
                        0, 3, 0, port_tlv),
@@ -1218,7 +1192,7 @@ static int lm49453_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
        }
 
        snd_soc_update_bits(codec, LM49453_P0_AUDIO_PORT1_BASIC_REG,
-                           LM49453_AUDIO_PORT1_BASIC_FMT_MASK|BIT(1)|BIT(5),
+                           LM49453_AUDIO_PORT1_BASIC_FMT_MASK|BIT(0)|BIT(5),
                            (aif_val | mode | clk_phase));
 
        snd_soc_write(codec, LM49453_P0_AUDIO_PORT1_RX_MSB_REG, clk_shift);
index cb1675cd8e1c5ffd9b404b9d12ee9c404f6f2efd..92bbfec9b107a0ec5ee55205b9272ce9e67caa74 100644 (file)
@@ -401,7 +401,7 @@ static const struct snd_kcontrol_new sgtl5000_snd_controls[] = {
                        5, 1, 0),
 
        SOC_SINGLE_TLV("Mic Volume", SGTL5000_CHIP_MIC_CTRL,
-                       0, 4, 0, mic_gain_tlv),
+                       0, 3, 0, mic_gain_tlv),
 };
 
 /* mute the codec used by alsa core */
@@ -1344,7 +1344,7 @@ static int sgtl5000_probe(struct snd_soc_codec *codec)
                        SGTL5000_HP_ZCD_EN |
                        SGTL5000_ADC_ZCD_EN);
 
-       snd_soc_write(codec, SGTL5000_CHIP_MIC_CTRL, 0);
+       snd_soc_write(codec, SGTL5000_CHIP_MIC_CTRL, 2);
 
        /*
         * disable DAP
index ab355c4f0b2de0aa786e754360a6a877a0855756..40c07be9b5814f170f73fa1b3670d3813101bb67 100644 (file)
                                SNDRV_PCM_FMTBIT_S32_LE)
 #define        S2PC_VALUE              0x98
 #define CLOCK_OUT              0x60
-#define LEFT_J_DATA_FORMAT     0x10
-#define I2S_DATA_FORMAT                0x12
-#define RIGHT_J_DATA_FORMAT    0x14
+#define DATA_FORMAT_MSK                0x0E
+#define LEFT_J_DATA_FORMAT     0x00
+#define I2S_DATA_FORMAT                0x02
+#define RIGHT_J_DATA_FORMAT    0x04
 #define CODEC_MUTE_VAL         0x80
 
 #define POWER_CNTLMSAK         0x40
@@ -289,7 +290,7 @@ static int sta529_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt)
                return -EINVAL;
        }
 
-       snd_soc_update_bits(codec, STA529_S2PCFG0, 0x0D, mode);
+       snd_soc_update_bits(codec, STA529_S2PCFG0, DATA_FORMAT_MSK, mode);
 
        return 0;
 }
index 1cbe88f01d634137e0d7e85218556e1c81710d59..12bcae63a7f020f2dab718b535ad8b3d41d49ccd 100644 (file)
@@ -209,9 +209,9 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
 
        ret = wm2000_read(i2c, WM2000_REG_SPEECH_CLARITY);
        if (wm2000->speech_clarity)
-               ret &= ~WM2000_SPEECH_CLARITY;
-       else
                ret |= WM2000_SPEECH_CLARITY;
+       else
+               ret &= ~WM2000_SPEECH_CLARITY;
        wm2000_write(i2c, WM2000_REG_SPEECH_CLARITY, ret);
 
        wm2000_write(i2c, WM2000_REG_SYS_START0, 0x33);
index afcf31df77e06efe19c709630f53990741348227..e6cefe1ac677fcd6cd0610b148300be39858cc36 100644 (file)
@@ -1566,15 +1566,9 @@ static int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        case SND_SOC_DAIFMT_DSP_A:
                fmt_val = 0;
                break;
-       case SND_SOC_DAIFMT_DSP_B:
-               fmt_val = 1;
-               break;
        case SND_SOC_DAIFMT_I2S:
                fmt_val = 2;
                break;
-       case SND_SOC_DAIFMT_LEFT_J:
-               fmt_val = 3;
-               break;
        default:
                dev_err(codec->dev, "Unsupported DAI format %d\n",
                        fmt & SND_SOC_DAIFMT_FORMAT_MASK);
@@ -1626,7 +1620,7 @@ static int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
                            WM2200_AIF1TX_LRCLK_MSTR | WM2200_AIF1TX_LRCLK_INV,
                            lrclk);
        snd_soc_update_bits(codec, WM2200_AUDIO_IF_1_5,
-                           WM2200_AIF1_FMT_MASK << 1, fmt_val << 1);
+                           WM2200_AIF1_FMT_MASK, fmt_val);
 
        return 0;
 }
index 5a5f3693623568d2d6268e9bc10e7055664c5d3d..54397a50807379bf2e625b4f980773ad72515164 100644 (file)
@@ -1279,15 +1279,9 @@ static int wm5100_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        case SND_SOC_DAIFMT_DSP_A:
                mask = 0;
                break;
-       case SND_SOC_DAIFMT_DSP_B:
-               mask = 1;
-               break;
        case SND_SOC_DAIFMT_I2S:
                mask = 2;
                break;
-       case SND_SOC_DAIFMT_LEFT_J:
-               mask = 3;
-               break;
        default:
                dev_err(codec->dev, "Unsupported DAI format %d\n",
                        fmt & SND_SOC_DAIFMT_FORMAT_MASK);
index 688ade0805897557baac586aeb6387a70361fd2c..7a9048dad1cdfd66e1f33a4d9a45b4642c387125 100644 (file)
@@ -36,6 +36,9 @@
 struct wm5102_priv {
        struct arizona_priv core;
        struct arizona_fll fll[2];
+
+       unsigned int spk_ena:2;
+       unsigned int spk_ena_pending:1;
 };
 
 static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
@@ -787,6 +790,47 @@ ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
 ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
 };
 
+static int wm5102_spk_ev(struct snd_soc_dapm_widget *w,
+                        struct snd_kcontrol *kcontrol,
+                        int event)
+{
+       struct snd_soc_codec *codec = w->codec;
+       struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
+       struct wm5102_priv *wm5102 = snd_soc_codec_get_drvdata(codec);
+
+       if (arizona->rev < 1)
+               return 0;
+
+       switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               if (!wm5102->spk_ena) {
+                       snd_soc_write(codec, 0x4f5, 0x25a);
+                       wm5102->spk_ena_pending = true;
+               }
+               break;
+       case SND_SOC_DAPM_POST_PMU:
+               if (wm5102->spk_ena_pending) {
+                       msleep(75);
+                       snd_soc_write(codec, 0x4f5, 0xda);
+                       wm5102->spk_ena_pending = false;
+                       wm5102->spk_ena++;
+               }
+               break;
+       case SND_SOC_DAPM_PRE_PMD:
+               wm5102->spk_ena--;
+               if (!wm5102->spk_ena)
+                       snd_soc_write(codec, 0x4f5, 0x25a);
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               if (!wm5102->spk_ena)
+                       snd_soc_write(codec, 0x4f5, 0x0da);
+               break;
+       }
+
+       return 0;
+}
+
+
 ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
 ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);
 ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE);
@@ -1034,10 +1078,10 @@ SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
 SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1,
-                  ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
+                  ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
 SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1,
-                  ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
+                  ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
 SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
index ffc89fab96fbf4b6ccc81973f69df863132da1ec..7b198c38f3efdd2e5d23db6c18332527f842e2f9 100644 (file)
@@ -169,6 +169,7 @@ static int wm_adsp_load(struct wm_adsp *dsp)
        const struct wm_adsp_region *mem;
        const char *region_name;
        char *file, *text;
+       void *buf;
        unsigned int reg;
        int regions = 0;
        int ret, offset, type, sizes;
@@ -322,8 +323,18 @@ static int wm_adsp_load(struct wm_adsp *dsp)
                }
 
                if (reg) {
-                       ret = regmap_raw_write(regmap, reg, region->data,
+                       buf = kmemdup(region->data, le32_to_cpu(region->len),
+                                     GFP_KERNEL);
+                       if (!buf) {
+                               adsp_err(dsp, "Out of memory\n");
+                               return -ENOMEM;
+                       }
+
+                       ret = regmap_raw_write(regmap, reg, buf,
                                               le32_to_cpu(region->len));
+
+                       kfree(buf);
+
                        if (ret != 0) {
                                adsp_err(dsp,
                                        "%s.%d: Failed to write %d bytes at %d in %s: %d\n",
@@ -359,6 +370,7 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
        const char *region_name;
        int ret, pos, blocks, type, offset, reg;
        char *file;
+       void *buf;
 
        file = kzalloc(PAGE_SIZE, GFP_KERNEL);
        if (file == NULL)
@@ -426,6 +438,13 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
                }
 
                if (reg) {
+                       buf = kmemdup(blk->data, le32_to_cpu(blk->len),
+                                     GFP_KERNEL);
+                       if (!buf) {
+                               adsp_err(dsp, "Out of memory\n");
+                               return -ENOMEM;
+                       }
+
                        ret = regmap_raw_write(regmap, reg, blk->data,
                                               le32_to_cpu(blk->len));
                        if (ret != 0) {
@@ -433,6 +452,8 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
                                        "%s.%d: Failed to write to %x in %s\n",
                                        file, blocks, reg, region_name);
                        }
+
+                       kfree(buf);
                }
 
                pos += le32_to_cpu(blk->len) + sizeof(*blk);
index 91d592ff67b7914cdbeec98c24eb3b4c1cb6a364..2370063b58245946f71adfa05f361097d3e53374 100644 (file)
@@ -1255,6 +1255,8 @@ static int soc_post_component_init(struct snd_soc_card *card,
        INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].fe_clients);
        ret = device_add(rtd->dev);
        if (ret < 0) {
+               /* calling put_device() here to free the rtd->dev */
+               put_device(rtd->dev);
                dev_err(card->dev,
                        "ASoC: failed to register runtime device: %d\n", ret);
                return ret;
@@ -1554,7 +1556,7 @@ static void soc_remove_aux_dev(struct snd_soc_card *card, int num)
        /* unregister the rtd device */
        if (rtd->dev_registered) {
                device_remove_file(rtd->dev, &dev_attr_codec_reg);
-               device_del(rtd->dev);
+               device_unregister(rtd->dev);
                rtd->dev_registered = 0;
        }
 
@@ -2917,7 +2919,7 @@ int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol,
        platform_max = mc->platform_max;
 
        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-       uinfo->count = 1;
+       uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1;
        uinfo->value.integer.min = 0;
        uinfo->value.integer.max = platform_max - min;
 
@@ -2941,12 +2943,14 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
                (struct soc_mixer_control *)kcontrol->private_value;
        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
        unsigned int reg = mc->reg;
+       unsigned int rreg = mc->rreg;
        unsigned int shift = mc->shift;
        int min = mc->min;
        int max = mc->max;
        unsigned int mask = (1 << fls(max)) - 1;
        unsigned int invert = mc->invert;
        unsigned int val, val_mask;
+       int ret;
 
        val = ((ucontrol->value.integer.value[0] + min) & mask);
        if (invert)
@@ -2954,7 +2958,21 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
        val_mask = mask << shift;
        val = val << shift;
 
-       return snd_soc_update_bits_locked(codec, reg, val_mask, val);
+       ret = snd_soc_update_bits_locked(codec, reg, val_mask, val);
+       if (ret != 0)
+               return ret;
+
+       if (snd_soc_volsw_is_stereo(mc)) {
+               val = ((ucontrol->value.integer.value[1] + min) & mask);
+               if (invert)
+                       val = max - val;
+               val_mask = mask << shift;
+               val = val << shift;
+
+               ret = snd_soc_update_bits_locked(codec, rreg, val_mask, val);
+       }
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(snd_soc_put_volsw_range);
 
@@ -2974,6 +2992,7 @@ int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
                (struct soc_mixer_control *)kcontrol->private_value;
        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
        unsigned int reg = mc->reg;
+       unsigned int rreg = mc->rreg;
        unsigned int shift = mc->shift;
        int min = mc->min;
        int max = mc->max;
@@ -2988,6 +3007,16 @@ int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
        ucontrol->value.integer.value[0] =
                ucontrol->value.integer.value[0] - min;
 
+       if (snd_soc_volsw_is_stereo(mc)) {
+               ucontrol->value.integer.value[1] =
+                       (snd_soc_read(codec, rreg) >> shift) & mask;
+               if (invert)
+                       ucontrol->value.integer.value[1] =
+                               max - ucontrol->value.integer.value[1];
+               ucontrol->value.integer.value[1] =
+                       ucontrol->value.integer.value[1] - min;
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range);
index d7711fce119b7b949bc521759b2f13e177dd657d..cf191e6aebbe1d1bfeb9dd511d0fe9b5e5bd3bbd 100644 (file)
@@ -1243,6 +1243,7 @@ static int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream)
                if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
                    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
                    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) &&
+                   (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) &&
                    (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
                        continue;
 
index c183d34842accdc69ac8b1dec5424bb4373b1bbc..34b9bb7fe87c8eabed83df8b7b77f510bedbc2b1 100644 (file)
@@ -2181,10 +2181,6 @@ int snd_usbmidi_create(struct snd_card *card,
                umidi->usb_protocol_ops = &snd_usbmidi_novation_ops;
                err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
                break;
-       case QUIRK_MIDI_MBOX2:
-               umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops;
-               err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
-               break;
        case QUIRK_MIDI_RAW_BYTES:
                umidi->usb_protocol_ops = &snd_usbmidi_raw_ops;
                /*
index 0422b1360af3a896da708a79365e3370be771fd8..15520de1df5647c95a4ffe1a13d8ede4485dee09 100644 (file)
@@ -1206,7 +1206,7 @@ static int snd_c400_create_mixer(struct usb_mixer_interface *mixer)
  * are valid they presents mono controls as L and R channels of
  * stereo. So we provide a good mixer here.
  */
-struct std_mono_table ebox44_table[] = {
+static struct std_mono_table ebox44_table[] = {
        {
                .unitid = 4,
                .control = 1,
index c6593101c049b88ca6e5661f8765b3f3df0b4d33..d82e378d37cbb7202aaa487b6003b6b171b79eab 100644 (file)
@@ -511,6 +511,16 @@ static int configure_sync_endpoint(struct snd_usb_substream *subs)
        struct snd_usb_substream *sync_subs =
                &subs->stream->substream[subs->direction ^ 1];
 
+       if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA ||
+           !subs->stream)
+               return snd_usb_endpoint_set_params(subs->sync_endpoint,
+                                                  subs->pcm_format,
+                                                  subs->channels,
+                                                  subs->period_bytes,
+                                                  subs->cur_rate,
+                                                  subs->cur_audiofmt,
+                                                  NULL);
+
        /* Try to find the best matching audioformat. */
        list_for_each_entry(fp, &sync_subs->fmt_list, list) {
                int score = match_endpoint_audioformats(fp, subs->cur_audiofmt,
index cdcf6b45e8a887746a2f087e680b2c45a3198462..78e845ec65dafabc06332de0a3e7ea3d31e8b667 100644 (file)
        }
 },
 
+{
+       /* Creative BT-D1 */
+       USB_DEVICE(0x041e, 0x0005),
+       .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
+               .ifnum = 1,
+               .type = QUIRK_AUDIO_FIXED_ENDPOINT,
+               .data = &(const struct audioformat) {
+                       .formats = SNDRV_PCM_FMTBIT_S16_LE,
+                       .channels = 2,
+                       .iface = 1,
+                       .altsetting = 1,
+                       .altset_idx = 1,
+                       .endpoint = 0x03,
+                       .ep_attr = USB_ENDPOINT_XFER_ISOC,
+                       .attributes = 0,
+                       .rates = SNDRV_PCM_RATE_CONTINUOUS,
+                       .rate_min = 48000,
+                       .rate_max = 48000,
+               }
+       }
+},
+
 /* Creative/Toshiba Multimedia Center SB-0500 */
 {
        USB_DEVICE(0x041e, 0x3048),
@@ -2993,7 +3015,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
                        },
                        {
                                .ifnum = 6,
-                               .type = QUIRK_MIDI_MBOX2,
+                               .type = QUIRK_MIDI_MIDIMAN,
                                .data = &(const struct snd_usb_midi_endpoint_info) {
                                        .out_ep =  0x02,
                                        .out_cables = 0x0001,
index f104c68fe1e0546bfbc43bdb51dc635a8ad642af..acc12f004c23f05f12b21aa311f2f49dc77652d5 100644 (file)
@@ -306,7 +306,6 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
                [QUIRK_MIDI_YAMAHA] = create_any_midi_quirk,
                [QUIRK_MIDI_MIDIMAN] = create_any_midi_quirk,
                [QUIRK_MIDI_NOVATION] = create_any_midi_quirk,
-               [QUIRK_MIDI_MBOX2] = create_any_midi_quirk,
                [QUIRK_MIDI_RAW_BYTES] = create_any_midi_quirk,
                [QUIRK_MIDI_EMAGIC] = create_any_midi_quirk,
                [QUIRK_MIDI_CME] = create_any_midi_quirk,
@@ -528,11 +527,11 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev)
 #define MBOX2_BOOT_LOADING     0x01 /* Hard coded into the device */
 #define MBOX2_BOOT_READY       0x02 /* Hard coded into the device */
 
-int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
+static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
 {
        struct usb_host_config *config = dev->actconfig;
        int err;
-       u8 bootresponse;
+       u8 bootresponse[12];
        int fwsize;
        int count;
 
@@ -546,20 +545,20 @@ int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
        snd_printd("usb-audio: Sending Digidesign Mbox 2 boot sequence...\n");
 
        count = 0;
-       bootresponse = MBOX2_BOOT_LOADING;
-       while ((bootresponse == MBOX2_BOOT_LOADING) && (count < 10)) {
+       bootresponse[0] = MBOX2_BOOT_LOADING;
+       while ((bootresponse[0] == MBOX2_BOOT_LOADING) && (count < 10)) {
                msleep(500); /* 0.5 second delay */
                snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
                        /* Control magic - load onboard firmware */
                        0x85, 0xc0, 0x0001, 0x0000, &bootresponse, 0x0012);
-               if (bootresponse == MBOX2_BOOT_READY)
+               if (bootresponse[0] == MBOX2_BOOT_READY)
                        break;
                snd_printd("usb-audio: device not ready, resending boot sequence...\n");
                count++;
        }
 
-       if (bootresponse != MBOX2_BOOT_READY) {
-               snd_printk(KERN_ERR "usb-audio: Unknown bootresponse=%d, or timed out, ignoring device.\n", bootresponse);
+       if (bootresponse[0] != MBOX2_BOOT_READY) {
+               snd_printk(KERN_ERR "usb-audio: Unknown bootresponse=%d, or timed out, ignoring device.\n", bootresponse[0]);
                return -ENODEV;
        }
 
@@ -660,7 +659,6 @@ static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip,
        return 0; /* keep this altsetting */
 }
 
-
 static int fasttrackpro_skip_setting_quirk(struct snd_usb_audio *chip,
                                           int iface, int altno)
 {
index a8172c119796015fa2edd0a675d4568c27f83ba7..1ac3fd9cc5a625e89cc1290ab3274ebac6982793 100644 (file)
@@ -76,7 +76,6 @@ enum quirk_type {
        QUIRK_MIDI_YAMAHA,
        QUIRK_MIDI_MIDIMAN,
        QUIRK_MIDI_NOVATION,
-       QUIRK_MIDI_MBOX2,
        QUIRK_MIDI_RAW_BYTES,
        QUIRK_MIDI_EMAGIC,
        QUIRK_MIDI_CME,
diff --git a/tools/testing/selftests/ipc/Makefile b/tools/testing/selftests/ipc/Makefile
new file mode 100644 (file)
index 0000000..5386fd7
--- /dev/null
@@ -0,0 +1,25 @@
+uname_M := $(shell uname -m 2>/dev/null || echo not)
+ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/)
+ifeq ($(ARCH),i386)
+        ARCH := X86
+       CFLAGS := -DCONFIG_X86_32 -D__i386__
+endif
+ifeq ($(ARCH),x86_64)
+       ARCH := X86
+       CFLAGS := -DCONFIG_X86_64 -D__x86_64__
+endif
+
+CFLAGS += -I../../../../usr/include/
+
+all:
+ifeq ($(ARCH),X86)
+       gcc $(CFLAGS) msgque.c -o msgque_test
+else
+       echo "Not an x86 target, can't build msgque selftest"
+endif
+
+run_tests: all
+       ./msgque_test
+
+clean:
+       rm -fr ./msgque_test
diff --git a/tools/testing/selftests/ipc/msgque.c b/tools/testing/selftests/ipc/msgque.c
new file mode 100644 (file)
index 0000000..d664182
--- /dev/null
@@ -0,0 +1,246 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <linux/msg.h>
+#include <fcntl.h>
+
+#define MAX_MSG_SIZE           32
+
+struct msg1 {
+       int msize;
+       long mtype;
+       char mtext[MAX_MSG_SIZE];
+};
+
+#define TEST_STRING "Test sysv5 msg"
+#define MSG_TYPE 1
+
+#define ANOTHER_TEST_STRING "Yet another test sysv5 msg"
+#define ANOTHER_MSG_TYPE 26538
+
+struct msgque_data {
+       key_t key;
+       int msq_id;
+       int qbytes;
+       int qnum;
+       int mode;
+       struct msg1 *messages;
+};
+
+int restore_queue(struct msgque_data *msgque)
+{
+       int fd, ret, id, i;
+       char buf[32];
+
+       fd = open("/proc/sys/kernel/msg_next_id", O_WRONLY);
+       if (fd == -1) {
+               printf("Failed to open /proc/sys/kernel/msg_next_id\n");
+               return -errno;
+       }
+       sprintf(buf, "%d", msgque->msq_id);
+
+       ret = write(fd, buf, strlen(buf));
+       if (ret != strlen(buf)) {
+               printf("Failed to write to /proc/sys/kernel/msg_next_id\n");
+               return -errno;
+       }
+
+       id = msgget(msgque->key, msgque->mode | IPC_CREAT | IPC_EXCL);
+       if (id == -1) {
+               printf("Failed to create queue\n");
+               return -errno;
+       }
+
+       if (id != msgque->msq_id) {
+               printf("Restored queue has wrong id (%d instead of %d)\n",
+                                                       id, msgque->msq_id);
+               ret = -EFAULT;
+               goto destroy;
+       }
+
+       for (i = 0; i < msgque->qnum; i++) {
+               if (msgsnd(msgque->msq_id, &msgque->messages[i].mtype,
+                          msgque->messages[i].msize, IPC_NOWAIT) != 0) {
+                       printf("msgsnd failed (%m)\n");
+                       ret = -errno;
+                       goto destroy;
+               };
+       }
+       return 0;
+
+destroy:
+       if (msgctl(id, IPC_RMID, 0))
+               printf("Failed to destroy queue: %d\n", -errno);
+       return ret;
+}
+
+int check_and_destroy_queue(struct msgque_data *msgque)
+{
+       struct msg1 message;
+       int cnt = 0, ret;
+
+       while (1) {
+               ret = msgrcv(msgque->msq_id, &message.mtype, MAX_MSG_SIZE,
+                               0, IPC_NOWAIT);
+               if (ret < 0) {
+                       if (errno == ENOMSG)
+                               break;
+                       printf("Failed to read IPC message: %m\n");
+                       ret = -errno;
+                       goto err;
+               }
+               if (ret != msgque->messages[cnt].msize) {
+                       printf("Wrong message size: %d (expected %d)\n", ret,
+                                               msgque->messages[cnt].msize);
+                       ret = -EINVAL;
+                       goto err;
+               }
+               if (message.mtype != msgque->messages[cnt].mtype) {
+                       printf("Wrong message type\n");
+                       ret = -EINVAL;
+                       goto err;
+               }
+               if (memcmp(message.mtext, msgque->messages[cnt].mtext, ret)) {
+                       printf("Wrong message content\n");
+                       ret = -EINVAL;
+                       goto err;
+               }
+               cnt++;
+       }
+
+       if (cnt != msgque->qnum) {
+               printf("Wrong message number\n");
+               ret = -EINVAL;
+               goto err;
+       }
+
+       ret = 0;
+err:
+       if (msgctl(msgque->msq_id, IPC_RMID, 0)) {
+               printf("Failed to destroy queue: %d\n", -errno);
+               return -errno;
+       }
+       return ret;
+}
+
+int dump_queue(struct msgque_data *msgque)
+{
+       struct msqid64_ds ds;
+       int kern_id;
+       int i, ret;
+
+       for (kern_id = 0; kern_id < 256; kern_id++) {
+               ret = msgctl(kern_id, MSG_STAT, &ds);
+               if (ret < 0) {
+                       if (errno == -EINVAL)
+                               continue;
+                       printf("Failed to get stats for IPC queue with id %d\n",
+                                       kern_id);
+                       return -errno;
+               }
+
+               if (ret == msgque->msq_id)
+                       break;
+       }
+
+       msgque->messages = malloc(sizeof(struct msg1) * ds.msg_qnum);
+       if (msgque->messages == NULL) {
+               printf("Failed to get stats for IPC queue\n");
+               return -ENOMEM;
+       }
+
+       msgque->qnum = ds.msg_qnum;
+       msgque->mode = ds.msg_perm.mode;
+       msgque->qbytes = ds.msg_qbytes;
+
+       for (i = 0; i < msgque->qnum; i++) {
+               ret = msgrcv(msgque->msq_id, &msgque->messages[i].mtype,
+                               MAX_MSG_SIZE, i, IPC_NOWAIT | MSG_COPY);
+               if (ret < 0) {
+                       printf("Failed to copy IPC message: %m (%d)\n", errno);
+                       return -errno;
+               }
+               msgque->messages[i].msize = ret;
+       }
+       return 0;
+}
+
+int fill_msgque(struct msgque_data *msgque)
+{
+       struct msg1 msgbuf;
+
+       msgbuf.mtype = MSG_TYPE;
+       memcpy(msgbuf.mtext, TEST_STRING, sizeof(TEST_STRING));
+       if (msgsnd(msgque->msq_id, &msgbuf.mtype, sizeof(TEST_STRING),
+                               IPC_NOWAIT) != 0) {
+               printf("First message send failed (%m)\n");
+               return -errno;
+       };
+
+       msgbuf.mtype = ANOTHER_MSG_TYPE;
+       memcpy(msgbuf.mtext, ANOTHER_TEST_STRING, sizeof(ANOTHER_TEST_STRING));
+       if (msgsnd(msgque->msq_id, &msgbuf.mtype, sizeof(ANOTHER_TEST_STRING),
+                               IPC_NOWAIT) != 0) {
+               printf("Second message send failed (%m)\n");
+               return -errno;
+       };
+       return 0;
+}
+
+int main(int argc, char **argv)
+{
+       int msg, pid, err;
+       struct msgque_data msgque;
+
+       msgque.key = ftok(argv[0], 822155650);
+       if (msgque.key == -1) {
+               printf("Can't make key\n");
+               return -errno;
+       }
+
+       msgque.msq_id = msgget(msgque.key, IPC_CREAT | IPC_EXCL | 0666);
+       if (msgque.msq_id == -1) {
+               printf("Can't create queue\n");
+               goto err_out;
+       }
+
+       err = fill_msgque(&msgque);
+       if (err) {
+               printf("Failed to fill queue\n");
+               goto err_destroy;
+       }
+
+       err = dump_queue(&msgque);
+       if (err) {
+               printf("Failed to dump queue\n");
+               goto err_destroy;
+       }
+
+       err = check_and_destroy_queue(&msgque);
+       if (err) {
+               printf("Failed to check and destroy queue\n");
+               goto err_out;
+       }
+
+       err = restore_queue(&msgque);
+       if (err) {
+               printf("Failed to restore queue\n");
+               goto err_destroy;
+       }
+
+       err = check_and_destroy_queue(&msgque);
+       if (err) {
+               printf("Failed to test queue\n");
+               goto err_out;
+       }
+       return 0;
+
+err_destroy:
+       if (msgctl(msgque.msq_id, IPC_RMID, 0)) {
+               printf("Failed to destroy queue: %d\n", -errno);
+               return -errno;
+       }
+err_out:
+       return err;
+}